!function(t, e) {
    "object" == typeof exports && "undefined" != typeof module ? e(exports) : "function" == typeof define && define.amd ? define(["exports"], e) : e((t = "undefined" != typeof globalThis ? globalThis : t || self).turf = {})
}(this, (function(t) {
    "use strict";
    var e = 6371008.8
      , n = {
        centimeters: 637100880,
        centimetres: 637100880,
        degrees: 57.22891354143274,
        feet: 20902260.511392,
        inches: 39.37 * e,
        kilometers: 6371.0088,
        kilometres: 6371.0088,
        meters: e,
        metres: e,
        miles: 3958.761333810546,
        millimeters: 6371008800,
        millimetres: 6371008800,
        nauticalmiles: e / 1852,
        radians: 1,
        yards: 6967335.223679999
    }
      , r = {
        centimeters: 100,
        centimetres: 100,
        degrees: 1 / 111325,
        feet: 3.28084,
        inches: 39.37,
        kilometers: .001,
        kilometres: .001,
        meters: 1,
        metres: 1,
        miles: 1 / 1609.344,
        millimeters: 1e3,
        millimetres: 1e3,
        nauticalmiles: 1 / 1852,
        radians: 1 / e,
        yards: 1.0936133
    }
      , i = {
        acres: 247105e-9,
        centimeters: 1e4,
        centimetres: 1e4,
        feet: 10.763910417,
        hectares: 1e-4,
        inches: 1550.003100006,
        kilometers: 1e-6,
        kilometres: 1e-6,
        meters: 1,
        metres: 1,
        miles: 386e-9,
        millimeters: 1e6,
        millimetres: 1e6,
        yards: 1.195990046
    };
    function o(t, e, n) {
        void 0 === n && (n = {});
        var r = {
            type: "Feature"
        };
        return (0 === n.id || n.id) && (r.id = n.id),
        n.bbox && (r.bbox = n.bbox),
        r.properties = e || {},
        r.geometry = t,
        r
    }
    function s(t, e, n) {
        switch (t) {
        case "Point":
            return a(e).geometry;
        case "LineString":
            return h(e).geometry;
        case "Polygon":
            return l(e).geometry;
        case "MultiPoint":
            return d(e).geometry;
        case "MultiLineString":
            return g(e).geometry;
        case "MultiPolygon":
            return y(e).geometry;
        default:
            throw new Error(t + " is invalid")
        }
    }
    function a(t, e, n) {
        if (void 0 === n && (n = {}),
        !t)
            throw new Error("coordinates is required");
        if (!Array.isArray(t))
            throw new Error("coordinates must be an Array");
        if (t.length < 2)
            throw new Error("coordinates must be at least 2 numbers long");
        if (!C(t[0]) || !C(t[1]))
            throw new Error("coordinates must contain numbers");
        return o({
            type: "Point",
            coordinates: t
        }, e, n)
    }
    function u(t, e, n) {
        return void 0 === n && (n = {}),
        f(t.map((function(t) {
            return a(t, e)
        }
        )), n)
    }
    function l(t, e, n) {
        void 0 === n && (n = {});
        for (var r = 0, i = t; r < i.length; r++) {
            var s = i[r];
            if (s.length < 4)
                throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
            for (var a = 0; a < s[s.length - 1].length; a++)
                if (s[s.length - 1][a] !== s[0][a])
                    throw new Error("First and last Position are not equivalent.")
        }
        return o({
            type: "Polygon",
            coordinates: t
        }, e, n)
    }
    function c(t, e, n) {
        return void 0 === n && (n = {}),
        f(t.map((function(t) {
            return l(t, e)
        }
        )), n)
    }
    function h(t, e, n) {
        if (void 0 === n && (n = {}),
        t.length < 2)
            throw new Error("coordinates must be an array of two or more positions");
        return o({
            type: "LineString",
            coordinates: t
        }, e, n)
    }
    function p(t, e, n) {
        return void 0 === n && (n = {}),
        f(t.map((function(t) {
            return h(t, e)
        }
        )), n)
    }
    function f(t, e) {
        void 0 === e && (e = {});
        var n = {
            type: "FeatureCollection"
        };
        return e.id && (n.id = e.id),
        e.bbox && (n.bbox = e.bbox),
        n.features = t,
        n
    }
    function g(t, e, n) {
        return void 0 === n && (n = {}),
        o({
            type: "MultiLineString",
            coordinates: t
        }, e, n)
    }
    function d(t, e, n) {
        return void 0 === n && (n = {}),
        o({
            type: "MultiPoint",
            coordinates: t
        }, e, n)
    }
    function y(t, e, n) {
        return void 0 === n && (n = {}),
        o({
            type: "MultiPolygon",
            coordinates: t
        }, e, n)
    }
    function v(t, e, n) {
        return void 0 === n && (n = {}),
        o({
            type: "GeometryCollection",
            geometries: t
        }, e, n)
    }
    function _(t, e) {
        if (void 0 === e && (e = 0),
        e && !(e >= 0))
            throw new Error("precision must be a positive number");
        var n = Math.pow(10, e || 0);
        return Math.round(t * n) / n
    }
    function m(t, e) {
        void 0 === e && (e = "kilometers");
        var r = n[e];
        if (!r)
            throw new Error(e + " units is invalid");
        return t * r
    }
    function x(t, e) {
        void 0 === e && (e = "kilometers");
        var r = n[e];
        if (!r)
            throw new Error(e + " units is invalid");
        return t / r
    }
    function E(t, e) {
        return w(x(t, e))
    }
    function b(t) {
        var e = t % 360;
        return e < 0 && (e += 360),
        e
    }
    function w(t) {
        return 180 * (t % (2 * Math.PI)) / Math.PI
    }
    function I(t) {
        return t % 360 * Math.PI / 180
    }
    function N(t, e, n) {
        if (void 0 === e && (e = "kilometers"),
        void 0 === n && (n = "kilometers"),
        !(t >= 0))
            throw new Error("length must be a positive number");
        return m(x(t, e), n)
    }
    function S(t, e, n) {
        if (void 0 === e && (e = "meters"),
        void 0 === n && (n = "kilometers"),
        !(t >= 0))
            throw new Error("area must be a positive number");
        var r = i[e];
        if (!r)
            throw new Error("invalid original units");
        var o = i[n];
        if (!o)
            throw new Error("invalid final units");
        return t / r * o
    }
    function C(t) {
        return !isNaN(t) && null !== t && !Array.isArray(t)
    }
    function P(t) {
        return !!t && t.constructor === Object
    }
    function M(t) {
        if (!t)
            throw new Error("bbox is required");
        if (!Array.isArray(t))
            throw new Error("bbox must be an Array");
        if (4 !== t.length && 6 !== t.length)
            throw new Error("bbox must be an Array of 4 or 6 numbers");
        t.forEach((function(t) {
            if (!C(t))
                throw new Error("bbox must only contain numbers")
        }
        ))
    }
    function L(t) {
        if (!t)
            throw new Error("id is required");
        if (-1 === ["string", "number"].indexOf(typeof t))
            throw new Error("id must be a number or a string")
    }
    var O = Object.freeze({
        __proto__: null,
        earthRadius: e,
        factors: n,
        unitsFactors: r,
        areaFactors: i,
        feature: o,
        geometry: s,
        point: a,
        points: u,
        polygon: l,
        polygons: c,
        lineString: h,
        lineStrings: p,
        featureCollection: f,
        multiLineString: g,
        multiPoint: d,
        multiPolygon: y,
        geometryCollection: v,
        round: _,
        radiansToLength: m,
        lengthToRadians: x,
        lengthToDegrees: E,
        bearingToAzimuth: b,
        radiansToDegrees: w,
        degreesToRadians: I,
        convertLength: N,
        convertArea: S,
        isNumber: C,
        isObject: P,
        validateBBox: M,
        validateId: L
    });
    function R(t, e, n) {
        if (null !== t)
            for (var r, i, o, s, a, u, l, c, h = 0, p = 0, f = t.type, g = "FeatureCollection" === f, d = "Feature" === f, y = g ? t.features.length : 1, v = 0; v < y; v++) {
                a = (c = !!(l = g ? t.features[v].geometry : d ? t.geometry : t) && "GeometryCollection" === l.type) ? l.geometries.length : 1;
                for (var _ = 0; _ < a; _++) {
                    var m = 0
                      , x = 0;
                    if (null !== (s = c ? l.geometries[_] : l)) {
                        u = s.coordinates;
                        var E = s.type;
                        switch (h = !n || "Polygon" !== E && "MultiPolygon" !== E ? 0 : 1,
                        E) {
                        case null:
                            break;
                        case "Point":
                            if (!1 === e(u, p, v, m, x))
                                return !1;
                            p++,
                            m++;
                            break;
                        case "LineString":
                        case "MultiPoint":
                            for (r = 0; r < u.length; r++) {
                                if (!1 === e(u[r], p, v, m, x))
                                    return !1;
                                p++,
                                "MultiPoint" === E && m++
                            }
                            "LineString" === E && m++;
                            break;
                        case "Polygon":
                        case "MultiLineString":
                            for (r = 0; r < u.length; r++) {
                                for (i = 0; i < u[r].length - h; i++) {
                                    if (!1 === e(u[r][i], p, v, m, x))
                                        return !1;
                                    p++
                                }
                                "MultiLineString" === E && m++,
                                "Polygon" === E && x++
                            }
                            "Polygon" === E && m++;
                            break;
                        case "MultiPolygon":
                            for (r = 0; r < u.length; r++) {
                                for (x = 0,
                                i = 0; i < u[r].length; i++) {
                                    for (o = 0; o < u[r][i].length - h; o++) {
                                        if (!1 === e(u[r][i][o], p, v, m, x))
                                            return !1;
                                        p++
                                    }
                                    x++
                                }
                                m++
                            }
                            break;
                        case "GeometryCollection":
                            for (r = 0; r < s.geometries.length; r++)
                                if (!1 === R(s.geometries[r], e, n))
                                    return !1;
                            break;
                        default:
                            throw new Error("Unknown Geometry Type")
                        }
                    }
                }
            }
    }
    function T(t, e, n, r) {
        var i = n;
        return R(t, (function(t, r, o, s, a) {
            i = 0 === r && void 0 === n ? t : e(i, t, r, o, s, a)
        }
        ), r),
        i
    }
    function A(t, e) {
        var n;
        switch (t.type) {
        case "FeatureCollection":
            for (n = 0; n < t.features.length && !1 !== e(t.features[n].properties, n); n++)
                ;
            break;
        case "Feature":
            e(t.properties, 0)
        }
    }
    function D(t, e, n) {
        var r = n;
        return A(t, (function(t, i) {
            r = 0 === i && void 0 === n ? t : e(r, t, i)
        }
        )),
        r
    }
    function F(t, e) {
        if ("Feature" === t.type)
            e(t, 0);
        else if ("FeatureCollection" === t.type)
            for (var n = 0; n < t.features.length && !1 !== e(t.features[n], n); n++)
                ;
    }
    function k(t, e, n) {
        var r = n;
        return F(t, (function(t, i) {
            r = 0 === i && void 0 === n ? t : e(r, t, i)
        }
        )),
        r
    }
    function G(t) {
        var e = [];
        return R(t, (function(t) {
            e.push(t)
        }
        )),
        e
    }
    function q(t, e) {
        var n, r, i, o, s, a, u, l, c, h, p = 0, f = "FeatureCollection" === t.type, g = "Feature" === t.type, d = f ? t.features.length : 1;
        for (n = 0; n < d; n++) {
            for (a = f ? t.features[n].geometry : g ? t.geometry : t,
            l = f ? t.features[n].properties : g ? t.properties : {},
            c = f ? t.features[n].bbox : g ? t.bbox : void 0,
            h = f ? t.features[n].id : g ? t.id : void 0,
            s = (u = !!a && "GeometryCollection" === a.type) ? a.geometries.length : 1,
            i = 0; i < s; i++)
                if (null !== (o = u ? a.geometries[i] : a))
                    switch (o.type) {
                    case "Point":
                    case "LineString":
                    case "MultiPoint":
                    case "Polygon":
                    case "MultiLineString":
                    case "MultiPolygon":
                        if (!1 === e(o, p, l, c, h))
                            return !1;
                        break;
                    case "GeometryCollection":
                        for (r = 0; r < o.geometries.length; r++)
                            if (!1 === e(o.geometries[r], p, l, c, h))
                                return !1;
                        break;
                    default:
                        throw new Error("Unknown Geometry Type")
                    }
                else if (!1 === e(null, p, l, c, h))
                    return !1;
            p++
        }
    }
    function B(t, e, n) {
        var r = n;
        return q(t, (function(t, i, o, s, a) {
            r = 0 === i && void 0 === n ? t : e(r, t, i, o, s, a)
        }
        )),
        r
    }
    function z(t, e) {
        q(t, (function(t, n, r, i, s) {
            var a, u = null === t ? null : t.type;
            switch (u) {
            case null:
            case "Point":
            case "LineString":
            case "Polygon":
                return !1 !== e(o(t, r, {
                    bbox: i,
                    id: s
                }), n, 0) && void 0
            }
            switch (u) {
            case "MultiPoint":
                a = "Point";
                break;
            case "MultiLineString":
                a = "LineString";
                break;
            case "MultiPolygon":
                a = "Polygon"
            }
            for (var l = 0; l < t.coordinates.length; l++) {
                var c = t.coordinates[l];
                if (!1 === e(o({
                    type: a,
                    coordinates: c
                }, r), n, l))
                    return !1
            }
        }
        ))
    }
    function j(t, e, n) {
        var r = n;
        return z(t, (function(t, i, o) {
            r = 0 === i && 0 === o && void 0 === n ? t : e(r, t, i, o)
        }
        )),
        r
    }
    function U(t, e) {
        z(t, (function(t, n, r) {
            var i = 0;
            if (t.geometry) {
                var o = t.geometry.type;
                if ("Point" !== o && "MultiPoint" !== o) {
                    var s, a = 0, u = 0, l = 0;
                    return !1 !== R(t, (function(o, c, p, f, g) {
                        if (void 0 === s || n > a || f > u || g > l)
                            return s = o,
                            a = n,
                            u = f,
                            l = g,
                            void (i = 0);
                        var d = h([s, o], t.properties);
                        if (!1 === e(d, n, r, g, i))
                            return !1;
                        i++,
                        s = o
                    }
                    )) && void 0
                }
            }
        }
        ))
    }
    function V(t, e, n) {
        var r = n
          , i = !1;
        return U(t, (function(t, o, s, a, u) {
            r = !1 === i && void 0 === n ? t : e(r, t, o, s, a, u),
            i = !0
        }
        )),
        r
    }
    function X(t, e) {
        if (!t)
            throw new Error("geojson is required");
        z(t, (function(t, n, r) {
            if (null !== t.geometry) {
                var i = t.geometry.type
                  , o = t.geometry.coordinates;
                switch (i) {
                case "LineString":
                    if (!1 === e(t, n, r, 0, 0))
                        return !1;
                    break;
                case "Polygon":
                    for (var s = 0; s < o.length; s++)
                        if (!1 === e(h(o[s], t.properties), n, r, s))
                            return !1
                }
            }
        }
        ))
    }
    function Y(t, e, n) {
        var r = n;
        return X(t, (function(t, i, o, s) {
            r = 0 === i && void 0 === n ? t : e(r, t, i, o, s)
        }
        )),
        r
    }
    function H(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n, r = e.featureIndex || 0, i = e.multiFeatureIndex || 0, o = e.geometryIndex || 0, s = e.segmentIndex || 0, a = e.properties;
        switch (t.type) {
        case "FeatureCollection":
            r < 0 && (r = t.features.length + r),
            a = a || t.features[r].properties,
            n = t.features[r].geometry;
            break;
        case "Feature":
            a = a || t.properties,
            n = t.geometry;
            break;
        case "Point":
        case "MultiPoint":
            return null;
        case "LineString":
        case "Polygon":
        case "MultiLineString":
        case "MultiPolygon":
            n = t;
            break;
        default:
            throw new Error("geojson is invalid")
        }
        if (null === n)
            return null;
        var u = n.coordinates;
        switch (n.type) {
        case "Point":
        case "MultiPoint":
            return null;
        case "LineString":
            return s < 0 && (s = u.length + s - 1),
            h([u[s], u[s + 1]], a, e);
        case "Polygon":
            return o < 0 && (o = u.length + o),
            s < 0 && (s = u[o].length + s - 1),
            h([u[o][s], u[o][s + 1]], a, e);
        case "MultiLineString":
            return i < 0 && (i = u.length + i),
            s < 0 && (s = u[i].length + s - 1),
            h([u[i][s], u[i][s + 1]], a, e);
        case "MultiPolygon":
            return i < 0 && (i = u.length + i),
            o < 0 && (o = u[i].length + o),
            s < 0 && (s = u[i][o].length - s - 1),
            h([u[i][o][s], u[i][o][s + 1]], a, e)
        }
        throw new Error("geojson is invalid")
    }
    function W(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n, r = e.featureIndex || 0, i = e.multiFeatureIndex || 0, o = e.geometryIndex || 0, s = e.coordIndex || 0, u = e.properties;
        switch (t.type) {
        case "FeatureCollection":
            r < 0 && (r = t.features.length + r),
            u = u || t.features[r].properties,
            n = t.features[r].geometry;
            break;
        case "Feature":
            u = u || t.properties,
            n = t.geometry;
            break;
        case "Point":
        case "MultiPoint":
            return null;
        case "LineString":
        case "Polygon":
        case "MultiLineString":
        case "MultiPolygon":
            n = t;
            break;
        default:
            throw new Error("geojson is invalid")
        }
        if (null === n)
            return null;
        var l = n.coordinates;
        switch (n.type) {
        case "Point":
            return a(l, u, e);
        case "MultiPoint":
            return i < 0 && (i = l.length + i),
            a(l[i], u, e);
        case "LineString":
            return s < 0 && (s = l.length + s),
            a(l[s], u, e);
        case "Polygon":
            return o < 0 && (o = l.length + o),
            s < 0 && (s = l[o].length + s),
            a(l[o][s], u, e);
        case "MultiLineString":
            return i < 0 && (i = l.length + i),
            s < 0 && (s = l[i].length + s),
            a(l[i][s], u, e);
        case "MultiPolygon":
            return i < 0 && (i = l.length + i),
            o < 0 && (o = l[i].length + o),
            s < 0 && (s = l[i][o].length - s),
            a(l[i][o][s], u, e)
        }
        throw new Error("geojson is invalid")
    }
    var J = Object.freeze({
        __proto__: null,
        coordAll: G,
        coordEach: R,
        coordReduce: T,
        featureEach: F,
        featureReduce: k,
        findPoint: W,
        findSegment: H,
        flattenEach: z,
        flattenReduce: j,
        geomEach: q,
        geomReduce: B,
        lineEach: X,
        lineReduce: Y,
        propEach: A,
        propReduce: D,
        segmentEach: U,
        segmentReduce: V
    });
    function Z(t) {
        var e = [1 / 0, 1 / 0, -1 / 0, -1 / 0];
        return R(t, (function(t) {
            e[0] > t[0] && (e[0] = t[0]),
            e[1] > t[1] && (e[1] = t[1]),
            e[2] < t[0] && (e[2] = t[0]),
            e[3] < t[1] && (e[3] = t[1])
        }
        )),
        e
    }
    function K(t) {
        if (!t)
            throw new Error("coord is required");
        if (!Array.isArray(t)) {
            if ("Feature" === t.type && null !== t.geometry && "Point" === t.geometry.type)
                return t.geometry.coordinates;
            if ("Point" === t.type)
                return t.coordinates
        }
        if (Array.isArray(t) && t.length >= 2 && !Array.isArray(t[0]) && !Array.isArray(t[1]))
            return t;
        throw new Error("coord must be GeoJSON Point or an Array of numbers")
    }
    function Q(t) {
        if (Array.isArray(t))
            return t;
        if ("Feature" === t.type) {
            if (null !== t.geometry)
                return t.geometry.coordinates
        } else if (t.coordinates)
            return t.coordinates;
        throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array")
    }
    function $(t) {
        if (t.length > 1 && C(t[0]) && C(t[1]))
            return !0;
        if (Array.isArray(t[0]) && t[0].length)
            return $(t[0]);
        throw new Error("coordinates must only contain numbers")
    }
    function tt(t, e, n) {
        if (!e || !n)
            throw new Error("type and name required");
        if (!t || t.type !== e)
            throw new Error("Invalid input to " + n + ": must be a " + e + ", given " + t.type)
    }
    function et(t, e, n) {
        if (!t)
            throw new Error("No feature passed");
        if (!n)
            throw new Error(".featureOf() requires a name");
        if (!t || "Feature" !== t.type || !t.geometry)
            throw new Error("Invalid input to " + n + ", Feature with geometry required");
        if (!t.geometry || t.geometry.type !== e)
            throw new Error("Invalid input to " + n + ": must be a " + e + ", given " + t.geometry.type)
    }
    function nt(t, e, n) {
        if (!t)
            throw new Error("No featureCollection passed");
        if (!n)
            throw new Error(".collectionOf() requires a name");
        if (!t || "FeatureCollection" !== t.type)
            throw new Error("Invalid input to " + n + ", FeatureCollection required");
        for (var r = 0, i = t.features; r < i.length; r++) {
            var o = i[r];
            if (!o || "Feature" !== o.type || !o.geometry)
                throw new Error("Invalid input to " + n + ", Feature with geometry required");
            if (!o.geometry || o.geometry.type !== e)
                throw new Error("Invalid input to " + n + ": must be a " + e + ", given " + o.geometry.type)
        }
    }
    function rt(t) {
        return "Feature" === t.type ? t.geometry : t
    }
    function it(t, e) {
        return "FeatureCollection" === t.type ? "FeatureCollection" : "GeometryCollection" === t.type ? "GeometryCollection" : "Feature" === t.type && null !== t.geometry ? t.geometry.type : t.type
    }
    Z.default = Z;
    var ot = Object.freeze({
        __proto__: null,
        getCoord: K,
        getCoords: Q,
        containsNumber: $,
        geojsonType: tt,
        featureOf: et,
        collectionOf: nt,
        getGeom: rt,
        getType: it
    })
      , st = Object.getOwnPropertySymbols
      , at = Object.prototype.hasOwnProperty
      , ut = Object.prototype.propertyIsEnumerable;
    /*
    object-assign
    (c) Sindre Sorhus
    @license MIT
    */
    function lt(t) {
        if (null == t)
            throw new TypeError("Object.assign cannot be called with null or undefined");
        return Object(t)
    }
    var ct = function() {
        try {
            if (!Object.assign)
                return !1;
            var t = new String("abc");
            if (t[5] = "de",
            "5" === Object.getOwnPropertyNames(t)[0])
                return !1;
            for (var e = {}, n = 0; n < 10; n++)
                e["_" + String.fromCharCode(n)] = n;
            if ("0123456789" !== Object.getOwnPropertyNames(e).map((function(t) {
                return e[t]
            }
            )).join(""))
                return !1;
            var r = {};
            return "abcdefghijklmnopqrst".split("").forEach((function(t) {
                r[t] = t
            }
            )),
            "abcdefghijklmnopqrst" === Object.keys(Object.assign({}, r)).join("")
        } catch (t) {
            return !1
        }
    }() ? Object.assign : function(t, e) {
        for (var n, r, i = lt(t), o = 1; o < arguments.length; o++) {
            for (var s in n = Object(arguments[o]))
                at.call(n, s) && (i[s] = n[s]);
            if (st) {
                r = st(n);
                for (var a = 0; a < r.length; a++)
                    ut.call(n, r[a]) && (i[r[a]] = n[r[a]])
            }
        }
        return i
    }
      , ht = {
        successCallback: null,
        verbose: !1
    }
      , pt = {};
    /**
     * @license GNU Affero General Public License.
     * Copyright (c) 2015, 2015 Ronny Lorenz <ronny@tbi.univie.ac.at>
     * v. 1.2.0
     * https://github.com/RaumZeit/MarchingSquares.js
     *
     * MarchingSquaresJS is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Affero General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * MarchingSquaresJS is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU Affero General Public License for more details.
     *
     * As additional permission under GNU Affero General Public License version 3
     * section 7, third-party projects (personal or commercial) may distribute,
     * include, or link against UNMODIFIED VERSIONS of MarchingSquaresJS without the
     * requirement that said third-party project for that reason alone becomes
     * subject to any requirement of the GNU Affero General Public License version 3.
     * Any modifications to MarchingSquaresJS, however, must be shared with the public
     * and made available.
     *
     * In summary this:
     * - allows you to use MarchingSquaresJS at no cost
     * - allows you to use MarchingSquaresJS for both personal and commercial purposes
     * - allows you to distribute UNMODIFIED VERSIONS of MarchingSquaresJS under any
     *   license as long as this license notice is included
     * - enables you to keep the source code of your program that uses MarchingSquaresJS
     *   undisclosed
     * - forces you to share any modifications you have made to MarchingSquaresJS,
     *   e.g. bug-fixes
     *
     * You should have received a copy of the GNU Affero General Public License
     * along with MarchingSquaresJS.  If not, see <http://www.gnu.org/licenses/>.
     */
    function ft(t, e, n) {
        n = n || {};
        for (var r = Object.keys(ht), i = 0; i < r.length; i++) {
            var o = r[i]
              , s = n[o];
            s = null != s ? s : ht[o],
            pt[o] = s
        }
        pt.verbose && console.log("MarchingSquaresJS-isoContours: computing isocontour for " + e);
        var a = function(t) {
            var e = []
              , n = 0
              , r = 1e-7;
            return t.cells.forEach((function(i, o) {
                i.forEach((function(i, s) {
                    if (void 0 !== i && (5 !== (f = i).cval && 10 !== f.cval) && !dt(i)) {
                        var a = function(t, e, n) {
                            var r, i, o = t.length, s = [], a = [0, 0, 1, 1, 0, 0, 0, 0, -1, 0, 1, 1, -1, 0, -1, 0], u = [0, -1, 0, 0, 1, 1, 1, 1, 0, -1, 0, 0, 0, -1, 0, 0], l = ["none", "left", "bottom", "left", "right", "none", "bottom", "left", "top", "top", "none", "top", "right", "right", "bottom", "none"], c = ["none", "bottom", "right", "right", "top", "top", "top", "top", "left", "bottom", "right", "right", "left", "bottom", "left", "none"], h = t[e][n], p = h.cval, f = l[p], g = vt(h, f);
                            s.push([n + g[0], e + g[1]]),
                            f = c[p],
                            g = vt(h, f),
                            s.push([n + g[0], e + g[1]]),
                            yt(h);
                            var d = n + a[p]
                              , y = e + u[p]
                              , v = p;
                            for (; d >= 0 && y >= 0 && y < o && (d != n || y != e) && void 0 !== (h = t[y][d]); ) {
                                if (0 === (p = h.cval) || 15 === p)
                                    return {
                                        path: s,
                                        info: "mergeable"
                                    };
                                f = c[p],
                                r = a[p],
                                i = u[p],
                                5 !== p && 10 !== p || (5 === p ? h.flipped ? -1 === u[v] ? (f = "left",
                                r = -1,
                                i = 0) : (f = "right",
                                r = 1,
                                i = 0) : -1 === a[v] && (f = "bottom",
                                r = 0,
                                i = -1) : 10 === p && (h.flipped ? -1 === a[v] ? (f = "top",
                                r = 0,
                                i = 1) : (f = "bottom",
                                r = 0,
                                i = -1) : 1 === u[v] && (f = "left",
                                r = -1,
                                i = 0))),
                                g = vt(h, f),
                                s.push([d + g[0], y + g[1]]),
                                yt(h),
                                d += r,
                                y += i,
                                v = p
                            }
                            return {
                                path: s,
                                info: "closed"
                            }
                        }(t.cells, o, s)
                          , u = !1;
                        if ("mergeable" === a.info)
                            for (var l = a.path[a.path.length - 1][0], c = a.path[a.path.length - 1][1], h = n - 1; h >= 0; h--)
                                if (Math.abs(e[h][0][0] - l) <= r && Math.abs(e[h][0][1] - c) <= r) {
                                    for (var p = a.path.length - 2; p >= 0; --p)
                                        e[h].unshift(a.path[p]);
                                    u = !0;
                                    break
                                }
                        u || (e[n++] = a.path)
                    }
                    var f
                }
                ))
            }
            )),
            e
        }(function(t, e) {
            for (var n = t.length - 1, r = t[0].length - 1, i = {
                rows: n,
                cols: r,
                cells: []
            }, o = 0; o < n; ++o) {
                i.cells[o] = [];
                for (var s = 0; s < r; ++s) {
                    var a = 0
                      , u = t[o + 1][s]
                      , l = t[o + 1][s + 1]
                      , c = t[o][s + 1]
                      , h = t[o][s];
                    if (!(isNaN(u) || isNaN(l) || isNaN(c) || isNaN(h))) {
                        a |= u >= e ? 8 : 0,
                        a |= l >= e ? 4 : 0,
                        a |= c >= e ? 2 : 0;
                        var p, f, g, d, y = !1;
                        if (5 === (a |= h >= e ? 1 : 0) || 10 === a) {
                            var v = (u + l + c + h) / 4;
                            5 === a && v < e ? (a = 10,
                            y = !0) : 10 === a && v < e && (a = 5,
                            y = !0)
                        }
                        if (0 !== a && 15 !== a)
                            p = f = g = d = .5,
                            1 === a ? (g = 1 - gt(e, u, h),
                            f = 1 - gt(e, c, h)) : 2 === a ? (f = gt(e, h, c),
                            d = 1 - gt(e, l, c)) : 3 === a ? (g = 1 - gt(e, u, h),
                            d = 1 - gt(e, l, c)) : 4 === a ? (p = gt(e, u, l),
                            d = gt(e, c, l)) : 5 === a ? (p = gt(e, u, l),
                            d = gt(e, c, l),
                            f = 1 - gt(e, c, h),
                            g = 1 - gt(e, u, h)) : 6 === a ? (f = gt(e, h, c),
                            p = gt(e, u, l)) : 7 === a ? (g = 1 - gt(e, u, h),
                            p = gt(e, u, l)) : 8 === a ? (g = gt(e, h, u),
                            p = 1 - gt(e, l, u)) : 9 === a ? (f = 1 - gt(e, c, h),
                            p = 1 - gt(e, l, u)) : 10 === a ? (p = 1 - gt(e, l, u),
                            d = 1 - gt(e, l, c),
                            f = gt(e, h, c),
                            g = gt(e, h, u)) : 11 === a ? (p = 1 - gt(e, l, u),
                            d = 1 - gt(e, l, c)) : 12 === a ? (g = gt(e, h, u),
                            d = gt(e, c, l)) : 13 === a ? (f = 1 - gt(e, c, h),
                            d = gt(e, c, l)) : 14 === a ? (g = gt(e, h, u),
                            f = gt(e, h, c)) : console.log("MarchingSquaresJS-isoContours: Illegal cval detected: " + a),
                            i.cells[o][s] = {
                                cval: a,
                                flipped: y,
                                top: p,
                                right: d,
                                bottom: f,
                                left: g
                            }
                    }
                }
            }
            return i
        }(t, e));
        return "function" == typeof pt.successCallback && pt.successCallback(a),
        a
    }
    function gt(t, e, n) {
        return (t - e) / (n - e)
    }
    function dt(t) {
        return 0 === t.cval || 15 === t.cval
    }
    function yt(t) {
        dt(t) || 5 === t.cval || 10 === t.cval || (t.cval = 15)
    }
    function vt(t, e) {
        return "top" === e ? [t.top, 1] : "bottom" === e ? [t.bottom, 0] : "right" === e ? [1, t.right] : "left" === e ? [0, t.left] : void 0
    }
    function _t(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.zProperty || "elevation"
          , r = e.flip
          , i = e.flags;
        nt(t, "Point", "input must contain Points");
        for (var o = function(t, e) {
            var n = {};
            return F(t, (function(t) {
                var e = Q(t)[1];
                n[e] || (n[e] = []),
                n[e].push(t)
            }
            )),
            Object.keys(n).map((function(t) {
                return n[t].sort((function(t, e) {
                    return Q(t)[0] - Q(e)[0]
                }
                ))
            }
            )).sort((function(t, n) {
                return e ? Q(t[0])[1] - Q(n[0])[1] : Q(n[0])[1] - Q(t[0])[1]
            }
            ))
        }(t, r), s = [], a = 0; a < o.length; a++) {
            for (var u = o[a], l = [], c = 0; c < u.length; c++) {
                var h = u[c];
                h.properties[n] ? l.push(h.properties[n]) : l.push(0),
                !0 === i && (h.properties.matrixPosition = [a, c])
            }
            s.push(l)
        }
        return s
    }
    var mt = Et
      , xt = Et;
    function Et(t, e, n, r, i) {
        bt(t, e, n || 0, r || t.length - 1, i || It)
    }
    function bt(t, e, n, r, i) {
        for (; r > n; ) {
            if (r - n > 600) {
                var o = r - n + 1
                  , s = e - n + 1
                  , a = Math.log(o)
                  , u = .5 * Math.exp(2 * a / 3)
                  , l = .5 * Math.sqrt(a * u * (o - u) / o) * (s - o / 2 < 0 ? -1 : 1);
                bt(t, e, Math.max(n, Math.floor(e - s * u / o + l)), Math.min(r, Math.floor(e + (o - s) * u / o + l)), i)
            }
            var c = t[e]
              , h = n
              , p = r;
            for (wt(t, n, e),
            i(t[r], c) > 0 && wt(t, n, r); h < p; ) {
                for (wt(t, h, p),
                h++,
                p--; i(t[h], c) < 0; )
                    h++;
                for (; i(t[p], c) > 0; )
                    p--
            }
            0 === i(t[n], c) ? wt(t, n, p) : wt(t, ++p, r),
            p <= e && (n = p + 1),
            e <= p && (r = p - 1)
        }
    }
    function wt(t, e, n) {
        var r = t[e];
        t[e] = t[n],
        t[n] = r
    }
    function It(t, e) {
        return t < e ? -1 : t > e ? 1 : 0
    }
    mt.default = xt;
    var Nt = Ct
      , St = Ct;
    function Ct(t, e) {
        if (!(this instanceof Ct))
            return new Ct(t,e);
        this._maxEntries = Math.max(4, t || 9),
        this._minEntries = Math.max(2, Math.ceil(.4 * this._maxEntries)),
        e && this._initFormat(e),
        this.clear()
    }
    function Pt(t, e, n) {
        if (!n)
            return e.indexOf(t);
        for (var r = 0; r < e.length; r++)
            if (n(t, e[r]))
                return r;
        return -1
    }
    function Mt(t, e) {
        Lt(t, 0, t.children.length, e, t)
    }
    function Lt(t, e, n, r, i) {
        i || (i = Gt(null)),
        i.minX = 1 / 0,
        i.minY = 1 / 0,
        i.maxX = -1 / 0,
        i.maxY = -1 / 0;
        for (var o, s = e; s < n; s++)
            o = t.children[s],
            Ot(i, t.leaf ? r(o) : o);
        return i
    }
    function Ot(t, e) {
        return t.minX = Math.min(t.minX, e.minX),
        t.minY = Math.min(t.minY, e.minY),
        t.maxX = Math.max(t.maxX, e.maxX),
        t.maxY = Math.max(t.maxY, e.maxY),
        t
    }
    function Rt(t, e) {
        return t.minX - e.minX
    }
    function Tt(t, e) {
        return t.minY - e.minY
    }
    function At(t) {
        return (t.maxX - t.minX) * (t.maxY - t.minY)
    }
    function Dt(t) {
        return t.maxX - t.minX + (t.maxY - t.minY)
    }
    function Ft(t, e) {
        return t.minX <= e.minX && t.minY <= e.minY && e.maxX <= t.maxX && e.maxY <= t.maxY
    }
    function kt(t, e) {
        return e.minX <= t.maxX && e.minY <= t.maxY && e.maxX >= t.minX && e.maxY >= t.minY
    }
    function Gt(t) {
        return {
            children: t,
            height: 1,
            leaf: !0,
            minX: 1 / 0,
            minY: 1 / 0,
            maxX: -1 / 0,
            maxY: -1 / 0
        }
    }
    function qt(t, e, n, r, i) {
        for (var o, s = [e, n]; s.length; )
            (n = s.pop()) - (e = s.pop()) <= r || (o = e + Math.ceil((n - e) / r / 2) * r,
            mt(t, o, e, n, i),
            s.push(e, o, o, n))
    }
    function Bt(t) {
        var e = {
            exports: {}
        };
        return t(e, e.exports),
        e.exports
    }
    Ct.prototype = {
        all: function() {
            return this._all(this.data, [])
        },
        search: function(t) {
            var e = this.data
              , n = []
              , r = this.toBBox;
            if (!kt(t, e))
                return n;
            for (var i, o, s, a, u = []; e; ) {
                for (i = 0,
                o = e.children.length; i < o; i++)
                    s = e.children[i],
                    kt(t, a = e.leaf ? r(s) : s) && (e.leaf ? n.push(s) : Ft(t, a) ? this._all(s, n) : u.push(s));
                e = u.pop()
            }
            return n
        },
        collides: function(t) {
            var e = this.data
              , n = this.toBBox;
            if (!kt(t, e))
                return !1;
            for (var r, i, o, s, a = []; e; ) {
                for (r = 0,
                i = e.children.length; r < i; r++)
                    if (o = e.children[r],
                    kt(t, s = e.leaf ? n(o) : o)) {
                        if (e.leaf || Ft(t, s))
                            return !0;
                        a.push(o)
                    }
                e = a.pop()
            }
            return !1
        },
        load: function(t) {
            if (!t || !t.length)
                return this;
            if (t.length < this._minEntries) {
                for (var e = 0, n = t.length; e < n; e++)
                    this.insert(t[e]);
                return this
            }
            var r = this._build(t.slice(), 0, t.length - 1, 0);
            if (this.data.children.length)
                if (this.data.height === r.height)
                    this._splitRoot(this.data, r);
                else {
                    if (this.data.height < r.height) {
                        var i = this.data;
                        this.data = r,
                        r = i
                    }
                    this._insert(r, this.data.height - r.height - 1, !0)
                }
            else
                this.data = r;
            return this
        },
        insert: function(t) {
            return t && this._insert(t, this.data.height - 1),
            this
        },
        clear: function() {
            return this.data = Gt([]),
            this
        },
        remove: function(t, e) {
            if (!t)
                return this;
            for (var n, r, i, o, s = this.data, a = this.toBBox(t), u = [], l = []; s || u.length; ) {
                if (s || (s = u.pop(),
                r = u[u.length - 1],
                n = l.pop(),
                o = !0),
                s.leaf && -1 !== (i = Pt(t, s.children, e)))
                    return s.children.splice(i, 1),
                    u.push(s),
                    this._condense(u),
                    this;
                o || s.leaf || !Ft(s, a) ? r ? (n++,
                s = r.children[n],
                o = !1) : s = null : (u.push(s),
                l.push(n),
                n = 0,
                r = s,
                s = s.children[0])
            }
            return this
        },
        toBBox: function(t) {
            return t
        },
        compareMinX: Rt,
        compareMinY: Tt,
        toJSON: function() {
            return this.data
        },
        fromJSON: function(t) {
            return this.data = t,
            this
        },
        _all: function(t, e) {
            for (var n = []; t; )
                t.leaf ? e.push.apply(e, t.children) : n.push.apply(n, t.children),
                t = n.pop();
            return e
        },
        _build: function(t, e, n, r) {
            var i, o = n - e + 1, s = this._maxEntries;
            if (o <= s)
                return Mt(i = Gt(t.slice(e, n + 1)), this.toBBox),
                i;
            r || (r = Math.ceil(Math.log(o) / Math.log(s)),
            s = Math.ceil(o / Math.pow(s, r - 1))),
            (i = Gt([])).leaf = !1,
            i.height = r;
            var a, u, l, c, h = Math.ceil(o / s), p = h * Math.ceil(Math.sqrt(s));
            for (qt(t, e, n, p, this.compareMinX),
            a = e; a <= n; a += p)
                for (qt(t, a, l = Math.min(a + p - 1, n), h, this.compareMinY),
                u = a; u <= l; u += h)
                    c = Math.min(u + h - 1, l),
                    i.children.push(this._build(t, u, c, r - 1));
            return Mt(i, this.toBBox),
            i
        },
        _chooseSubtree: function(t, e, n, r) {
            for (var i, o, s, a, u, l, c, h, p, f; r.push(e),
            !e.leaf && r.length - 1 !== n; ) {
                for (c = h = 1 / 0,
                i = 0,
                o = e.children.length; i < o; i++)
                    u = At(s = e.children[i]),
                    p = t,
                    f = s,
                    (l = (Math.max(f.maxX, p.maxX) - Math.min(f.minX, p.minX)) * (Math.max(f.maxY, p.maxY) - Math.min(f.minY, p.minY)) - u) < h ? (h = l,
                    c = u < c ? u : c,
                    a = s) : l === h && u < c && (c = u,
                    a = s);
                e = a || e.children[0]
            }
            return e
        },
        _insert: function(t, e, n) {
            var r = this.toBBox
              , i = n ? t : r(t)
              , o = []
              , s = this._chooseSubtree(i, this.data, e, o);
            for (s.children.push(t),
            Ot(s, i); e >= 0 && o[e].children.length > this._maxEntries; )
                this._split(o, e),
                e--;
            this._adjustParentBBoxes(i, o, e)
        },
        _split: function(t, e) {
            var n = t[e]
              , r = n.children.length
              , i = this._minEntries;
            this._chooseSplitAxis(n, i, r);
            var o = this._chooseSplitIndex(n, i, r)
              , s = Gt(n.children.splice(o, n.children.length - o));
            s.height = n.height,
            s.leaf = n.leaf,
            Mt(n, this.toBBox),
            Mt(s, this.toBBox),
            e ? t[e - 1].children.push(s) : this._splitRoot(n, s)
        },
        _splitRoot: function(t, e) {
            this.data = Gt([t, e]),
            this.data.height = t.height + 1,
            this.data.leaf = !1,
            Mt(this.data, this.toBBox)
        },
        _chooseSplitIndex: function(t, e, n) {
            var r, i, o, s, a, u, l, c, h, p, f, g, d, y;
            for (u = l = 1 / 0,
            r = e; r <= n - e; r++)
                i = Lt(t, 0, r, this.toBBox),
                o = Lt(t, r, n, this.toBBox),
                h = i,
                p = o,
                f = void 0,
                g = void 0,
                d = void 0,
                y = void 0,
                f = Math.max(h.minX, p.minX),
                g = Math.max(h.minY, p.minY),
                d = Math.min(h.maxX, p.maxX),
                y = Math.min(h.maxY, p.maxY),
                s = Math.max(0, d - f) * Math.max(0, y - g),
                a = At(i) + At(o),
                s < u ? (u = s,
                c = r,
                l = a < l ? a : l) : s === u && a < l && (l = a,
                c = r);
            return c
        },
        _chooseSplitAxis: function(t, e, n) {
            var r = t.leaf ? this.compareMinX : Rt
              , i = t.leaf ? this.compareMinY : Tt;
            this._allDistMargin(t, e, n, r) < this._allDistMargin(t, e, n, i) && t.children.sort(r)
        },
        _allDistMargin: function(t, e, n, r) {
            t.children.sort(r);
            var i, o, s = this.toBBox, a = Lt(t, 0, e, s), u = Lt(t, n - e, n, s), l = Dt(a) + Dt(u);
            for (i = e; i < n - e; i++)
                o = t.children[i],
                Ot(a, t.leaf ? s(o) : o),
                l += Dt(a);
            for (i = n - e - 1; i >= e; i--)
                o = t.children[i],
                Ot(u, t.leaf ? s(o) : o),
                l += Dt(u);
            return l
        },
        _adjustParentBBoxes: function(t, e, n) {
            for (var r = n; r >= 0; r--)
                Ot(e[r], t)
        },
        _condense: function(t) {
            for (var e, n = t.length - 1; n >= 0; n--)
                0 === t[n].children.length ? n > 0 ? (e = t[n - 1].children).splice(e.indexOf(t[n]), 1) : this.clear() : Mt(t[n], this.toBBox)
        },
        _initFormat: function(t) {
            var e = ["return a", " - b", ";"];
            this.compareMinX = new Function("a","b",e.join(t[0])),
            this.compareMinY = new Function("a","b",e.join(t[1])),
            this.toBBox = new Function("a","return {minX: a" + t[0] + ", minY: a" + t[1] + ", maxX: a" + t[2] + ", maxY: a" + t[3] + "};")
        }
    },
    Nt.default = St;
    var zt = function(t, e, n) {
        var r = t * e
          , i = jt * t
          , o = i - (i - t)
          , s = t - o
          , a = jt * e
          , u = a - (a - e)
          , l = e - u
          , c = s * l - (r - o * u - s * u - o * l);
        if (n)
            return n[0] = c,
            n[1] = r,
            n;
        return [c, r]
    }
      , jt = +(Math.pow(2, 27) + 1);
    var Ut = function(t, e) {
        var n = 0 | t.length
          , r = 0 | e.length;
        if (1 === n && 1 === r)
            return function(t, e) {
                var n = t + e
                  , r = n - t
                  , i = t - (n - r) + (e - r);
                if (i)
                    return [i, n];
                return [n]
            }(t[0], e[0]);
        var i, o, s = new Array(n + r), a = 0, u = 0, l = 0, c = Math.abs, h = t[u], p = c(h), f = e[l], g = c(f);
        p < g ? (o = h,
        (u += 1) < n && (h = t[u],
        p = c(h))) : (o = f,
        (l += 1) < r && (f = e[l],
        g = c(f)));
        u < n && p < g || l >= r ? (i = h,
        (u += 1) < n && (h = t[u],
        p = c(h))) : (i = f,
        (l += 1) < r && (f = e[l],
        g = c(f)));
        var d, y, v = i + o, _ = v - i, m = o - _, x = m, E = v;
        for (; u < n && l < r; )
            p < g ? (i = h,
            (u += 1) < n && (h = t[u],
            p = c(h))) : (i = f,
            (l += 1) < r && (f = e[l],
            g = c(f))),
            (m = (o = x) - (_ = (v = i + o) - i)) && (s[a++] = m),
            x = E - ((d = E + v) - (y = d - E)) + (v - y),
            E = d;
        for (; u < n; )
            (m = (o = x) - (_ = (v = (i = h) + o) - i)) && (s[a++] = m),
            x = E - ((d = E + v) - (y = d - E)) + (v - y),
            E = d,
            (u += 1) < n && (h = t[u]);
        for (; l < r; )
            (m = (o = x) - (_ = (v = (i = f) + o) - i)) && (s[a++] = m),
            x = E - ((d = E + v) - (y = d - E)) + (v - y),
            E = d,
            (l += 1) < r && (f = e[l]);
        x && (s[a++] = x);
        E && (s[a++] = E);
        a || (s[a++] = 0);
        return s.length = a,
        s
    };
    var Vt = function(t, e, n) {
        var r = t + e
          , i = r - t
          , o = e - i
          , s = t - (r - i);
        if (n)
            return n[0] = s + o,
            n[1] = r,
            n;
        return [s + o, r]
    };
    var Xt = function(t, e) {
        var n = t.length;
        if (1 === n) {
            var r = zt(t[0], e);
            return r[0] ? r : [r[1]]
        }
        var i = new Array(2 * n)
          , o = [.1, .1]
          , s = [.1, .1]
          , a = 0;
        zt(t[0], e, o),
        o[0] && (i[a++] = o[0]);
        for (var u = 1; u < n; ++u) {
            zt(t[u], e, s);
            var l = o[1];
            Vt(l, s[0], o),
            o[0] && (i[a++] = o[0]);
            var c = s[1]
              , h = o[1]
              , p = c + h
              , f = h - (p - c);
            o[1] = p,
            f && (i[a++] = f)
        }
        o[1] && (i[a++] = o[1]);
        0 === a && (i[a++] = 0);
        return i.length = a,
        i
    };
    var Yt = function(t, e) {
        var n = 0 | t.length
          , r = 0 | e.length;
        if (1 === n && 1 === r)
            return function(t, e) {
                var n = t + e
                  , r = n - t
                  , i = t - (n - r) + (e - r);
                if (i)
                    return [i, n];
                return [n]
            }(t[0], -e[0]);
        var i, o, s = new Array(n + r), a = 0, u = 0, l = 0, c = Math.abs, h = t[u], p = c(h), f = -e[l], g = c(f);
        p < g ? (o = h,
        (u += 1) < n && (h = t[u],
        p = c(h))) : (o = f,
        (l += 1) < r && (f = -e[l],
        g = c(f)));
        u < n && p < g || l >= r ? (i = h,
        (u += 1) < n && (h = t[u],
        p = c(h))) : (i = f,
        (l += 1) < r && (f = -e[l],
        g = c(f)));
        var d, y, v = i + o, _ = v - i, m = o - _, x = m, E = v;
        for (; u < n && l < r; )
            p < g ? (i = h,
            (u += 1) < n && (h = t[u],
            p = c(h))) : (i = f,
            (l += 1) < r && (f = -e[l],
            g = c(f))),
            (m = (o = x) - (_ = (v = i + o) - i)) && (s[a++] = m),
            x = E - ((d = E + v) - (y = d - E)) + (v - y),
            E = d;
        for (; u < n; )
            (m = (o = x) - (_ = (v = (i = h) + o) - i)) && (s[a++] = m),
            x = E - ((d = E + v) - (y = d - E)) + (v - y),
            E = d,
            (u += 1) < n && (h = t[u]);
        for (; l < r; )
            (m = (o = x) - (_ = (v = (i = f) + o) - i)) && (s[a++] = m),
            x = E - ((d = E + v) - (y = d - E)) + (v - y),
            E = d,
            (l += 1) < r && (f = -e[l]);
        x && (s[a++] = x);
        E && (s[a++] = E);
        a || (s[a++] = 0);
        return s.length = a,
        s
    };
    var Ht = Bt((function(t) {
        function e(t, e) {
            for (var n = new Array(t.length - 1), r = 1; r < t.length; ++r)
                for (var i = n[r - 1] = new Array(t.length - 1), o = 0, s = 0; o < t.length; ++o)
                    o !== e && (i[s++] = t[r][o]);
            return n
        }
        function n(t) {
            if (1 === t.length)
                return t[0];
            if (2 === t.length)
                return ["sum(", t[0], ",", t[1], ")"].join("");
            var e = t.length >> 1;
            return ["sum(", n(t.slice(0, e)), ",", n(t.slice(e)), ")"].join("")
        }
        function r(t) {
            if (2 === t.length)
                return [["sum(prod(", t[0][0], ",", t[1][1], "),prod(-", t[0][1], ",", t[1][0], "))"].join("")];
            for (var i = [], o = 0; o < t.length; ++o)
                i.push(["scale(", n(r(e(t, o))), ",", (s = o,
                1 & s ? "-" : ""), t[0][o], ")"].join(""));
            return i;
            var s
        }
        function i(t) {
            for (var i = [], o = [], s = function(t) {
                for (var e = new Array(t), n = 0; n < t; ++n) {
                    e[n] = new Array(t);
                    for (var r = 0; r < t; ++r)
                        e[n][r] = ["m", r, "[", t - n - 1, "]"].join("")
                }
                return e
            }(t), a = [], u = 0; u < t; ++u)
                0 == (1 & u) ? i.push.apply(i, r(e(s, u))) : o.push.apply(o, r(e(s, u))),
                a.push("m" + u);
            var l = n(i)
              , c = n(o)
              , h = "orientation" + t + "Exact"
              , p = ["function ", h, "(", a.join(), "){var p=", l, ",n=", c, ",d=sub(p,n);return d[d.length-1];};return ", h].join("");
            return new Function("sum","prod","scale","sub",p)(Ut, zt, Xt, Yt)
        }
        var o = i(3)
          , s = i(4)
          , a = [function() {
            return 0
        }
        , function() {
            return 0
        }
        , function(t, e) {
            return e[0] - t[0]
        }
        , function(t, e, n) {
            var r, i = (t[1] - n[1]) * (e[0] - n[0]), s = (t[0] - n[0]) * (e[1] - n[1]), a = i - s;
            if (i > 0) {
                if (s <= 0)
                    return a;
                r = i + s
            } else {
                if (!(i < 0))
                    return a;
                if (s >= 0)
                    return a;
                r = -(i + s)
            }
            var u = 33306690738754716e-32 * r;
            return a >= u || a <= -u ? a : o(t, e, n)
        }
        , function(t, e, n, r) {
            var i = t[0] - r[0]
              , o = e[0] - r[0]
              , a = n[0] - r[0]
              , u = t[1] - r[1]
              , l = e[1] - r[1]
              , c = n[1] - r[1]
              , h = t[2] - r[2]
              , p = e[2] - r[2]
              , f = n[2] - r[2]
              , g = o * c
              , d = a * l
              , y = a * u
              , v = i * c
              , _ = i * l
              , m = o * u
              , x = h * (g - d) + p * (y - v) + f * (_ - m)
              , E = 7771561172376103e-31 * ((Math.abs(g) + Math.abs(d)) * Math.abs(h) + (Math.abs(y) + Math.abs(v)) * Math.abs(p) + (Math.abs(_) + Math.abs(m)) * Math.abs(f));
            return x > E || -x > E ? x : s(t, e, n, r)
        }
        ];
        function u(t) {
            var e = a[t.length];
            return e || (e = a[t.length] = i(t.length)),
            e.apply(void 0, t)
        }
        !function() {
            for (; a.length <= 5; )
                a.push(i(a.length));
            for (var e = [], n = ["slow"], r = 0; r <= 5; ++r)
                e.push("a" + r),
                n.push("o" + r);
            var o = ["function getOrientation(", e.join(), "){switch(arguments.length){case 0:case 1:return 0;"];
            for (r = 2; r <= 5; ++r)
                o.push("case ", r, ":return o", r, "(", e.slice(0, r).join(), ");");
            o.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return getOrientation"),
            n.push(o.join(""));
            var s = Function.apply(void 0, n);
            for (t.exports = s.apply(void 0, [u].concat(a)),
            r = 0; r <= 5; ++r)
                t.exports[r] = a[r]
        }()
    }
    ))
      , Wt = function(t) {
        var e = t.length;
        if (e < 3) {
            for (var n = new Array(e), r = 0; r < e; ++r)
                n[r] = r;
            return 2 === e && t[0][0] === t[1][0] && t[0][1] === t[1][1] ? [0] : n
        }
        var i = new Array(e);
        for (r = 0; r < e; ++r)
            i[r] = r;
        i.sort((function(e, n) {
            var r = t[e][0] - t[n][0];
            return r || t[e][1] - t[n][1]
        }
        ));
        var o = [i[0], i[1]]
          , s = [i[0], i[1]];
        for (r = 2; r < e; ++r) {
            for (var a = i[r], u = t[a], l = o.length; l > 1 && Jt(t[o[l - 2]], t[o[l - 1]], u) <= 0; )
                l -= 1,
                o.pop();
            for (o.push(a),
            l = s.length; l > 1 && Jt(t[s[l - 2]], t[s[l - 1]], u) >= 0; )
                l -= 1,
                s.pop();
            s.push(a)
        }
        n = new Array(s.length + o.length - 2);
        for (var c = 0, h = (r = 0,
        o.length); r < h; ++r)
            n[c++] = o[r];
        for (var p = s.length - 2; p > 0; --p)
            n[c++] = s[p];
        return n
    }
      , Jt = Ht[3];
    var Zt = Qt
      , Kt = Qt;
    function Qt(t, e) {
        if (!(this instanceof Qt))
            return new Qt(t,e);
        if (this.data = t || [],
        this.length = this.data.length,
        this.compare = e || $t,
        this.length > 0)
            for (var n = (this.length >> 1) - 1; n >= 0; n--)
                this._down(n)
    }
    function $t(t, e) {
        return t < e ? -1 : t > e ? 1 : 0
    }
    Qt.prototype = {
        push: function(t) {
            this.data.push(t),
            this.length++,
            this._up(this.length - 1)
        },
        pop: function() {
            if (0 !== this.length) {
                var t = this.data[0];
                return this.length--,
                this.length > 0 && (this.data[0] = this.data[this.length],
                this._down(0)),
                this.data.pop(),
                t
            }
        },
        peek: function() {
            return this.data[0]
        },
        _up: function(t) {
            for (var e = this.data, n = this.compare, r = e[t]; t > 0; ) {
                var i = t - 1 >> 1
                  , o = e[i];
                if (n(r, o) >= 0)
                    break;
                e[t] = o,
                t = i
            }
            e[t] = r
        },
        _down: function(t) {
            for (var e = this.data, n = this.compare, r = this.length >> 1, i = e[t]; t < r; ) {
                var o = 1 + (t << 1)
                  , s = o + 1
                  , a = e[o];
                if (s < this.length && n(e[s], a) < 0 && (o = s,
                a = e[s]),
                n(a, i) >= 0)
                    break;
                e[t] = a,
                t = o
            }
            e[t] = i
        }
    },
    Zt.default = Kt;
    var te = function(t, e) {
        for (var n = t[0], r = t[1], i = !1, o = 0, s = e.length - 1; o < e.length; s = o++) {
            var a = e[o][0]
              , u = e[o][1]
              , l = e[s][0]
              , c = e[s][1];
            u > r != c > r && n < (l - a) * (r - u) / (c - u) + a && (i = !i)
        }
        return i
    }
      , ee = Ht[3]
      , ne = ie
      , re = ie;
    function ie(t, e, n) {
        e = Math.max(0, void 0 === e ? 2 : e),
        n = n || 0;
        for (var r, i = function(t) {
            for (var e = t[0], n = t[0], r = t[0], i = t[0], o = 0; o < t.length; o++) {
                var s = t[o];
                s[0] < e[0] && (e = s),
                s[0] > r[0] && (r = s),
                s[1] < n[1] && (n = s),
                s[1] > i[1] && (i = s)
            }
            var a = [e, n, r, i]
              , u = a.slice();
            for (o = 0; o < t.length; o++)
                te(t[o], a) || u.push(t[o]);
            var l = Wt(u)
              , c = [];
            for (o = 0; o < l.length; o++)
                c.push(u[l[o]]);
            return c
        }(t), o = Nt(16, ["[0]", "[1]", "[0]", "[1]"]).load(t), s = [], a = 0; a < i.length; a++) {
            var u = i[a];
            o.remove(u),
            r = he(u, r),
            s.push(r)
        }
        var l = Nt(16);
        for (a = 0; a < s.length; a++)
            l.insert(ce(s[a]));
        for (var c = e * e, h = n * n; s.length; ) {
            var p = s.shift()
              , f = p.p
              , g = p.next.p
              , d = pe(f, g);
            if (!(d < h)) {
                var y = d / c;
                (u = oe(o, p.prev.p, f, g, p.next.next.p, y, l)) && Math.min(pe(u, f), pe(u, g)) <= y && (s.push(p),
                s.push(he(u, p)),
                o.remove(u),
                l.remove(p),
                l.insert(ce(p)),
                l.insert(ce(p.next)))
            }
        }
        p = r;
        var v = [];
        do {
            v.push(p.p),
            p = p.next
        } while (p !== r);
        return v.push(p.p),
        v
    }
    function oe(t, e, n, r, i, o, s) {
        for (var a = new Zt(null,se), u = t.data; u; ) {
            for (var l = 0; l < u.children.length; l++) {
                var c = u.children[l]
                  , h = u.leaf ? fe(c, n, r) : ae(n, r, c);
                h > o || a.push({
                    node: c,
                    dist: h
                })
            }
            for (; a.length && !a.peek().node.children; ) {
                var p = a.pop()
                  , f = p.node
                  , g = fe(f, e, n)
                  , d = fe(f, r, i);
                if (p.dist < g && p.dist < d && le(n, f, s) && le(r, f, s))
                    return f
            }
            (u = a.pop()) && (u = u.node)
        }
        return null
    }
    function se(t, e) {
        return t.dist - e.dist
    }
    function ae(t, e, n) {
        if (ue(t, n) || ue(e, n))
            return 0;
        var r = ge(t[0], t[1], e[0], e[1], n.minX, n.minY, n.maxX, n.minY);
        if (0 === r)
            return 0;
        var i = ge(t[0], t[1], e[0], e[1], n.minX, n.minY, n.minX, n.maxY);
        if (0 === i)
            return 0;
        var o = ge(t[0], t[1], e[0], e[1], n.maxX, n.minY, n.maxX, n.maxY);
        if (0 === o)
            return 0;
        var s = ge(t[0], t[1], e[0], e[1], n.minX, n.maxY, n.maxX, n.maxY);
        return 0 === s ? 0 : Math.min(r, i, o, s)
    }
    function ue(t, e) {
        return t[0] >= e.minX && t[0] <= e.maxX && t[1] >= e.minY && t[1] <= e.maxY
    }
    function le(t, e, n) {
        for (var r, i, o, s, a = Math.min(t[0], e[0]), u = Math.min(t[1], e[1]), l = Math.max(t[0], e[0]), c = Math.max(t[1], e[1]), h = n.search({
            minX: a,
            minY: u,
            maxX: l,
            maxY: c
        }), p = 0; p < h.length; p++)
            if (r = h[p].p,
            i = h[p].next.p,
            o = t,
            r !== (s = e) && i !== o && ee(r, i, o) > 0 != ee(r, i, s) > 0 && ee(o, s, r) > 0 != ee(o, s, i) > 0)
                return !1;
        return !0
    }
    function ce(t) {
        var e = t.p
          , n = t.next.p;
        return t.minX = Math.min(e[0], n[0]),
        t.minY = Math.min(e[1], n[1]),
        t.maxX = Math.max(e[0], n[0]),
        t.maxY = Math.max(e[1], n[1]),
        t
    }
    function he(t, e) {
        var n = {
            p: t,
            prev: null,
            next: null,
            minX: 0,
            minY: 0,
            maxX: 0,
            maxY: 0
        };
        return e ? (n.next = e.next,
        n.prev = e,
        e.next.prev = n,
        e.next = n) : (n.prev = n,
        n.next = n),
        n
    }
    function pe(t, e) {
        var n = t[0] - e[0]
          , r = t[1] - e[1];
        return n * n + r * r
    }
    function fe(t, e, n) {
        var r = e[0]
          , i = e[1]
          , o = n[0] - r
          , s = n[1] - i;
        if (0 !== o || 0 !== s) {
            var a = ((t[0] - r) * o + (t[1] - i) * s) / (o * o + s * s);
            a > 1 ? (r = n[0],
            i = n[1]) : a > 0 && (r += o * a,
            i += s * a)
        }
        return (o = t[0] - r) * o + (s = t[1] - i) * s
    }
    function ge(t, e, n, r, i, o, s, a) {
        var u, l, c, h, p = n - t, f = r - e, g = s - i, d = a - o, y = t - i, v = e - o, _ = p * p + f * f, m = p * g + f * d, x = g * g + d * d, E = p * y + f * v, b = g * y + d * v, w = _ * x - m * m, I = w, N = w;
        0 === w ? (l = 0,
        I = 1,
        h = b,
        N = x) : (h = _ * b - m * E,
        (l = m * b - x * E) < 0 ? (l = 0,
        h = b,
        N = x) : l > I && (l = I,
        h = b + m,
        N = x)),
        h < 0 ? (h = 0,
        -E < 0 ? l = 0 : -E > _ ? l = I : (l = -E,
        I = _)) : h > N && (h = N,
        -E + m < 0 ? l = 0 : -E + m > _ ? l = I : (l = -E + m,
        I = _));
        var S = (1 - (c = 0 === h ? 0 : h / N)) * i + c * s - ((1 - (u = 0 === l ? 0 : l / I)) * t + u * n)
          , C = (1 - c) * o + c * a - ((1 - u) * e + u * r);
        return S * S + C * C
    }
    function de(t, e) {
        void 0 === e && (e = {}),
        e.concavity = e.concavity || 1 / 0;
        var n = [];
        if (R(t, (function(t) {
            n.push([t[0], t[1]])
        }
        )),
        !n.length)
            return null;
        var r = ne(n, e.concavity);
        return r.length > 3 ? l([r]) : null
    }
    function ye(t, e, n) {
        if (void 0 === n && (n = {}),
        !t)
            throw new Error("point is required");
        if (!e)
            throw new Error("polygon is required");
        var r = K(t)
          , i = rt(e)
          , o = i.type
          , s = e.bbox
          , a = i.coordinates;
        if (s && !1 === function(t, e) {
            return e[0] <= t[0] && e[1] <= t[1] && e[2] >= t[0] && e[3] >= t[1]
        }(r, s))
            return !1;
        "Polygon" === o && (a = [a]);
        for (var u = !1, l = 0; l < a.length && !u; l++)
            if (ve(r, a[l][0], n.ignoreBoundary)) {
                for (var c = !1, h = 1; h < a[l].length && !c; )
                    ve(r, a[l][h], !n.ignoreBoundary) && (c = !0),
                    h++;
                c || (u = !0)
            }
        return u
    }
    function ve(t, e, n) {
        var r = !1;
        e[0][0] === e[e.length - 1][0] && e[0][1] === e[e.length - 1][1] && (e = e.slice(0, e.length - 1));
        for (var i = 0, o = e.length - 1; i < e.length; o = i++) {
            var s = e[i][0]
              , a = e[i][1]
              , u = e[o][0]
              , l = e[o][1];
            if (t[1] * (s - u) + a * (u - t[0]) + l * (t[0] - s) == 0 && (s - t[0]) * (u - t[0]) <= 0 && (a - t[1]) * (l - t[1]) <= 0)
                return !n;
            a > t[1] != l > t[1] && t[0] < (u - s) * (t[1] - a) / (l - a) + s && (r = !r)
        }
        return r
    }
    function _e(t, e) {
        var n = [];
        return F(t, (function(t) {
            var r = !1;
            if ("Point" === t.geometry.type)
                q(e, (function(e) {
                    ye(t, e) && (r = !0)
                }
                )),
                r && n.push(t);
            else {
                if ("MultiPoint" !== t.geometry.type)
                    throw new Error("Input geometry must be a Point or MultiPoint");
                var i = [];
                q(e, (function(e) {
                    R(t, (function(t) {
                        ye(t, e) && (r = !0,
                        i.push(t))
                    }
                    ))
                }
                )),
                r && n.push(d(i))
            }
        }
        )),
        f(n)
    }
    function me(t, e, n) {
        void 0 === n && (n = {});
        var r = K(t)
          , i = K(e)
          , o = I(i[1] - r[1])
          , s = I(i[0] - r[0])
          , a = I(r[1])
          , u = I(i[1])
          , l = Math.pow(Math.sin(o / 2), 2) + Math.pow(Math.sin(s / 2), 2) * Math.cos(a) * Math.cos(u);
        return m(2 * Math.atan2(Math.sqrt(l), Math.sqrt(1 - l)), n.units)
    }
    function xe(t, e) {
        var n = !1;
        return f(function(t) {
            if (t.length < 3)
                return [];
            t.sort(be);
            var e, n, r, i, o, s, a = t.length - 1, u = t[a].x, l = t[0].x, c = t[a].y, h = c, p = 1e-12;
            for (; a--; )
                t[a].y < c && (c = t[a].y),
                t[a].y > h && (h = t[a].y);
            var f, g = l - u, d = h - c, y = g > d ? g : d, v = .5 * (l + u), _ = .5 * (h + c), m = [new Ee({
                __sentinel: !0,
                x: v - 20 * y,
                y: _ - y
            },{
                __sentinel: !0,
                x: v,
                y: _ + 20 * y
            },{
                __sentinel: !0,
                x: v + 20 * y,
                y: _ - y
            })], x = [], E = [];
            a = t.length;
            for (; a--; ) {
                for (E.length = 0,
                f = m.length; f--; )
                    (g = t[a].x - m[f].x) > 0 && g * g > m[f].r ? (x.push(m[f]),
                    m.splice(f, 1)) : g * g + (d = t[a].y - m[f].y) * d > m[f].r || (E.push(m[f].a, m[f].b, m[f].b, m[f].c, m[f].c, m[f].a),
                    m.splice(f, 1));
                for (we(E),
                f = E.length; f; )
                    n = E[--f],
                    e = E[--f],
                    r = t[a],
                    i = n.x - e.x,
                    o = n.y - e.y,
                    s = 2 * (i * (r.y - n.y) - o * (r.x - n.x)),
                    Math.abs(s) > p && m.push(new Ee(e,n,r))
            }
            Array.prototype.push.apply(x, m),
            a = x.length;
            for (; a--; )
                (x[a].a.__sentinel || x[a].b.__sentinel || x[a].c.__sentinel) && x.splice(a, 1);
            return x
        }(t.features.map((function(t) {
            var r = {
                x: t.geometry.coordinates[0],
                y: t.geometry.coordinates[1]
            };
            return e ? r.z = t.properties[e] : 3 === t.geometry.coordinates.length && (n = !0,
            r.z = t.geometry.coordinates[2]),
            r
        }
        ))).map((function(t) {
            var e = [t.a.x, t.a.y]
              , r = [t.b.x, t.b.y]
              , i = [t.c.x, t.c.y]
              , o = {};
            return n ? (e.push(t.a.z),
            r.push(t.b.z),
            i.push(t.c.z)) : o = {
                a: t.a.z,
                b: t.b.z,
                c: t.c.z
            },
            l([[e, r, i, e]], o)
        }
        )))
    }
    ne.default = re;
    var Ee = function(t, e, n) {
        this.a = t,
        this.b = e,
        this.c = n;
        var r, i, o = e.x - t.x, s = e.y - t.y, a = n.x - t.x, u = n.y - t.y, l = o * (t.x + e.x) + s * (t.y + e.y), c = a * (t.x + n.x) + u * (t.y + n.y), h = 2 * (o * (n.y - e.y) - s * (n.x - e.x));
        this.x = (u * l - s * c) / h,
        this.y = (o * c - a * l) / h,
        r = this.x - t.x,
        i = this.y - t.y,
        this.r = r * r + i * i
    };
    function be(t, e) {
        return e.x - t.x
    }
    function we(t) {
        var e, n, r, i, o, s = t.length;
        t: for (; s; )
            for (n = t[--s],
            e = t[--s],
            r = s; r; )
                if (o = t[--r],
                e === (i = t[--r]) && n === o || e === o && n === i) {
                    t.splice(s, 2),
                    t.splice(r, 2),
                    s -= 2;
                    continue t
                }
    }
    function Ie(t) {
        if (!t)
            throw new Error("geojson is required");
        switch (t.type) {
        case "Feature":
            return Ne(t);
        case "FeatureCollection":
            return function(t) {
                var e = {
                    type: "FeatureCollection"
                };
                return Object.keys(t).forEach((function(n) {
                    switch (n) {
                    case "type":
                    case "features":
                        return;
                    default:
                        e[n] = t[n]
                    }
                }
                )),
                e.features = t.features.map((function(t) {
                    return Ne(t)
                }
                )),
                e
            }(t);
        case "Point":
        case "LineString":
        case "Polygon":
        case "MultiPoint":
        case "MultiLineString":
        case "MultiPolygon":
        case "GeometryCollection":
            return Ce(t);
        default:
            throw new Error("unknown GeoJSON type")
        }
    }
    function Ne(t) {
        var e = {
            type: "Feature"
        };
        return Object.keys(t).forEach((function(n) {
            switch (n) {
            case "type":
            case "properties":
            case "geometry":
                return;
            default:
                e[n] = t[n]
            }
        }
        )),
        e.properties = Se(t.properties),
        e.geometry = Ce(t.geometry),
        e
    }
    function Se(t) {
        var e = {};
        return t ? (Object.keys(t).forEach((function(n) {
            var r = t[n];
            "object" == typeof r ? null === r ? e[n] = null : Array.isArray(r) ? e[n] = r.map((function(t) {
                return t
            }
            )) : e[n] = Se(r) : e[n] = r
        }
        )),
        e) : e
    }
    function Ce(t) {
        var e = {
            type: t.type
        };
        return t.bbox && (e.bbox = t.bbox),
        "GeometryCollection" === t.type ? (e.geometries = t.geometries.map((function(t) {
            return Ce(t)
        }
        )),
        e) : (e.coordinates = Pe(t.coordinates),
        e)
    }
    function Pe(t) {
        var e = t;
        return "object" != typeof e[0] ? e.slice() : e.map((function(t) {
            return Pe(t)
        }
        ))
    }
    function Me(t, e) {
        if (void 0 === e && (e = {}),
        !P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.mutate;
        if ("FeatureCollection" !== it(t))
            throw new Error("geojson must be a FeatureCollection");
        if (!t.features.length)
            throw new Error("geojson is empty");
        !1 !== n && void 0 !== n || (t = Ie(t));
        var r = []
          , i = Y(t, (function(t, e) {
            var n = function(t, e) {
                var n, r = t.geometry.coordinates, i = e.geometry.coordinates, o = Le(r[0]), s = Le(r[r.length - 1]), a = Le(i[0]), u = Le(i[i.length - 1]);
                if (o === u)
                    n = i.concat(r.slice(1));
                else if (a === s)
                    n = r.concat(i.slice(1));
                else if (o === a)
                    n = r.slice(1).reverse().concat(i);
                else {
                    if (s !== u)
                        return null;
                    n = r.concat(i.reverse().slice(1))
                }
                return h(n)
            }(t, e);
            return n || (r.push(t),
            e)
        }
        ));
        return i && r.push(i),
        r.length ? 1 === r.length ? r[0] : g(r.map((function(t) {
            return t.coordinates
        }
        ))) : null
    }
    function Le(t) {
        return t[0].toString() + "," + t[1].toString()
    }
    function Oe(t) {
        return t
    }
    function Re(t, e) {
        var n = function(t) {
            if (null == t)
                return Oe;
            var e, n, r = t.scale[0], i = t.scale[1], o = t.translate[0], s = t.translate[1];
            return function(t, a) {
                a || (e = n = 0);
                var u = 2
                  , l = t.length
                  , c = new Array(l);
                for (c[0] = (e += t[0]) * r + o,
                c[1] = (n += t[1]) * i + s; u < l; )
                    c[u] = t[u],
                    ++u;
                return c
            }
        }(t.transform)
          , r = t.arcs;
        function i(t, e) {
            e.length && e.pop();
            for (var i = r[t < 0 ? ~t : t], o = 0, s = i.length; o < s; ++o)
                e.push(n(i[o], o));
            t < 0 && function(t, e) {
                for (var n, r = t.length, i = r - e; i < --r; )
                    n = t[i],
                    t[i++] = t[r],
                    t[r] = n
            }(e, s)
        }
        function o(t) {
            return n(t)
        }
        function s(t) {
            for (var e = [], n = 0, r = t.length; n < r; ++n)
                i(t[n], e);
            return e.length < 2 && e.push(e[0]),
            e
        }
        function a(t) {
            for (var e = s(t); e.length < 4; )
                e.push(e[0]);
            return e
        }
        function u(t) {
            return t.map(a)
        }
        return function t(e) {
            var n, r = e.type;
            switch (r) {
            case "GeometryCollection":
                return {
                    type: r,
                    geometries: e.geometries.map(t)
                };
            case "Point":
                n = o(e.coordinates);
                break;
            case "MultiPoint":
                n = e.coordinates.map(o);
                break;
            case "LineString":
                n = s(e.arcs);
                break;
            case "MultiLineString":
                n = e.arcs.map(s);
                break;
            case "Polygon":
                n = u(e.arcs);
                break;
            case "MultiPolygon":
                n = e.arcs.map(u);
                break;
            default:
                return null
            }
            return {
                type: r,
                coordinates: n
            }
        }(e)
    }
    function Te(t, e) {
        var n = {}
          , r = {}
          , i = {}
          , o = []
          , s = -1;
        function a(t, e) {
            for (var r in t) {
                var i = t[r];
                delete e[i.start],
                delete i.start,
                delete i.end,
                i.forEach((function(t) {
                    n[t < 0 ? ~t : t] = 1
                }
                )),
                o.push(i)
            }
        }
        return e.forEach((function(n, r) {
            var i, o = t.arcs[n < 0 ? ~n : n];
            o.length < 3 && !o[1][0] && !o[1][1] && (i = e[++s],
            e[s] = n,
            e[r] = i)
        }
        )),
        e.forEach((function(e) {
            var n, o, s = function(e) {
                var n, r = t.arcs[e < 0 ? ~e : e], i = r[0];
                t.transform ? (n = [0, 0],
                r.forEach((function(t) {
                    n[0] += t[0],
                    n[1] += t[1]
                }
                ))) : n = r[r.length - 1];
                return e < 0 ? [n, i] : [i, n]
            }(e), a = s[0], u = s[1];
            if (n = i[a])
                if (delete i[n.end],
                n.push(e),
                n.end = u,
                o = r[u]) {
                    delete r[o.start];
                    var l = o === n ? n : n.concat(o);
                    r[l.start = n.start] = i[l.end = o.end] = l
                } else
                    r[n.start] = i[n.end] = n;
            else if (n = r[u])
                if (delete r[n.start],
                n.unshift(e),
                n.start = a,
                o = i[a]) {
                    delete i[o.end];
                    var c = o === n ? n : o.concat(n);
                    r[c.start = o.start] = i[c.end = n.end] = c
                } else
                    r[n.start] = i[n.end] = n;
            else
                r[(n = [e]).start = a] = i[n.end = u] = n
        }
        )),
        a(i, r),
        a(r, i),
        e.forEach((function(t) {
            n[t < 0 ? ~t : t] || o.push([t])
        }
        )),
        o
    }
    function Ae(t, e) {
        var n = {}
          , r = []
          , i = [];
        function o(t) {
            t.forEach((function(e) {
                e.forEach((function(e) {
                    (n[e = e < 0 ? ~e : e] || (n[e] = [])).push(t)
                }
                ))
            }
            )),
            r.push(t)
        }
        function s(e) {
            return function(t) {
                for (var e, n = -1, r = t.length, i = t[r - 1], o = 0; ++n < r; )
                    e = i,
                    i = t[n],
                    o += e[0] * i[1] - e[1] * i[0];
                return Math.abs(o)
            }(Re(t, {
                type: "Polygon",
                arcs: [e]
            }).coordinates[0])
        }
        return e.forEach((function t(e) {
            switch (e.type) {
            case "GeometryCollection":
                e.geometries.forEach(t);
                break;
            case "Polygon":
                o(e.arcs);
                break;
            case "MultiPolygon":
                e.arcs.forEach(o)
            }
        }
        )),
        r.forEach((function(t) {
            if (!t._) {
                var e = []
                  , r = [t];
                for (t._ = 1,
                i.push(e); t = r.pop(); )
                    e.push(t),
                    t.forEach((function(t) {
                        t.forEach((function(t) {
                            n[t < 0 ? ~t : t].forEach((function(t) {
                                t._ || (t._ = 1,
                                r.push(t))
                            }
                            ))
                        }
                        ))
                    }
                    ))
            }
        }
        )),
        r.forEach((function(t) {
            delete t._
        }
        )),
        {
            type: "MultiPolygon",
            arcs: i.map((function(e) {
                var r, i = [];
                if (e.forEach((function(t) {
                    t.forEach((function(t) {
                        t.forEach((function(t) {
                            n[t < 0 ? ~t : t].length < 2 && i.push(t)
                        }
                        ))
                    }
                    ))
                }
                )),
                (r = (i = Te(t, i)).length) > 1)
                    for (var o, a, u = 1, l = s(i[0]); u < r; ++u)
                        (o = s(i[u])) > l && (a = i[0],
                        i[0] = i[u],
                        i[u] = a,
                        l = o);
                return i
            }
            )).filter((function(t) {
                return t.length > 0
            }
            ))
        }
    }
    var De = Object.prototype.hasOwnProperty;
    function Fe(t, e, n, r, i, o) {
        3 === arguments.length && (r = o = Array,
        i = null);
        for (var s = new r(t = 1 << Math.max(4, Math.ceil(Math.log(t) / Math.LN2))), a = new o(t), u = t - 1, l = 0; l < t; ++l)
            s[l] = i;
        function c(r, o) {
            for (var l = e(r) & u, c = s[l], h = 0; c != i; ) {
                if (n(c, r))
                    return a[l] = o;
                if (++h >= t)
                    throw new Error("full hashmap");
                c = s[l = l + 1 & u]
            }
            return s[l] = r,
            a[l] = o,
            o
        }
        function h(r, o) {
            for (var l = e(r) & u, c = s[l], h = 0; c != i; ) {
                if (n(c, r))
                    return a[l];
                if (++h >= t)
                    throw new Error("full hashmap");
                c = s[l = l + 1 & u]
            }
            return s[l] = r,
            a[l] = o,
            o
        }
        function p(r, o) {
            for (var l = e(r) & u, c = s[l], h = 0; c != i; ) {
                if (n(c, r))
                    return a[l];
                if (++h >= t)
                    break;
                c = s[l = l + 1 & u]
            }
            return o
        }
        function f() {
            for (var t = [], e = 0, n = s.length; e < n; ++e) {
                var r = s[e];
                r != i && t.push(r)
            }
            return t
        }
        return {
            set: c,
            maybeSet: h,
            get: p,
            keys: f
        }
    }
    function ke(t, e) {
        return t[0] === e[0] && t[1] === e[1]
    }
    var Ge = new ArrayBuffer(16)
      , qe = new Float64Array(Ge)
      , Be = new Uint32Array(Ge);
    function ze(t) {
        qe[0] = t[0],
        qe[1] = t[1];
        var e = Be[0] ^ Be[1];
        return 2147483647 & (e = e << 5 ^ e >> 7 ^ Be[2] ^ Be[3])
    }
    function je(t) {
        var e, n, r, i, o = t.coordinates, s = t.lines, a = t.rings, u = function() {
            for (var t = Fe(1.4 * o.length, E, b, Int32Array, -1, Int32Array), e = new Int32Array(o.length), n = 0, r = o.length; n < r; ++n)
                e[n] = t.maybeSet(n, n);
            return e
        }(), l = new Int32Array(o.length), c = new Int32Array(o.length), h = new Int32Array(o.length), p = new Int8Array(o.length), f = 0;
        for (e = 0,
        n = o.length; e < n; ++e)
            l[e] = c[e] = h[e] = -1;
        for (e = 0,
        n = s.length; e < n; ++e) {
            var g = s[e]
              , d = g[0]
              , y = g[1];
            for (r = u[d],
            i = u[++d],
            ++f,
            p[r] = 1; ++d <= y; )
                x(e, r, r = i, i = u[d]);
            ++f,
            p[i] = 1
        }
        for (e = 0,
        n = o.length; e < n; ++e)
            l[e] = -1;
        for (e = 0,
        n = a.length; e < n; ++e) {
            var v = a[e]
              , _ = v[0] + 1
              , m = v[1];
            for (x(e, u[m - 1], r = u[_ - 1], i = u[_]); ++_ <= m; )
                x(e, r, r = i, i = u[_])
        }
        function x(t, e, n, r) {
            if (l[n] !== t) {
                l[n] = t;
                var i = c[n];
                if (i >= 0) {
                    var o = h[n];
                    i === e && o === r || i === r && o === e || (++f,
                    p[n] = 1)
                } else
                    c[n] = e,
                    h[n] = r
            }
        }
        function E(t) {
            return ze(o[t])
        }
        function b(t, e) {
            return ke(o[t], o[e])
        }
        l = c = h = null;
        var w, I = function(t, e, n, r, i) {
            3 === arguments.length && (r = Array,
            i = null);
            for (var o = new r(t = 1 << Math.max(4, Math.ceil(Math.log(t) / Math.LN2))), s = t - 1, a = 0; a < t; ++a)
                o[a] = i;
            function u(r) {
                for (var a = e(r) & s, u = o[a], l = 0; u != i; ) {
                    if (n(u, r))
                        return !0;
                    if (++l >= t)
                        throw new Error("full hashset");
                    u = o[a = a + 1 & s]
                }
                return o[a] = r,
                !0
            }
            function l(r) {
                for (var a = e(r) & s, u = o[a], l = 0; u != i; ) {
                    if (n(u, r))
                        return !0;
                    if (++l >= t)
                        break;
                    u = o[a = a + 1 & s]
                }
                return !1
            }
            function c() {
                for (var t = [], e = 0, n = o.length; e < n; ++e) {
                    var r = o[e];
                    r != i && t.push(r)
                }
                return t
            }
            return {
                add: u,
                has: l,
                values: c
            }
        }(1.4 * f, ze, ke);
        for (e = 0,
        n = o.length; e < n; ++e)
            p[w = u[e]] && I.add(o[w]);
        return I
    }
    function Ue(t, e, n, r) {
        Ve(t, e, n),
        Ve(t, e, e + r),
        Ve(t, e + r, n)
    }
    function Ve(t, e, n) {
        for (var r, i = e + (n-- - e >> 1); e < i; ++e,
        --n)
            r = t[e],
            t[e] = t[n],
            t[n] = r
    }
    function Xe(t) {
        var e, n, r = {};
        for (e in t)
            r[e] = null == (n = t[e]) ? {
                type: null
            } : ("FeatureCollection" === n.type ? Ye : "Feature" === n.type ? He : We)(n);
        return r
    }
    function Ye(t) {
        var e = {
            type: "GeometryCollection",
            geometries: t.features.map(He)
        };
        return null != t.bbox && (e.bbox = t.bbox),
        e
    }
    function He(t) {
        var e, n = We(t.geometry);
        for (e in null != t.id && (n.id = t.id),
        null != t.bbox && (n.bbox = t.bbox),
        t.properties) {
            n.properties = t.properties;
            break
        }
        return n
    }
    function We(t) {
        if (null == t)
            return {
                type: null
            };
        var e = "GeometryCollection" === t.type ? {
            type: "GeometryCollection",
            geometries: t.geometries.map(We)
        } : "Point" === t.type || "MultiPoint" === t.type ? {
            type: t.type,
            coordinates: t.coordinates
        } : {
            type: t.type,
            arcs: t.coordinates
        };
        return null != t.bbox && (e.bbox = t.bbox),
        e
    }
    function Je(t, e) {
        var n = function(t) {
            var e = 1 / 0
              , n = 1 / 0
              , r = -1 / 0
              , i = -1 / 0;
            function o(t) {
                null != t && De.call(s, t.type) && s[t.type](t)
            }
            var s = {
                GeometryCollection: function(t) {
                    t.geometries.forEach(o)
                },
                Point: function(t) {
                    a(t.coordinates)
                },
                MultiPoint: function(t) {
                    t.coordinates.forEach(a)
                },
                LineString: function(t) {
                    u(t.arcs)
                },
                MultiLineString: function(t) {
                    t.arcs.forEach(u)
                },
                Polygon: function(t) {
                    t.arcs.forEach(u)
                },
                MultiPolygon: function(t) {
                    t.arcs.forEach(l)
                }
            };
            function a(t) {
                var o = t[0]
                  , s = t[1];
                o < e && (e = o),
                o > r && (r = o),
                s < n && (n = s),
                s > i && (i = s)
            }
            function u(t) {
                t.forEach(a)
            }
            function l(t) {
                t.forEach(u)
            }
            for (var c in t)
                o(t[c]);
            return r >= e && i >= n ? [e, n, r, i] : void 0
        }(t = Xe(t))
          , r = e > 0 && n && function(t, e, n) {
            var r = e[0]
              , i = e[1]
              , o = e[2]
              , s = e[3]
              , a = o - r ? (n - 1) / (o - r) : 1
              , u = s - i ? (n - 1) / (s - i) : 1;
            function l(t) {
                return [Math.round((t[0] - r) * a), Math.round((t[1] - i) * u)]
            }
            function c(t, e) {
                for (var n, o, s, l, c, h = -1, p = 0, f = t.length, g = new Array(f); ++h < f; )
                    n = t[h],
                    l = Math.round((n[0] - r) * a),
                    c = Math.round((n[1] - i) * u),
                    l === o && c === s || (g[p++] = [o = l, s = c]);
                for (g.length = p; p < e; )
                    p = g.push([g[0][0], g[0][1]]);
                return g
            }
            function h(t) {
                return c(t, 2)
            }
            function p(t) {
                return c(t, 4)
            }
            function f(t) {
                return t.map(p)
            }
            function g(t) {
                null != t && De.call(d, t.type) && d[t.type](t)
            }
            var d = {
                GeometryCollection: function(t) {
                    t.geometries.forEach(g)
                },
                Point: function(t) {
                    t.coordinates = l(t.coordinates)
                },
                MultiPoint: function(t) {
                    t.coordinates = t.coordinates.map(l)
                },
                LineString: function(t) {
                    t.arcs = h(t.arcs)
                },
                MultiLineString: function(t) {
                    t.arcs = t.arcs.map(h)
                },
                Polygon: function(t) {
                    t.arcs = f(t.arcs)
                },
                MultiPolygon: function(t) {
                    t.arcs = t.arcs.map(f)
                }
            };
            for (var y in t)
                g(t[y]);
            return {
                scale: [1 / a, 1 / u],
                translate: [r, i]
            }
        }(t, n, e)
          , i = function(t) {
            var e, n, r, i, o = t.coordinates, s = t.lines, a = t.rings, u = s.length + a.length;
            for (delete t.lines,
            delete t.rings,
            r = 0,
            i = s.length; r < i; ++r)
                for (e = s[r]; e = e.next; )
                    ++u;
            for (r = 0,
            i = a.length; r < i; ++r)
                for (n = a[r]; n = n.next; )
                    ++u;
            var l = Fe(2 * u * 1.4, ze, ke)
              , c = t.arcs = [];
            for (r = 0,
            i = s.length; r < i; ++r) {
                e = s[r];
                do {
                    h(e)
                } while (e = e.next)
            }
            for (r = 0,
            i = a.length; r < i; ++r)
                if ((n = a[r]).next)
                    do {
                        h(n)
                    } while (n = n.next);
                else
                    p(n);
            function h(t) {
                var e, n, r, i, s, a, u, h;
                if (r = l.get(e = o[t[0]]))
                    for (u = 0,
                    h = r.length; u < h; ++u)
                        if (f(i = r[u], t))
                            return t[0] = i[0],
                            void (t[1] = i[1]);
                if (s = l.get(n = o[t[1]]))
                    for (u = 0,
                    h = s.length; u < h; ++u)
                        if (g(a = s[u], t))
                            return t[1] = a[0],
                            void (t[0] = a[1]);
                r ? r.push(t) : l.set(e, [t]),
                s ? s.push(t) : l.set(n, [t]),
                c.push(t)
            }
            function p(t) {
                var e, n, r, i, s;
                if (n = l.get(o[t[0]]))
                    for (i = 0,
                    s = n.length; i < s; ++i) {
                        if (d(r = n[i], t))
                            return t[0] = r[0],
                            void (t[1] = r[1]);
                        if (y(r, t))
                            return t[0] = r[1],
                            void (t[1] = r[0])
                    }
                if (n = l.get(e = o[t[0] + v(t)]))
                    for (i = 0,
                    s = n.length; i < s; ++i) {
                        if (d(r = n[i], t))
                            return t[0] = r[0],
                            void (t[1] = r[1]);
                        if (y(r, t))
                            return t[0] = r[1],
                            void (t[1] = r[0])
                    }
                n ? n.push(t) : l.set(e, [t]),
                c.push(t)
            }
            function f(t, e) {
                var n = t[0]
                  , r = e[0]
                  , i = t[1];
                if (n - i != r - e[1])
                    return !1;
                for (; n <= i; ++n,
                ++r)
                    if (!ke(o[n], o[r]))
                        return !1;
                return !0
            }
            function g(t, e) {
                var n = t[0]
                  , r = e[0]
                  , i = t[1]
                  , s = e[1];
                if (n - i != r - s)
                    return !1;
                for (; n <= i; ++n,
                --s)
                    if (!ke(o[n], o[s]))
                        return !1;
                return !0
            }
            function d(t, e) {
                var n = t[0]
                  , r = e[0]
                  , i = t[1] - n;
                if (i !== e[1] - r)
                    return !1;
                for (var s = v(t), a = v(e), u = 0; u < i; ++u)
                    if (!ke(o[n + (u + s) % i], o[r + (u + a) % i]))
                        return !1;
                return !0
            }
            function y(t, e) {
                var n = t[0]
                  , r = e[0]
                  , i = t[1]
                  , s = e[1]
                  , a = i - n;
                if (a !== s - r)
                    return !1;
                for (var u = v(t), l = a - v(e), c = 0; c < a; ++c)
                    if (!ke(o[n + (c + u) % a], o[s - (c + l) % a]))
                        return !1;
                return !0
            }
            function v(t) {
                for (var e = t[0], n = t[1], r = e, i = r, s = o[r]; ++r < n; ) {
                    var a = o[r];
                    (a[0] < s[0] || a[0] === s[0] && a[1] < s[1]) && (i = r,
                    s = a)
                }
                return i - e
            }
            return t
        }(function(t) {
            var e, n, r, i = je(t), o = t.coordinates, s = t.lines, a = t.rings;
            for (n = 0,
            r = s.length; n < r; ++n)
                for (var u = s[n], l = u[0], c = u[1]; ++l < c; )
                    i.has(o[l]) && (e = {
                        0: l,
                        1: u[1]
                    },
                    u[1] = l,
                    u = u.next = e);
            for (n = 0,
            r = a.length; n < r; ++n)
                for (var h = a[n], p = h[0], f = p, g = h[1], d = i.has(o[p]); ++f < g; )
                    i.has(o[f]) && (d ? (e = {
                        0: f,
                        1: h[1]
                    },
                    h[1] = f,
                    h = h.next = e) : (Ue(o, p, g, g - f),
                    o[g] = o[p],
                    d = !0,
                    f = p));
            return t
        }(function(t) {
            var e = -1
              , n = []
              , r = []
              , i = [];
            function o(t) {
                t && De.call(s, t.type) && s[t.type](t)
            }
            var s = {
                GeometryCollection: function(t) {
                    t.geometries.forEach(o)
                },
                LineString: function(t) {
                    t.arcs = a(t.arcs)
                },
                MultiLineString: function(t) {
                    t.arcs = t.arcs.map(a)
                },
                Polygon: function(t) {
                    t.arcs = t.arcs.map(u)
                },
                MultiPolygon: function(t) {
                    t.arcs = t.arcs.map(l)
                }
            };
            function a(t) {
                for (var r = 0, o = t.length; r < o; ++r)
                    i[++e] = t[r];
                var s = {
                    0: e - o + 1,
                    1: e
                };
                return n.push(s),
                s
            }
            function u(t) {
                for (var n = 0, o = t.length; n < o; ++n)
                    i[++e] = t[n];
                var s = {
                    0: e - o + 1,
                    1: e
                };
                return r.push(s),
                s
            }
            function l(t) {
                return t.map(u)
            }
            for (var c in t)
                o(t[c]);
            return {
                type: "Topology",
                coordinates: i,
                lines: n,
                rings: r,
                objects: t
            }
        }(t)))
          , o = i.coordinates
          , s = Fe(1.4 * i.arcs.length, Ze, Ke);
        function a(t) {
            t && De.call(u, t.type) && u[t.type](t)
        }
        t = i.objects,
        i.bbox = n,
        i.arcs = i.arcs.map((function(t, e) {
            return s.set(t, e),
            o.slice(t[0], t[1] + 1)
        }
        )),
        delete i.coordinates,
        o = null;
        var u = {
            GeometryCollection: function(t) {
                t.geometries.forEach(a)
            },
            LineString: function(t) {
                t.arcs = l(t.arcs)
            },
            MultiLineString: function(t) {
                t.arcs = t.arcs.map(l)
            },
            Polygon: function(t) {
                t.arcs = t.arcs.map(l)
            },
            MultiPolygon: function(t) {
                t.arcs = t.arcs.map(c)
            }
        };
        function l(t) {
            var e = [];
            do {
                var n = s.get(t);
                e.push(t[0] < t[1] ? n : ~n)
            } while (t = t.next);
            return e
        }
        function c(t) {
            return t.map(l)
        }
        for (var h in t)
            a(t[h]);
        return r && (i.transform = r,
        i.arcs = function(t) {
            for (var e = -1, n = t.length; ++e < n; ) {
                for (var r, i, o = t[e], s = 0, a = 1, u = o.length, l = o[0], c = l[0], h = l[1]; ++s < u; )
                    r = (l = o[s])[0],
                    i = l[1],
                    r === c && i === h || (o[a++] = [r - c, i - h],
                    c = r,
                    h = i);
                1 === a && (o[a++] = [0, 0]),
                o.length = a
            }
            return t
        }(i.arcs)),
        i
    }
    function Ze(t) {
        var e, n = t[0], r = t[1];
        return r < n && (e = n,
        n = r,
        r = e),
        n + 31 * r
    }
    function Ke(t, e) {
        var n, r = t[0], i = t[1], o = e[0], s = e[1];
        return i < r && (n = r,
        r = i,
        i = n),
        s < o && (n = o,
        o = s,
        s = n),
        r === o && i === s
    }
    function Qe(t, e) {
        if (void 0 === e && (e = {}),
        "FeatureCollection" !== it(t))
            throw new Error("geojson must be a FeatureCollection");
        if (!t.features.length)
            throw new Error("geojson is empty");
        !1 !== e.mutate && void 0 !== e.mutate || (t = Ie(t));
        var n = [];
        z(t, (function(t) {
            n.push(t.geometry)
        }
        ));
        var r = Je({
            geoms: v(n).geometry
        });
        return function(t) {
            return Re(t, Ae.apply(this, arguments))
        }(r, r.objects.geoms.geometries)
    }
    function $e(t, e) {
        if (void 0 === e && (e = {}),
        !P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.mutate;
        if ("FeatureCollection" !== it(t))
            throw new Error("geojson must be a FeatureCollection");
        if (!t.features.length)
            throw new Error("geojson is empty");
        !1 !== n && void 0 !== n || (t = Ie(t));
        var r = function(t) {
            var e = {};
            z(t, (function(t) {
                e[t.geometry.type] = !0
            }
            ));
            var n = Object.keys(e);
            if (1 === n.length)
                return n[0];
            return null
        }(t);
        if (!r)
            throw new Error("geojson must be homogenous");
        var i = t;
        switch (r) {
        case "LineString":
            return Me(i, e);
        case "Polygon":
            return Qe(i, e);
        default:
            throw new Error(r + " is not supported")
        }
    }
    function tn(t, e) {
        void 0 === e && (e = {});
        var n = "object" == typeof e ? e.mutate : e;
        if (!t)
            throw new Error("geojson is required");
        var r = it(t)
          , i = [];
        switch (r) {
        case "LineString":
            i = en(t);
            break;
        case "MultiLineString":
        case "Polygon":
            Q(t).forEach((function(t) {
                i.push(en(t))
            }
            ));
            break;
        case "MultiPolygon":
            Q(t).forEach((function(t) {
                var e = [];
                t.forEach((function(t) {
                    e.push(en(t))
                }
                )),
                i.push(e)
            }
            ));
            break;
        case "Point":
            return t;
        case "MultiPoint":
            var s = {};
            Q(t).forEach((function(t) {
                var e = t.join("-");
                Object.prototype.hasOwnProperty.call(s, e) || (i.push(t),
                s[e] = !0)
            }
            ));
            break;
        default:
            throw new Error(r + " geometry not supported")
        }
        return t.coordinates ? !0 === n ? (t.coordinates = i,
        t) : {
            type: r,
            coordinates: i
        } : !0 === n ? (t.geometry.coordinates = i,
        t) : o({
            type: r,
            coordinates: i
        }, t.properties, {
            bbox: t.bbox,
            id: t.id
        })
    }
    function en(t) {
        var e = Q(t);
        if (2 === e.length && !nn(e[0], e[1]))
            return e;
        var n = []
          , r = e.length - 1
          , i = n.length;
        n.push(e[0]);
        for (var o = 1; o < r; o++) {
            var s = n[n.length - 1];
            e[o][0] === s[0] && e[o][1] === s[1] || (n.push(e[o]),
            (i = n.length) > 2 && rn(n[i - 3], n[i - 1], n[i - 2]) && n.splice(n.length - 2, 1))
        }
        if (n.push(e[e.length - 1]),
        i = n.length,
        nn(e[0], e[e.length - 1]) && i < 4)
            throw new Error("invalid polygon");
        return rn(n[i - 3], n[i - 1], n[i - 2]) && n.splice(n.length - 2, 1),
        n
    }
    function nn(t, e) {
        return t[0] === e[0] && t[1] === e[1]
    }
    function rn(t, e, n) {
        var r = n[0]
          , i = n[1]
          , o = t[0]
          , s = t[1]
          , a = e[0]
          , u = e[1]
          , l = a - o
          , c = u - s;
        return 0 === (r - o) * c - (i - s) * l && (Math.abs(l) >= Math.abs(c) ? l > 0 ? o <= r && r <= a : a <= r && r <= o : c > 0 ? s <= i && i <= u : u <= i && i <= s)
    }
    function on(t, e, n) {
        var r = e.x
          , i = e.y
          , o = n.x - r
          , s = n.y - i;
        if (0 !== o || 0 !== s) {
            var a = ((t.x - r) * o + (t.y - i) * s) / (o * o + s * s);
            a > 1 ? (r = n.x,
            i = n.y) : a > 0 && (r += o * a,
            i += s * a)
        }
        return (o = t.x - r) * o + (s = t.y - i) * s
    }
    function sn(t, e, n, r, i) {
        for (var o, s = r, a = e + 1; a < n; a++) {
            var u = on(t[a], t[e], t[n]);
            u > s && (o = a,
            s = u)
        }
        s > r && (o - e > 1 && sn(t, e, o, r, i),
        i.push(t[o]),
        n - o > 1 && sn(t, o, n, r, i))
    }
    function an(t, e) {
        var n = t.length - 1
          , r = [t[0]];
        return sn(t, 0, n, e, r),
        r.push(t[n]),
        r
    }
    function un(t, e, n) {
        if (t.length <= 2)
            return t;
        var r = void 0 !== e ? e * e : 1;
        return t = an(t = n ? t : function(t, e) {
            for (var n, r, i, o, s, a = t[0], u = [a], l = 1, c = t.length; l < c; l++)
                n = t[l],
                i = a,
                o = void 0,
                s = void 0,
                o = (r = n).x - i.x,
                s = r.y - i.y,
                o * o + s * s > e && (u.push(n),
                a = n);
            return a !== n && u.push(n),
            u
        }(t, r), r)
    }
    function ln(t, e, n) {
        return un(t.map((function(t) {
            return {
                x: t[0],
                y: t[1],
                z: t[2]
            }
        }
        )), e, n).map((function(t) {
            return t.z ? [t.x, t.y, t.z] : [t.x, t.y]
        }
        ))
    }
    function cn(t, e, n) {
        return t.map((function(t) {
            var r = t.map((function(t) {
                return {
                    x: t[0],
                    y: t[1]
                }
            }
            ));
            if (r.length < 4)
                throw new Error("invalid polygon");
            for (var i = un(r, e, n).map((function(t) {
                return [t.x, t.y]
            }
            )); !hn(i); )
                i = un(r, e -= .01 * e, n).map((function(t) {
                    return [t.x, t.y]
                }
                ));
            return i[i.length - 1][0] === i[0][0] && i[i.length - 1][1] === i[0][1] || i.push(i[0]),
            i
        }
        ))
    }
    function hn(t) {
        return !(t.length < 3) && !(3 === t.length && t[2][0] === t[0][0] && t[2][1] === t[0][1])
    }
    var pn = function() {
        function t(t) {
            this.points = t.points || [],
            this.duration = t.duration || 1e4,
            this.sharpness = t.sharpness || .85,
            this.centers = [],
            this.controls = [],
            this.stepLength = t.stepLength || 60,
            this.length = this.points.length,
            this.delay = 0;
            for (var e = 0; e < this.length; e++)
                this.points[e].z = this.points[e].z || 0;
            for (e = 0; e < this.length - 1; e++) {
                var n = this.points[e]
                  , r = this.points[e + 1];
                this.centers.push({
                    x: (n.x + r.x) / 2,
                    y: (n.y + r.y) / 2,
                    z: (n.z + r.z) / 2
                })
            }
            this.controls.push([this.points[0], this.points[0]]);
            for (e = 0; e < this.centers.length - 1; e++) {
                var i = this.points[e + 1].x - (this.centers[e].x + this.centers[e + 1].x) / 2
                  , o = this.points[e + 1].y - (this.centers[e].y + this.centers[e + 1].y) / 2
                  , s = this.points[e + 1].z - (this.centers[e].y + this.centers[e + 1].z) / 2;
                this.controls.push([{
                    x: (1 - this.sharpness) * this.points[e + 1].x + this.sharpness * (this.centers[e].x + i),
                    y: (1 - this.sharpness) * this.points[e + 1].y + this.sharpness * (this.centers[e].y + o),
                    z: (1 - this.sharpness) * this.points[e + 1].z + this.sharpness * (this.centers[e].z + s)
                }, {
                    x: (1 - this.sharpness) * this.points[e + 1].x + this.sharpness * (this.centers[e + 1].x + i),
                    y: (1 - this.sharpness) * this.points[e + 1].y + this.sharpness * (this.centers[e + 1].y + o),
                    z: (1 - this.sharpness) * this.points[e + 1].z + this.sharpness * (this.centers[e + 1].z + s)
                }])
            }
            return this.controls.push([this.points[this.length - 1], this.points[this.length - 1]]),
            this.steps = this.cacheSteps(this.stepLength),
            this
        }
        return t.prototype.cacheSteps = function(t) {
            var e = []
              , n = this.pos(0);
            e.push(0);
            for (var r = 0; r < this.duration; r += 10) {
                var i = this.pos(r);
                Math.sqrt((i.x - n.x) * (i.x - n.x) + (i.y - n.y) * (i.y - n.y) + (i.z - n.z) * (i.z - n.z)) > t && (e.push(r),
                n = i)
            }
            return e
        }
        ,
        t.prototype.vector = function(t) {
            var e = this.pos(t + 10)
              , n = this.pos(t - 10);
            return {
                angle: 180 * Math.atan2(e.y - n.y, e.x - n.x) / 3.14,
                speed: Math.sqrt((n.x - e.x) * (n.x - e.x) + (n.y - e.y) * (n.y - e.y) + (n.z - e.z) * (n.z - e.z))
            }
        }
        ,
        t.prototype.pos = function(t) {
            var e = t - this.delay;
            e < 0 && (e = 0),
            e > this.duration && (e = this.duration - 1);
            var n = e / this.duration;
            if (n >= 1)
                return this.points[this.length - 1];
            var r = Math.floor((this.points.length - 1) * n);
            return function(t, e, n, r, i) {
                var o = function(t) {
                    var e = t * t;
                    return [e * t, 3 * e * (1 - t), 3 * t * (1 - t) * (1 - t), (1 - t) * (1 - t) * (1 - t)]
                }(t);
                return {
                    x: i.x * o[0] + r.x * o[1] + n.x * o[2] + e.x * o[3],
                    y: i.y * o[0] + r.y * o[1] + n.y * o[2] + e.y * o[3],
                    z: i.z * o[0] + r.z * o[1] + n.z * o[2] + e.z * o[3]
                }
            }((this.length - 1) * n - r, this.points[r], this.controls[r][1], this.controls[r + 1][0], this.points[r + 1])
        }
        ,
        t
    }();
    function fn(t, e) {
        void 0 === e && (e = {});
        for (var n = e.resolution || 1e4, r = e.sharpness || .85, i = [], o = rt(t).coordinates.map((function(t) {
            return {
                x: t[0],
                y: t[1]
            }
        }
        )), s = new pn({
            duration: n,
            points: o,
            sharpness: r
        }), a = function(t) {
            var e = s.pos(t);
            Math.floor(t / 100) % 2 == 0 && i.push([e.x, e.y])
        }, u = 0; u < s.duration; u += 10)
            a(u);
        return a(s.duration),
        h(i, e.properties)
    }
    function gn(t, e) {
        void 0 === e && (e = {});
        var n = Number(t[0])
          , r = Number(t[1])
          , i = Number(t[2])
          , o = Number(t[3]);
        if (6 === t.length)
            throw new Error("@turf/bbox-polygon does not support BBox with 6 positions");
        var s = [n, r];
        return l([[s, [i, r], [i, o], [n, o], s]], e.properties, {
            bbox: t,
            id: e.id
        })
    }
    function dn(t) {
        return gn(Z(t))
    }
    function yn(t) {
        var e = t[0]
          , n = t[1]
          , r = t[2]
          , i = t[3];
        if (me(t.slice(0, 2), [r, n]) >= me(t.slice(0, 2), [e, i])) {
            var o = (n + i) / 2;
            return [e, o - (r - e) / 2, r, o + (r - e) / 2]
        }
        var s = (e + r) / 2;
        return [s - (i - n) / 2, n, s + (i - n) / 2, i]
    }
    function vn(t, e, n, r) {
        void 0 === r && (r = {});
        var i = K(t)
          , o = I(i[0])
          , s = I(i[1])
          , u = I(n)
          , l = x(e, r.units)
          , c = Math.asin(Math.sin(s) * Math.cos(l) + Math.cos(s) * Math.sin(l) * Math.cos(u));
        return a([w(o + Math.atan2(Math.sin(u) * Math.sin(l) * Math.cos(s), Math.cos(l) - Math.sin(s) * Math.sin(c))), w(c)], r.properties)
    }
    function _n(t, e, n) {
        void 0 === n && (n = {});
        for (var r = n.steps || 64, i = n.properties ? n.properties : !Array.isArray(t) && "Feature" === t.type && t.properties ? t.properties : {}, o = [], s = 0; s < r; s++)
            o.push(vn(t, e, -360 * s / r, n).geometry.coordinates);
        return o.push(o[0]),
        l([o], i)
    }
    function mn(t, e, n) {
        if (void 0 === n && (n = {}),
        !0 === n.final)
            return function(t, e) {
                var n = mn(e, t);
                return n = (n + 180) % 360
            }(t, e);
        var r = K(t)
          , i = K(e)
          , o = I(r[0])
          , s = I(i[0])
          , a = I(r[1])
          , u = I(i[1])
          , l = Math.sin(s - o) * Math.cos(u)
          , c = Math.cos(a) * Math.sin(u) - Math.sin(a) * Math.cos(u) * Math.cos(s - o);
        return w(Math.atan2(l, c))
    }
    function xn(t, e) {
        void 0 === e && (e = {});
        var n = Z(t);
        return a([(n[0] + n[2]) / 2, (n[1] + n[3]) / 2], e.properties, e)
    }
    function En(t, e) {
        void 0 === e && (e = {});
        var n = 0
          , r = 0
          , i = 0;
        return R(t, (function(t) {
            n += t[0],
            r += t[1],
            i++
        }
        ), !0),
        a([n / i, r / i], e.properties)
    }
    function bn(t) {
        var e = [];
        return "FeatureCollection" === t.type ? F(t, (function(t) {
            R(t, (function(n) {
                e.push(a(n, t.properties))
            }
            ))
        }
        )) : R(t, (function(n) {
            e.push(a(n, t.properties))
        }
        )),
        f(e)
    }
    var wn = Nn
      , In = Nn;
    function Nn(t, e, n) {
        n = n || 2;
        var r, i, o, s, a, u, l, c = e && e.length, h = c ? e[0] * n : t.length, p = Sn(t, 0, h, n, !0), f = [];
        if (!p)
            return f;
        if (c && (p = function(t, e, n, r) {
            var i, o, s, a = [];
            for (i = 0,
            o = e.length; i < o; i++)
                (s = Sn(t, e[i] * r, i < o - 1 ? e[i + 1] * r : t.length, r, !1)) === s.next && (s.steiner = !0),
                a.push(Fn(s));
            for (a.sort(Tn),
            i = 0; i < a.length; i++)
                An(a[i], n),
                n = Cn(n, n.next);
            return n
        }(t, e, p, n)),
        t.length > 80 * n) {
            r = o = t[0],
            i = s = t[1];
            for (var g = n; g < h; g += n)
                (a = t[g]) < r && (r = a),
                (u = t[g + 1]) < i && (i = u),
                a > o && (o = a),
                u > s && (s = u);
            l = 0 !== (l = Math.max(o - r, s - i)) ? 1 / l : 0
        }
        return Pn(p, f, n, r, i, l),
        f
    }
    function Sn(t, e, n, r, i) {
        var o, s;
        if (i === Hn(t, e, n, r) > 0)
            for (o = e; o < n; o += r)
                s = Vn(o, t[o], t[o + 1], s);
        else
            for (o = n - r; o >= e; o -= r)
                s = Vn(o, t[o], t[o + 1], s);
        return s && Bn(s, s.next) && (Xn(s),
        s = s.next),
        s
    }
    function Cn(t, e) {
        if (!t)
            return t;
        e || (e = t);
        var n, r = t;
        do {
            if (n = !1,
            r.steiner || !Bn(r, r.next) && 0 !== qn(r.prev, r, r.next))
                r = r.next;
            else {
                if (Xn(r),
                (r = e = r.prev) === r.next)
                    break;
                n = !0
            }
        } while (n || r !== e);
        return e
    }
    function Pn(t, e, n, r, i, o, s) {
        if (t) {
            !s && o && function(t, e, n, r) {
                var i = t;
                do {
                    null === i.z && (i.z = Dn(i.x, i.y, e, n, r)),
                    i.prevZ = i.prev,
                    i.nextZ = i.next,
                    i = i.next
                } while (i !== t);
                i.prevZ.nextZ = null,
                i.prevZ = null,
                function(t) {
                    var e, n, r, i, o, s, a, u, l = 1;
                    do {
                        for (n = t,
                        t = null,
                        o = null,
                        s = 0; n; ) {
                            for (s++,
                            r = n,
                            a = 0,
                            e = 0; e < l && (a++,
                            r = r.nextZ); e++)
                                ;
                            for (u = l; a > 0 || u > 0 && r; )
                                0 !== a && (0 === u || !r || n.z <= r.z) ? (i = n,
                                n = n.nextZ,
                                a--) : (i = r,
                                r = r.nextZ,
                                u--),
                                o ? o.nextZ = i : t = i,
                                i.prevZ = o,
                                o = i;
                            n = r
                        }
                        o.nextZ = null,
                        l *= 2
                    } while (s > 1)
                }(i)
            }(t, r, i, o);
            for (var a, u, l = t; t.prev !== t.next; )
                if (a = t.prev,
                u = t.next,
                o ? Ln(t, r, i, o) : Mn(t))
                    e.push(a.i / n),
                    e.push(t.i / n),
                    e.push(u.i / n),
                    Xn(t),
                    t = u.next,
                    l = u.next;
                else if ((t = u) === l) {
                    s ? 1 === s ? Pn(t = On(t, e, n), e, n, r, i, o, 2) : 2 === s && Rn(t, e, n, r, i, o) : Pn(Cn(t), e, n, r, i, o, 1);
                    break
                }
        }
    }
    function Mn(t) {
        var e = t.prev
          , n = t
          , r = t.next;
        if (qn(e, n, r) >= 0)
            return !1;
        for (var i = t.next.next; i !== t.prev; ) {
            if (kn(e.x, e.y, n.x, n.y, r.x, r.y, i.x, i.y) && qn(i.prev, i, i.next) >= 0)
                return !1;
            i = i.next
        }
        return !0
    }
    function Ln(t, e, n, r) {
        var i = t.prev
          , o = t
          , s = t.next;
        if (qn(i, o, s) >= 0)
            return !1;
        for (var a = i.x < o.x ? i.x < s.x ? i.x : s.x : o.x < s.x ? o.x : s.x, u = i.y < o.y ? i.y < s.y ? i.y : s.y : o.y < s.y ? o.y : s.y, l = i.x > o.x ? i.x > s.x ? i.x : s.x : o.x > s.x ? o.x : s.x, c = i.y > o.y ? i.y > s.y ? i.y : s.y : o.y > s.y ? o.y : s.y, h = Dn(a, u, e, n, r), p = Dn(l, c, e, n, r), f = t.prevZ, g = t.nextZ; f && f.z >= h && g && g.z <= p; ) {
            if (f !== t.prev && f !== t.next && kn(i.x, i.y, o.x, o.y, s.x, s.y, f.x, f.y) && qn(f.prev, f, f.next) >= 0)
                return !1;
            if (f = f.prevZ,
            g !== t.prev && g !== t.next && kn(i.x, i.y, o.x, o.y, s.x, s.y, g.x, g.y) && qn(g.prev, g, g.next) >= 0)
                return !1;
            g = g.nextZ
        }
        for (; f && f.z >= h; ) {
            if (f !== t.prev && f !== t.next && kn(i.x, i.y, o.x, o.y, s.x, s.y, f.x, f.y) && qn(f.prev, f, f.next) >= 0)
                return !1;
            f = f.prevZ
        }
        for (; g && g.z <= p; ) {
            if (g !== t.prev && g !== t.next && kn(i.x, i.y, o.x, o.y, s.x, s.y, g.x, g.y) && qn(g.prev, g, g.next) >= 0)
                return !1;
            g = g.nextZ
        }
        return !0
    }
    function On(t, e, n) {
        var r = t;
        do {
            var i = r.prev
              , o = r.next.next;
            !Bn(i, o) && zn(i, r, r.next, o) && jn(i, o) && jn(o, i) && (e.push(i.i / n),
            e.push(r.i / n),
            e.push(o.i / n),
            Xn(r),
            Xn(r.next),
            r = t = o),
            r = r.next
        } while (r !== t);
        return r
    }
    function Rn(t, e, n, r, i, o) {
        var s = t;
        do {
            for (var a = s.next.next; a !== s.prev; ) {
                if (s.i !== a.i && Gn(s, a)) {
                    var u = Un(s, a);
                    return s = Cn(s, s.next),
                    u = Cn(u, u.next),
                    Pn(s, e, n, r, i, o),
                    void Pn(u, e, n, r, i, o)
                }
                a = a.next
            }
            s = s.next
        } while (s !== t)
    }
    function Tn(t, e) {
        return t.x - e.x
    }
    function An(t, e) {
        if (e = function(t, e) {
            var n, r = e, i = t.x, o = t.y, s = -1 / 0;
            do {
                if (o <= r.y && o >= r.next.y && r.next.y !== r.y) {
                    var a = r.x + (o - r.y) * (r.next.x - r.x) / (r.next.y - r.y);
                    if (a <= i && a > s) {
                        if (s = a,
                        a === i) {
                            if (o === r.y)
                                return r;
                            if (o === r.next.y)
                                return r.next
                        }
                        n = r.x < r.next.x ? r : r.next
                    }
                }
                r = r.next
            } while (r !== e);
            if (!n)
                return null;
            if (i === s)
                return n.prev;
            var u, l = n, c = n.x, h = n.y, p = 1 / 0;
            r = n.next;
            for (; r !== l; )
                i >= r.x && r.x >= c && i !== r.x && kn(o < h ? i : s, o, c, h, o < h ? s : i, o, r.x, r.y) && ((u = Math.abs(o - r.y) / (i - r.x)) < p || u === p && r.x > n.x) && jn(r, t) && (n = r,
                p = u),
                r = r.next;
            return n
        }(t, e)) {
            var n = Un(e, t);
            Cn(n, n.next)
        }
    }
    function Dn(t, e, n, r, i) {
        return (t = 1431655765 & ((t = 858993459 & ((t = 252645135 & ((t = 16711935 & ((t = 32767 * (t - n) * i) | t << 8)) | t << 4)) | t << 2)) | t << 1)) | (e = 1431655765 & ((e = 858993459 & ((e = 252645135 & ((e = 16711935 & ((e = 32767 * (e - r) * i) | e << 8)) | e << 4)) | e << 2)) | e << 1)) << 1
    }
    function Fn(t) {
        var e = t
          , n = t;
        do {
            e.x < n.x && (n = e),
            e = e.next
        } while (e !== t);
        return n
    }
    function kn(t, e, n, r, i, o, s, a) {
        return (i - s) * (e - a) - (t - s) * (o - a) >= 0 && (t - s) * (r - a) - (n - s) * (e - a) >= 0 && (n - s) * (o - a) - (i - s) * (r - a) >= 0
    }
    function Gn(t, e) {
        return t.next.i !== e.i && t.prev.i !== e.i && !function(t, e) {
            var n = t;
            do {
                if (n.i !== t.i && n.next.i !== t.i && n.i !== e.i && n.next.i !== e.i && zn(n, n.next, t, e))
                    return !0;
                n = n.next
            } while (n !== t);
            return !1
        }(t, e) && jn(t, e) && jn(e, t) && function(t, e) {
            var n = t
              , r = !1
              , i = (t.x + e.x) / 2
              , o = (t.y + e.y) / 2;
            do {
                n.y > o != n.next.y > o && n.next.y !== n.y && i < (n.next.x - n.x) * (o - n.y) / (n.next.y - n.y) + n.x && (r = !r),
                n = n.next
            } while (n !== t);
            return r
        }(t, e)
    }
    function qn(t, e, n) {
        return (e.y - t.y) * (n.x - e.x) - (e.x - t.x) * (n.y - e.y)
    }
    function Bn(t, e) {
        return t.x === e.x && t.y === e.y
    }
    function zn(t, e, n, r) {
        return !!(Bn(t, e) && Bn(n, r) || Bn(t, r) && Bn(n, e)) || qn(t, e, n) > 0 != qn(t, e, r) > 0 && qn(n, r, t) > 0 != qn(n, r, e) > 0
    }
    function jn(t, e) {
        return qn(t.prev, t, t.next) < 0 ? qn(t, e, t.next) >= 0 && qn(t, t.prev, e) >= 0 : qn(t, e, t.prev) < 0 || qn(t, t.next, e) < 0
    }
    function Un(t, e) {
        var n = new Yn(t.i,t.x,t.y)
          , r = new Yn(e.i,e.x,e.y)
          , i = t.next
          , o = e.prev;
        return t.next = e,
        e.prev = t,
        n.next = i,
        i.prev = n,
        r.next = n,
        n.prev = r,
        o.next = r,
        r.prev = o,
        r
    }
    function Vn(t, e, n, r) {
        var i = new Yn(t,e,n);
        return r ? (i.next = r.next,
        i.prev = r,
        r.next.prev = i,
        r.next = i) : (i.prev = i,
        i.next = i),
        i
    }
    function Xn(t) {
        t.next.prev = t.prev,
        t.prev.next = t.next,
        t.prevZ && (t.prevZ.nextZ = t.nextZ),
        t.nextZ && (t.nextZ.prevZ = t.prevZ)
    }
    function Yn(t, e, n) {
        this.i = t,
        this.x = e,
        this.y = n,
        this.prev = null,
        this.next = null,
        this.z = null,
        this.prevZ = null,
        this.nextZ = null,
        this.steiner = !1
    }
    function Hn(t, e, n, r) {
        for (var i = 0, o = e, s = n - r; o < n; o += r)
            i += (t[s] - t[o]) * (t[o + 1] + t[s + 1]),
            s = o;
        return i
    }
    function Wn(t) {
        var e = function(t) {
            for (var e = t[0][0].length, n = {
                vertices: [],
                holes: [],
                dimensions: e
            }, r = 0, i = 0; i < t.length; i++) {
                for (var o = 0; o < t[i].length; o++)
                    for (var s = 0; s < e; s++)
                        n.vertices.push(t[i][o][s]);
                i > 0 && (r += t[i - 1].length,
                n.holes.push(r))
            }
            return n
        }(t)
          , n = wn(e.vertices, e.holes, 2)
          , r = []
          , i = [];
        n.forEach((function(t, r) {
            var o = n[r];
            i.push([e.vertices[2 * o], e.vertices[2 * o + 1]])
        }
        ));
        for (var o = 0; o < i.length; o += 3) {
            var s = i.slice(o, o + 3);
            s.push(i[o]),
            r.push(l([s]))
        }
        return r
    }
    function Jn(t, e) {
        if (!t)
            throw new Error("targetPoint is required");
        if (!e)
            throw new Error("points is required");
        var n, r = 1 / 0, i = 0;
        return F(e, (function(e, n) {
            var o = me(t, e);
            o < r && (i = n,
            r = o)
        }
        )),
        (n = Ie(e.features[i])).properties.featureIndex = i,
        n.properties.distanceToPoint = r,
        n
    }
    function Zn(t) {
        if (!t)
            throw new Error("geojson is required");
        var e = [];
        return z(t, (function(t) {
            !function(t, e) {
                var n = []
                  , r = t.geometry;
                if (null !== r) {
                    switch (r.type) {
                    case "Polygon":
                        n = Q(r);
                        break;
                    case "LineString":
                        n = [Q(r)]
                    }
                    n.forEach((function(n) {
                        (function(t, e) {
                            var n = [];
                            return t.reduce((function(t, r) {
                                var i = h([t, r], e);
                                return i.bbox = function(t, e) {
                                    var n = t[0]
                                      , r = t[1]
                                      , i = e[0]
                                      , o = e[1];
                                    return [n < i ? n : i, r < o ? r : o, n > i ? n : i, r > o ? r : o]
                                }(t, r),
                                n.push(i),
                                r
                            }
                            )),
                            n
                        }
                        )(n, t.properties).forEach((function(t) {
                            t.id = e.length,
                            e.push(t)
                        }
                        ))
                    }
                    ))
                }
            }(t, e)
        }
        )),
        f(e)
    }
    Nn.deviation = function(t, e, n, r) {
        var i = e && e.length
          , o = i ? e[0] * n : t.length
          , s = Math.abs(Hn(t, 0, o, n));
        if (i)
            for (var a = 0, u = e.length; a < u; a++) {
                var l = e[a] * n
                  , c = a < u - 1 ? e[a + 1] * n : t.length;
                s -= Math.abs(Hn(t, l, c, n))
            }
        var h = 0;
        for (a = 0; a < r.length; a += 3) {
            var p = r[a] * n
              , f = r[a + 1] * n
              , g = r[a + 2] * n;
            h += Math.abs((t[p] - t[g]) * (t[f + 1] - t[p + 1]) - (t[p] - t[f]) * (t[g + 1] - t[p + 1]))
        }
        return 0 === s && 0 === h ? 0 : Math.abs((h - s) / s)
    }
    ,
    Nn.flatten = function(t) {
        for (var e = t[0][0].length, n = {
            vertices: [],
            holes: [],
            dimensions: e
        }, r = 0, i = 0; i < t.length; i++) {
            for (var o = 0; o < t[i].length; o++)
                for (var s = 0; s < e; s++)
                    n.vertices.push(t[i][o][s]);
            i > 0 && (r += t[i - 1].length,
            n.holes.push(r))
        }
        return n
    }
    ,
    wn.default = In;
    var Kn = Bt((function(t, e) {
        function n(t, e, n) {
            void 0 === n && (n = {});
            var r = {
                type: "Feature"
            };
            return (0 === n.id || n.id) && (r.id = n.id),
            n.bbox && (r.bbox = n.bbox),
            r.properties = e || {},
            r.geometry = t,
            r
        }
        function r(t, e, r) {
            if (void 0 === r && (r = {}),
            !t)
                throw new Error("coordinates is required");
            if (!Array.isArray(t))
                throw new Error("coordinates must be an Array");
            if (t.length < 2)
                throw new Error("coordinates must be at least 2 numbers long");
            if (!f(t[0]) || !f(t[1]))
                throw new Error("coordinates must contain numbers");
            return n({
                type: "Point",
                coordinates: t
            }, e, r)
        }
        function i(t, e, r) {
            void 0 === r && (r = {});
            for (var i = 0, o = t; i < o.length; i++) {
                var s = o[i];
                if (s.length < 4)
                    throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
                for (var a = 0; a < s[s.length - 1].length; a++)
                    if (s[s.length - 1][a] !== s[0][a])
                        throw new Error("First and last Position are not equivalent.")
            }
            return n({
                type: "Polygon",
                coordinates: t
            }, e, r)
        }
        function o(t, e, r) {
            if (void 0 === r && (r = {}),
            t.length < 2)
                throw new Error("coordinates must be an array of two or more positions");
            return n({
                type: "LineString",
                coordinates: t
            }, e, r)
        }
        function s(t, e) {
            void 0 === e && (e = {});
            var n = {
                type: "FeatureCollection"
            };
            return e.id && (n.id = e.id),
            e.bbox && (n.bbox = e.bbox),
            n.features = t,
            n
        }
        function a(t, e, r) {
            return void 0 === r && (r = {}),
            n({
                type: "MultiLineString",
                coordinates: t
            }, e, r)
        }
        function u(t, e, r) {
            return void 0 === r && (r = {}),
            n({
                type: "MultiPoint",
                coordinates: t
            }, e, r)
        }
        function l(t, e, r) {
            return void 0 === r && (r = {}),
            n({
                type: "MultiPolygon",
                coordinates: t
            }, e, r)
        }
        function c(t, n) {
            void 0 === n && (n = "kilometers");
            var r = e.factors[n];
            if (!r)
                throw new Error(n + " units is invalid");
            return t * r
        }
        function h(t, n) {
            void 0 === n && (n = "kilometers");
            var r = e.factors[n];
            if (!r)
                throw new Error(n + " units is invalid");
            return t / r
        }
        function p(t) {
            return 180 * (t % (2 * Math.PI)) / Math.PI
        }
        function f(t) {
            return !isNaN(t) && null !== t && !Array.isArray(t)
        }
        Object.defineProperty(e, "__esModule", {
            value: !0
        }),
        e.earthRadius = 6371008.8,
        e.factors = {
            centimeters: 100 * e.earthRadius,
            centimetres: 100 * e.earthRadius,
            degrees: e.earthRadius / 111325,
            feet: 3.28084 * e.earthRadius,
            inches: 39.37 * e.earthRadius,
            kilometers: e.earthRadius / 1e3,
            kilometres: e.earthRadius / 1e3,
            meters: e.earthRadius,
            metres: e.earthRadius,
            miles: e.earthRadius / 1609.344,
            millimeters: 1e3 * e.earthRadius,
            millimetres: 1e3 * e.earthRadius,
            nauticalmiles: e.earthRadius / 1852,
            radians: 1,
            yards: 1.0936 * e.earthRadius
        },
        e.unitsFactors = {
            centimeters: 100,
            centimetres: 100,
            degrees: 1 / 111325,
            feet: 3.28084,
            inches: 39.37,
            kilometers: .001,
            kilometres: .001,
            meters: 1,
            metres: 1,
            miles: 1 / 1609.344,
            millimeters: 1e3,
            millimetres: 1e3,
            nauticalmiles: 1 / 1852,
            radians: 1 / e.earthRadius,
            yards: 1.0936133
        },
        e.areaFactors = {
            acres: 247105e-9,
            centimeters: 1e4,
            centimetres: 1e4,
            feet: 10.763910417,
            hectares: 1e-4,
            inches: 1550.003100006,
            kilometers: 1e-6,
            kilometres: 1e-6,
            meters: 1,
            metres: 1,
            miles: 386e-9,
            millimeters: 1e6,
            millimetres: 1e6,
            yards: 1.195990046
        },
        e.feature = n,
        e.geometry = function(t, e, n) {
            switch (t) {
            case "Point":
                return r(e).geometry;
            case "LineString":
                return o(e).geometry;
            case "Polygon":
                return i(e).geometry;
            case "MultiPoint":
                return u(e).geometry;
            case "MultiLineString":
                return a(e).geometry;
            case "MultiPolygon":
                return l(e).geometry;
            default:
                throw new Error(t + " is invalid")
            }
        }
        ,
        e.point = r,
        e.points = function(t, e, n) {
            return void 0 === n && (n = {}),
            s(t.map((function(t) {
                return r(t, e)
            }
            )), n)
        }
        ,
        e.polygon = i,
        e.polygons = function(t, e, n) {
            return void 0 === n && (n = {}),
            s(t.map((function(t) {
                return i(t, e)
            }
            )), n)
        }
        ,
        e.lineString = o,
        e.lineStrings = function(t, e, n) {
            return void 0 === n && (n = {}),
            s(t.map((function(t) {
                return o(t, e)
            }
            )), n)
        }
        ,
        e.featureCollection = s,
        e.multiLineString = a,
        e.multiPoint = u,
        e.multiPolygon = l,
        e.geometryCollection = function(t, e, r) {
            return void 0 === r && (r = {}),
            n({
                type: "GeometryCollection",
                geometries: t
            }, e, r)
        }
        ,
        e.round = function(t, e) {
            if (void 0 === e && (e = 0),
            e && !(e >= 0))
                throw new Error("precision must be a positive number");
            var n = Math.pow(10, e || 0);
            return Math.round(t * n) / n
        }
        ,
        e.radiansToLength = c,
        e.lengthToRadians = h,
        e.lengthToDegrees = function(t, e) {
            return p(h(t, e))
        }
        ,
        e.bearingToAzimuth = function(t) {
            var e = t % 360;
            return e < 0 && (e += 360),
            e
        }
        ,
        e.radiansToDegrees = p,
        e.degreesToRadians = function(t) {
            return t % 360 * Math.PI / 180
        }
        ,
        e.convertLength = function(t, e, n) {
            if (void 0 === e && (e = "kilometers"),
            void 0 === n && (n = "kilometers"),
            !(t >= 0))
                throw new Error("length must be a positive number");
            return c(h(t, e), n)
        }
        ,
        e.convertArea = function(t, n, r) {
            if (void 0 === n && (n = "meters"),
            void 0 === r && (r = "kilometers"),
            !(t >= 0))
                throw new Error("area must be a positive number");
            var i = e.areaFactors[n];
            if (!i)
                throw new Error("invalid original units");
            var o = e.areaFactors[r];
            if (!o)
                throw new Error("invalid final units");
            return t / i * o
        }
        ,
        e.isNumber = f,
        e.isObject = function(t) {
            return !!t && t.constructor === Object
        }
        ,
        e.validateBBox = function(t) {
            if (!t)
                throw new Error("bbox is required");
            if (!Array.isArray(t))
                throw new Error("bbox must be an Array");
            if (4 !== t.length && 6 !== t.length)
                throw new Error("bbox must be an Array of 4 or 6 numbers");
            t.forEach((function(t) {
                if (!f(t))
                    throw new Error("bbox must only contain numbers")
            }
            ))
        }
        ,
        e.validateId = function(t) {
            if (!t)
                throw new Error("id is required");
            if (-1 === ["string", "number"].indexOf(typeof t))
                throw new Error("id must be a number or a string")
        }
    }
    ));
    function Qn(t, e, n) {
        if (null !== t)
            for (var r, i, o, s, a, u, l, c, h = 0, p = 0, f = t.type, g = "FeatureCollection" === f, d = "Feature" === f, y = g ? t.features.length : 1, v = 0; v < y; v++) {
                a = (c = !!(l = g ? t.features[v].geometry : d ? t.geometry : t) && "GeometryCollection" === l.type) ? l.geometries.length : 1;
                for (var _ = 0; _ < a; _++) {
                    var m = 0
                      , x = 0;
                    if (null !== (s = c ? l.geometries[_] : l)) {
                        u = s.coordinates;
                        var E = s.type;
                        switch (h = !n || "Polygon" !== E && "MultiPolygon" !== E ? 0 : 1,
                        E) {
                        case null:
                            break;
                        case "Point":
                            if (!1 === e(u, p, v, m, x))
                                return !1;
                            p++,
                            m++;
                            break;
                        case "LineString":
                        case "MultiPoint":
                            for (r = 0; r < u.length; r++) {
                                if (!1 === e(u[r], p, v, m, x))
                                    return !1;
                                p++,
                                "MultiPoint" === E && m++
                            }
                            "LineString" === E && m++;
                            break;
                        case "Polygon":
                        case "MultiLineString":
                            for (r = 0; r < u.length; r++) {
                                for (i = 0; i < u[r].length - h; i++) {
                                    if (!1 === e(u[r][i], p, v, m, x))
                                        return !1;
                                    p++
                                }
                                "MultiLineString" === E && m++,
                                "Polygon" === E && x++
                            }
                            "Polygon" === E && m++;
                            break;
                        case "MultiPolygon":
                            for (r = 0; r < u.length; r++) {
                                for (x = 0,
                                i = 0; i < u[r].length; i++) {
                                    for (o = 0; o < u[r][i].length - h; o++) {
                                        if (!1 === e(u[r][i][o], p, v, m, x))
                                            return !1;
                                        p++
                                    }
                                    x++
                                }
                                m++
                            }
                            break;
                        case "GeometryCollection":
                            for (r = 0; r < s.geometries.length; r++)
                                if (!1 === Qn(s.geometries[r], e, n))
                                    return !1;
                            break;
                        default:
                            throw new Error("Unknown Geometry Type")
                        }
                    }
                }
            }
    }
    function $n(t, e) {
        var n;
        switch (t.type) {
        case "FeatureCollection":
            for (n = 0; n < t.features.length && !1 !== e(t.features[n].properties, n); n++)
                ;
            break;
        case "Feature":
            e(t.properties, 0)
        }
    }
    function tr(t, e) {
        if ("Feature" === t.type)
            e(t, 0);
        else if ("FeatureCollection" === t.type)
            for (var n = 0; n < t.features.length && !1 !== e(t.features[n], n); n++)
                ;
    }
    function er(t, e) {
        var n, r, i, o, s, a, u, l, c, h, p = 0, f = "FeatureCollection" === t.type, g = "Feature" === t.type, d = f ? t.features.length : 1;
        for (n = 0; n < d; n++) {
            for (a = f ? t.features[n].geometry : g ? t.geometry : t,
            l = f ? t.features[n].properties : g ? t.properties : {},
            c = f ? t.features[n].bbox : g ? t.bbox : void 0,
            h = f ? t.features[n].id : g ? t.id : void 0,
            s = (u = !!a && "GeometryCollection" === a.type) ? a.geometries.length : 1,
            i = 0; i < s; i++)
                if (null !== (o = u ? a.geometries[i] : a))
                    switch (o.type) {
                    case "Point":
                    case "LineString":
                    case "MultiPoint":
                    case "Polygon":
                    case "MultiLineString":
                    case "MultiPolygon":
                        if (!1 === e(o, p, l, c, h))
                            return !1;
                        break;
                    case "GeometryCollection":
                        for (r = 0; r < o.geometries.length; r++)
                            if (!1 === e(o.geometries[r], p, l, c, h))
                                return !1;
                        break;
                    default:
                        throw new Error("Unknown Geometry Type")
                    }
                else if (!1 === e(null, p, l, c, h))
                    return !1;
            p++
        }
    }
    function nr(t, e) {
        er(t, (function(t, n, r, i, o) {
            var s, a = null === t ? null : t.type;
            switch (a) {
            case null:
            case "Point":
            case "LineString":
            case "Polygon":
                return !1 !== e(Kn.feature(t, r, {
                    bbox: i,
                    id: o
                }), n, 0) && void 0
            }
            switch (a) {
            case "MultiPoint":
                s = "Point";
                break;
            case "MultiLineString":
                s = "LineString";
                break;
            case "MultiPolygon":
                s = "Polygon"
            }
            for (var u = 0; u < t.coordinates.length; u++) {
                var l = {
                    type: s,
                    coordinates: t.coordinates[u]
                };
                if (!1 === e(Kn.feature(l, r), n, u))
                    return !1
            }
        }
        ))
    }
    function rr(t, e) {
        nr(t, (function(t, n, r) {
            var i = 0;
            if (t.geometry) {
                var o = t.geometry.type;
                if ("Point" !== o && "MultiPoint" !== o) {
                    var s, a = 0, u = 0, l = 0;
                    return !1 !== Qn(t, (function(o, c, h, p, f) {
                        if (void 0 === s || n > a || p > u || f > l)
                            return s = o,
                            a = n,
                            u = p,
                            l = f,
                            void (i = 0);
                        var g = Kn.lineString([s, o], t.properties);
                        if (!1 === e(g, n, r, f, i))
                            return !1;
                        i++,
                        s = o
                    }
                    )) && void 0
                }
            }
        }
        ))
    }
    function ir(t, e) {
        if (!t)
            throw new Error("geojson is required");
        nr(t, (function(t, n, r) {
            if (null !== t.geometry) {
                var i = t.geometry.type
                  , o = t.geometry.coordinates;
                switch (i) {
                case "LineString":
                    if (!1 === e(t, n, r, 0, 0))
                        return !1;
                    break;
                case "Polygon":
                    for (var s = 0; s < o.length; s++)
                        if (!1 === e(Kn.lineString(o[s], t.properties), n, r, s))
                            return !1
                }
            }
        }
        ))
    }
    var or = function(t) {
        var e = [];
        return Qn(t, (function(t) {
            e.push(t)
        }
        )),
        e
    }
      , sr = Qn
      , ar = function(t, e, n, r) {
        var i = n;
        return Qn(t, (function(t, r, o, s, a) {
            i = 0 === r && void 0 === n ? t : e(i, t, r, o, s, a)
        }
        ), r),
        i
    }
      , ur = tr
      , lr = function(t, e, n) {
        var r = n;
        return tr(t, (function(t, i) {
            r = 0 === i && void 0 === n ? t : e(r, t, i)
        }
        )),
        r
    }
      , cr = function(t, e) {
        if (e = e || {},
        !Kn.isObject(e))
            throw new Error("options is invalid");
        var n, r = e.featureIndex || 0, i = e.multiFeatureIndex || 0, o = e.geometryIndex || 0, s = e.coordIndex || 0, a = e.properties;
        switch (t.type) {
        case "FeatureCollection":
            r < 0 && (r = t.features.length + r),
            a = a || t.features[r].properties,
            n = t.features[r].geometry;
            break;
        case "Feature":
            a = a || t.properties,
            n = t.geometry;
            break;
        case "Point":
        case "MultiPoint":
            return null;
        case "LineString":
        case "Polygon":
        case "MultiLineString":
        case "MultiPolygon":
            n = t;
            break;
        default:
            throw new Error("geojson is invalid")
        }
        if (null === n)
            return null;
        var u = n.coordinates;
        switch (n.type) {
        case "Point":
            return Kn.point(u, a, e);
        case "MultiPoint":
            return i < 0 && (i = u.length + i),
            Kn.point(u[i], a, e);
        case "LineString":
            return s < 0 && (s = u.length + s),
            Kn.point(u[s], a, e);
        case "Polygon":
            return o < 0 && (o = u.length + o),
            s < 0 && (s = u[o].length + s),
            Kn.point(u[o][s], a, e);
        case "MultiLineString":
            return i < 0 && (i = u.length + i),
            s < 0 && (s = u[i].length + s),
            Kn.point(u[i][s], a, e);
        case "MultiPolygon":
            return i < 0 && (i = u.length + i),
            o < 0 && (o = u[i].length + o),
            s < 0 && (s = u[i][o].length - s),
            Kn.point(u[i][o][s], a, e)
        }
        throw new Error("geojson is invalid")
    }
      , hr = function(t, e) {
        if (e = e || {},
        !Kn.isObject(e))
            throw new Error("options is invalid");
        var n, r = e.featureIndex || 0, i = e.multiFeatureIndex || 0, o = e.geometryIndex || 0, s = e.segmentIndex || 0, a = e.properties;
        switch (t.type) {
        case "FeatureCollection":
            r < 0 && (r = t.features.length + r),
            a = a || t.features[r].properties,
            n = t.features[r].geometry;
            break;
        case "Feature":
            a = a || t.properties,
            n = t.geometry;
            break;
        case "Point":
        case "MultiPoint":
            return null;
        case "LineString":
        case "Polygon":
        case "MultiLineString":
        case "MultiPolygon":
            n = t;
            break;
        default:
            throw new Error("geojson is invalid")
        }
        if (null === n)
            return null;
        var u = n.coordinates;
        switch (n.type) {
        case "Point":
        case "MultiPoint":
            return null;
        case "LineString":
            return s < 0 && (s = u.length + s - 1),
            Kn.lineString([u[s], u[s + 1]], a, e);
        case "Polygon":
            return o < 0 && (o = u.length + o),
            s < 0 && (s = u[o].length + s - 1),
            Kn.lineString([u[o][s], u[o][s + 1]], a, e);
        case "MultiLineString":
            return i < 0 && (i = u.length + i),
            s < 0 && (s = u[i].length + s - 1),
            Kn.lineString([u[i][s], u[i][s + 1]], a, e);
        case "MultiPolygon":
            return i < 0 && (i = u.length + i),
            o < 0 && (o = u[i].length + o),
            s < 0 && (s = u[i][o].length - s - 1),
            Kn.lineString([u[i][o][s], u[i][o][s + 1]], a, e)
        }
        throw new Error("geojson is invalid")
    }
      , pr = nr
      , fr = function(t, e, n) {
        var r = n;
        return nr(t, (function(t, i, o) {
            r = 0 === i && 0 === o && void 0 === n ? t : e(r, t, i, o)
        }
        )),
        r
    }
      , gr = er
      , dr = function(t, e, n) {
        var r = n;
        return er(t, (function(t, i, o, s, a) {
            r = 0 === i && void 0 === n ? t : e(r, t, i, o, s, a)
        }
        )),
        r
    }
      , yr = ir
      , vr = function(t, e, n) {
        var r = n;
        return ir(t, (function(t, i, o, s) {
            r = 0 === i && void 0 === n ? t : e(r, t, i, o, s)
        }
        )),
        r
    }
      , _r = $n
      , mr = function(t, e, n) {
        var r = n;
        return $n(t, (function(t, i) {
            r = 0 === i && void 0 === n ? t : e(r, t, i)
        }
        )),
        r
    }
      , xr = rr
      , Er = function(t, e, n) {
        var r = n
          , i = !1;
        return rr(t, (function(t, o, s, a, u) {
            r = !1 === i && void 0 === n ? t : e(r, t, o, s, a, u),
            i = !0
        }
        )),
        r
    }
      , br = Object.defineProperty({
        coordAll: or,
        coordEach: sr,
        coordReduce: ar,
        featureEach: ur,
        featureReduce: lr,
        findPoint: cr,
        findSegment: hr,
        flattenEach: pr,
        flattenReduce: fr,
        geomEach: gr,
        geomReduce: dr,
        lineEach: yr,
        lineReduce: vr,
        propEach: _r,
        propReduce: mr,
        segmentEach: xr,
        segmentReduce: Er
    }, "__esModule", {
        value: !0
    });
    function wr(t) {
        var e = [1 / 0, 1 / 0, -1 / 0, -1 / 0];
        return br.coordEach(t, (function(t) {
            e[0] > t[0] && (e[0] = t[0]),
            e[1] > t[1] && (e[1] = t[1]),
            e[2] < t[0] && (e[2] = t[0]),
            e[3] < t[1] && (e[3] = t[1])
        }
        )),
        e
    }
    wr.default = wr;
    var Ir = wr
      , Nr = Object.defineProperty({
        default: Ir
    }, "__esModule", {
        value: !0
    }).default
      , Sr = br.featureEach
      , Cr = (br.coordEach,
    Kn.polygon,
    Kn.featureCollection);
    function Pr(t) {
        var e = Nt(t);
        return e.insert = function(t) {
            if ("Feature" !== t.type)
                throw new Error("invalid feature");
            return t.bbox = t.bbox ? t.bbox : Nr(t),
            Nt.prototype.insert.call(this, t)
        }
        ,
        e.load = function(t) {
            var e = [];
            return Array.isArray(t) ? t.forEach((function(t) {
                if ("Feature" !== t.type)
                    throw new Error("invalid features");
                t.bbox = t.bbox ? t.bbox : Nr(t),
                e.push(t)
            }
            )) : Sr(t, (function(t) {
                if ("Feature" !== t.type)
                    throw new Error("invalid features");
                t.bbox = t.bbox ? t.bbox : Nr(t),
                e.push(t)
            }
            )),
            Nt.prototype.load.call(this, e)
        }
        ,
        e.remove = function(t, e) {
            if ("Feature" !== t.type)
                throw new Error("invalid feature");
            return t.bbox = t.bbox ? t.bbox : Nr(t),
            Nt.prototype.remove.call(this, t, e)
        }
        ,
        e.clear = function() {
            return Nt.prototype.clear.call(this)
        }
        ,
        e.search = function(t) {
            var e = Nt.prototype.search.call(this, this.toBBox(t));
            return Cr(e)
        }
        ,
        e.collides = function(t) {
            return Nt.prototype.collides.call(this, this.toBBox(t))
        }
        ,
        e.all = function() {
            var t = Nt.prototype.all.call(this);
            return Cr(t)
        }
        ,
        e.toJSON = function() {
            return Nt.prototype.toJSON.call(this)
        }
        ,
        e.fromJSON = function(t) {
            return Nt.prototype.fromJSON.call(this, t)
        }
        ,
        e.toBBox = function(t) {
            var e;
            if (t.bbox)
                e = t.bbox;
            else if (Array.isArray(t) && 4 === t.length)
                e = t;
            else if (Array.isArray(t) && 6 === t.length)
                e = [t[0], t[1], t[3], t[4]];
            else if ("Feature" === t.type)
                e = Nr(t);
            else {
                if ("FeatureCollection" !== t.type)
                    throw new Error("invalid geojson");
                e = Nr(t)
            }
            return {
                minX: e[0],
                minY: e[1],
                maxX: e[2],
                maxY: e[3]
            }
        }
        ,
        e
    }
    var Mr = Pr
      , Lr = Pr;
    function Or(t, e) {
        var n = {}
          , r = [];
        if ("LineString" === t.type && (t = o(t)),
        "LineString" === e.type && (e = o(e)),
        "Feature" === t.type && "Feature" === e.type && null !== t.geometry && null !== e.geometry && "LineString" === t.geometry.type && "LineString" === e.geometry.type && 2 === t.geometry.coordinates.length && 2 === e.geometry.coordinates.length) {
            var i = Rr(t, e);
            return i && r.push(i),
            f(r)
        }
        var s = Mr();
        return s.load(Zn(e)),
        F(Zn(t), (function(t) {
            F(s.search(t), (function(e) {
                var i = Rr(t, e);
                if (i) {
                    var o = Q(i).join(",");
                    n[o] || (n[o] = !0,
                    r.push(i))
                }
            }
            ))
        }
        )),
        f(r)
    }
    function Rr(t, e) {
        var n = Q(t)
          , r = Q(e);
        if (2 !== n.length)
            throw new Error("<intersects> line1 must only contain 2 coordinates");
        if (2 !== r.length)
            throw new Error("<intersects> line2 must only contain 2 coordinates");
        var i = n[0][0]
          , o = n[0][1]
          , s = n[1][0]
          , u = n[1][1]
          , l = r[0][0]
          , c = r[0][1]
          , h = r[1][0]
          , p = r[1][1]
          , f = (p - c) * (s - i) - (h - l) * (u - o)
          , g = (h - l) * (o - c) - (p - c) * (i - l)
          , d = (s - i) * (o - c) - (u - o) * (i - l);
        if (0 === f)
            return null;
        var y = g / f
          , v = d / f;
        return y >= 0 && y <= 1 && v >= 0 && v <= 1 ? a([i + y * (s - i), o + y * (u - o)]) : null
    }
    function Tr(t, e, n) {
        void 0 === n && (n = {});
        var r = a([1 / 0, 1 / 0], {
            dist: 1 / 0
        })
          , i = 0;
        return z(t, (function(t) {
            for (var o = Q(t), s = 0; s < o.length - 1; s++) {
                var u = a(o[s]);
                u.properties.dist = me(e, u, n);
                var l = a(o[s + 1]);
                l.properties.dist = me(e, l, n);
                var c = me(u, l, n)
                  , p = Math.max(u.properties.dist, l.properties.dist)
                  , f = mn(u, l)
                  , g = vn(e, p, f + 90, n)
                  , d = vn(e, p, f - 90, n)
                  , y = Or(h([g.geometry.coordinates, d.geometry.coordinates]), h([u.geometry.coordinates, l.geometry.coordinates]))
                  , v = null;
                y.features.length > 0 && ((v = y.features[0]).properties.dist = me(e, v, n),
                v.properties.location = i + me(u, v, n)),
                u.properties.dist < r.properties.dist && ((r = u).properties.index = s,
                r.properties.location = i),
                l.properties.dist < r.properties.dist && ((r = l).properties.index = s + 1,
                r.properties.location = i + c),
                v && v.properties.dist < r.properties.dist && ((r = v).properties.index = s),
                i += c
            }
        }
        )),
        r
    }
    function Ar(t, n, r) {
        void 0 === r && (r = {});
        var i = K(t)
          , o = K(n);
        return o[0] += o[0] - i[0] > 180 ? -360 : i[0] - o[0] > 180 ? 360 : 0,
        N(function(t, n, r) {
            var i = r = void 0 === r ? e : Number(r)
              , o = t[1] * Math.PI / 180
              , s = n[1] * Math.PI / 180
              , a = s - o
              , u = Math.abs(n[0] - t[0]) * Math.PI / 180;
            u > Math.PI && (u -= 2 * Math.PI);
            var l = Math.log(Math.tan(s / 2 + Math.PI / 4) / Math.tan(o / 2 + Math.PI / 4))
              , c = Math.abs(l) > 1e-11 ? a / l : Math.cos(o);
            return Math.sqrt(a * a + c * c * u * u) * i
        }(i, o), "meters", r.units)
    }
    function Dr(t, e, n) {
        if (void 0 === n && (n = {}),
        n.method || (n.method = "geodesic"),
        n.units || (n.units = "kilometers"),
        !t)
            throw new Error("pt is required");
        if (Array.isArray(t) ? t = a(t) : "Point" === t.type ? t = o(t) : et(t, "Point", "point"),
        !e)
            throw new Error("line is required");
        Array.isArray(e) ? e = h(e) : "LineString" === e.type ? e = o(e) : et(e, "LineString", "line");
        var r = 1 / 0
          , i = t.geometry.coordinates;
        return U(e, (function(t) {
            var e = t.geometry.coordinates[0]
              , o = t.geometry.coordinates[1]
              , s = function(t, e, n, r) {
                var i = [n[0] - e[0], n[1] - e[1]]
                  , o = Fr([t[0] - e[0], t[1] - e[1]], i);
                if (o <= 0)
                    return kr(t, e, {
                        method: r.method,
                        units: "degrees"
                    });
                var s = Fr(i, i);
                if (s <= o)
                    return kr(t, n, {
                        method: r.method,
                        units: "degrees"
                    });
                var a = o / s
                  , u = [e[0] + a * i[0], e[1] + a * i[1]];
                return kr(t, u, {
                    method: r.method,
                    units: "degrees"
                })
            }(i, e, o, n);
            s < r && (r = s)
        }
        )),
        N(r, "degrees", n.units)
    }
    function Fr(t, e) {
        return t[0] * e[0] + t[1] * e[1]
    }
    function kr(t, e, n) {
        return "planar" === n.method ? Ar(t, e, n) : me(t, e, n)
    }
    function Gr(t, e, n, r, i, o, s, a) {
        var u, l, c, h, p = {
            x: null,
            y: null,
            onLine1: !1,
            onLine2: !1
        };
        return 0 === (u = (a - o) * (n - t) - (s - i) * (r - e)) ? null !== p.x && null !== p.y && p : (h = (n - t) * (l = e - o) - (r - e) * (c = t - i),
        l = ((s - i) * l - (a - o) * c) / u,
        c = h / u,
        p.x = t + l * (n - t),
        p.y = e + l * (r - e),
        l >= 0 && l <= 1 && (p.onLine1 = !0),
        c >= 0 && c <= 1 && (p.onLine2 = !0),
        !(!p.onLine1 || !p.onLine2) && [p.x, p.y])
    }
    function qr(t) {
        for (var e = function(t) {
            if ("FeatureCollection" !== t.type)
                return "Feature" !== t.type ? f([o(t)]) : f([t]);
            return t
        }(t), n = xn(e), r = !1, i = 0; !r && i < e.features.length; ) {
            var s, u = e.features[i].geometry, l = !1;
            if ("Point" === u.type)
                n.geometry.coordinates[0] === u.coordinates[0] && n.geometry.coordinates[1] === u.coordinates[1] && (r = !0);
            else if ("MultiPoint" === u.type) {
                var c = !1;
                for (s = 0; !c && s < u.coordinates.length; )
                    n.geometry.coordinates[0] === u.coordinates[s][0] && n.geometry.coordinates[1] === u.coordinates[s][1] && (r = !0,
                    c = !0),
                    s++
            } else if ("LineString" === u.type)
                for (s = 0; !l && s < u.coordinates.length - 1; )
                    Br(n.geometry.coordinates[0], n.geometry.coordinates[1], u.coordinates[s][0], u.coordinates[s][1], u.coordinates[s + 1][0], u.coordinates[s + 1][1]) && (l = !0,
                    r = !0),
                    s++;
            else if ("MultiLineString" === u.type)
                for (var h = 0; h < u.coordinates.length; ) {
                    l = !1,
                    s = 0;
                    for (var p = u.coordinates[h]; !l && s < p.length - 1; )
                        Br(n.geometry.coordinates[0], n.geometry.coordinates[1], p[s][0], p[s][1], p[s + 1][0], p[s + 1][1]) && (l = !0,
                        r = !0),
                        s++;
                    h++
                }
            else
                "Polygon" !== u.type && "MultiPolygon" !== u.type || ye(n, u) && (r = !0);
            i++
        }
        if (r)
            return n;
        var g = f([]);
        for (i = 0; i < e.features.length; i++)
            g.features = g.features.concat(bn(e.features[i]).features);
        return a(Jn(n, g).geometry.coordinates)
    }
    function Br(t, e, n, r, i, o) {
        return Math.sqrt((i - n) * (i - n) + (o - r) * (o - r)) === Math.sqrt((t - n) * (t - n) + (e - r) * (e - r)) + Math.sqrt((i - t) * (i - t) + (o - e) * (o - e))
    }
    Mr.default = Lr;
    var zr = 6378137;
    function jr(t) {
        return B(t, (function(t, e) {
            return t + function(t) {
                var e, n = 0;
                switch (t.type) {
                case "Polygon":
                    return Ur(t.coordinates);
                case "MultiPolygon":
                    for (e = 0; e < t.coordinates.length; e++)
                        n += Ur(t.coordinates[e]);
                    return n;
                case "Point":
                case "MultiPoint":
                case "LineString":
                case "MultiLineString":
                    return 0
                }
                return 0
            }(e)
        }
        ), 0)
    }
    function Ur(t) {
        var e = 0;
        if (t && t.length > 0) {
            e += Math.abs(Vr(t[0]));
            for (var n = 1; n < t.length; n++)
                e -= Math.abs(Vr(t[n]))
        }
        return e
    }
    function Vr(t) {
        var e, n, r, i, o, s, a = 0, u = t.length;
        if (u > 2) {
            for (s = 0; s < u; s++)
                s === u - 2 ? (r = u - 2,
                i = u - 1,
                o = 0) : s === u - 1 ? (r = u - 1,
                i = 0,
                o = 1) : (r = s,
                i = s + 1,
                o = s + 2),
                e = t[r],
                n = t[i],
                a += (Xr(t[o][0]) - Xr(e[0])) * Math.sin(Xr(n[1]));
            a = a * zr * zr / 2
        }
        return a
    }
    function Xr(t) {
        return t * Math.PI / 180
    }
    function Yr(t, e) {
        return void 0 === e && (e = {}),
        V(t, (function(t, n) {
            var r = n.geometry.coordinates;
            return t + me(r[0], r[1], e)
        }
        ), 0)
    }
    function Hr(t, e, n, r) {
        if (!P(r = r || {}))
            throw new Error("options is invalid");
        var i, o = [];
        if ("Feature" === t.type)
            i = t.geometry.coordinates;
        else {
            if ("LineString" !== t.type)
                throw new Error("input must be a LineString Feature or Geometry");
            i = t.coordinates
        }
        for (var s, a, u, l = i.length, c = 0, p = 0; p < i.length && !(e >= c && p === i.length - 1); p++) {
            if (c > e && 0 === o.length) {
                if (!(s = e - c))
                    return o.push(i[p]),
                    h(o);
                a = mn(i[p], i[p - 1]) - 180,
                u = vn(i[p], s, a, r),
                o.push(u.geometry.coordinates)
            }
            if (c >= n)
                return (s = n - c) ? (a = mn(i[p], i[p - 1]) - 180,
                u = vn(i[p], s, a, r),
                o.push(u.geometry.coordinates),
                h(o)) : (o.push(i[p]),
                h(o));
            if (c >= e && o.push(i[p]),
            p === i.length - 1)
                return h(o);
            c += me(i[p], i[p + 1], r)
        }
        if (c < e && i.length === l)
            throw new Error("Start position is beyond line");
        var f = i[i.length - 1];
        return h([f, f])
    }
    function Wr(t, e, n) {
        void 0 === n && (n = {});
        for (var r = K(t), i = Q(e), o = 0; o < i.length - 1; o++) {
            var s = !1;
            if (n.ignoreEndVertices && (0 === o && (s = "start"),
            o === i.length - 2 && (s = "end"),
            0 === o && o + 1 === i.length - 1 && (s = "both")),
            Jr(i[o], i[o + 1], r, s, void 0 === n.epsilon ? null : n.epsilon))
                return !0
        }
        return !1
    }
    function Jr(t, e, n, r, i) {
        var o = n[0]
          , s = n[1]
          , a = t[0]
          , u = t[1]
          , l = e[0]
          , c = e[1]
          , h = l - a
          , p = c - u
          , f = (n[0] - a) * p - (n[1] - u) * h;
        if (null !== i) {
            if (Math.abs(f) > i)
                return !1
        } else if (0 !== f)
            return !1;
        return r ? "start" === r ? Math.abs(h) >= Math.abs(p) ? h > 0 ? a < o && o <= l : l <= o && o < a : p > 0 ? u < s && s <= c : c <= s && s < u : "end" === r ? Math.abs(h) >= Math.abs(p) ? h > 0 ? a <= o && o < l : l < o && o <= a : p > 0 ? u <= s && s < c : c < s && s <= u : "both" === r && (Math.abs(h) >= Math.abs(p) ? h > 0 ? a < o && o < l : l < o && o < a : p > 0 ? u < s && s < c : c < s && s < u) : Math.abs(h) >= Math.abs(p) ? h > 0 ? a <= o && o <= l : l <= o && o <= a : p > 0 ? u <= s && s <= c : c <= s && s <= u
    }
    function Zr(t, e) {
        var n = rt(t)
          , r = rt(e)
          , i = n.type
          , o = r.type;
        switch (i) {
        case "Point":
            switch (o) {
            case "MultiPoint":
                return function(t, e) {
                    var n, r = !1;
                    for (n = 0; n < e.coordinates.length; n++)
                        if (Qr(e.coordinates[n], t.coordinates)) {
                            r = !0;
                            break
                        }
                    return r
                }(n, r);
            case "LineString":
                return Wr(n, r, {
                    ignoreEndVertices: !0
                });
            case "Polygon":
            case "MultiPolygon":
                return ye(n, r, {
                    ignoreBoundary: !0
                });
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "MultiPoint":
            switch (o) {
            case "MultiPoint":
                return function(t, e) {
                    for (var n = 0; n < t.coordinates.length; n++) {
                        for (var r = !1, i = 0; i < e.coordinates.length; i++)
                            Qr(t.coordinates[n], e.coordinates[i]) && (r = !0);
                        if (!r)
                            return !1
                    }
                    return !0
                }(n, r);
            case "LineString":
                return function(t, e) {
                    for (var n = !1, r = 0; r < t.coordinates.length; r++) {
                        if (!Wr(t.coordinates[r], e))
                            return !1;
                        n || (n = Wr(t.coordinates[r], e, {
                            ignoreEndVertices: !0
                        }))
                    }
                    return n
                }(n, r);
            case "Polygon":
            case "MultiPolygon":
                return function(t, e) {
                    for (var n = !0, r = !1, i = 0; i < t.coordinates.length; i++) {
                        if (!(r = ye(t.coordinates[1], e))) {
                            n = !1;
                            break
                        }
                        r = ye(t.coordinates[1], e, {
                            ignoreBoundary: !0
                        })
                    }
                    return n && r
                }(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "LineString":
            switch (o) {
            case "LineString":
                return function(t, e) {
                    for (var n = 0; n < t.coordinates.length; n++)
                        if (!Wr(t.coordinates[n], e))
                            return !1;
                    return !0
                }(n, r);
            case "Polygon":
            case "MultiPolygon":
                return function(t, e) {
                    var n = Z(e)
                      , r = Z(t);
                    if (!Kr(n, r))
                        return !1;
                    for (var i = !1, o = 0; o < t.coordinates.length - 1; o++) {
                        if (!ye(t.coordinates[o], e))
                            return !1;
                        if (i || (i = ye(t.coordinates[o], e, {
                            ignoreBoundary: !0
                        })),
                        !i)
                            i = ye($r(t.coordinates[o], t.coordinates[o + 1]), e, {
                                ignoreBoundary: !0
                            })
                    }
                    return i
                }(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "Polygon":
            switch (o) {
            case "Polygon":
            case "MultiPolygon":
                return function(t, e) {
                    var n = Z(t);
                    if (!Kr(Z(e), n))
                        return !1;
                    for (var r = 0; r < t.coordinates[0].length; r++)
                        if (!ye(t.coordinates[0][r], e))
                            return !1;
                    return !0
                }(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        default:
            throw new Error("feature1 " + i + " geometry not supported")
        }
    }
    function Kr(t, e) {
        return !(t[0] > e[0]) && (!(t[2] < e[2]) && (!(t[1] > e[1]) && !(t[3] < e[3])))
    }
    function Qr(t, e) {
        return t[0] === e[0] && t[1] === e[1]
    }
    function $r(t, e) {
        return [(t[0] + e[0]) / 2, (t[1] + e[1]) / 2]
    }
    function ti(t, e, n) {
        void 0 === n && (n = {}),
        n.mask && !n.units && (n.units = "kilometers");
        for (var r = [], i = t[0], o = t[1], s = t[2], u = t[3], l = e / me([i, o], [s, o], n) * (s - i), c = e / me([i, o], [i, u], n) * (u - o), h = s - i, p = u - o, g = Math.floor(h / l), d = (p - Math.floor(p / c) * c) / 2, y = i + (h - g * l) / 2; y <= s; ) {
            for (var v = o + d; v <= u; ) {
                var _ = a([y, v], n.properties);
                n.mask ? Zr(_, n.mask) && r.push(_) : r.push(_),
                v += c
            }
            y += l
        }
        return f(r)
    }
    function ei(t, e) {
        void 0 === e && (e = {});
        var n = e.precision
          , r = e.coordinates
          , i = e.mutate;
        if (n = null == n || isNaN(n) ? 6 : n,
        r = null == r || isNaN(r) ? 3 : r,
        !t)
            throw new Error("<geojson> is required");
        if ("number" != typeof n)
            throw new Error("<precision> must be a number");
        if ("number" != typeof r)
            throw new Error("<coordinates> must be a number");
        !1 !== i && void 0 !== i || (t = JSON.parse(JSON.stringify(t)));
        var o = Math.pow(10, n);
        return R(t, (function(t) {
            !function(t, e, n) {
                t.length > n && t.splice(n, t.length);
                for (var r = 0; r < t.length; r++)
                    t[r] = Math.round(t[r] * e) / e
            }(t, o, r)
        }
        )),
        t
    }
    function ni(t) {
        if (!t)
            throw new Error("geojson is required");
        var e = [];
        return z(t, (function(t) {
            e.push(t)
        }
        )),
        f(e)
    }
    function ri(t, e, n) {
        if ("Polygon" !== t.geometry.type)
            throw new Error("The input feature must be a Polygon");
        void 0 === n && (n = 1);
        var r = t.geometry.coordinates
          , i = []
          , o = {};
        if (n) {
            for (var s = [], a = 0; a < r.length; a++)
                for (var u = 0; u < r[a].length - 1; u++)
                    s.push(d(a, u));
            var l = Nt();
            l.load(s)
        }
        for (var c = 0; c < r.length; c++)
            for (var h = 0; h < r[c].length - 1; h++) {
                if (n)
                    l.search(d(c, h)).forEach((function(t) {
                        var e = t.ring
                          , n = t.edge;
                        g(c, h, e, n)
                    }
                    ));
                else
                    for (var p = 0; p < r.length; p++)
                        for (var f = 0; f < r[p].length - 1; f++)
                            g(c, h, p, f)
            }
        return e || (i = {
            type: "Feature",
            geometry: {
                type: "MultiPoint",
                coordinates: i
            }
        }),
        i;
        function g(t, n, s, a) {
            var u, l, c = r[t][n], h = r[t][n + 1], p = r[s][a], f = r[s][a + 1], g = function(t, e, n, r) {
                if (ii(t, n) || ii(t, r) || ii(e, n) || ii(r, n))
                    return null;
                var i = t[0]
                  , o = t[1]
                  , s = e[0]
                  , a = e[1]
                  , u = n[0]
                  , l = n[1]
                  , c = r[0]
                  , h = r[1]
                  , p = (i - s) * (l - h) - (o - a) * (u - c);
                return 0 === p ? null : [((i * a - o * s) * (u - c) - (i - s) * (u * h - l * c)) / p, ((i * a - o * s) * (l - h) - (o - a) * (u * h - l * c)) / p]
            }(c, h, p, f);
            if (null !== g && (u = h[0] !== c[0] ? (g[0] - c[0]) / (h[0] - c[0]) : (g[1] - c[1]) / (h[1] - c[1]),
            l = f[0] !== p[0] ? (g[0] - p[0]) / (f[0] - p[0]) : (g[1] - p[1]) / (f[1] - p[1]),
            !(u >= 1 || u <= 0 || l >= 1 || l <= 0))) {
                var d = g
                  , y = !o[d];
                y && (o[d] = !0),
                e ? i.push(e(g, t, n, c, h, u, s, a, p, f, l, y)) : i.push(g)
            }
        }
        function d(t, e) {
            var n, i, o, s, a = r[t][e], u = r[t][e + 1];
            return a[0] < u[0] ? (n = a[0],
            i = u[0]) : (n = u[0],
            i = a[0]),
            a[1] < u[1] ? (o = a[1],
            s = u[1]) : (o = u[1],
            s = a[1]),
            {
                minX: n,
                minY: o,
                maxX: i,
                maxY: s,
                ring: t,
                edge: e
            }
        }
    }
    function ii(t, e) {
        if (!t || !e)
            return !1;
        if (t.length !== e.length)
            return !1;
        for (var n = 0, r = t.length; n < r; n++)
            if (t[n]instanceof Array && e[n]instanceof Array) {
                if (!ii(t[n], e[n]))
                    return !1
            } else if (t[n] !== e[n])
                return !1;
        return !0
    }
    function oi(t) {
        if ("Feature" != t.type)
            throw new Error("The input must a geojson object of type Feature");
        if (void 0 === t.geometry || null == t.geometry)
            throw new Error("The input must a geojson object with a non-empty geometry");
        if ("Polygon" != t.geometry.type)
            throw new Error("The input must be a geojson Polygon");
        for (var e = t.geometry.coordinates.length, n = [], r = 0; r < e; r++) {
            var i = t.geometry.coordinates[r];
            ci(i[0], i[i.length - 1]) || i.push(i[0]),
            n.push.apply(n, i.slice(0, i.length - 1))
        }
        if (!function(t) {
            for (var e = {}, n = 1, r = 0, i = t.length; r < i; ++r) {
                if (Object.prototype.hasOwnProperty.call(e, t[r])) {
                    n = 0;
                    break
                }
                e[t[r]] = 1
            }
            return n
        }(n))
            throw new Error("The input polygon may not have duplicate vertices (except for the first and last vertex of each ring)");
        var o = n.length
          , s = ri(t, (function(t, e, n, r, i, o, s, a, u, l, c, h) {
            return [t, e, n, r, i, o, s, a, u, l, c, h]
        }
        ))
          , a = s.length;
        if (0 == a) {
            var u = [];
            for (r = 0; r < e; r++)
                u.push(l([t.geometry.coordinates[r]], {
                    parent: -1,
                    winding: li(t.geometry.coordinates[r])
                }));
            var c = f(u);
            return G(),
            q(),
            c
        }
        var h = []
          , p = [];
        for (r = 0; r < e; r++) {
            h.push([]);
            for (var g = 0; g < t.geometry.coordinates[r].length - 1; g++)
                h[r].push([new si(t.geometry.coordinates[r][hi(g + 1, t.geometry.coordinates[r].length - 1)],1,[r, g],[r, hi(g + 1, t.geometry.coordinates[r].length - 1)],void 0)]),
                p.push(new ai(t.geometry.coordinates[r][g],[r, hi(g - 1, t.geometry.coordinates[r].length - 1)],[r, g],void 0,void 0,!1,!0))
        }
        for (r = 0; r < a; r++)
            h[s[r][1]][s[r][2]].push(new si(s[r][0],s[r][5],[s[r][1], s[r][2]],[s[r][6], s[r][7]],void 0)),
            s[r][11] && p.push(new ai(s[r][0],[s[r][1], s[r][2]],[s[r][6], s[r][7]],void 0,void 0,!0,!0));
        var d = p.length;
        for (r = 0; r < h.length; r++)
            for (g = 0; g < h[r].length; g++)
                h[r][g].sort((function(t, e) {
                    return t.param < e.param ? -1 : 1
                }
                ));
        var y = [];
        for (r = 0; r < d; r++)
            y.push({
                minX: p[r].coord[0],
                minY: p[r].coord[1],
                maxX: p[r].coord[0],
                maxY: p[r].coord[1],
                index: r
            });
        var v = Nt();
        v.load(y);
        for (r = 0; r < h.length; r++)
            for (g = 0; g < h[r].length; g++)
                for (var _ = 0; _ < h[r][g].length; _++) {
                    x = _ == h[r][g].length - 1 ? h[r][hi(g + 1, t.geometry.coordinates[r].length - 1)][0].coord : h[r][g][_ + 1].coord;
                    var m = v.search({
                        minX: x[0],
                        minY: x[1],
                        maxX: x[0],
                        maxY: x[1]
                    })[0];
                    h[r][g][_].nxtIsectAlongEdgeIn = m.index
                }
        for (r = 0; r < h.length; r++)
            for (g = 0; g < h[r].length; g++)
                for (_ = 0; _ < h[r][g].length; _++) {
                    var x = h[r][g][_].coord
                      , E = (m = v.search({
                        minX: x[0],
                        minY: x[1],
                        maxX: x[0],
                        maxY: x[1]
                    })[0]).index;
                    E < o ? p[E].nxtIsectAlongRingAndEdge2 = h[r][g][_].nxtIsectAlongEdgeIn : ci(p[E].ringAndEdge1, h[r][g][_].ringAndEdgeIn) ? p[E].nxtIsectAlongRingAndEdge1 = h[r][g][_].nxtIsectAlongEdgeIn : p[E].nxtIsectAlongRingAndEdge2 = h[r][g][_].nxtIsectAlongEdgeIn
                }
        var b = [];
        for (r = 0,
        g = 0; g < e; g++) {
            var w = r;
            for (_ = 0; _ < t.geometry.coordinates[g].length - 1; _++)
                p[r].coord[0] < p[w].coord[0] && (w = r),
                r++;
            var I = p[w].nxtIsectAlongRingAndEdge2;
            for (_ = 0; _ < p.length; _++)
                if (p[_].nxtIsectAlongRingAndEdge1 == w || p[_].nxtIsectAlongRingAndEdge2 == w) {
                    var N = _;
                    break
                }
            var S = ui([p[N].coord, p[w].coord, p[I].coord], !0) ? 1 : -1;
            b.push({
                isect: w,
                parent: -1,
                winding: S
            })
        }
        b.sort((function(t, e) {
            return p[t.isect].coord > p[e.isect].coord ? -1 : 1
        }
        ));
        for (u = []; b.length > 0; ) {
            var C = b.pop()
              , P = C.isect
              , M = C.parent
              , L = C.winding
              , O = u.length
              , R = [p[P].coord]
              , T = P;
            if (p[P].ringAndEdge1Walkable)
                var A = p[P].ringAndEdge1
                  , D = p[P].nxtIsectAlongRingAndEdge1;
            else
                A = p[P].ringAndEdge2,
                D = p[P].nxtIsectAlongRingAndEdge2;
            for (; !ci(p[P].coord, p[D].coord); ) {
                R.push(p[D].coord);
                var F = void 0;
                for (r = 0; r < b.length; r++)
                    if (b[r].isect == D) {
                        F = r;
                        break
                    }
                if (null != F && b.splice(F, 1),
                ci(A, p[D].ringAndEdge1)) {
                    if (A = p[D].ringAndEdge2,
                    p[D].ringAndEdge2Walkable = !1,
                    p[D].ringAndEdge1Walkable) {
                        var k = {
                            isect: D
                        };
                        ui([p[T].coord, p[D].coord, p[p[D].nxtIsectAlongRingAndEdge2].coord], 1 == L) ? (k.parent = M,
                        k.winding = -L) : (k.parent = O,
                        k.winding = L),
                        b.push(k)
                    }
                    T = D,
                    D = p[D].nxtIsectAlongRingAndEdge2
                } else {
                    if (A = p[D].ringAndEdge1,
                    p[D].ringAndEdge1Walkable = !1,
                    p[D].ringAndEdge2Walkable) {
                        k = {
                            isect: D
                        };
                        ui([p[T].coord, p[D].coord, p[p[D].nxtIsectAlongRingAndEdge1].coord], 1 == L) ? (k.parent = M,
                        k.winding = -L) : (k.parent = O,
                        k.winding = L),
                        b.push(k)
                    }
                    T = D,
                    D = p[D].nxtIsectAlongRingAndEdge1
                }
            }
            R.push(p[D].coord),
            u.push(l([R], {
                index: O,
                parent: M,
                winding: L,
                netWinding: void 0
            }))
        }
        c = f(u);
        function G() {
            for (var t = [], e = 0; e < c.features.length; e++)
                -1 == c.features[e].properties.parent && t.push(e);
            if (t.length > 1)
                for (e = 0; e < t.length; e++) {
                    for (var n = -1, r = 0; r < c.features.length; r++)
                        t[e] != r && ye(c.features[t[e]].geometry.coordinates[0][0], c.features[r], {
                            ignoreBoundary: !0
                        }) && jr(c.features[r]) < Infinity && (n = r);
                    c.features[t[e]].properties.parent = n
                }
        }
        function q() {
            for (var t = 0; t < c.features.length; t++)
                if (-1 == c.features[t].properties.parent) {
                    var e = c.features[t].properties.winding;
                    c.features[t].properties.netWinding = e,
                    B(t, e)
                }
        }
        function B(t, e) {
            for (var n = 0; n < c.features.length; n++)
                if (c.features[n].properties.parent == t) {
                    var r = e + c.features[n].properties.winding;
                    c.features[n].properties.netWinding = r,
                    B(n, r)
                }
        }
        return G(),
        q(),
        c
    }
    var si = function(t, e, n, r, i) {
        this.coord = t,
        this.param = e,
        this.ringAndEdgeIn = n,
        this.ringAndEdgeOut = r,
        this.nxtIsectAlongEdgeIn = i
    }
      , ai = function(t, e, n, r, i, o, s) {
        this.coord = t,
        this.ringAndEdge1 = e,
        this.ringAndEdge2 = n,
        this.nxtIsectAlongRingAndEdge1 = r,
        this.nxtIsectAlongRingAndEdge2 = i,
        this.ringAndEdge1Walkable = o,
        this.ringAndEdge2Walkable = s
    };
    function ui(t, e) {
        if (void 0 === e && (e = !0),
        3 != t.length)
            throw new Error("This function requires an array of three points [x,y]");
        return (t[1][0] - t[0][0]) * (t[2][1] - t[0][1]) - (t[1][1] - t[0][1]) * (t[2][0] - t[0][0]) >= 0 == e
    }
    function li(t) {
        for (var e = 0, n = 0; n < t.length - 1; n++)
            t[n][0] < t[e][0] && (e = n);
        if (ui([t[hi(e - 1, t.length - 1)], t[e], t[hi(e + 1, t.length - 1)]], !0))
            var r = 1;
        else
            r = -1;
        return r
    }
    function ci(t, e) {
        if (!t || !e)
            return !1;
        if (t.length != e.length)
            return !1;
        for (var n = 0, r = t.length; n < r; n++)
            if (t[n]instanceof Array && e[n]instanceof Array) {
                if (!ci(t[n], e[n]))
                    return !1
            } else if (t[n] != e[n])
                return !1;
        return !0
    }
    function hi(t, e) {
        return (t % e + e) % e
    }
    var pi = Math.PI / 180
      , fi = 180 / Math.PI
      , gi = function(t, e) {
        this.lon = t,
        this.lat = e,
        this.x = pi * t,
        this.y = pi * e
    };
    gi.prototype.view = function() {
        return String(this.lon).slice(0, 4) + "," + String(this.lat).slice(0, 4)
    }
    ,
    gi.prototype.antipode = function() {
        var t = -1 * this.lat
          , e = this.lon < 0 ? 180 + this.lon : -1 * (180 - this.lon);
        return new gi(e,t)
    }
    ;
    var di = function() {
        this.coords = [],
        this.length = 0
    };
    di.prototype.move_to = function(t) {
        this.length++,
        this.coords.push(t)
    }
    ;
    var yi = function(t) {
        this.properties = t || {},
        this.geometries = []
    };
    yi.prototype.json = function() {
        if (this.geometries.length <= 0)
            return {
                geometry: {
                    type: "LineString",
                    coordinates: null
                },
                type: "Feature",
                properties: this.properties
            };
        if (1 === this.geometries.length)
            return {
                geometry: {
                    type: "LineString",
                    coordinates: this.geometries[0].coords
                },
                type: "Feature",
                properties: this.properties
            };
        for (var t = [], e = 0; e < this.geometries.length; e++)
            t.push(this.geometries[e].coords);
        return {
            geometry: {
                type: "MultiLineString",
                coordinates: t
            },
            type: "Feature",
            properties: this.properties
        }
    }
    ,
    yi.prototype.wkt = function() {
        for (var t = "", e = "LINESTRING(", n = function(t) {
            e += t[0] + " " + t[1] + ","
        }, r = 0; r < this.geometries.length; r++) {
            if (0 === this.geometries[r].coords.length)
                return "LINESTRING(empty)";
            this.geometries[r].coords.forEach(n),
            t += e.substring(0, e.length - 1) + ")"
        }
        return t
    }
    ;
    var vi = function(t, e, n) {
        if (!t || void 0 === t.x || void 0 === t.y)
            throw new Error("GreatCircle constructor expects two args: start and end objects with x and y properties");
        if (!e || void 0 === e.x || void 0 === e.y)
            throw new Error("GreatCircle constructor expects two args: start and end objects with x and y properties");
        this.start = new gi(t.x,t.y),
        this.end = new gi(e.x,e.y),
        this.properties = n || {};
        var r = this.start.x - this.end.x
          , i = this.start.y - this.end.y
          , o = Math.pow(Math.sin(i / 2), 2) + Math.cos(this.start.y) * Math.cos(this.end.y) * Math.pow(Math.sin(r / 2), 2);
        if (this.g = 2 * Math.asin(Math.sqrt(o)),
        this.g === Math.PI)
            throw new Error("it appears " + t.view() + " and " + e.view() + " are 'antipodal', e.g diametrically opposite, thus there is no single route but rather infinite");
        if (isNaN(this.g))
            throw new Error("could not calculate great circle between " + t + " and " + e)
    };
    function _i(t, e) {
        var n = []
          , r = Mr();
        return z(e, (function(e) {
            if (n.forEach((function(t, e) {
                t.id = e
            }
            )),
            n.length) {
                var i = r.search(e);
                if (i.features.length) {
                    var o = xi(e, i);
                    n = n.filter((function(t) {
                        return t.id !== o.id
                    }
                    )),
                    r.remove(o),
                    F(mi(o, e), (function(t) {
                        n.push(t),
                        r.insert(t)
                    }
                    ))
                }
            } else
                (n = mi(t, e).features).forEach((function(t) {
                    t.bbox || (t.bbox = yn(Z(t)))
                }
                )),
                r.load(f(n))
        }
        )),
        f(n)
    }
    function mi(t, e) {
        var n = []
          , r = Q(t)[0]
          , i = Q(t)[t.geometry.coordinates.length - 1];
        if (Ei(r, K(e)) || Ei(i, K(e)))
            return f([t]);
        var o = Mr()
          , s = Zn(t);
        o.load(s);
        var a = o.search(e);
        if (!a.features.length)
            return f([t]);
        var u = xi(e, a)
          , l = k(s, (function(t, r, i) {
            var o = Q(r)[1]
              , s = K(e);
            return i === u.id ? (t.push(s),
            n.push(h(t)),
            Ei(s, o) ? [s] : [s, o]) : (t.push(o),
            t)
        }
        ), [r]);
        return l.length > 1 && n.push(h(l)),
        f(n)
    }
    function xi(t, e) {
        if (!e.features.length)
            throw new Error("lines must contain features");
        if (1 === e.features.length)
            return e.features[0];
        var n, r = 1 / 0;
        return F(e, (function(e) {
            var i = Tr(e, t).properties.dist;
            i < r && (n = e,
            r = i)
        }
        )),
        n
    }
    function Ei(t, e) {
        return t[0] === e[0] && t[1] === e[1]
    }
    function bi(t, e, n, r, i) {
        void 0 === i && (i = {});
        var o = i.steps || 64
          , s = wi(n)
          , a = wi(r)
          , u = Array.isArray(t) || "Feature" !== t.type ? {} : t.properties;
        if (s === a)
            return h(_n(t, e, i).geometry.coordinates[0], u);
        for (var l = s, c = s < a ? a : a + 360, p = l, f = [], g = 0; p < c; )
            f.push(vn(t, e, p, i).geometry.coordinates),
            p = l + 360 * ++g / o;
        return p > c && f.push(vn(t, e, c, i).geometry.coordinates),
        h(f, u)
    }
    function wi(t) {
        var e = t % 360;
        return e < 0 && (e += 360),
        e
    }
    function Ii(t, e) {
        void 0 === e && (e = {});
        var n = rt(t);
        switch (e.properties || "Feature" !== t.type || (e.properties = t.properties),
        n.type) {
        case "Polygon":
            return Ni(n, e);
        case "MultiPolygon":
            return function(t, e) {
                void 0 === e && (e = {});
                var n = rt(t).coordinates
                  , r = e.properties ? e.properties : "Feature" === t.type ? t.properties : {}
                  , i = [];
                return n.forEach((function(t) {
                    i.push(Si(t, r))
                }
                )),
                f(i)
            }(n, e);
        default:
            throw new Error("invalid poly")
        }
    }
    function Ni(t, e) {
        return void 0 === e && (e = {}),
        Si(rt(t).coordinates, e.properties ? e.properties : "Feature" === t.type ? t.properties : {})
    }
    function Si(t, e) {
        return t.length > 1 ? g(t, e) : h(t[0], e)
    }
    function Ci(t, e) {
        var n, r, i;
        void 0 === e && (e = {});
        var o = e.properties
          , s = null === (n = e.autoComplete) || void 0 === n || n
          , a = null === (r = e.orderCoords) || void 0 === r || r;
        switch (null !== (i = e.mutate) && void 0 !== i && i || (t = Ie(t)),
        t.type) {
        case "FeatureCollection":
            var u = [];
            return t.features.forEach((function(t) {
                u.push(Q(Pi(t, {}, s, a)))
            }
            )),
            y(u, o);
        default:
            return Pi(t, o, s, a)
        }
    }
    function Pi(t, e, n, r) {
        e = e || ("Feature" === t.type ? t.properties : {});
        var i = rt(t)
          , o = i.coordinates
          , s = i.type;
        if (!o.length)
            throw new Error("line must contain coordinates");
        switch (s) {
        case "LineString":
            return n && (o = Mi(o)),
            l([o], e);
        case "MultiLineString":
            var a = []
              , u = 0;
            return o.forEach((function(t) {
                if (n && (t = Mi(t)),
                r) {
                    var e = function(t) {
                        var e = t[0]
                          , n = t[1]
                          , r = t[2]
                          , i = t[3];
                        return Math.abs(e - r) * Math.abs(n - i)
                    }(Z(h(t)));
                    e > u ? (a.unshift(t),
                    u = e) : a.push(t)
                } else
                    a.push(t)
            }
            )),
            l(a, e);
        default:
            throw new Error("geometry type " + s + " is not supported")
        }
    }
    function Mi(t) {
        var e = t[0]
          , n = e[0]
          , r = e[1]
          , i = t[t.length - 1]
          , o = i[0]
          , s = i[1];
        return n === o && r === s || t.push(e),
        t
    }
    function Li(t, e) {
        var n, r, i, o, s, a, u;
        for (r = 1; r <= 8; r *= 2) {
            for (n = [],
            o = !(Ri(i = t[t.length - 1], e) & r),
            s = 0; s < t.length; s++)
                (u = !(Ri(a = t[s], e) & r)) !== o && n.push(Oi(i, a, r, e)),
                u && n.push(a),
                i = a,
                o = u;
            if (!(t = n).length)
                break
        }
        return n
    }
    function Oi(t, e, n, r) {
        return 8 & n ? [t[0] + (e[0] - t[0]) * (r[3] - t[1]) / (e[1] - t[1]), r[3]] : 4 & n ? [t[0] + (e[0] - t[0]) * (r[1] - t[1]) / (e[1] - t[1]), r[1]] : 2 & n ? [r[2], t[1] + (e[1] - t[1]) * (r[2] - t[0]) / (e[0] - t[0])] : 1 & n ? [r[0], t[1] + (e[1] - t[1]) * (r[0] - t[0]) / (e[0] - t[0])] : null
    }
    function Ri(t, e) {
        var n = 0;
        return t[0] < e[0] ? n |= 1 : t[0] > e[2] && (n |= 2),
        t[1] < e[1] ? n |= 4 : t[1] > e[3] && (n |= 8),
        n
    }
    function Ti(t, e) {
        for (var n = [], r = 0, i = t; r < i.length; r++) {
            var o = Li(i[r], e);
            o.length > 0 && (o[0][0] === o[o.length - 1][0] && o[0][1] === o[o.length - 1][1] || o.push(o[0]),
            o.length >= 4 && n.push(o))
        }
        return n
    }
    vi.prototype.interpolate = function(t) {
        var e = Math.sin((1 - t) * this.g) / Math.sin(this.g)
          , n = Math.sin(t * this.g) / Math.sin(this.g)
          , r = e * Math.cos(this.start.y) * Math.cos(this.start.x) + n * Math.cos(this.end.y) * Math.cos(this.end.x)
          , i = e * Math.cos(this.start.y) * Math.sin(this.start.x) + n * Math.cos(this.end.y) * Math.sin(this.end.x)
          , o = e * Math.sin(this.start.y) + n * Math.sin(this.end.y)
          , s = fi * Math.atan2(o, Math.sqrt(Math.pow(r, 2) + Math.pow(i, 2)));
        return [fi * Math.atan2(i, r), s]
    }
    ,
    vi.prototype.Arc = function(t, e) {
        var n = [];
        if (!t || t <= 2)
            n.push([this.start.lon, this.start.lat]),
            n.push([this.end.lon, this.end.lat]);
        else
            for (var r = 1 / (t - 1), i = 0; i < t; ++i) {
                var o = r * i
                  , s = this.interpolate(o);
                n.push(s)
            }
        for (var a = !1, u = 0, l = e && e.offset ? e.offset : 10, c = 180 - l, h = -180 + l, p = 360 - l, f = 1; f < n.length; ++f) {
            var g = n[f - 1][0]
              , d = n[f][0]
              , y = Math.abs(d - g);
            y > p && (d > c && g < h || g > c && d < h) ? a = !0 : y > u && (u = y)
        }
        var v = [];
        if (a && u < l) {
            var _ = [];
            v.push(_);
            for (var m = 0; m < n.length; ++m) {
                var x = parseFloat(n[m][0]);
                if (m > 0 && Math.abs(x - n[m - 1][0]) > p) {
                    var E = parseFloat(n[m - 1][0])
                      , b = parseFloat(n[m - 1][1])
                      , w = parseFloat(n[m][0])
                      , I = parseFloat(n[m][1]);
                    if (E > -180 && E < h && 180 === w && m + 1 < n.length && n[m - 1][0] > -180 && n[m - 1][0] < h) {
                        _.push([-180, n[m][1]]),
                        m++,
                        _.push([n[m][0], n[m][1]]);
                        continue
                    }
                    if (E > c && E < 180 && -180 === w && m + 1 < n.length && n[m - 1][0] > c && n[m - 1][0] < 180) {
                        _.push([180, n[m][1]]),
                        m++,
                        _.push([n[m][0], n[m][1]]);
                        continue
                    }
                    if (E < h && w > c) {
                        var N = E;
                        E = w,
                        w = N;
                        var S = b;
                        b = I,
                        I = S
                    }
                    if (E > c && w < h && (w += 360),
                    E <= 180 && w >= 180 && E < w) {
                        var C = (180 - E) / (w - E)
                          , P = C * I + (1 - C) * b;
                        _.push([n[m - 1][0] > c ? 180 : -180, P]),
                        (_ = []).push([n[m - 1][0] > c ? -180 : 180, P]),
                        v.push(_)
                    } else
                        _ = [],
                        v.push(_);
                    _.push([x, n[m][1]])
                } else
                    _.push([n[m][0], n[m][1]])
            }
        } else {
            var M = [];
            v.push(M);
            for (var L = 0; L < n.length; ++L)
                M.push([n[L][0], n[L][1]])
        }
        for (var O = new yi(this.properties), R = 0; R < v.length; ++R) {
            var T = new di;
            O.geometries.push(T);
            for (var A = v[R], D = 0; D < A.length; ++D)
                T.move_to(A[D])
        }
        return O
    }
    ;
    var Ai = Bt((function(t, e) {
        function n(t) {
            var e = [];
            for (var n in t)
                e.push(n);
            return e
        }
        (t.exports = "function" == typeof Object.keys ? Object.keys : n).shim = n
    }
    ))
      , Di = Bt((function(t, e) {
        var n = "[object Arguments]" == function() {
            return Object.prototype.toString.call(arguments)
        }();
        function r(t) {
            return "[object Arguments]" == Object.prototype.toString.call(t)
        }
        function i(t) {
            return t && "object" == typeof t && "number" == typeof t.length && Object.prototype.hasOwnProperty.call(t, "callee") && !Object.prototype.propertyIsEnumerable.call(t, "callee") || !1
        }
        (e = t.exports = n ? r : i).supported = r,
        e.unsupported = i
    }
    ))
      , Fi = Bt((function(t) {
        var e = Array.prototype.slice
          , n = t.exports = function(t, o, s) {
            return s || (s = {}),
            t === o || (t instanceof Date && o instanceof Date ? t.getTime() === o.getTime() : !t || !o || "object" != typeof t && "object" != typeof o ? s.strict ? t === o : t == o : function(t, o, s) {
                var a, u;
                if (r(t) || r(o))
                    return !1;
                if (t.prototype !== o.prototype)
                    return !1;
                if (Di(t))
                    return !!Di(o) && (t = e.call(t),
                    o = e.call(o),
                    n(t, o, s));
                if (i(t)) {
                    if (!i(o))
                        return !1;
                    if (t.length !== o.length)
                        return !1;
                    for (a = 0; a < t.length; a++)
                        if (t[a] !== o[a])
                            return !1;
                    return !0
                }
                try {
                    var l = Ai(t)
                      , c = Ai(o)
                } catch (t) {
                    return !1
                }
                if (l.length != c.length)
                    return !1;
                for (l.sort(),
                c.sort(),
                a = l.length - 1; a >= 0; a--)
                    if (l[a] != c[a])
                        return !1;
                for (a = l.length - 1; a >= 0; a--)
                    if (u = l[a],
                    !n(t[u], o[u], s))
                        return !1;
                return typeof t == typeof o
            }(t, o, s))
        }
        ;
        function r(t) {
            return null == t
        }
        function i(t) {
            return !(!t || "object" != typeof t || "number" != typeof t.length) && ("function" == typeof t.copy && "function" == typeof t.slice && !(t.length > 0 && "number" != typeof t[0]))
        }
    }
    ));
    function ki(t, e, n) {
        if (void 0 === n && (n = {}),
        !P(n = n || {}))
            throw new Error("options is invalid");
        var r, i = n.tolerance || 0, o = [], s = Mr(), a = Zn(t);
        return s.load(a),
        U(e, (function(t) {
            var e = !1;
            t && (F(s.search(t), (function(n) {
                if (!1 === e) {
                    var o = Q(t).sort()
                      , s = Q(n).sort();
                    Fi(o, s) || (0 === i ? Wr(o[0], n) && Wr(o[1], n) : Tr(n, o[0]).properties.dist <= i && Tr(n, o[1]).properties.dist <= i) ? (e = !0,
                    r = r ? Gi(r, t) : t) : (0 === i ? Wr(s[0], t) && Wr(s[1], t) : Tr(t, s[0]).properties.dist <= i && Tr(t, s[1]).properties.dist <= i) && (r = r ? Gi(r, n) : n)
                }
            }
            )),
            !1 === e && r && (o.push(r),
            r = void 0))
        }
        )),
        r && o.push(r),
        f(o)
    }
    function Gi(t, e) {
        var n = Q(e)
          , r = Q(t)
          , i = r[0]
          , o = r[r.length - 1]
          , s = t.geometry.coordinates;
        return Fi(n[0], i) ? s.unshift(n[1]) : Fi(n[0], o) ? s.push(n[1]) : Fi(n[1], i) ? s.unshift(n[0]) : Fi(n[1], o) && s.push(n[0]),
        t
    }
    function qi(t) {
        var e = t % 360;
        return e < 0 && (e += 360),
        e
    }
    function Bi(t, e, n) {
        var r;
        return void 0 === n && (n = {}),
        (r = n.final ? zi(K(e), K(t)) : zi(K(t), K(e))) > 180 ? -(360 - r) : r
    }
    function zi(t, e) {
        var n = I(t[1])
          , r = I(e[1])
          , i = I(e[0] - t[0]);
        i > Math.PI && (i -= 2 * Math.PI),
        i < -Math.PI && (i += 2 * Math.PI);
        var o = Math.log(Math.tan(r / 2 + Math.PI / 4) / Math.tan(n / 2 + Math.PI / 4));
        return (w(Math.atan2(i, o)) + 360) % 360
    }
    function ji(t, n, r, i) {
        void 0 === i && (i = {});
        var o = n < 0
          , s = N(Math.abs(n), i.units, "meters");
        o && (s = -Math.abs(s));
        var u = K(t)
          , l = function(t, n, r, i) {
            i = void 0 === i ? e : Number(i);
            var o = n / i
              , s = t[0] * Math.PI / 180
              , a = I(t[1])
              , u = I(r)
              , l = o * Math.cos(u)
              , c = a + l;
            Math.abs(c) > Math.PI / 2 && (c = c > 0 ? Math.PI - c : -Math.PI - c);
            var h = Math.log(Math.tan(c / 2 + Math.PI / 4) / Math.tan(a / 2 + Math.PI / 4))
              , p = Math.abs(h) > 1e-11 ? l / h : Math.cos(a)
              , f = o * Math.sin(u) / p;
            return [(180 * (s + f) / Math.PI + 540) % 360 - 180, 180 * c / Math.PI]
        }(u, s, r);
        return l[0] += l[0] - u[0] > 180 ? -360 : u[0] - l[0] > 180 ? 360 : 0,
        a(l, i.properties)
    }
    function Ui(t, e, n, r, i, o) {
        for (var s = 0; s < t.length; s++) {
            var a = t[s]
              , u = t[s + 1];
            s === t.length - 1 && (u = t[0]),
            r = Xi(a, u, e),
            n <= 0 && r > 0 ? Xi(e, a, i) < 0 || (i = a) : n > 0 && r <= 0 && (Vi(e, a, o) || (o = a)),
            n = r
        }
        return [i, o]
    }
    function Vi(t, e, n) {
        return Xi(t, e, n) > 0
    }
    function Xi(t, e, n) {
        return (e[0] - t[0]) * (n[1] - t[1]) - (n[0] - t[0]) * (e[1] - t[1])
    }
    function Yi(t) {
        for (var e, n, r = Q(t), i = 0, o = 1; o < r.length; )
            e = n || r[0],
            i += ((n = r[o])[0] - e[0]) * (n[1] + e[1]),
            o++;
        return i > 0
    }
    function Hi(t, e) {
        switch ("Feature" === t.type ? t.geometry.type : t.type) {
        case "GeometryCollection":
            return q(t, (function(t) {
                Hi(t, e)
            }
            )),
            t;
        case "LineString":
            return Wi(Q(t), e),
            t;
        case "Polygon":
            return Ji(Q(t), e),
            t;
        case "MultiLineString":
            return Q(t).forEach((function(t) {
                Wi(t, e)
            }
            )),
            t;
        case "MultiPolygon":
            return Q(t).forEach((function(t) {
                Ji(t, e)
            }
            )),
            t;
        case "Point":
        case "MultiPoint":
            return t
        }
    }
    function Wi(t, e) {
        Yi(t) === e && t.reverse()
    }
    function Ji(t, e) {
        Yi(t[0]) !== e && t[0].reverse();
        for (var n = 1; n < t.length; n++)
            Yi(t[n]) === e && t[n].reverse()
    }
    function Zi(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.zProperty || "elevation"
          , r = e.flip
          , i = e.flags;
        nt(t, "Point", "input must contain Points");
        for (var o = function(t, e) {
            var n = {};
            return F(t, (function(t) {
                var e = Q(t)[1];
                n[e] || (n[e] = []),
                n[e].push(t)
            }
            )),
            Object.keys(n).map((function(t) {
                return n[t].sort((function(t, e) {
                    return Q(t)[0] - Q(e)[0]
                }
                ))
            }
            )).sort((function(t, n) {
                return e ? Q(t[0])[1] - Q(n[0])[1] : Q(n[0])[1] - Q(t[0])[1]
            }
            ))
        }/*!
     * @license GNU Affero General Public License.
     * Copyright (c) 2015, 2015 Ronny Lorenz <ronny@tbi.univie.ac.at>
     * v. 1.2.0
     * https://github.com/RaumZeit/MarchingSquares.js
     *
     * MarchingSquaresJS is free software: you can redistribute it and/or modify
     * it under the terms of the GNU Affero General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     * MarchingSquaresJS is distributed in the hope that it will be useful,
     * but WITHOUT ANY WARRANTY; without even the implied warranty of
     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     * GNU Affero General Public License for more details.
     *
     * As additional permission under GNU Affero General Public License version 3
     * section 7, third-party projects (personal or commercial) may distribute,
     * include, or link against UNMODIFIED VERSIONS of MarchingSquaresJS without the
     * requirement that said third-party project for that reason alone becomes
     * subject to any requirement of the GNU Affero General Public License version 3.
     * Any modifications to MarchingSquaresJS, however, must be shared with the public
     * and made available.
     *
     * In summary this:
     * - allows you to use MarchingSquaresJS at no cost
     * - allows you to use MarchingSquaresJS for both personal and commercial purposes
     * - allows you to distribute UNMODIFIED VERSIONS of MarchingSquaresJS under any
     *   license as long as this license notice is included
     * - enables you to keep the source code of your program that uses MarchingSquaresJS
     *   undisclosed
     * - forces you to share any modifications you have made to MarchingSquaresJS,
     *   e.g. bug-fixes
     *
     * You should have received a copy of the GNU Affero General Public License
     * along with MarchingSquaresJS.  If not, see <http://www.gnu.org/licenses/>.
     */
        (t, r), s = [], a = 0; a < o.length; a++) {
            for (var u = o[a], l = [], c = 0; c < u.length; c++) {
                var h = u[c];
                h.properties[n] ? l.push(h.properties[n]) : l.push(0),
                !0 === i && (h.properties.matrixPosition = [a, c])
            }
            s.push(l)
        }
        return s
    }
    var Ki = {
        successCallback: null,
        verbose: !1,
        polygons: !1
    }
      , Qi = {};
    function $i(t, e, n, r) {
        r = r || {};
        for (var i = Object.keys(Ki), o = 0; o < i.length; o++) {
            var s = i[o]
              , a = r[s];
            a = null != a ? a : Ki[s],
            Qi[s] = a
        }
        Qi.verbose && console.log("MarchingSquaresJS-isoBands: computing isobands for [" + e + ":" + (e + n) + "]");
        var u, l = function(t, e, n) {
            for (var r = t.length - 1, i = t[0].length - 1, o = {
                rows: r,
                cols: i,
                cells: []
            }, s = e + Math.abs(n), a = 0; a < r; ++a) {
                o.cells[a] = [];
                for (var u = 0; u < i; ++u) {
                    var l = 0
                      , c = t[a + 1][u]
                      , h = t[a + 1][u + 1]
                      , p = t[a][u + 1]
                      , f = t[a][u];
                    if (!(isNaN(c) || isNaN(h) || isNaN(p) || isNaN(f))) {
                        l |= c < e ? 0 : c > s ? 128 : 64,
                        l |= h < e ? 0 : h > s ? 32 : 16,
                        l |= p < e ? 0 : p > s ? 8 : 4;
                        var g = +(l |= f < e ? 0 : f > s ? 2 : 1)
                          , d = 0;
                        if (17 === l || 18 === l || 33 === l || 34 === l || 38 === l || 68 === l || 72 === l || 98 === l || 102 === l || 132 === l || 136 === l || 137 === l || 152 === l || 153 === l) {
                            var y = (c + h + p + f) / 4;
                            d = y > s ? 2 : y < e ? 0 : 1,
                            34 === l ? 1 === d ? l = 35 : 0 === d && (l = 136) : 136 === l ? 1 === d ? (l = 35,
                            d = 4) : 0 === d && (l = 34) : 17 === l ? 1 === d ? (l = 155,
                            d = 4) : 0 === d && (l = 153) : 68 === l ? 1 === d ? (l = 103,
                            d = 4) : 0 === d && (l = 102) : 153 === l ? 1 === d && (l = 155) : 102 === l ? 1 === d && (l = 103) : 152 === l ? d < 2 && (l = 156,
                            d = 1) : 137 === l ? d < 2 && (l = 139,
                            d = 1) : 98 === l ? d < 2 && (l = 99,
                            d = 1) : 38 === l ? d < 2 && (l = 39,
                            d = 1) : 18 === l ? d > 0 ? (l = 156,
                            d = 4) : l = 152 : 33 === l ? d > 0 ? (l = 139,
                            d = 4) : l = 137 : 72 === l ? d > 0 ? (l = 99,
                            d = 4) : l = 98 : 132 === l && (d > 0 ? (l = 39,
                            d = 4) : l = 38)
                        }
                        if (0 != l && 170 != l) {
                            var v, _, m, x, E, b, w, I;
                            v = _ = m = x = E = b = w = I = .5;
                            var N = [];
                            1 === l ? (m = 1 - Vo(e, p, f),
                            I = 1 - Vo(e, c, f),
                            N.push(Go[l])) : 169 === l ? (m = Vo(s, f, p),
                            I = Vo(s, f, c),
                            N.push(Go[l])) : 4 === l ? (b = 1 - Vo(e, h, p),
                            x = Vo(e, f, p),
                            N.push(Fo[l])) : 166 === l ? (b = Vo(s, p, h),
                            x = 1 - Vo(s, p, f),
                            N.push(Fo[l])) : 16 === l ? (E = Vo(e, p, h),
                            _ = Vo(e, c, h),
                            N.push(Do[l])) : 154 === l ? (E = 1 - Vo(s, h, p),
                            _ = 1 - Vo(s, h, c),
                            N.push(Do[l])) : 64 === l ? (w = Vo(e, f, c),
                            v = 1 - Vo(e, h, c),
                            N.push(Bo[l])) : 106 === l ? (w = 1 - Vo(s, c, f),
                            v = Vo(s, c, h),
                            N.push(Bo[l])) : 168 === l ? (x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            N.push(ko[l]),
                            N.push(Go[l])) : 2 === l ? (x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            N.push(ko[l]),
                            N.push(Go[l])) : 162 === l ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            N.push(ko[l]),
                            N.push(Go[l])) : 8 === l ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 138 === l ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 32 === l ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 42 === l ? (I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h),
                            N.push(qo[l]),
                            N.push(Bo[l])) : 128 === l && (I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c),
                            N.push(qo[l]),
                            N.push(Bo[l])),
                            5 === l ? (b = 1 - Vo(e, h, p),
                            I = 1 - Vo(e, c, f),
                            N.push(Fo[l])) : 165 === l ? (b = Vo(s, p, h),
                            I = Vo(s, f, c),
                            N.push(Fo[l])) : 20 === l ? (x = Vo(e, f, p),
                            _ = Vo(e, c, h),
                            N.push(ko[l])) : 150 === l ? (x = 1 - Vo(s, p, f),
                            _ = 1 - Vo(s, h, c),
                            N.push(ko[l])) : 80 === l ? (E = Vo(e, p, h),
                            w = Vo(e, f, c),
                            N.push(Do[l])) : 90 === l ? (E = 1 - Vo(s, h, p),
                            w = 1 - Vo(s, c, f),
                            N.push(Do[l])) : 65 === l ? (m = 1 - Vo(e, p, f),
                            v = 1 - Vo(e, h, c),
                            N.push(Go[l])) : 105 === l ? (m = Vo(s, f, p),
                            v = Vo(s, c, h),
                            N.push(Go[l])) : 160 === l ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 10 === l ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 130 === l ? (x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c),
                            N.push(ko[l]),
                            N.push(Go[l])) : 40 === l ? (x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h),
                            N.push(ko[l]),
                            N.push(Go[l])) : 101 === l ? (b = Vo(s, p, h),
                            v = Vo(s, c, h),
                            N.push(Fo[l])) : 69 === l ? (b = 1 - Vo(e, h, p),
                            v = 1 - Vo(e, h, c),
                            N.push(Fo[l])) : 149 === l ? (I = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c),
                            N.push(qo[l])) : 21 === l ? (I = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h),
                            N.push(qo[l])) : 86 === l ? (x = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            N.push(ko[l])) : 84 === l ? (x = Vo(e, f, p),
                            w = Vo(e, f, c),
                            N.push(ko[l])) : 89 === l ? (E = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            N.push(Go[l])) : 81 === l ? (E = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            N.push(Go[l])) : 96 === l ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            w = Vo(e, f, c),
                            v = Vo(s, c, h),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 74 === l ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            w = 1 - Vo(s, c, f),
                            v = 1 - Vo(e, h, c),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 24 === l ? (E = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            _ = Vo(e, c, h),
                            N.push(Do[l]),
                            N.push(Go[l])) : 146 === l ? (E = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            _ = 1 - Vo(s, h, c),
                            N.push(Do[l]),
                            N.push(Go[l])) : 6 === l ? (b = 1 - Vo(e, h, p),
                            x = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            N.push(Fo[l]),
                            N.push(ko[l])) : 164 === l ? (b = Vo(s, p, h),
                            x = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            N.push(Fo[l]),
                            N.push(ko[l])) : 129 === l ? (m = 1 - Vo(e, p, f),
                            I = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c),
                            N.push(Go[l]),
                            N.push(qo[l])) : 41 === l ? (m = Vo(s, f, p),
                            I = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h),
                            N.push(Go[l]),
                            N.push(qo[l])) : 66 === l ? (x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            v = 1 - Vo(e, h, c),
                            N.push(ko[l]),
                            N.push(Go[l])) : 104 === l ? (x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            w = Vo(e, f, c),
                            v = Vo(s, c, h),
                            N.push(Go[l]),
                            N.push(zo[l])) : 144 === l ? (E = Vo(e, p, h),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c),
                            N.push(Do[l]),
                            N.push(Bo[l])) : 26 === l ? (E = 1 - Vo(s, h, p),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h),
                            N.push(Do[l]),
                            N.push(Bo[l])) : 36 === l ? (b = Vo(s, p, h),
                            x = Vo(e, f, p),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h),
                            N.push(Fo[l]),
                            N.push(ko[l])) : 134 === l ? (b = 1 - Vo(e, h, p),
                            x = 1 - Vo(s, p, f),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c),
                            N.push(Fo[l]),
                            N.push(ko[l])) : 9 === l ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            I = 1 - Vo(e, c, f),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 161 === l ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            I = Vo(s, f, c),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 37 === l ? (b = Vo(s, p, h),
                            I = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h),
                            N.push(Fo[l]),
                            N.push(qo[l])) : 133 === l ? (b = 1 - Vo(e, h, p),
                            I = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c),
                            N.push(Fo[l]),
                            N.push(qo[l])) : 148 === l ? (x = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c),
                            N.push(ko[l]),
                            N.push(Bo[l])) : 22 === l ? (x = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h),
                            N.push(ko[l]),
                            N.push(Bo[l])) : 82 === l ? (E = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            N.push(Do[l]),
                            N.push(Go[l])) : 88 === l ? (E = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            w = Vo(e, f, c),
                            N.push(Do[l]),
                            N.push(Go[l])) : 73 === l ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            v = 1 - Vo(e, h, c),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 97 === l ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            v = Vo(s, c, h),
                            N.push(Do[l]),
                            N.push(Fo[l])) : 145 === l ? (E = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            I = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c),
                            N.push(Do[l]),
                            N.push(qo[l])) : 25 === l ? (E = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            I = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h),
                            N.push(Do[l]),
                            N.push(qo[l])) : 70 === l ? (b = 1 - Vo(e, h, p),
                            x = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            v = 1 - Vo(e, h, c),
                            N.push(Fo[l]),
                            N.push(ko[l])) : 100 === l ? (b = Vo(s, p, h),
                            x = Vo(e, f, p),
                            w = Vo(e, f, c),
                            v = Vo(s, c, h),
                            N.push(Fo[l]),
                            N.push(ko[l])) : 34 === l ? (0 === d ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c)) : (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h)),
                            N.push(Do[l]),
                            N.push(Fo[l]),
                            N.push(qo[l]),
                            N.push(Bo[l])) : 35 === l ? (4 === d ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c)) : (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h)),
                            N.push(Do[l]),
                            N.push(Fo[l]),
                            N.push(Go[l]),
                            N.push(Bo[l])) : 136 === l ? (0 === d ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h)) : (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c)),
                            N.push(Do[l]),
                            N.push(Fo[l]),
                            N.push(qo[l]),
                            N.push(Bo[l])) : 153 === l ? (0 === d ? (E = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            I = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h)) : (E = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            I = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c)),
                            N.push(Do[l]),
                            N.push(Go[l])) : 102 === l ? (0 === d ? (b = 1 - Vo(e, h, p),
                            x = Vo(e, f, p),
                            w = Vo(e, f, c),
                            v = 1 - Vo(e, h, c)) : (b = Vo(s, p, h),
                            x = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            v = Vo(s, c, h)),
                            N.push(Fo[l]),
                            N.push(Bo[l])) : 155 === l ? (4 === d ? (E = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            I = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h)) : (E = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            I = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c)),
                            N.push(Do[l]),
                            N.push(qo[l])) : 103 === l ? (4 === d ? (b = 1 - Vo(e, h, p),
                            x = Vo(e, f, p),
                            w = Vo(e, f, c),
                            v = 1 - Vo(e, h, c)) : (b = Vo(s, p, h),
                            x = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            v = Vo(s, c, h)),
                            N.push(Fo[l]),
                            N.push(ko[l])) : 152 === l ? (0 === d ? (E = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h)) : (E = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c)),
                            N.push(Do[l]),
                            N.push(ko[l]),
                            N.push(Go[l])) : 156 === l ? (4 === d ? (E = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            _ = Vo(e, c, h)) : (E = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            _ = 1 - Vo(s, h, c)),
                            N.push(Do[l]),
                            N.push(Go[l]),
                            N.push(Bo[l])) : 137 === l ? (0 === d ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            I = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h)) : (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            I = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c)),
                            N.push(Do[l]),
                            N.push(Fo[l]),
                            N.push(Go[l])) : 139 === l ? (4 === d ? (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            m = 1 - Vo(e, p, f),
                            I = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h)) : (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            m = Vo(s, f, p),
                            I = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c)),
                            N.push(Do[l]),
                            N.push(Fo[l]),
                            N.push(qo[l])) : 98 === l ? (0 === d ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            w = Vo(e, f, c),
                            v = 1 - Vo(e, h, c)) : (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            v = Vo(s, c, h)),
                            N.push(Do[l]),
                            N.push(Fo[l]),
                            N.push(Bo[l])) : 99 === l ? (4 === d ? (E = 1 - Vo(e, h, p),
                            b = 1 - Vo(s, h, p),
                            x = Vo(s, f, p),
                            m = Vo(e, f, p),
                            w = Vo(e, f, c),
                            v = 1 - Vo(e, h, c)) : (E = Vo(s, p, h),
                            b = Vo(e, p, h),
                            x = 1 - Vo(e, p, f),
                            m = 1 - Vo(s, p, f),
                            w = 1 - Vo(s, c, f),
                            v = Vo(s, c, h)),
                            N.push(Do[l]),
                            N.push(Fo[l]),
                            N.push(Go[l])) : 38 === l ? (0 === d ? (b = 1 - Vo(e, h, p),
                            x = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c)) : (b = Vo(s, p, h),
                            x = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h)),
                            N.push(Fo[l]),
                            N.push(qo[l]),
                            N.push(Bo[l])) : 39 === l ? (4 === d ? (b = 1 - Vo(e, h, p),
                            x = Vo(e, f, p),
                            I = Vo(e, f, c),
                            w = Vo(s, f, c),
                            v = 1 - Vo(s, h, c),
                            _ = 1 - Vo(e, h, c)) : (b = Vo(s, p, h),
                            x = 1 - Vo(s, p, f),
                            I = 1 - Vo(s, c, f),
                            w = 1 - Vo(e, c, f),
                            v = Vo(e, c, h),
                            _ = Vo(s, c, h)),
                            N.push(Fo[l]),
                            N.push(ko[l]),
                            N.push(Bo[l])) : 85 === l && (E = 1,
                            b = 0,
                            x = 1,
                            m = 0,
                            I = 0,
                            w = 1,
                            v = 0,
                            _ = 1),
                            (v < 0 || v > 1 || _ < 0 || _ > 1 || E < 0 || E > 1 || x < 0 || x > 1 || I < 0 || I > 1 || w < 0 || w > 1) && console.log("MarchingSquaresJS-isoBands: " + l + " " + g + " " + c + "," + h + "," + p + "," + f + " " + d + " " + v + " " + _ + " " + E + " " + b + " " + x + " " + m + " " + I + " " + w),
                            o.cells[a][u] = {
                                cval: l,
                                cval_real: g,
                                flipped: d,
                                topleft: v,
                                topright: _,
                                righttop: E,
                                rightbottom: b,
                                bottomright: x,
                                bottomleft: m,
                                leftbottom: I,
                                lefttop: w,
                                edges: N
                            }
                        }
                    }
                }
            }
            return o
        }(t, e, n);
        return Qi.polygons ? (Qi.verbose && console.log("MarchingSquaresJS-isoBands: returning single polygons for each grid cell"),
        u = function(t) {
            var e = []
              , n = 0;
            return t.cells.forEach((function(t, r) {
                t.forEach((function(t, i) {
                    if (void 0 !== t) {
                        var o = Uo[t.cval](t);
                        "object" == typeof o && Xo(o) ? "object" == typeof o[0] && Xo(o[0]) ? "object" == typeof o[0][0] && Xo(o[0][0]) ? o.forEach((function(t) {
                            t.forEach((function(t) {
                                t[0] += i,
                                t[1] += r
                            }
                            )),
                            e[n++] = t
                        }
                        )) : (o.forEach((function(t) {
                            t[0] += i,
                            t[1] += r
                        }
                        )),
                        e[n++] = o) : console.log("MarchingSquaresJS-isoBands: bandcell polygon with malformed coordinates") : console.log("MarchingSquaresJS-isoBands: bandcell polygon with null coordinates")
                    }
                }
                ))
            }
            )),
            e
        }(l)) : (Qi.verbose && console.log("MarchingSquaresJS-isoBands: returning polygon paths for entire data grid"),
        u = function(t) {
            for (var e = [], n = t.rows, r = t.cols, i = [], o = 0; o < n; o++)
                for (var s = 0; s < r; s++)
                    if (void 0 !== t.cells[o][s] && t.cells[o][s].edges.length > 0) {
                        var a = Ho(t.cells[o][s])
                          , u = null
                          , l = s
                          , c = o;
                        null !== a && i.push([a.p[0] + l, a.p[1] + c]);
                        do {
                            if (null === (u = Wo(t.cells[c][l], a.x, a.y, a.o)))
                                break;
                            if (i.push([u.p[0] + l, u.p[1] + c]),
                            l += u.x,
                            a = u,
                            (c += u.y) < 0 || c >= n || l < 0 || l >= r || void 0 === t.cells[c][l]) {
                                var h = Yo(t, l -= u.x, c -= u.y, u.x, u.y, u.o);
                                if (null === h)
                                    break;
                                h.path.forEach((function(t) {
                                    i.push(t)
                                }
                                )),
                                l = h.i,
                                c = h.j,
                                a = h
                            }
                        } while (void 0 !== t.cells[c][l] && t.cells[c][l].edges.length > 0);
                        e.push(i),
                        i = [],
                        t.cells[o][s].edges.length > 0 && s--
                    }
            return e
        }(l)),
        "function" == typeof Qi.successCallback && Qi.successCallback(u),
        u
    }
    var to = 64
      , eo = 16
      , no = []
      , ro = []
      , io = []
      , oo = []
      , so = []
      , ao = []
      , uo = []
      , lo = []
      , co = []
      , ho = []
      , po = []
      , fo = []
      , go = []
      , yo = []
      , vo = []
      , _o = []
      , mo = []
      , xo = []
      , Eo = []
      , bo = []
      , wo = []
      , Io = []
      , No = []
      , So = [];
    uo[85] = ho[85] = -1,
    lo[85] = po[85] = 0,
    co[85] = fo[85] = 1,
    Eo[85] = Io[85] = 1,
    bo[85] = No[85] = 0,
    wo[85] = So[85] = 1,
    no[85] = oo[85] = 0,
    ro[85] = so[85] = -1,
    io[85] = vo[85] = 0,
    _o[85] = go[85] = 0,
    mo[85] = yo[85] = 1,
    ao[85] = xo[85] = 1,
    Io[1] = Io[169] = 0,
    No[1] = No[169] = -1,
    So[1] = So[169] = 0,
    go[1] = go[169] = -1,
    yo[1] = yo[169] = 0,
    vo[1] = vo[169] = 0,
    ho[4] = ho[166] = 0,
    po[4] = po[166] = -1,
    fo[4] = fo[166] = 1,
    _o[4] = _o[166] = 1,
    mo[4] = mo[166] = 0,
    xo[4] = xo[166] = 0,
    uo[16] = uo[154] = 0,
    lo[16] = lo[154] = 1,
    co[16] = co[154] = 1,
    oo[16] = oo[154] = 1,
    so[16] = so[154] = 0,
    ao[16] = ao[154] = 1,
    Eo[64] = Eo[106] = 0,
    bo[64] = bo[106] = 1,
    wo[64] = wo[106] = 0,
    no[64] = no[106] = -1,
    ro[64] = ro[106] = 0,
    io[64] = io[106] = 1,
    Eo[2] = Eo[168] = 0,
    bo[2] = bo[168] = -1,
    wo[2] = wo[168] = 1,
    Io[2] = Io[168] = 0,
    No[2] = No[168] = -1,
    So[2] = So[168] = 0,
    go[2] = go[168] = -1,
    yo[2] = yo[168] = 0,
    vo[2] = vo[168] = 0,
    _o[2] = _o[168] = -1,
    mo[2] = mo[168] = 0,
    xo[2] = xo[168] = 1,
    uo[8] = uo[162] = 0,
    lo[8] = lo[162] = -1,
    co[8] = co[162] = 0,
    ho[8] = ho[162] = 0,
    po[8] = po[162] = -1,
    fo[8] = fo[162] = 1,
    go[8] = go[162] = 1,
    yo[8] = yo[162] = 0,
    vo[8] = vo[162] = 1,
    _o[8] = _o[162] = 1,
    mo[8] = mo[162] = 0,
    xo[8] = xo[162] = 0,
    uo[32] = uo[138] = 0,
    lo[32] = lo[138] = 1,
    co[32] = co[138] = 1,
    ho[32] = ho[138] = 0,
    po[32] = po[138] = 1,
    fo[32] = fo[138] = 0,
    no[32] = no[138] = 1,
    ro[32] = ro[138] = 0,
    io[32] = io[138] = 0,
    oo[32] = oo[138] = 1,
    so[32] = so[138] = 0,
    ao[32] = ao[138] = 1,
    Io[128] = Io[42] = 0,
    No[128] = No[42] = 1,
    So[128] = So[42] = 1,
    Eo[128] = Eo[42] = 0,
    bo[128] = bo[42] = 1,
    wo[128] = wo[42] = 0,
    no[128] = no[42] = -1,
    ro[128] = ro[42] = 0,
    io[128] = io[42] = 1,
    oo[128] = oo[42] = -1,
    so[128] = so[42] = 0,
    ao[128] = ao[42] = 0,
    ho[5] = ho[165] = -1,
    po[5] = po[165] = 0,
    fo[5] = fo[165] = 0,
    Io[5] = Io[165] = 1,
    No[5] = No[165] = 0,
    So[5] = So[165] = 0,
    _o[20] = _o[150] = 0,
    mo[20] = mo[150] = 1,
    xo[20] = xo[150] = 1,
    oo[20] = oo[150] = 0,
    so[20] = so[150] = -1,
    ao[20] = ao[150] = 1,
    uo[80] = uo[90] = -1,
    lo[80] = lo[90] = 0,
    co[80] = co[90] = 1,
    Eo[80] = Eo[90] = 1,
    bo[80] = bo[90] = 0,
    wo[80] = wo[90] = 1,
    go[65] = go[105] = 0,
    yo[65] = yo[105] = 1,
    vo[65] = vo[105] = 0,
    no[65] = no[105] = 0,
    ro[65] = ro[105] = -1,
    io[65] = io[105] = 0,
    uo[160] = uo[10] = -1,
    lo[160] = lo[10] = 0,
    co[160] = co[10] = 1,
    ho[160] = ho[10] = -1,
    po[160] = po[10] = 0,
    fo[160] = fo[10] = 0,
    Io[160] = Io[10] = 1,
    No[160] = No[10] = 0,
    So[160] = So[10] = 0,
    Eo[160] = Eo[10] = 1,
    bo[160] = bo[10] = 0,
    wo[160] = wo[10] = 1,
    _o[130] = _o[40] = 0,
    mo[130] = mo[40] = 1,
    xo[130] = xo[40] = 1,
    go[130] = go[40] = 0,
    yo[130] = yo[40] = 1,
    vo[130] = vo[40] = 0,
    no[130] = no[40] = 0,
    ro[130] = ro[40] = -1,
    io[130] = io[40] = 0,
    oo[130] = oo[40] = 0,
    so[130] = so[40] = -1,
    ao[130] = ao[40] = 1,
    ho[37] = ho[133] = 0,
    po[37] = po[133] = 1,
    fo[37] = fo[133] = 1,
    Io[37] = Io[133] = 0,
    No[37] = No[133] = 1,
    So[37] = So[133] = 0,
    no[37] = no[133] = -1,
    ro[37] = ro[133] = 0,
    io[37] = io[133] = 0,
    oo[37] = oo[133] = 1,
    so[37] = so[133] = 0,
    ao[37] = ao[133] = 0,
    _o[148] = _o[22] = -1,
    mo[148] = mo[22] = 0,
    xo[148] = xo[22] = 0,
    Io[148] = Io[22] = 0,
    No[148] = No[22] = -1,
    So[148] = So[22] = 1,
    Eo[148] = Eo[22] = 0,
    bo[148] = bo[22] = 1,
    wo[148] = wo[22] = 1,
    oo[148] = oo[22] = -1,
    so[148] = so[22] = 0,
    ao[148] = ao[22] = 1,
    uo[82] = uo[88] = 0,
    lo[82] = lo[88] = -1,
    co[82] = co[88] = 1,
    _o[82] = _o[88] = 1,
    mo[82] = mo[88] = 0,
    xo[82] = xo[88] = 1,
    go[82] = go[88] = -1,
    yo[82] = yo[88] = 0,
    vo[82] = vo[88] = 1,
    Eo[82] = Eo[88] = 0,
    bo[82] = bo[88] = -1,
    wo[82] = wo[88] = 0,
    uo[73] = uo[97] = 0,
    lo[73] = lo[97] = 1,
    co[73] = co[97] = 0,
    ho[73] = ho[97] = 0,
    po[73] = po[97] = -1,
    fo[73] = fo[97] = 0,
    go[73] = go[97] = 1,
    yo[73] = yo[97] = 0,
    vo[73] = vo[97] = 0,
    no[73] = no[97] = 1,
    ro[73] = ro[97] = 0,
    io[73] = io[97] = 1,
    uo[145] = uo[25] = 0,
    lo[145] = lo[25] = -1,
    co[145] = co[25] = 0,
    go[145] = go[25] = 1,
    yo[145] = yo[25] = 0,
    vo[145] = vo[25] = 1,
    Io[145] = Io[25] = 0,
    No[145] = No[25] = 1,
    So[145] = So[25] = 1,
    oo[145] = oo[25] = -1,
    so[145] = so[25] = 0,
    ao[145] = ao[25] = 0,
    ho[70] = ho[100] = 0,
    po[70] = po[100] = 1,
    fo[70] = fo[100] = 0,
    _o[70] = _o[100] = -1,
    mo[70] = mo[100] = 0,
    xo[70] = xo[100] = 1,
    Eo[70] = Eo[100] = 0,
    bo[70] = bo[100] = -1,
    wo[70] = wo[100] = 1,
    no[70] = no[100] = 1,
    ro[70] = ro[100] = 0,
    io[70] = io[100] = 0,
    ho[101] = ho[69] = 0,
    po[101] = po[69] = 1,
    fo[101] = fo[69] = 0,
    no[101] = no[69] = 1,
    ro[101] = ro[69] = 0,
    io[101] = io[69] = 0,
    Io[149] = Io[21] = 0,
    No[149] = No[21] = 1,
    So[149] = So[21] = 1,
    oo[149] = oo[21] = -1,
    so[149] = so[21] = 0,
    ao[149] = ao[21] = 0,
    _o[86] = _o[84] = -1,
    mo[86] = mo[84] = 0,
    xo[86] = xo[84] = 1,
    Eo[86] = Eo[84] = 0,
    bo[86] = bo[84] = -1,
    wo[86] = wo[84] = 1,
    uo[89] = uo[81] = 0,
    lo[89] = lo[81] = -1,
    co[89] = co[81] = 0,
    go[89] = go[81] = 1,
    yo[89] = yo[81] = 0,
    vo[89] = vo[81] = 1,
    uo[96] = uo[74] = 0,
    lo[96] = lo[74] = 1,
    co[96] = co[74] = 0,
    ho[96] = ho[74] = -1,
    po[96] = po[74] = 0,
    fo[96] = fo[74] = 1,
    Eo[96] = Eo[74] = 1,
    bo[96] = bo[74] = 0,
    wo[96] = wo[74] = 0,
    no[96] = no[74] = 1,
    ro[96] = ro[74] = 0,
    io[96] = io[74] = 1,
    uo[24] = uo[146] = 0,
    lo[24] = lo[146] = -1,
    co[24] = co[146] = 1,
    _o[24] = _o[146] = 1,
    mo[24] = mo[146] = 0,
    xo[24] = xo[146] = 1,
    go[24] = go[146] = 0,
    yo[24] = yo[146] = 1,
    vo[24] = vo[146] = 1,
    oo[24] = oo[146] = 0,
    so[24] = so[146] = -1,
    ao[24] = ao[146] = 0,
    ho[6] = ho[164] = -1,
    po[6] = po[164] = 0,
    fo[6] = fo[164] = 1,
    _o[6] = _o[164] = -1,
    mo[6] = mo[164] = 0,
    xo[6] = xo[164] = 0,
    Io[6] = Io[164] = 0,
    No[6] = No[164] = -1,
    So[6] = So[164] = 1,
    Eo[6] = Eo[164] = 1,
    bo[6] = bo[164] = 0,
    wo[6] = wo[164] = 0,
    go[129] = go[41] = 0,
    yo[129] = yo[41] = 1,
    vo[129] = vo[41] = 1,
    Io[129] = Io[41] = 0,
    No[129] = No[41] = 1,
    So[129] = So[41] = 0,
    no[129] = no[41] = -1,
    ro[129] = ro[41] = 0,
    io[129] = io[41] = 0,
    oo[129] = oo[41] = 0,
    so[129] = so[41] = -1,
    ao[129] = ao[41] = 0,
    _o[66] = _o[104] = 0,
    mo[66] = mo[104] = 1,
    xo[66] = xo[104] = 0,
    go[66] = go[104] = -1,
    yo[66] = yo[104] = 0,
    vo[66] = vo[104] = 1,
    Eo[66] = Eo[104] = 0,
    bo[66] = bo[104] = -1,
    wo[66] = wo[104] = 0,
    no[66] = no[104] = 0,
    ro[66] = ro[104] = -1,
    io[66] = io[104] = 1,
    uo[144] = uo[26] = -1,
    lo[144] = lo[26] = 0,
    co[144] = co[26] = 0,
    Io[144] = Io[26] = 1,
    No[144] = No[26] = 0,
    So[144] = So[26] = 1,
    Eo[144] = Eo[26] = 0,
    bo[144] = bo[26] = 1,
    wo[144] = wo[26] = 1,
    oo[144] = oo[26] = -1,
    so[144] = so[26] = 0,
    ao[144] = ao[26] = 1,
    ho[36] = ho[134] = 0,
    po[36] = po[134] = 1,
    fo[36] = fo[134] = 1,
    _o[36] = _o[134] = 0,
    mo[36] = mo[134] = 1,
    xo[36] = xo[134] = 0,
    no[36] = no[134] = 0,
    ro[36] = ro[134] = -1,
    io[36] = io[134] = 1,
    oo[36] = oo[134] = 1,
    so[36] = so[134] = 0,
    ao[36] = ao[134] = 0,
    uo[9] = uo[161] = -1,
    lo[9] = lo[161] = 0,
    co[9] = co[161] = 0,
    ho[9] = ho[161] = 0,
    po[9] = po[161] = -1,
    fo[9] = fo[161] = 0,
    go[9] = go[161] = 1,
    yo[9] = yo[161] = 0,
    vo[9] = vo[161] = 0,
    Io[9] = Io[161] = 1,
    No[9] = No[161] = 0,
    So[9] = So[161] = 1,
    uo[136] = 0,
    lo[136] = 1,
    co[136] = 1,
    ho[136] = 0,
    po[136] = 1,
    fo[136] = 0,
    _o[136] = -1,
    mo[136] = 0,
    xo[136] = 1,
    go[136] = -1,
    yo[136] = 0,
    vo[136] = 0,
    Io[136] = 0,
    No[136] = -1,
    So[136] = 0,
    Eo[136] = 0,
    bo[136] = -1,
    wo[136] = 1,
    no[136] = 1,
    ro[136] = 0,
    io[136] = 0,
    oo[136] = 1,
    so[136] = 0,
    ao[136] = 1,
    uo[34] = 0,
    lo[34] = -1,
    co[34] = 0,
    ho[34] = 0,
    po[34] = -1,
    fo[34] = 1,
    _o[34] = 1,
    mo[34] = 0,
    xo[34] = 0,
    go[34] = 1,
    yo[34] = 0,
    vo[34] = 1,
    Io[34] = 0,
    No[34] = 1,
    So[34] = 1,
    Eo[34] = 0,
    bo[34] = 1,
    wo[34] = 0,
    no[34] = -1,
    ro[34] = 0,
    io[34] = 1,
    oo[34] = -1,
    so[34] = 0,
    ao[34] = 0,
    uo[35] = 0,
    lo[35] = 1,
    co[35] = 1,
    ho[35] = 0,
    po[35] = -1,
    fo[35] = 1,
    _o[35] = 1,
    mo[35] = 0,
    xo[35] = 0,
    go[35] = -1,
    yo[35] = 0,
    vo[35] = 0,
    Io[35] = 0,
    No[35] = -1,
    So[35] = 0,
    Eo[35] = 0,
    bo[35] = 1,
    wo[35] = 0,
    no[35] = -1,
    ro[35] = 0,
    io[35] = 1,
    oo[35] = 1,
    so[35] = 0,
    ao[35] = 1,
    uo[153] = 0,
    lo[153] = 1,
    co[153] = 1,
    go[153] = -1,
    yo[153] = 0,
    vo[153] = 0,
    Io[153] = 0,
    No[153] = -1,
    So[153] = 0,
    oo[153] = 1,
    so[153] = 0,
    ao[153] = 1,
    ho[102] = 0,
    po[102] = -1,
    fo[102] = 1,
    _o[102] = 1,
    mo[102] = 0,
    xo[102] = 0,
    Eo[102] = 0,
    bo[102] = 1,
    wo[102] = 0,
    no[102] = -1,
    ro[102] = 0,
    io[102] = 1,
    uo[155] = 0,
    lo[155] = -1,
    co[155] = 0,
    go[155] = 1,
    yo[155] = 0,
    vo[155] = 1,
    Io[155] = 0,
    No[155] = 1,
    So[155] = 1,
    oo[155] = -1,
    so[155] = 0,
    ao[155] = 0,
    ho[103] = 0,
    po[103] = 1,
    fo[103] = 0,
    _o[103] = -1,
    mo[103] = 0,
    xo[103] = 1,
    Eo[103] = 0,
    bo[103] = -1,
    wo[103] = 1,
    no[103] = 1,
    ro[103] = 0,
    io[103] = 0,
    uo[152] = 0,
    lo[152] = 1,
    co[152] = 1,
    _o[152] = -1,
    mo[152] = 0,
    xo[152] = 1,
    go[152] = -1,
    yo[152] = 0,
    vo[152] = 0,
    Io[152] = 0,
    No[152] = -1,
    So[152] = 0,
    Eo[152] = 0,
    bo[152] = -1,
    wo[152] = 1,
    oo[152] = 1,
    so[152] = 0,
    ao[152] = 1,
    uo[156] = 0,
    lo[156] = -1,
    co[156] = 1,
    _o[156] = 1,
    mo[156] = 0,
    xo[156] = 1,
    go[156] = -1,
    yo[156] = 0,
    vo[156] = 0,
    Io[156] = 0,
    No[156] = -1,
    So[156] = 0,
    Eo[156] = 0,
    bo[156] = 1,
    wo[156] = 1,
    oo[156] = -1,
    so[156] = 0,
    ao[156] = 1,
    uo[137] = 0,
    lo[137] = 1,
    co[137] = 1,
    ho[137] = 0,
    po[137] = 1,
    fo[137] = 0,
    go[137] = -1,
    yo[137] = 0,
    vo[137] = 0,
    Io[137] = 0,
    No[137] = -1,
    So[137] = 0,
    no[137] = 1,
    ro[137] = 0,
    io[137] = 0,
    oo[137] = 1,
    so[137] = 0,
    ao[137] = 1,
    uo[139] = 0,
    lo[139] = 1,
    co[139] = 1,
    ho[139] = 0,
    po[139] = -1,
    fo[139] = 0,
    go[139] = 1,
    yo[139] = 0,
    vo[139] = 0,
    Io[139] = 0,
    No[139] = 1,
    So[139] = 0,
    no[139] = -1,
    ro[139] = 0,
    io[139] = 0,
    oo[139] = 1,
    so[139] = 0,
    ao[139] = 1,
    uo[98] = 0,
    lo[98] = -1,
    co[98] = 0,
    ho[98] = 0,
    po[98] = -1,
    fo[98] = 1,
    _o[98] = 1,
    mo[98] = 0,
    xo[98] = 0,
    go[98] = 1,
    yo[98] = 0,
    vo[98] = 1,
    Eo[98] = 0,
    bo[98] = 1,
    wo[98] = 0,
    no[98] = -1,
    ro[98] = 0,
    io[98] = 1,
    uo[99] = 0,
    lo[99] = 1,
    co[99] = 0,
    ho[99] = 0,
    po[99] = -1,
    fo[99] = 1,
    _o[99] = 1,
    mo[99] = 0,
    xo[99] = 0,
    go[99] = -1,
    yo[99] = 0,
    vo[99] = 1,
    Eo[99] = 0,
    bo[99] = -1,
    wo[99] = 0,
    no[99] = 1,
    ro[99] = 0,
    io[99] = 1,
    ho[38] = 0,
    po[38] = -1,
    fo[38] = 1,
    _o[38] = 1,
    mo[38] = 0,
    xo[38] = 0,
    Io[38] = 0,
    No[38] = 1,
    So[38] = 1,
    Eo[38] = 0,
    bo[38] = 1,
    wo[38] = 0,
    no[38] = -1,
    ro[38] = 0,
    io[38] = 1,
    oo[38] = -1,
    so[38] = 0,
    ao[38] = 0,
    ho[39] = 0,
    po[39] = 1,
    fo[39] = 1,
    _o[39] = -1,
    mo[39] = 0,
    xo[39] = 0,
    Io[39] = 0,
    No[39] = -1,
    So[39] = 1,
    Eo[39] = 0,
    bo[39] = 1,
    wo[39] = 0,
    no[39] = -1,
    ro[39] = 0,
    io[39] = 1,
    oo[39] = 1,
    so[39] = 0,
    ao[39] = 0;
    var Co = function(t) {
        return [[t.bottomleft, 0], [0, 0], [0, t.leftbottom]]
    }
      , Po = function(t) {
        return [[1, t.rightbottom], [1, 0], [t.bottomright, 0]]
    }
      , Mo = function(t) {
        return [[t.topright, 1], [1, 1], [1, t.righttop]]
    }
      , Lo = function(t) {
        return [[0, t.lefttop], [0, 1], [t.topleft, 1]]
    }
      , Oo = function(t) {
        return [[t.bottomright, 0], [t.bottomleft, 0], [0, t.leftbottom], [0, t.lefttop]]
    }
      , Ro = function(t) {
        return [[t.bottomright, 0], [t.bottomleft, 0], [1, t.righttop], [1, t.rightbottom]]
    }
      , To = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [t.topleft, 1], [t.topright, 1]]
    }
      , Ao = function(t) {
        return [[0, t.leftbottom], [0, t.lefttop], [t.topleft, 1], [t.topright, 1]]
    }
      , Do = []
      , Fo = []
      , ko = []
      , Go = []
      , qo = []
      , Bo = []
      , zo = []
      , jo = [];
    Go[1] = qo[1] = 18,
    Go[169] = qo[169] = 18,
    ko[4] = Fo[4] = 12,
    ko[166] = Fo[166] = 12,
    Do[16] = jo[16] = 4,
    Do[154] = jo[154] = 4,
    Bo[64] = zo[64] = 22,
    Bo[106] = zo[106] = 22,
    ko[2] = Bo[2] = 17,
    Go[2] = qo[2] = 18,
    ko[168] = Bo[168] = 17,
    Go[168] = qo[168] = 18,
    Do[8] = Go[8] = 9,
    Fo[8] = ko[8] = 12,
    Do[162] = Go[162] = 9,
    Fo[162] = ko[162] = 12,
    Do[32] = jo[32] = 4,
    Fo[32] = zo[32] = 1,
    Do[138] = jo[138] = 4,
    Fo[138] = zo[138] = 1,
    qo[128] = jo[128] = 21,
    Bo[128] = zo[128] = 22,
    qo[42] = jo[42] = 21,
    Bo[42] = zo[42] = 22,
    Fo[5] = qo[5] = 14,
    Fo[165] = qo[165] = 14,
    ko[20] = jo[20] = 6,
    ko[150] = jo[150] = 6,
    Do[80] = Bo[80] = 11,
    Do[90] = Bo[90] = 11,
    Go[65] = zo[65] = 3,
    Go[105] = zo[105] = 3,
    Do[160] = Bo[160] = 11,
    Fo[160] = qo[160] = 14,
    Do[10] = Bo[10] = 11,
    Fo[10] = qo[10] = 14,
    ko[130] = jo[130] = 6,
    Go[130] = zo[130] = 3,
    ko[40] = jo[40] = 6,
    Go[40] = zo[40] = 3,
    Fo[101] = zo[101] = 1,
    Fo[69] = zo[69] = 1,
    qo[149] = jo[149] = 21,
    qo[21] = jo[21] = 21,
    ko[86] = Bo[86] = 17,
    ko[84] = Bo[84] = 17,
    Do[89] = Go[89] = 9,
    Do[81] = Go[81] = 9,
    Do[96] = zo[96] = 0,
    Fo[96] = Bo[96] = 15,
    Do[74] = zo[74] = 0,
    Fo[74] = Bo[74] = 15,
    Do[24] = ko[24] = 8,
    Go[24] = jo[24] = 7,
    Do[146] = ko[146] = 8,
    Go[146] = jo[146] = 7,
    Fo[6] = Bo[6] = 15,
    ko[6] = qo[6] = 16,
    Fo[164] = Bo[164] = 15,
    ko[164] = qo[164] = 16,
    Go[129] = jo[129] = 7,
    qo[129] = zo[129] = 20,
    Go[41] = jo[41] = 7,
    qo[41] = zo[41] = 20,
    ko[66] = zo[66] = 2,
    Go[66] = Bo[66] = 19,
    ko[104] = zo[104] = 2,
    Go[104] = Bo[104] = 19,
    Do[144] = qo[144] = 10,
    Bo[144] = jo[144] = 23,
    Do[26] = qo[26] = 10,
    Bo[26] = jo[26] = 23,
    Fo[36] = jo[36] = 5,
    ko[36] = zo[36] = 2,
    Fo[134] = jo[134] = 5,
    ko[134] = zo[134] = 2,
    Do[9] = qo[9] = 10,
    Fo[9] = Go[9] = 13,
    Do[161] = qo[161] = 10,
    Fo[161] = Go[161] = 13,
    Fo[37] = jo[37] = 5,
    qo[37] = zo[37] = 20,
    Fo[133] = jo[133] = 5,
    qo[133] = zo[133] = 20,
    ko[148] = qo[148] = 16,
    Bo[148] = jo[148] = 23,
    ko[22] = qo[22] = 16,
    Bo[22] = jo[22] = 23,
    Do[82] = ko[82] = 8,
    Go[82] = Bo[82] = 19,
    Do[88] = ko[88] = 8,
    Go[88] = Bo[88] = 19,
    Do[73] = zo[73] = 0,
    Fo[73] = Go[73] = 13,
    Do[97] = zo[97] = 0,
    Fo[97] = Go[97] = 13,
    Do[145] = Go[145] = 9,
    qo[145] = jo[145] = 21,
    Do[25] = Go[25] = 9,
    qo[25] = jo[25] = 21,
    Fo[70] = zo[70] = 1,
    ko[70] = Bo[70] = 17,
    Fo[100] = zo[100] = 1,
    ko[100] = Bo[100] = 17,
    Do[34] = Go[34] = 9,
    Fo[34] = ko[34] = 12,
    qo[34] = jo[34] = 21,
    Bo[34] = zo[34] = 22,
    Do[136] = jo[136] = 4,
    Fo[136] = zo[136] = 1,
    ko[136] = Bo[136] = 17,
    Go[136] = qo[136] = 18,
    Do[35] = jo[35] = 4,
    Fo[35] = ko[35] = 12,
    Go[35] = qo[35] = 18,
    Bo[35] = zo[35] = 22,
    Do[153] = jo[153] = 4,
    Go[153] = qo[153] = 18,
    Fo[102] = ko[102] = 12,
    Bo[102] = zo[102] = 22,
    Do[155] = Go[155] = 9,
    qo[155] = jo[155] = 23,
    Fo[103] = zo[103] = 1,
    ko[103] = Bo[103] = 17,
    Do[152] = jo[152] = 4,
    ko[152] = Bo[152] = 17,
    Go[152] = qo[152] = 18,
    Do[156] = ko[156] = 8,
    Go[156] = qo[156] = 18,
    Bo[156] = jo[156] = 23,
    Do[137] = jo[137] = 4,
    Fo[137] = zo[137] = 1,
    Go[137] = qo[137] = 18,
    Do[139] = jo[139] = 4,
    Fo[139] = Go[139] = 13,
    qo[139] = zo[139] = 20,
    Do[98] = Go[98] = 9,
    Fo[98] = ko[98] = 12,
    Bo[98] = zo[98] = 22,
    Do[99] = zo[99] = 0,
    Fo[99] = ko[99] = 12,
    Go[99] = Bo[99] = 19,
    Fo[38] = ko[38] = 12,
    qo[38] = jo[38] = 21,
    Bo[38] = zo[38] = 22,
    Fo[39] = jo[39] = 5,
    ko[39] = qo[39] = 16,
    Bo[39] = zo[39] = 22;
    var Uo = [];
    function Vo(t, e, n) {
        return (t - e) / (n - e)
    }
    function Xo(t) {
        return t.constructor.toString().indexOf("Array") > -1
    }
    function Yo(t, e, n, r, i, o) {
        for (var s = t.cells[n][e], a = s.cval_real, u = e + r, l = n + i, c = [], h = !1; !h; ) {
            if (void 0 === t.cells[l] || void 0 === t.cells[l][u])
                if (l -= i,
                u -= r,
                a = (s = t.cells[l][u]).cval_real,
                -1 === i)
                    if (0 === o)
                        if (1 & a)
                            c.push([u, l]),
                            r = -1,
                            i = 0,
                            o = 0;
                        else {
                            if (!(4 & a)) {
                                c.push([u + s.bottomright, l]),
                                r = 0,
                                i = 1,
                                o = 1,
                                h = !0;
                                break
                            }
                            c.push([u + 1, l]),
                            r = 1,
                            i = 0,
                            o = 0
                        }
                    else {
                        if (!(1 & a)) {
                            if (4 & a) {
                                c.push([u + s.bottomright, l]),
                                r = 0,
                                i = 1,
                                o = 1,
                                h = !0;
                                break
                            }
                            c.push([u + s.bottomleft, l]),
                            r = 0,
                            i = 1,
                            o = 0,
                            h = !0;
                            break
                        }
                        c.push([u, l]),
                        r = -1,
                        i = 0,
                        o = 0
                    }
                else if (1 === i)
                    if (0 === o) {
                        if (!(a & eo)) {
                            if (a & to) {
                                c.push([u + s.topleft, l + 1]),
                                r = 0,
                                i = -1,
                                o = 0,
                                h = !0;
                                break
                            }
                            c.push([u + s.topright, l + 1]),
                            r = 0,
                            i = -1,
                            o = 1,
                            h = !0;
                            break
                        }
                        c.push([u + 1, l + 1]),
                        r = 1,
                        i = 0,
                        o = 1
                    } else
                        c.push([u + 1, l + 1]),
                        r = 1,
                        i = 0,
                        o = 1;
                else if (-1 === r)
                    if (0 === o) {
                        if (!(a & to)) {
                            if (1 & a) {
                                c.push([u, l + s.leftbottom]),
                                r = 1,
                                i = 0,
                                o = 0,
                                h = !0;
                                break
                            }
                            c.push([u, l + s.lefttop]),
                            r = 1,
                            i = 0,
                            o = 1,
                            h = !0;
                            break
                        }
                        c.push([u, l + 1]),
                        r = 0,
                        i = 1,
                        o = 0
                    } else {
                        if (!(a & to)) {
                            console.log("MarchingSquaresJS-isoBands: wtf");
                            break
                        }
                        c.push([u, l + 1]),
                        r = 0,
                        i = 1,
                        o = 0
                    }
                else {
                    if (1 !== r) {
                        console.log("MarchingSquaresJS-isoBands: we came from nowhere!");
                        break
                    }
                    if (0 === o) {
                        if (!(4 & a)) {
                            c.push([u + 1, l + s.rightbottom]),
                            r = -1,
                            i = 0,
                            o = 0,
                            h = !0;
                            break
                        }
                        c.push([u + 1, l]),
                        r = 0,
                        i = -1,
                        o = 1
                    } else {
                        if (!(4 & a)) {
                            if (a & eo) {
                                c.push([u + 1, l + s.righttop]),
                                r = -1,
                                i = 0,
                                o = 1;
                                break
                            }
                            c.push([u + 1, l + s.rightbottom]),
                            r = -1,
                            i = 0,
                            o = 0,
                            h = !0;
                            break
                        }
                        c.push([u + 1, l]),
                        r = 0,
                        i = -1,
                        o = 1
                    }
                }
            else if (a = (s = t.cells[l][u]).cval_real,
            -1 === r)
                if (0 === o)
                    if (void 0 !== t.cells[l - 1] && void 0 !== t.cells[l - 1][u])
                        r = 0,
                        i = -1,
                        o = 1;
                    else {
                        if (!(1 & a)) {
                            c.push([u + s.bottomright, l]),
                            r = 0,
                            i = 1,
                            o = 1,
                            h = !0;
                            break
                        }
                        c.push([u, l])
                    }
                else {
                    if (!(a & to)) {
                        console.log("MarchingSquaresJS-isoBands: found entry from top at " + u + "," + l);
                        break
                    }
                    console.log("MarchingSquaresJS-isoBands: proceeding in x-direction!")
                }
            else if (1 === r) {
                if (0 === o) {
                    console.log("MarchingSquaresJS-isoBands: wtf");
                    break
                }
                if (void 0 !== t.cells[l + 1] && void 0 !== t.cells[l + 1][u])
                    r = 0,
                    i = 1,
                    o = 0;
                else {
                    if (!(a & eo)) {
                        c.push([u + s.topleft, l + 1]),
                        r = 0,
                        i = -1,
                        o = 0,
                        h = !0;
                        break
                    }
                    c.push([u + 1, l + 1]),
                    r = 1,
                    i = 0,
                    o = 1
                }
            } else if (-1 === i) {
                if (1 !== o) {
                    console.log("MarchingSquaresJS-isoBands: wtf");
                    break
                }
                if (void 0 !== t.cells[l][u + 1])
                    r = 1,
                    i = 0,
                    o = 1;
                else {
                    if (!(4 & a)) {
                        c.push([u + 1, l + s.righttop]),
                        r = -1,
                        i = 0,
                        o = 1,
                        h = !0;
                        break
                    }
                    c.push([u + 1, l]),
                    r = 0,
                    i = -1,
                    o = 1
                }
            } else {
                if (1 !== i) {
                    console.log("MarchingSquaresJS-isoBands: where did we came from???");
                    break
                }
                if (0 !== o) {
                    console.log("MarchingSquaresJS-isoBands: wtf");
                    break
                }
                if (void 0 !== t.cells[l][u - 1])
                    r = -1,
                    i = 0,
                    o = 0;
                else {
                    if (!(a & to)) {
                        c.push([u, l + s.leftbottom]),
                        r = 1,
                        i = 0,
                        o = 0,
                        h = !0;
                        break
                    }
                    c.push([u, l + 1]),
                    r = 0,
                    i = 1,
                    o = 0
                }
            }
            if (l += i,
            (u += r) === e && l === n)
                break
        }
        return {
            path: c,
            i: u,
            j: l,
            x: r,
            y: i,
            o: o
        }
    }
    function Ho(t) {
        if (t.edges.length > 0) {
            var e = t.edges[t.edges.length - 1]
              , n = t.cval_real;
            switch (e) {
            case 0:
                return n & eo ? {
                    p: [1, t.righttop],
                    x: -1,
                    y: 0,
                    o: 1
                } : {
                    p: [t.topleft, 1],
                    x: 0,
                    y: -1,
                    o: 0
                };
            case 1:
                return 4 & n ? {
                    p: [t.topleft, 1],
                    x: 0,
                    y: -1,
                    o: 0
                } : {
                    p: [1, t.rightbottom],
                    x: -1,
                    y: 0,
                    o: 0
                };
            case 2:
                return 4 & n ? {
                    p: [t.bottomright, 0],
                    x: 0,
                    y: 1,
                    o: 1
                } : {
                    p: [t.topleft, 1],
                    x: 0,
                    y: -1,
                    o: 0
                };
            case 3:
                return 1 & n ? {
                    p: [t.topleft, 1],
                    x: 0,
                    y: -1,
                    o: 0
                } : {
                    p: [t.bottomleft, 0],
                    x: 0,
                    y: 1,
                    o: 0
                };
            case 4:
                return n & eo ? {
                    p: [1, t.righttop],
                    x: -1,
                    y: 0,
                    o: 1
                } : {
                    p: [t.topright, 1],
                    x: 0,
                    y: -1,
                    o: 1
                };
            case 5:
                return 4 & n ? {
                    p: [t.topright, 1],
                    x: 0,
                    y: -1,
                    o: 1
                } : {
                    p: [1, t.rightbottom],
                    x: -1,
                    y: 0,
                    o: 0
                };
            case 6:
                return 4 & n ? {
                    p: [t.bottomright, 0],
                    x: 0,
                    y: 1,
                    o: 1
                } : {
                    p: [t.topright, 1],
                    x: 0,
                    y: -1,
                    o: 1
                };
            case 7:
                return 1 & n ? {
                    p: [t.topright, 1],
                    x: 0,
                    y: -1,
                    o: 1
                } : {
                    p: [t.bottomleft, 0],
                    x: 0,
                    y: 1,
                    o: 0
                };
            case 8:
                return 4 & n ? {
                    p: [t.bottomright, 0],
                    x: 0,
                    y: 1,
                    o: 1
                } : {
                    p: [1, t.righttop],
                    x: -1,
                    y: 0,
                    o: 1
                };
            case 9:
                return 1 & n ? {
                    p: [1, t.righttop],
                    x: -1,
                    y: 0,
                    o: 1
                } : {
                    p: [t.bottomleft, 0],
                    x: 0,
                    y: 1,
                    o: 0
                };
            case 10:
                return 1 & n ? {
                    p: [0, t.leftbottom],
                    x: 1,
                    y: 0,
                    o: 0
                } : {
                    p: [1, t.righttop],
                    x: -1,
                    y: 0,
                    o: 1
                };
            case 11:
                return n & to ? {
                    p: [1, t.righttop],
                    x: -1,
                    y: 0,
                    o: 1
                } : {
                    p: [0, t.lefttop],
                    x: 1,
                    y: 0,
                    o: 1
                };
            case 12:
                return 4 & n ? {
                    p: [t.bottomright, 0],
                    x: 0,
                    y: 1,
                    o: 1
                } : {
                    p: [1, t.rightbottom],
                    x: -1,
                    y: 0,
                    o: 0
                };
            case 13:
                return 1 & n ? {
                    p: [1, t.rightbottom],
                    x: -1,
                    y: 0,
                    o: 0
                } : {
                    p: [t.bottomleft, 0],
                    x: 0,
                    y: 1,
                    o: 0
                };
            case 14:
                return 1 & n ? {
                    p: [0, t.leftbottom],
                    x: 1,
                    y: 0,
                    o: 0
                } : {
                    p: [1, t.rightbottom],
                    x: -1,
                    y: 0,
                    o: 0
                };
            case 15:
                return n & to ? {
                    p: [1, t.rightbottom],
                    x: -1,
                    y: 0,
                    o: 0
                } : {
                    p: [0, t.lefttop],
                    x: 1,
                    y: 0,
                    o: 1
                };
            case 16:
                return 4 & n ? {
                    p: [t.bottomright, 0],
                    x: 0,
                    y: 1,
                    o: 1
                } : {
                    p: [0, t.leftbottom],
                    x: 1,
                    y: 0,
                    o: 0
                };
            case 17:
                return n & to ? {
                    p: [t.bottomright, 0],
                    x: 0,
                    y: 1,
                    o: 1
                } : {
                    p: [0, t.lefttop],
                    x: 1,
                    y: 0,
                    o: 1
                };
            case 18:
                return 1 & n ? {
                    p: [0, t.leftbottom],
                    x: 1,
                    y: 0,
                    o: 0
                } : {
                    p: [t.bottomleft, 0],
                    x: 0,
                    y: 1,
                    o: 0
                };
            case 19:
                return n & to ? {
                    p: [t.bottomleft, 0],
                    x: 0,
                    y: 1,
                    o: 0
                } : {
                    p: [0, t.lefttop],
                    x: 1,
                    y: 0,
                    o: 1
                };
            case 20:
                return n & to ? {
                    p: [t.topleft, 1],
                    x: 0,
                    y: -1,
                    o: 0
                } : {
                    p: [0, t.leftbottom],
                    x: 1,
                    y: 0,
                    o: 0
                };
            case 21:
                return n & eo ? {
                    p: [0, t.leftbottom],
                    x: 1,
                    y: 0,
                    o: 0
                } : {
                    p: [t.topright, 1],
                    x: 0,
                    y: -1,
                    o: 1
                };
            case 22:
                return n & to ? {
                    p: [t.topleft, 1],
                    x: 0,
                    y: -1,
                    o: 0
                } : {
                    p: [0, t.lefttop],
                    x: 1,
                    y: 0,
                    o: 1
                };
            case 23:
                return n & eo ? {
                    p: [0, t.lefttop],
                    x: 1,
                    y: 0,
                    o: 1
                } : {
                    p: [t.topright, 1],
                    x: 0,
                    y: -1,
                    o: 1
                };
            default:
                console.log("MarchingSquaresJS-isoBands: edge index out of range!"),
                console.log(t)
            }
        }
        return null
    }
    function Wo(t, e, n, r) {
        var i, o, s, a, u, l = t.cval;
        switch (e) {
        case -1:
            switch (r) {
            case 0:
                i = Fo[l],
                s = ho[l],
                a = po[l],
                u = fo[l];
                break;
            default:
                i = Do[l],
                s = uo[l],
                a = lo[l],
                u = co[l]
            }
            break;
        case 1:
            switch (r) {
            case 0:
                i = qo[l],
                s = Io[l],
                a = No[l],
                u = So[l];
                break;
            default:
                i = Bo[l],
                s = Eo[l],
                a = bo[l],
                u = wo[l]
            }
            break;
        default:
            switch (n) {
            case -1:
                switch (r) {
                case 0:
                    i = zo[l],
                    s = no[l],
                    a = ro[l],
                    u = io[l];
                    break;
                default:
                    i = jo[l],
                    s = oo[l],
                    a = so[l],
                    u = ao[l]
                }
                break;
            case 1:
                switch (r) {
                case 0:
                    i = Go[l],
                    s = go[l],
                    a = yo[l],
                    u = vo[l];
                    break;
                default:
                    i = ko[l],
                    s = _o[l],
                    a = mo[l],
                    u = xo[l]
                }
            }
        }
        if (o = t.edges.indexOf(i),
        void 0 === t.edges[o])
            return null;
        switch (function(t, e) {
            delete t.edges[e];
            for (var n = e + 1; n < t.edges.length; n++)
                t.edges[n - 1] = t.edges[n];
            t.edges.pop()
        }(t, o),
        l = t.cval_real,
        i) {
        case 0:
            l & eo ? (e = t.topleft,
            n = 1) : (e = 1,
            n = t.righttop);
            break;
        case 1:
            4 & l ? (e = 1,
            n = t.rightbottom) : (e = t.topleft,
            n = 1);
            break;
        case 2:
            4 & l ? (e = t.topleft,
            n = 1) : (e = t.bottomright,
            n = 0);
            break;
        case 3:
            1 & l ? (e = t.bottomleft,
            n = 0) : (e = t.topleft,
            n = 1);
            break;
        case 4:
            l & eo ? (e = t.topright,
            n = 1) : (e = 1,
            n = t.righttop);
            break;
        case 5:
            4 & l ? (e = 1,
            n = t.rightbottom) : (e = t.topright,
            n = 1);
            break;
        case 6:
            4 & l ? (e = t.topright,
            n = 1) : (e = t.bottomright,
            n = 0);
            break;
        case 7:
            1 & l ? (e = t.bottomleft,
            n = 0) : (e = t.topright,
            n = 1);
            break;
        case 8:
            4 & l ? (e = 1,
            n = t.righttop) : (e = t.bottomright,
            n = 0);
            break;
        case 9:
            1 & l ? (e = t.bottomleft,
            n = 0) : (e = 1,
            n = t.righttop);
            break;
        case 10:
            1 & l ? (e = 1,
            n = t.righttop) : (e = 0,
            n = t.leftbottom);
            break;
        case 11:
            l & to ? (e = 0,
            n = t.lefttop) : (e = 1,
            n = t.righttop);
            break;
        case 12:
            4 & l ? (e = 1,
            n = t.rightbottom) : (e = t.bottomright,
            n = 0);
            break;
        case 13:
            1 & l ? (e = t.bottomleft,
            n = 0) : (e = 1,
            n = t.rightbottom);
            break;
        case 14:
            1 & l ? (e = 1,
            n = t.rightbottom) : (e = 0,
            n = t.leftbottom);
            break;
        case 15:
            l & to ? (e = 0,
            n = t.lefttop) : (e = 1,
            n = t.rightbottom);
            break;
        case 16:
            4 & l ? (e = 0,
            n = t.leftbottom) : (e = t.bottomright,
            n = 0);
            break;
        case 17:
            l & to ? (e = 0,
            n = t.lefttop) : (e = t.bottomright,
            n = 0);
            break;
        case 18:
            1 & l ? (e = t.bottomleft,
            n = 0) : (e = 0,
            n = t.leftbottom);
            break;
        case 19:
            l & to ? (e = 0,
            n = t.lefttop) : (e = t.bottomleft,
            n = 0);
            break;
        case 20:
            l & to ? (e = 0,
            n = t.leftbottom) : (e = t.topleft,
            n = 1);
            break;
        case 21:
            l & eo ? (e = t.topright,
            n = 1) : (e = 0,
            n = t.leftbottom);
            break;
        case 22:
            l & to ? (e = 0,
            n = t.lefttop) : (e = t.topleft,
            n = 1);
            break;
        case 23:
            l & eo ? (e = t.topright,
            n = 1) : (e = 0,
            n = t.lefttop);
            break;
        default:
            return console.log("MarchingSquaresJS-isoBands: edge index out of range!"),
            console.log(t),
            null
        }
        return void 0 !== e && void 0 !== n && void 0 !== s && void 0 !== a && void 0 !== u || (console.log("MarchingSquaresJS-isoBands: undefined value!"),
        console.log(t),
        console.log(e + " " + n + " " + s + " " + a + " " + u)),
        {
            p: [e, n],
            x: s,
            y: a,
            o: u
        }
    }
    function Jo(t) {
        var e = []
          , n = [];
        t.forEach((function(t) {
            var r = jr(l([t]));
            n.push(r),
            e.push({
                ring: t,
                area: r
            })
        }
        )),
        n.sort((function(t, e) {
            return e - t
        }
        ));
        var r = [];
        return n.forEach((function(t) {
            for (var n = 0; n < e.length; n++)
                if (e[n].area === t) {
                    r.push(e[n].ring),
                    e.splice(n, 1);
                    break
                }
        }
        )),
        r
    }
    function Zo(t) {
        for (var e = t.map((function(t) {
            return {
                lrCoordinates: t,
                grouped: !1
            }
        }
        )), n = []; !Qo(e); )
            for (var r = 0; r < e.length; r++)
                if (!e[r].grouped) {
                    var i = [];
                    i.push(e[r].lrCoordinates),
                    e[r].grouped = !0;
                    for (var o = l([e[r].lrCoordinates]), s = r + 1; s < e.length; s++) {
                        if (!e[s].grouped)
                            Ko(l([e[s].lrCoordinates]), o) && (i.push(e[s].lrCoordinates),
                            e[s].grouped = !0)
                    }
                    n.push(i)
                }
        return n
    }
    function Ko(t, e) {
        for (var n = bn(t), r = 0; r < n.features.length; r++)
            if (!ye(n.features[r], e))
                return !1;
        return !0
    }
    function Qo(t) {
        for (var e = 0; e < t.length; e++)
            if (!1 === t[e].grouped)
                return !1;
        return !0
    }
    function $o(t, e, n) {
        if (!P(n = n || {}))
            throw new Error("options is invalid");
        var r = n.pivot
          , i = n.mutate;
        if (!t)
            throw new Error("geojson is required");
        if (null == e || isNaN(e))
            throw new Error("angle is required");
        return 0 === e || (r || (r = En(t)),
        !1 !== i && void 0 !== i || (t = Ie(t)),
        R(t, (function(t) {
            var n = Bi(r, t) + e
              , i = Ar(r, t)
              , o = Q(ji(r, i, n));
            t[0] = o[0],
            t[1] = o[1]
        }
        ))),
        t
    }
    function ts(t, e, n) {
        if (!P(n = n || {}))
            throw new Error("options is invalid");
        var r = n.origin
          , i = n.mutate;
        if (!t)
            throw new Error("geojson required");
        if ("number" != typeof e || 0 === e)
            throw new Error("invalid factor");
        var o = Array.isArray(r) || "object" == typeof r;
        return !0 !== i && (t = Ie(t)),
        "FeatureCollection" !== t.type || o ? es(t, e, r) : (F(t, (function(n, i) {
            t.features[i] = es(n, e, r)
        }
        )),
        t)
    }
    function es(t, e, n) {
        var r = "Point" === it(t);
        return n = function(t, e) {
            null == e && (e = "centroid");
            if (Array.isArray(e) || "object" == typeof e)
                return K(e);
            var n = t.bbox ? t.bbox : Z(t)
              , r = n[0]
              , i = n[1]
              , o = n[2]
              , s = n[3];
            switch (e) {
            case "sw":
            case "southwest":
            case "westsouth":
            case "bottomleft":
                return a([r, i]);
            case "se":
            case "southeast":
            case "eastsouth":
            case "bottomright":
                return a([o, i]);
            case "nw":
            case "northwest":
            case "westnorth":
            case "topleft":
                return a([r, s]);
            case "ne":
            case "northeast":
            case "eastnorth":
            case "topright":
                return a([o, s]);
            case "center":
                return xn(t);
            case void 0:
            case null:
            case "centroid":
                return En(t);
            default:
                throw new Error("invalid origin")
            }
        }(t, n),
        1 === e || r || R(t, (function(t) {
            var r = Ar(n, t)
              , i = Bi(n, t)
              , o = Q(ji(n, r * e, i));
            t[0] = o[0],
            t[1] = o[1],
            3 === t.length && (t[2] *= e)
        }
        )),
        t
    }
    function ns(t) {
        var e = t[0]
          , n = t[1];
        return [n[0] - e[0], n[1] - e[1]]
    }
    function rs(t, e) {
        return t[0] * e[1] - e[0] * t[1]
    }
    function is(t, e) {
        return !function(t, e) {
            return 0 === rs(ns(t), ns(e))
        }(t, e) && function(t, e) {
            var n, r, i = t[0], o = ns(t), s = e[0], a = ns(e), u = rs(o, a);
            return function(t, e) {
                return [t[0] + e[0], t[1] + e[1]]
            }(i, function(t, e) {
                return [t * e[0], t * e[1]]
            }(rs((r = i,
            [(n = s)[0] - r[0], n[1] - r[1]]), a) / u, o))
        }(t, e)
    }
    function os(t, e, n) {
        var r = []
          , i = E(e, n)
          , o = Q(t)
          , s = [];
        return o.forEach((function(t, e) {
            if (e !== o.length - 1) {
                var n = (l = t,
                c = o[e + 1],
                h = i,
                p = Math.sqrt((l[0] - c[0]) * (l[0] - c[0]) + (l[1] - c[1]) * (l[1] - c[1])),
                f = l[0] + h * (c[1] - l[1]) / p,
                g = c[0] + h * (c[1] - l[1]) / p,
                d = l[1] + h * (l[0] - c[0]) / p,
                y = c[1] + h * (l[0] - c[0]) / p,
                [[f, d], [g, y]]);
                if (r.push(n),
                e > 0) {
                    var a = r[e - 1]
                      , u = is(n, a);
                    !1 !== u && (a[1] = u,
                    n[0] = u),
                    s.push(a[0]),
                    e === o.length - 2 && (s.push(n[0]),
                    s.push(n[1]))
                }
                2 === o.length && (s.push(n[0]),
                s.push(n[1]))
            }
            var l, c, h, p, f, g, d, y
        }
        )),
        h(s, t.properties)
    }
    function ss(t, e, n) {
        var r = e[0] - t[0]
          , i = e[1] - t[1]
          , o = n[0] - e[0];
        return function(t) {
            return (t > 0) - (t < 0) || +t
        }(r * (n[1] - e[1]) - o * i)
    }
    function as(t, e) {
        return e.geometry.coordinates[0].every((function(e) {
            return ye(a(e), t)
        }
        ))
    }
    Uo[1] = Uo[169] = Co,
    Uo[4] = Uo[166] = Po,
    Uo[16] = Uo[154] = Mo,
    Uo[64] = Uo[106] = Lo,
    Uo[168] = Uo[2] = Oo,
    Uo[162] = Uo[8] = Ro,
    Uo[138] = Uo[32] = To,
    Uo[42] = Uo[128] = Ao,
    Uo[5] = Uo[165] = function(t) {
        return [[0, 0], [0, t.leftbottom], [1, t.rightbottom], [1, 0]]
    }
    ,
    Uo[20] = Uo[150] = function(t) {
        return [[1, 0], [t.bottomright, 0], [t.topright, 1], [1, 1]]
    }
    ,
    Uo[80] = Uo[90] = function(t) {
        return [[1, 1], [1, t.righttop], [0, t.lefttop], [0, 1]]
    }
    ,
    Uo[65] = Uo[105] = function(t) {
        return [[t.bottomleft, 0], [0, 0], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[160] = Uo[10] = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [0, t.leftbottom], [0, t.lefttop]]
    }
    ,
    Uo[130] = Uo[40] = function(t) {
        return [[t.topleft, 1], [t.topright, 1], [t.bottomright, 0], [t.bottomleft, 0]]
    }
    ,
    Uo[85] = function() {
        return [[0, 0], [0, 1], [1, 1], [1, 0]]
    }
    ,
    Uo[101] = Uo[69] = function(t) {
        return [[1, t.rightbottom], [1, 0], [0, 0], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[149] = Uo[21] = function(t) {
        return [[t.topright, 1], [1, 1], [1, 0], [0, 0], [0, t.leftbottom]]
    }
    ,
    Uo[86] = Uo[84] = function(t) {
        return [[1, 0], [t.bottomright, 0], [0, t.lefttop], [0, 1], [1, 1]]
    }
    ,
    Uo[89] = Uo[81] = function(t) {
        return [[1, 1], [1, t.righttop], [t.bottomleft, 0], [0, 0], [0, 1]]
    }
    ,
    Uo[96] = Uo[74] = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [0, t.lefttop], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[24] = Uo[146] = function(t) {
        return [[1, 1], [1, t.righttop], [t.bottomright, 0], [t.bottomleft, 0], [t.topright, 1]]
    }
    ,
    Uo[6] = Uo[164] = function(t) {
        return [[1, t.rightbottom], [1, 0], [t.bottomright, 0], [0, t.leftbottom], [0, t.lefttop]]
    }
    ,
    Uo[129] = Uo[41] = function(t) {
        return [[t.topright, 1], [t.bottomleft, 0], [0, 0], [0, t.leftbottom], [t.topleft, 1]]
    }
    ,
    Uo[66] = Uo[104] = function(t) {
        return [[t.bottomright, 0], [t.bottomleft, 0], [0, t.lefttop], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[144] = Uo[26] = function(t) {
        return [[1, 1], [1, t.righttop], [0, t.leftbottom], [0, t.lefttop], [t.topright, 1]]
    }
    ,
    Uo[36] = Uo[134] = function(t) {
        return [[1, t.rightbottom], [1, 0], [t.bottomright, 0], [t.topleft, 1], [t.topright, 1]]
    }
    ,
    Uo[9] = Uo[161] = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [t.bottomleft, 0], [0, 0], [0, t.leftbottom]]
    }
    ,
    Uo[37] = Uo[133] = function(t) {
        return [[1, t.rightbottom], [1, 0], [0, 0], [0, t.leftbottom], [t.topleft, 1], [t.topright, 1]]
    }
    ,
    Uo[148] = Uo[22] = function(t) {
        return [[1, 1], [1, 0], [t.bottomright, 0], [0, t.leftbottom], [0, t.lefttop], [t.topright, 1]]
    }
    ,
    Uo[82] = Uo[88] = function(t) {
        return [[1, 1], [1, t.righttop], [t.bottomright, 0], [t.bottomleft, 0], [0, t.lefttop], [0, 1]]
    }
    ,
    Uo[73] = Uo[97] = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [t.bottomleft, 0], [0, 0], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[145] = Uo[25] = function(t) {
        return [[1, 1], [1, t.righttop], [t.bottomleft, 0], [0, 0], [0, t.leftbottom], [t.topright, 1]]
    }
    ,
    Uo[70] = Uo[100] = function(t) {
        return [[1, t.rightbottom], [1, 0], [t.bottomright, 0], [0, t.lefttop], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[34] = function(t) {
        return [Ao(t), Ro(t)]
    }
    ,
    Uo[35] = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [t.bottomright, 0], [t.bottomleft, 0], [0, t.leftbottom], [0, t.lefttop], [t.topleft, 1], [t.topright, 1]]
    }
    ,
    Uo[136] = function(t) {
        return [To(t), Oo(t)]
    }
    ,
    Uo[153] = function(t) {
        return [Mo(t), Co(t)]
    }
    ,
    Uo[102] = function(t) {
        return [Po(t), Lo(t)]
    }
    ,
    Uo[155] = function(t) {
        return [[1, 1], [1, t.righttop], [t.bottomleft, 0], [0, 0], [0, t.leftbottom], [t.topright, 1]]
    }
    ,
    Uo[103] = function(t) {
        return [[1, t.rightbottom], [1, 0], [t.bottomright, 0], [0, t.lefttop], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[152] = function(t) {
        return [Mo(t), Oo(t)]
    }
    ,
    Uo[156] = function(t) {
        return [[1, 1], [1, t.righttop], [t.bottomright, 0], [t.bottomleft, 0], [0, t.leftbottom], [0, t.lefttop], [t.topright, 1]]
    }
    ,
    Uo[137] = function(t) {
        return [To(t), Co(t)]
    }
    ,
    Uo[139] = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [t.bottomleft, 0], [0, 0], [0, t.leftbottom], [t.topleft, 1], [t.topright, 1]]
    }
    ,
    Uo[98] = function(t) {
        return [Ro(t), Lo(t)]
    }
    ,
    Uo[99] = function(t) {
        return [[1, t.righttop], [1, t.rightbottom], [t.bottomright, 0], [t.bottomleft, 0], [0, t.lefttop], [0, 1], [t.topleft, 1]]
    }
    ,
    Uo[38] = function(t) {
        return [Po(t), Ao(t)]
    }
    ,
    Uo[39] = function(t) {
        return [[1, t.rightbottom], [1, 0], [t.bottomright, 0], [0, t.leftbottom], [0, t.lefttop], [t.topleft, 1], [t.topright, 1]]
    }
    ;
    var us = function() {
        function t(e) {
            this.id = t.buildId(e),
            this.coordinates = e,
            this.innerEdges = [],
            this.outerEdges = [],
            this.outerEdgesSorted = !1
        }
        return t.buildId = function(t) {
            return t.join(",")
        }
        ,
        t.prototype.removeInnerEdge = function(t) {
            this.innerEdges = this.innerEdges.filter((function(e) {
                return e.from.id !== t.from.id
            }
            ))
        }
        ,
        t.prototype.removeOuterEdge = function(t) {
            this.outerEdges = this.outerEdges.filter((function(e) {
                return e.to.id !== t.to.id
            }
            ))
        }
        ,
        t.prototype.addOuterEdge = function(t) {
            this.outerEdges.push(t),
            this.outerEdgesSorted = !1
        }
        ,
        t.prototype.sortOuterEdges = function() {
            var t = this;
            this.outerEdgesSorted || (this.outerEdges.sort((function(e, n) {
                var r = e.to
                  , i = n.to;
                if (r.coordinates[0] - t.coordinates[0] >= 0 && i.coordinates[0] - t.coordinates[0] < 0)
                    return 1;
                if (r.coordinates[0] - t.coordinates[0] < 0 && i.coordinates[0] - t.coordinates[0] >= 0)
                    return -1;
                if (r.coordinates[0] - t.coordinates[0] == 0 && i.coordinates[0] - t.coordinates[0] == 0)
                    return r.coordinates[1] - t.coordinates[1] >= 0 || i.coordinates[1] - t.coordinates[1] >= 0 ? r.coordinates[1] - i.coordinates[1] : i.coordinates[1] - r.coordinates[1];
                var o = ss(t.coordinates, r.coordinates, i.coordinates);
                return o < 0 ? 1 : o > 0 ? -1 : Math.pow(r.coordinates[0] - t.coordinates[0], 2) + Math.pow(r.coordinates[1] - t.coordinates[1], 2) - (Math.pow(i.coordinates[0] - t.coordinates[0], 2) + Math.pow(i.coordinates[1] - t.coordinates[1], 2))
            }
            )),
            this.outerEdgesSorted = !0)
        }
        ,
        t.prototype.getOuterEdges = function() {
            return this.sortOuterEdges(),
            this.outerEdges
        }
        ,
        t.prototype.getOuterEdge = function(t) {
            return this.sortOuterEdges(),
            this.outerEdges[t]
        }
        ,
        t.prototype.addInnerEdge = function(t) {
            this.innerEdges.push(t)
        }
        ,
        t
    }()
      , ls = function() {
        function t(t, e) {
            this.from = t,
            this.to = e,
            this.next = void 0,
            this.label = void 0,
            this.symetric = void 0,
            this.ring = void 0,
            this.from.addOuterEdge(this),
            this.to.addInnerEdge(this)
        }
        return t.prototype.getSymetric = function() {
            return this.symetric || (this.symetric = new t(this.to,this.from),
            this.symetric.symetric = this),
            this.symetric
        }
        ,
        t.prototype.deleteEdge = function() {
            this.from.removeOuterEdge(this),
            this.to.removeInnerEdge(this)
        }
        ,
        t.prototype.isEqual = function(t) {
            return this.from.id === t.from.id && this.to.id === t.to.id
        }
        ,
        t.prototype.toString = function() {
            return "Edge { " + this.from.id + " -> " + this.to.id + " }"
        }
        ,
        t.prototype.toLineString = function() {
            return h([this.from.coordinates, this.to.coordinates])
        }
        ,
        t.prototype.compareTo = function(t) {
            return ss(t.from.coordinates, t.to.coordinates, this.to.coordinates)
        }
        ,
        t
    }()
      , cs = function() {
        function t() {
            this.edges = [],
            this.polygon = void 0,
            this.envelope = void 0
        }
        return t.prototype.push = function(t) {
            this.edges.push(t),
            this.polygon = this.envelope = void 0
        }
        ,
        t.prototype.get = function(t) {
            return this.edges[t]
        }
        ,
        Object.defineProperty(t.prototype, "length", {
            get: function() {
                return this.edges.length
            },
            enumerable: !0,
            configurable: !0
        }),
        t.prototype.forEach = function(t) {
            this.edges.forEach(t)
        }
        ,
        t.prototype.map = function(t) {
            return this.edges.map(t)
        }
        ,
        t.prototype.some = function(t) {
            return this.edges.some(t)
        }
        ,
        t.prototype.isValid = function() {
            return !0
        }
        ,
        t.prototype.isHole = function() {
            var t = this
              , e = this.edges.reduce((function(e, n, r) {
                return n.from.coordinates[1] > t.edges[e].from.coordinates[1] && (e = r),
                e
            }
            ), 0)
              , n = (0 === e ? this.length : e) - 1
              , r = (e + 1) % this.length
              , i = ss(this.edges[n].from.coordinates, this.edges[e].from.coordinates, this.edges[r].from.coordinates);
            return 0 === i ? this.edges[n].from.coordinates[0] > this.edges[r].from.coordinates[0] : i > 0
        }
        ,
        t.prototype.toMultiPoint = function() {
            return d(this.edges.map((function(t) {
                return t.from.coordinates
            }
            )))
        }
        ,
        t.prototype.toPolygon = function() {
            if (this.polygon)
                return this.polygon;
            var t = this.edges.map((function(t) {
                return t.from.coordinates
            }
            ));
            return t.push(this.edges[0].from.coordinates),
            this.polygon = l([t])
        }
        ,
        t.prototype.getEnvelope = function() {
            return this.envelope ? this.envelope : this.envelope = dn(this.toPolygon())
        }
        ,
        t.findEdgeRingContaining = function(t, e) {
            var n, r, i = t.getEnvelope();
            return e.forEach((function(e) {
                var o, s, u, l, c, h, p = e.getEnvelope();
                if ((r && (n = r.getEnvelope()),
                s = i,
                u = (o = p).geometry.coordinates[0].map((function(t) {
                    return t[0]
                }
                )),
                l = o.geometry.coordinates[0].map((function(t) {
                    return t[1]
                }
                )),
                c = s.geometry.coordinates[0].map((function(t) {
                    return t[0]
                }
                )),
                h = s.geometry.coordinates[0].map((function(t) {
                    return t[1]
                }
                )),
                Math.max.apply(null, u) !== Math.max.apply(null, c) || Math.max.apply(null, l) !== Math.max.apply(null, h) || Math.min.apply(null, u) !== Math.min.apply(null, c) || Math.min.apply(null, l) !== Math.min.apply(null, h)) && as(p, i)) {
                    for (var f = t.map((function(t) {
                        return t.from.coordinates
                    }
                    )), g = void 0, d = function(t) {
                        e.some((function(e) {
                            return n = t,
                            r = e.from.coordinates,
                            n[0] === r[0] && n[1] === r[1];
                            var n, r
                        }
                        )) || (g = t)
                    }, y = 0, v = f; y < v.length; y++) {
                        d(v[y])
                    }
                    g && e.inside(a(g)) && (r && !as(n, p) || (r = e))
                }
            }
            )),
            r
        }
        ,
        t.prototype.inside = function(t) {
            return ye(t, this.toPolygon())
        }
        ,
        t
    }();
    var hs = function() {
        function t() {
            this.edges = [],
            this.nodes = {}
        }
        return t.fromGeoJson = function(e) {
            !function(t) {
                if (!t)
                    throw new Error("No geojson passed");
                if ("FeatureCollection" !== t.type && "GeometryCollection" !== t.type && "MultiLineString" !== t.type && "LineString" !== t.type && "Feature" !== t.type)
                    throw new Error("Invalid input type '" + t.type + "'. Geojson must be FeatureCollection, GeometryCollection, LineString, MultiLineString or Feature")
            }(e);
            var n = new t;
            return z(e, (function(t) {
                et(t, "LineString", "Graph::fromGeoJson"),
                T(t, (function(t, e) {
                    if (t) {
                        var r = n.getNode(t)
                          , i = n.getNode(e);
                        n.addEdge(r, i)
                    }
                    return e
                }
                ))
            }
            )),
            n
        }
        ,
        t.prototype.getNode = function(t) {
            var e = us.buildId(t)
              , n = this.nodes[e];
            return n || (n = this.nodes[e] = new us(t)),
            n
        }
        ,
        t.prototype.addEdge = function(t, e) {
            var n = new ls(t,e)
              , r = n.getSymetric();
            this.edges.push(n),
            this.edges.push(r)
        }
        ,
        t.prototype.deleteDangles = function() {
            var t = this;
            Object.keys(this.nodes).map((function(e) {
                return t.nodes[e]
            }
            )).forEach((function(e) {
                return t._removeIfDangle(e)
            }
            ))
        }
        ,
        t.prototype._removeIfDangle = function(t) {
            var e = this;
            if (t.innerEdges.length <= 1) {
                var n = t.getOuterEdges().map((function(t) {
                    return t.to
                }
                ));
                this.removeNode(t),
                n.forEach((function(t) {
                    return e._removeIfDangle(t)
                }
                ))
            }
        }
        ,
        t.prototype.deleteCutEdges = function() {
            var t = this;
            this._computeNextCWEdges(),
            this._findLabeledEdgeRings(),
            this.edges.forEach((function(e) {
                e.label === e.symetric.label && (t.removeEdge(e.symetric),
                t.removeEdge(e))
            }
            ))
        }
        ,
        t.prototype._computeNextCWEdges = function(t) {
            var e = this;
            void 0 === t ? Object.keys(this.nodes).forEach((function(t) {
                return e._computeNextCWEdges(e.nodes[t])
            }
            )) : t.getOuterEdges().forEach((function(e, n) {
                t.getOuterEdge((0 === n ? t.getOuterEdges().length : n) - 1).symetric.next = e
            }
            ))
        }
        ,
        t.prototype._computeNextCCWEdges = function(t, e) {
            for (var n, r, i = t.getOuterEdges(), o = i.length - 1; o >= 0; --o) {
                var s = i[o]
                  , a = s.symetric
                  , u = void 0
                  , l = void 0;
                s.label === e && (u = s),
                a.label === e && (l = a),
                u && l && (l && (r = l),
                u && (r && (r.next = u,
                r = void 0),
                n || (n = u)))
            }
            r && (r.next = n)
        }
        ,
        t.prototype._findLabeledEdgeRings = function() {
            var t = []
              , e = 0;
            return this.edges.forEach((function(n) {
                if (!(n.label >= 0)) {
                    t.push(n);
                    var r = n;
                    do {
                        r.label = e,
                        r = r.next
                    } while (!n.isEqual(r));
                    e++
                }
            }
            )),
            t
        }
        ,
        t.prototype.getEdgeRings = function() {
            var t = this;
            this._computeNextCWEdges(),
            this.edges.forEach((function(t) {
                t.label = void 0
            }
            )),
            this._findLabeledEdgeRings().forEach((function(e) {
                t._findIntersectionNodes(e).forEach((function(n) {
                    t._computeNextCCWEdges(n, e.label)
                }
                ))
            }
            ));
            var e = [];
            return this.edges.forEach((function(n) {
                n.ring || e.push(t._findEdgeRing(n))
            }
            )),
            e
        }
        ,
        t.prototype._findIntersectionNodes = function(t) {
            var e = []
              , n = t
              , r = function() {
                var r = 0;
                n.from.getOuterEdges().forEach((function(e) {
                    e.label === t.label && ++r
                }
                )),
                r > 1 && e.push(n.from),
                n = n.next
            };
            do {
                r()
            } while (!t.isEqual(n));
            return e
        }
        ,
        t.prototype._findEdgeRing = function(t) {
            var e = t
              , n = new cs;
            do {
                n.push(e),
                e.ring = n,
                e = e.next
            } while (!t.isEqual(e));
            return n
        }
        ,
        t.prototype.removeNode = function(t) {
            var e = this;
            t.getOuterEdges().forEach((function(t) {
                return e.removeEdge(t)
            }
            )),
            t.innerEdges.forEach((function(t) {
                return e.removeEdge(t)
            }
            )),
            delete this.nodes[t.id]
        }
        ,
        t.prototype.removeEdge = function(t) {
            this.edges = this.edges.filter((function(e) {
                return !e.isEqual(t)
            }
            )),
            t.deleteEdge()
        }
        ,
        t
    }();
    function ps(t, e) {
        var n = !0;
        return z(t, (function(t) {
            z(e, (function(e) {
                if (!1 === n)
                    return !1;
                n = function(t, e) {
                    switch (t.type) {
                    case "Point":
                        switch (e.type) {
                        case "Point":
                            return n = t.coordinates,
                            r = e.coordinates,
                            !(n[0] === r[0] && n[1] === r[1]);
                        case "LineString":
                            return !fs(e, t);
                        case "Polygon":
                            return !ye(t, e)
                        }
                        break;
                    case "LineString":
                        switch (e.type) {
                        case "Point":
                            return !fs(t, e);
                        case "LineString":
                            return !function(t, e) {
                                if (Or(t, e).features.length > 0)
                                    return !0;
                                return !1
                            }(t, e);
                        case "Polygon":
                            return !gs(e, t)
                        }
                        break;
                    case "Polygon":
                        switch (e.type) {
                        case "Point":
                            return !ye(e, t);
                        case "LineString":
                            return !gs(t, e);
                        case "Polygon":
                            return !function(t, e) {
                                for (var n = 0, r = t.coordinates[0]; n < r.length; n++) {
                                    if (ye(r[n], e))
                                        return !0
                                }
                                for (var i = 0, o = e.coordinates[0]; i < o.length; i++) {
                                    if (ye(o[i], t))
                                        return !0
                                }
                                if (Or(Ii(t), Ii(e)).features.length > 0)
                                    return !0;
                                return !1
                            }(e, t)
                        }
                    }
                    var n, r;
                    return !1
                }(t.geometry, e.geometry)
            }
            ))
        }
        )),
        n
    }
    function fs(t, e) {
        for (var n = 0; n < t.coordinates.length - 1; n++)
            if (ds(t.coordinates[n], t.coordinates[n + 1], e.coordinates))
                return !0;
        return !1
    }
    function gs(t, e) {
        for (var n = 0, r = e.coordinates; n < r.length; n++) {
            if (ye(r[n], t))
                return !0
        }
        return Or(e, Ii(t)).features.length > 0
    }
    function ds(t, e, n) {
        var r = n[0] - t[0]
          , i = n[1] - t[1]
          , o = e[0] - t[0]
          , s = e[1] - t[1];
        return 0 == r * s - i * o && (Math.abs(o) >= Math.abs(s) ? o > 0 ? t[0] <= n[0] && n[0] <= e[0] : e[0] <= n[0] && n[0] <= t[0] : s > 0 ? t[1] <= n[1] && n[1] <= e[1] : e[1] <= n[1] && n[1] <= t[1])
    }
    function ys(t, e) {
        return !(t[0] > e[0]) && (!(t[2] < e[2]) && (!(t[1] > e[1]) && !(t[3] < e[3])))
    }
    function vs(t, e) {
        return t[0] === e[0] && t[1] === e[1]
    }
    function _s(t, e) {
        return [(t[0] + e[0]) / 2, (t[1] + e[1]) / 2]
    }
    function ms(t, e) {
        for (var n = !1, r = !1, i = t.coordinates.length, o = 0; o < i && !n && !r; ) {
            for (var s = 0; s < e.coordinates.length - 1; s++) {
                var a = !0;
                0 !== s && s !== e.coordinates.length - 2 || (a = !1),
                bs(e.coordinates[s], e.coordinates[s + 1], t.coordinates[o], a) ? n = !0 : r = !0
            }
            o++
        }
        return n && r
    }
    function xs(t, e) {
        return Or(t, Ni(e)).features.length > 0
    }
    function Es(t, e) {
        for (var n = !1, r = !1, i = t.coordinates.length, o = 0; o < i && (!n || !r); o++)
            ye(a(t.coordinates[o]), e) ? n = !0 : r = !0;
        return r && n
    }
    function bs(t, e, n, r) {
        var i = n[0] - t[0]
          , o = n[1] - t[1]
          , s = e[0] - t[0]
          , a = e[1] - t[1];
        return 0 == i * a - o * s && (r ? Math.abs(s) >= Math.abs(a) ? s > 0 ? t[0] <= n[0] && n[0] <= e[0] : e[0] <= n[0] && n[0] <= t[0] : a > 0 ? t[1] <= n[1] && n[1] <= e[1] : e[1] <= n[1] && n[1] <= t[1] : Math.abs(s) >= Math.abs(a) ? s > 0 ? t[0] < n[0] && n[0] < e[0] : e[0] < n[0] && n[0] < t[0] : a > 0 ? t[1] < n[1] && n[1] < e[1] : e[1] < n[1] && n[1] < t[1])
    }
    var ws = function(t) {
        this.precision = t && t.precision ? t.precision : 17,
        this.direction = !(!t || !t.direction) && t.direction,
        this.pseudoNode = !(!t || !t.pseudoNode) && t.pseudoNode,
        this.objectComparator = t && t.objectComparator ? t.objectComparator : Ss
    };
    function Is(t) {
        return t.coordinates.map((function(e) {
            return {
                type: t.type.replace("Multi", ""),
                coordinates: e
            }
        }
        ))
    }
    function Ns(t, e) {
        return t.hasOwnProperty("coordinates") ? t.coordinates.length === e.coordinates.length : t.length === e.length
    }
    function Ss(t, e) {
        return Fi(t, e, {
            strict: !0
        })
    }
    ws.prototype.compare = function(t, e) {
        if (t.type !== e.type || !Ns(t, e))
            return !1;
        switch (t.type) {
        case "Point":
            return this.compareCoord(t.coordinates, e.coordinates);
        case "LineString":
            return this.compareLine(t.coordinates, e.coordinates, 0, !1);
        case "Polygon":
            return this.comparePolygon(t, e);
        case "Feature":
            return this.compareFeature(t, e);
        default:
            if (0 === t.type.indexOf("Multi")) {
                var n = this
                  , r = Is(t)
                  , i = Is(e);
                return r.every((function(t) {
                    return this.some((function(e) {
                        return n.compare(t, e)
                    }
                    ))
                }
                ), i)
            }
        }
        return !1
    }
    ,
    ws.prototype.compareCoord = function(t, e) {
        if (t.length !== e.length)
            return !1;
        for (var n = 0; n < t.length; n++)
            if (t[n].toFixed(this.precision) !== e[n].toFixed(this.precision))
                return !1;
        return !0
    }
    ,
    ws.prototype.compareLine = function(t, e, n, r) {
        if (!Ns(t, e))
            return !1;
        var i = this.pseudoNode ? t : this.removePseudo(t)
          , o = this.pseudoNode ? e : this.removePseudo(e);
        if (!r || this.compareCoord(i[0], o[0]) || (o = this.fixStartIndex(o, i))) {
            var s = this.compareCoord(i[n], o[n]);
            return this.direction || s ? this.comparePath(i, o) : !!this.compareCoord(i[n], o[o.length - (1 + n)]) && this.comparePath(i.slice().reverse(), o)
        }
    }
    ,
    ws.prototype.fixStartIndex = function(t, e) {
        for (var n, r = -1, i = 0; i < t.length; i++)
            if (this.compareCoord(t[i], e[0])) {
                r = i;
                break
            }
        return r >= 0 && (n = [].concat(t.slice(r, t.length), t.slice(1, r + 1))),
        n
    }
    ,
    ws.prototype.comparePath = function(t, e) {
        var n = this;
        return t.every((function(t, e) {
            return n.compareCoord(t, this[e])
        }
        ), e)
    }
    ,
    ws.prototype.comparePolygon = function(t, e) {
        if (this.compareLine(t.coordinates[0], e.coordinates[0], 1, !0)) {
            var n = t.coordinates.slice(1, t.coordinates.length)
              , r = e.coordinates.slice(1, e.coordinates.length)
              , i = this;
            return n.every((function(t) {
                return this.some((function(e) {
                    return i.compareLine(t, e, 1, !0)
                }
                ))
            }
            ), r)
        }
        return !1
    }
    ,
    ws.prototype.compareFeature = function(t, e) {
        return !(t.id !== e.id || !this.objectComparator(t.properties, e.properties) || !this.compareBBox(t, e)) && this.compare(t.geometry, e.geometry)
    }
    ,
    ws.prototype.compareBBox = function(t, e) {
        return !!(!t.bbox && !e.bbox || t.bbox && e.bbox && this.compareCoord(t.bbox, e.bbox))
    }
    ,
    ws.prototype.removePseudo = function(t) {
        return t
    }
    ;
    var Cs = ws;
    function Ps(t, e) {
        var n = !1;
        return z(t, (function(t) {
            z(e, (function(e) {
                if (!0 === n)
                    return !0;
                n = !ps(t.geometry, e.geometry)
            }
            ))
        }
        )),
        n
    }
    var Ms = Bt((function(t) {
        function e(t, e, n, r) {
            this.dataset = [],
            this.epsilon = 1,
            this.minPts = 2,
            this.distance = this._euclideanDistance,
            this.clusters = [],
            this.noise = [],
            this._visited = [],
            this._assigned = [],
            this._datasetLength = 0,
            this._init(t, e, n, r)
        }
        e.prototype.run = function(t, e, n, r) {
            this._init(t, e, n, r);
            for (var i = 0; i < this._datasetLength; i++)
                if (1 !== this._visited[i]) {
                    this._visited[i] = 1;
                    var o = this._regionQuery(i);
                    if (o.length < this.minPts)
                        this.noise.push(i);
                    else {
                        var s = this.clusters.length;
                        this.clusters.push([]),
                        this._addToCluster(i, s),
                        this._expandCluster(s, o)
                    }
                }
            return this.clusters
        }
        ,
        e.prototype._init = function(t, e, n, r) {
            if (t) {
                if (!(t instanceof Array))
                    throw Error("Dataset must be of type array, " + typeof t + " given");
                this.dataset = t,
                this.clusters = [],
                this.noise = [],
                this._datasetLength = t.length,
                this._visited = new Array(this._datasetLength),
                this._assigned = new Array(this._datasetLength)
            }
            e && (this.epsilon = e),
            n && (this.minPts = n),
            r && (this.distance = r)
        }
        ,
        e.prototype._expandCluster = function(t, e) {
            for (var n = 0; n < e.length; n++) {
                var r = e[n];
                if (1 !== this._visited[r]) {
                    this._visited[r] = 1;
                    var i = this._regionQuery(r);
                    i.length >= this.minPts && (e = this._mergeArrays(e, i))
                }
                1 !== this._assigned[r] && this._addToCluster(r, t)
            }
        }
        ,
        e.prototype._addToCluster = function(t, e) {
            this.clusters[e].push(t),
            this._assigned[t] = 1
        }
        ,
        e.prototype._regionQuery = function(t) {
            for (var e = [], n = 0; n < this._datasetLength; n++) {
                this.distance(this.dataset[t], this.dataset[n]) < this.epsilon && e.push(n)
            }
            return e
        }
        ,
        e.prototype._mergeArrays = function(t, e) {
            for (var n = e.length, r = 0; r < n; r++) {
                var i = e[r];
                t.indexOf(i) < 0 && t.push(i)
            }
            return t
        }
        ,
        e.prototype._euclideanDistance = function(t, e) {
            for (var n = 0, r = Math.min(t.length, e.length); r--; )
                n += (t[r] - e[r]) * (t[r] - e[r]);
            return Math.sqrt(n)
        }
        ,
        t.exports && (t.exports = e)
    }
    ))
      , Ls = Bt((function(t) {
        function e(t, e, n) {
            this.k = 3,
            this.dataset = [],
            this.assignments = [],
            this.centroids = [],
            this.init(t, e, n)
        }
        e.prototype.init = function(t, e, n) {
            this.assignments = [],
            this.centroids = [],
            void 0 !== t && (this.dataset = t),
            void 0 !== e && (this.k = e),
            void 0 !== n && (this.distance = n)
        }
        ,
        e.prototype.run = function(t, e) {
            this.init(t, e);
            for (var n = this.dataset.length, r = 0; r < this.k; r++)
                this.centroids[r] = this.randomCentroid();
            for (var i = !0; i; ) {
                i = this.assign();
                for (var o = 0; o < this.k; o++) {
                    for (var s = new Array(c), a = 0, u = 0; u < c; u++)
                        s[u] = 0;
                    for (var l = 0; l < n; l++) {
                        var c = this.dataset[l].length;
                        if (o === this.assignments[l]) {
                            for (u = 0; u < c; u++)
                                s[u] += this.dataset[l][u];
                            a++
                        }
                    }
                    if (a > 0) {
                        for (u = 0; u < c; u++)
                            s[u] /= a;
                        this.centroids[o] = s
                    } else
                        this.centroids[o] = this.randomCentroid(),
                        i = !0
                }
            }
            return this.getClusters()
        }
        ,
        e.prototype.randomCentroid = function() {
            var t, e, n = this.dataset.length - 1;
            do {
                e = Math.round(Math.random() * n),
                t = this.dataset[e]
            } while (this.centroids.indexOf(t) >= 0);
            return t
        }
        ,
        e.prototype.assign = function() {
            for (var t, e = !1, n = this.dataset.length, r = 0; r < n; r++)
                (t = this.argmin(this.dataset[r], this.centroids, this.distance)) != this.assignments[r] && (this.assignments[r] = t,
                e = !0);
            return e
        }
        ,
        e.prototype.getClusters = function() {
            for (var t, e = new Array(this.k), n = 0; n < this.assignments.length; n++)
                void 0 === e[t = this.assignments[n]] && (e[t] = []),
                e[t].push(n);
            return e
        }
        ,
        e.prototype.argmin = function(t, e, n) {
            for (var r, i = Number.MAX_VALUE, o = 0, s = e.length, a = 0; a < s; a++)
                (r = n(t, e[a])) < i && (i = r,
                o = a);
            return o
        }
        ,
        e.prototype.distance = function(t, e) {
            for (var n = 0, r = Math.min(t.length, e.length); r--; ) {
                var i = t[r] - e[r];
                n += i * i
            }
            return Math.sqrt(n)
        }
        ,
        t.exports && (t.exports = e)
    }
    ))
      , Os = Bt((function(t) {
        function e(t, e, n) {
            this._queue = [],
            this._priorities = [],
            this._sorting = "desc",
            this._init(t, e, n)
        }
        e.prototype.insert = function(t, e) {
            for (var n = this._queue.length, r = n; r--; ) {
                var i = this._priorities[r];
                "desc" === this._sorting ? e > i && (n = r) : e < i && (n = r)
            }
            this._insertAt(t, e, n)
        }
        ,
        e.prototype.remove = function(t) {
            for (var e = this._queue.length; e--; ) {
                if (t === this._queue[e]) {
                    this._queue.splice(e, 1),
                    this._priorities.splice(e, 1);
                    break
                }
            }
        }
        ,
        e.prototype.forEach = function(t) {
            this._queue.forEach(t)
        }
        ,
        e.prototype.getElements = function() {
            return this._queue
        }
        ,
        e.prototype.getElementPriority = function(t) {
            return this._priorities[t]
        }
        ,
        e.prototype.getPriorities = function() {
            return this._priorities
        }
        ,
        e.prototype.getElementsWithPriorities = function() {
            for (var t = [], e = 0, n = this._queue.length; e < n; e++)
                t.push([this._queue[e], this._priorities[e]]);
            return t
        }
        ,
        e.prototype._init = function(t, e, n) {
            if (t && e) {
                if (this._queue = [],
                this._priorities = [],
                t.length !== e.length)
                    throw new Error("Arrays must have the same length");
                for (var r = 0; r < t.length; r++)
                    this.insert(t[r], e[r])
            }
            n && (this._sorting = n)
        }
        ,
        e.prototype._insertAt = function(t, e, n) {
            this._queue.length === n ? (this._queue.push(t),
            this._priorities.push(e)) : (this._queue.splice(n, 0, t),
            this._priorities.splice(n, 0, e))
        }
        ,
        t.exports && (t.exports = e)
    }
    ))
      , Rs = Bt((function(t) {
        if (t.exports)
            var e = Os;
        function n(t, e, n, r) {
            this.epsilon = 1,
            this.minPts = 1,
            this.distance = this._euclideanDistance,
            this._reachability = [],
            this._processed = [],
            this._coreDistance = 0,
            this._orderedList = [],
            this._init(t, e, n, r)
        }
        n.prototype.run = function(t, n, r, i) {
            this._init(t, n, r, i);
            for (var o = 0, s = this.dataset.length; o < s; o++)
                if (1 !== this._processed[o]) {
                    this._processed[o] = 1,
                    this.clusters.push([o]);
                    var a = this.clusters.length - 1;
                    this._orderedList.push(o);
                    var u = new e(null,null,"asc")
                      , l = this._regionQuery(o);
                    void 0 !== this._distanceToCore(o) && (this._updateQueue(o, l, u),
                    this._expandCluster(a, u))
                }
            return this.clusters
        }
        ,
        n.prototype.getReachabilityPlot = function() {
            for (var t = [], e = 0, n = this._orderedList.length; e < n; e++) {
                var r = this._orderedList[e]
                  , i = this._reachability[r];
                t.push([r, i])
            }
            return t
        }
        ,
        n.prototype._init = function(t, e, n, r) {
            if (t) {
                if (!(t instanceof Array))
                    throw Error("Dataset must be of type array, " + typeof t + " given");
                this.dataset = t,
                this.clusters = [],
                this._reachability = new Array(this.dataset.length),
                this._processed = new Array(this.dataset.length),
                this._coreDistance = 0,
                this._orderedList = []
            }
            e && (this.epsilon = e),
            n && (this.minPts = n),
            r && (this.distance = r)
        }
        ,
        n.prototype._updateQueue = function(t, e, n) {
            var r = this;
            this._coreDistance = this._distanceToCore(t),
            e.forEach((function(e) {
                if (void 0 === r._processed[e]) {
                    var i = r.distance(r.dataset[t], r.dataset[e])
                      , o = Math.max(r._coreDistance, i);
                    void 0 === r._reachability[e] ? (r._reachability[e] = o,
                    n.insert(e, o)) : o < r._reachability[e] && (r._reachability[e] = o,
                    n.remove(e),
                    n.insert(e, o))
                }
            }
            ))
        }
        ,
        n.prototype._expandCluster = function(t, e) {
            for (var n = e.getElements(), r = 0, i = n.length; r < i; r++) {
                var o = n[r];
                if (void 0 === this._processed[o]) {
                    var s = this._regionQuery(o);
                    this._processed[o] = 1,
                    this.clusters[t].push(o),
                    this._orderedList.push(o),
                    void 0 !== this._distanceToCore(o) && (this._updateQueue(o, s, e),
                    this._expandCluster(t, e))
                }
            }
        }
        ,
        n.prototype._distanceToCore = function(t) {
            for (var e = this.epsilon, n = 0; n < e; n++) {
                if (this._regionQuery(t, n).length >= this.minPts)
                    return n
            }
        }
        ,
        n.prototype._regionQuery = function(t, e) {
            e = e || this.epsilon;
            for (var n = [], r = 0, i = this.dataset.length; r < i; r++)
                this.distance(this.dataset[t], this.dataset[r]) < e && n.push(r);
            return n
        }
        ,
        n.prototype._euclideanDistance = function(t, e) {
            for (var n = 0, r = Math.min(t.length, e.length); r--; )
                n += (t[r] - e[r]) * (t[r] - e[r]);
            return Math.sqrt(n)
        }
        ,
        t.exports && (t.exports = n)
    }
    ))
      , Ts = Bt((function(t) {
        t.exports && (t.exports = {
            DBSCAN: Ms,
            KMEANS: Ls,
            OPTICS: Rs,
            PriorityQueue: Os
        })
    }
    ));
    var As = function(t, e, n) {
        for (var r = t.length, i = 0, o = 0; o < r; o++) {
            var s = (t[o] || 0) - (e[o] || 0);
            i += s * s
        }
        return n ? Math.sqrt(i) : i
    }
      , Ds = As
      , Fs = function(t, e, n) {
        var r = Math.abs(t - e);
        return n ? r : r * r
    }
      , ks = As
      , Gs = function(t, e) {
        for (var n = {}, r = [], i = e << 2, o = t.length, s = t[0].length > 0; r.length < e && i-- > 0; ) {
            var a = t[Math.floor(Math.random() * o)]
              , u = s ? a.join("_") : "" + a;
            n[u] || (n[u] = !0,
            r.push(a))
        }
        if (r.length < e)
            throw new Error("Error initializating clusters");
        return r
    }
      , qs = function(t, e) {
        var n = t[0].length ? Ds : Fs
          , r = []
          , i = t.length
          , o = t[0].length > 0
          , s = t[Math.floor(Math.random() * i)];
        o && s.join("_");
        for (r.push(s); r.length < e; ) {
            for (var a = [], u = r.length, l = 0, c = [], h = 0; h < i; h++) {
                for (var p = 1 / 0, f = 0; f < u; f++) {
                    var g = n(t[h], r[f]);
                    g <= p && (p = g)
                }
                a[h] = p
            }
            for (var d = 0; d < i; d++)
                l += a[d];
            for (var y = 0; y < i; y++)
                c[y] = {
                    i: y,
                    v: t[y],
                    pr: a[y] / l,
                    cs: 0
                };
            c.sort((function(t, e) {
                return t.pr - e.pr
            }
            )),
            c[0].cs = c[0].pr;
            for (var v = 1; v < i; v++)
                c[v].cs = c[v - 1].cs + c[v].pr;
            for (var _ = Math.random(), m = 0; m < i - 1 && c[m++].cs < _; )
                ;
            r.push(c[m - 1].v)
        }
        return r
    };
    function Bs(t, e, n) {
        n = n || [];
        for (var r = 0; r < t; r++)
            n[r] = e;
        return n
    }
    var zs = function(t, e, n, r) {
        var i = []
          , o = []
          , s = []
          , a = []
          , u = !1
          , l = r || 1e4
          , c = t.length
          , h = t[0].length
          , p = h > 0
          , f = [];
        if (n)
            i = "kmrand" == n ? Gs(t, e) : "kmpp" == n ? qs(t, e) : n;
        else
            for (var g = {}; i.length < e; ) {
                var d = Math.floor(Math.random() * c);
                g[d] || (g[d] = !0,
                i.push(t[d]))
            }
        do {
            Bs(e, 0, f);
            for (var y = 0; y < c; y++) {
                for (var v = 1 / 0, _ = 0, m = 0; m < e; m++) {
                    (a = p ? ks(t[y], i[m]) : Math.abs(t[y] - i[m])) <= v && (v = a,
                    _ = m)
                }
                s[y] = _,
                f[_]++
            }
            for (var x = [], E = (o = [],
            0); E < e; E++)
                x[E] = p ? Bs(h, 0, x[E]) : 0,
                o[E] = i[E];
            if (p) {
                for (var b = 0; b < e; b++)
                    i[b] = [];
                for (var w = 0; w < c; w++)
                    for (var I = x[s[w]], N = t[w], S = 0; S < h; S++)
                        I[S] += N[S];
                u = !0;
                for (var C = 0; C < e; C++) {
                    for (var P = i[C], M = x[C], L = o[C], O = f[C], R = 0; R < h; R++)
                        P[R] = M[R] / O || 0;
                    if (u)
                        for (var T = 0; T < h; T++)
                            if (L[T] != P[T]) {
                                u = !1;
                                break
                            }
                }
            } else {
                for (var A = 0; A < c; A++) {
                    x[s[A]] += t[A]
                }
                for (var D = 0; D < e; D++)
                    i[D] = x[D] / f[D] || 0;
                u = !0;
                for (var F = 0; F < e; F++)
                    if (o[F] != i[F]) {
                        u = !1;
                        break
                    }
            }
            u = u || --l <= 0
        } while (!u);
        return {
            it: 1e4 - l,
            k: e,
            idxs: s,
            centroids: i
        }
    };
    function js(t, e) {
        return b(Bi(t[0], t[1])) === b(Bi(e[0], e[1]))
    }
    function Us(t, e) {
        if (t.geometry && t.geometry.type)
            return t.geometry.type;
        if (t.type)
            return t.type;
        throw new Error("Invalid GeoJSON object for " + e)
    }
    function Vs(t) {
        for (var e = t, n = []; e.parent; )
            n.unshift(e),
            e = e.parent;
        return n
    }
    var Xs = {
        search: function(t, e, n, r) {
            t.cleanDirty();
            var i = (r = r || {}).heuristic || Xs.heuristics.manhattan
              , o = r.closest || !1
              , s = new Ws((function(t) {
                return t.f
            }
            ))
              , a = e;
            for (e.h = i(e, n),
            s.push(e); s.size() > 0; ) {
                var u = s.pop();
                if (u === n)
                    return Vs(u);
                u.closed = !0;
                for (var l = t.neighbors(u), c = 0, h = l.length; c < h; ++c) {
                    var p = l[c];
                    if (!p.closed && !p.isWall()) {
                        var f = u.g + p.getCost(u)
                          , g = p.visited;
                        (!g || f < p.g) && (p.visited = !0,
                        p.parent = u,
                        p.h = p.h || i(p, n),
                        p.g = f,
                        p.f = p.g + p.h,
                        t.markDirty(p),
                        o && (p.h < a.h || p.h === a.h && p.g < a.g) && (a = p),
                        g ? s.rescoreElement(p) : s.push(p))
                    }
                }
            }
            return o ? Vs(a) : []
        },
        heuristics: {
            manhattan: function(t, e) {
                return Math.abs(e.x - t.x) + Math.abs(e.y - t.y)
            },
            diagonal: function(t, e) {
                var n = Math.sqrt(2)
                  , r = Math.abs(e.x - t.x)
                  , i = Math.abs(e.y - t.y);
                return 1 * (r + i) + (n - 2) * Math.min(r, i)
            }
        },
        cleanNode: function(t) {
            t.f = 0,
            t.g = 0,
            t.h = 0,
            t.visited = !1,
            t.closed = !1,
            t.parent = null
        }
    };
    function Ys(t, e) {
        e = e || {},
        this.nodes = [],
        this.diagonal = !!e.diagonal,
        this.grid = [];
        for (var n = 0; n < t.length; n++) {
            this.grid[n] = [];
            for (var r = 0, i = t[n]; r < i.length; r++) {
                var o = new Hs(n,r,i[r]);
                this.grid[n][r] = o,
                this.nodes.push(o)
            }
        }
        this.init()
    }
    function Hs(t, e, n) {
        this.x = t,
        this.y = e,
        this.weight = n
    }
    function Ws(t) {
        this.content = [],
        this.scoreFunction = t
    }
    function Js(t, e) {
        for (var n = 0; n < e.features.length; n++)
            if (ye(t, e.features[n]))
                return !0;
        return !1
    }
    function Zs(t) {
        return function() {
            return t
        }
    }
    function Ks(t) {
        return t[0]
    }
    function Qs(t) {
        return t[1]
    }
    function $s() {
        this._ = null
    }
    function ta(t) {
        t.U = t.C = t.L = t.R = t.P = t.N = null
    }
    function ea(t, e) {
        var n = e
          , r = e.R
          , i = n.U;
        i ? i.L === n ? i.L = r : i.R = r : t._ = r,
        r.U = i,
        n.U = r,
        n.R = r.L,
        n.R && (n.R.U = n),
        r.L = n
    }
    function na(t, e) {
        var n = e
          , r = e.L
          , i = n.U;
        i ? i.L === n ? i.L = r : i.R = r : t._ = r,
        r.U = i,
        n.U = r,
        n.L = r.R,
        n.L && (n.L.U = n),
        r.R = n
    }
    function ra(t) {
        for (; t.L; )
            t = t.L;
        return t
    }
    function ia(t, e, n, r) {
        var i = [null, null]
          , o = Pa.push(i) - 1;
        return i.left = t,
        i.right = e,
        n && sa(i, t, e, n),
        r && sa(i, e, t, r),
        Sa[t.index].halfedges.push(o),
        Sa[e.index].halfedges.push(o),
        i
    }
    function oa(t, e, n) {
        var r = [e, n];
        return r.left = t,
        r
    }
    function sa(t, e, n, r) {
        t[0] || t[1] ? t.left === n ? t[1] = r : t[0] = r : (t[0] = r,
        t.left = e,
        t.right = n)
    }
    function aa(t, e, n, r, i) {
        var o, s = t[0], a = t[1], u = s[0], l = s[1], c = 0, h = 1, p = a[0] - u, f = a[1] - l;
        if (o = e - u,
        p || !(o > 0)) {
            if (o /= p,
            p < 0) {
                if (o < c)
                    return;
                o < h && (h = o)
            } else if (p > 0) {
                if (o > h)
                    return;
                o > c && (c = o)
            }
            if (o = r - u,
            p || !(o < 0)) {
                if (o /= p,
                p < 0) {
                    if (o > h)
                        return;
                    o > c && (c = o)
                } else if (p > 0) {
                    if (o < c)
                        return;
                    o < h && (h = o)
                }
                if (o = n - l,
                f || !(o > 0)) {
                    if (o /= f,
                    f < 0) {
                        if (o < c)
                            return;
                        o < h && (h = o)
                    } else if (f > 0) {
                        if (o > h)
                            return;
                        o > c && (c = o)
                    }
                    if (o = i - l,
                    f || !(o < 0)) {
                        if (o /= f,
                        f < 0) {
                            if (o > h)
                                return;
                            o > c && (c = o)
                        } else if (f > 0) {
                            if (o < c)
                                return;
                            o < h && (h = o)
                        }
                        return !(c > 0 || h < 1) || (c > 0 && (t[0] = [u + c * p, l + c * f]),
                        h < 1 && (t[1] = [u + h * p, l + h * f]),
                        !0)
                    }
                }
            }
        }
    }
    function ua(t, e, n, r, i) {
        var o = t[1];
        if (o)
            return !0;
        var s, a, u = t[0], l = t.left, c = t.right, h = l[0], p = l[1], f = c[0], g = c[1], d = (h + f) / 2, y = (p + g) / 2;
        if (g === p) {
            if (d < e || d >= r)
                return;
            if (h > f) {
                if (u) {
                    if (u[1] >= i)
                        return
                } else
                    u = [d, n];
                o = [d, i]
            } else {
                if (u) {
                    if (u[1] < n)
                        return
                } else
                    u = [d, i];
                o = [d, n]
            }
        } else if (a = y - (s = (h - f) / (g - p)) * d,
        s < -1 || s > 1)
            if (h > f) {
                if (u) {
                    if (u[1] >= i)
                        return
                } else
                    u = [(n - a) / s, n];
                o = [(i - a) / s, i]
            } else {
                if (u) {
                    if (u[1] < n)
                        return
                } else
                    u = [(i - a) / s, i];
                o = [(n - a) / s, n]
            }
        else if (p < g) {
            if (u) {
                if (u[0] >= r)
                    return
            } else
                u = [e, s * e + a];
            o = [r, s * r + a]
        } else {
            if (u) {
                if (u[0] < e)
                    return
            } else
                u = [r, s * r + a];
            o = [e, s * e + a]
        }
        return t[0] = u,
        t[1] = o,
        !0
    }
    function la(t, e) {
        var n = t.site
          , r = e.left
          , i = e.right;
        return n === i && (i = r,
        r = n),
        i ? Math.atan2(i[1] - r[1], i[0] - r[0]) : (n === r ? (r = e[1],
        i = e[0]) : (r = e[0],
        i = e[1]),
        Math.atan2(r[0] - i[0], i[1] - r[1]))
    }
    function ca(t, e) {
        return e[+(e.left !== t.site)]
    }
    function ha(t, e) {
        return e[+(e.left === t.site)]
    }
    Ys.prototype.init = function() {
        this.dirtyNodes = [];
        for (var t = 0; t < this.nodes.length; t++)
            Xs.cleanNode(this.nodes[t])
    }
    ,
    Ys.prototype.cleanDirty = function() {
        for (var t = 0; t < this.dirtyNodes.length; t++)
            Xs.cleanNode(this.dirtyNodes[t]);
        this.dirtyNodes = []
    }
    ,
    Ys.prototype.markDirty = function(t) {
        this.dirtyNodes.push(t)
    }
    ,
    Ys.prototype.neighbors = function(t) {
        var e = []
          , n = t.x
          , r = t.y
          , i = this.grid;
        return i[n - 1] && i[n - 1][r] && e.push(i[n - 1][r]),
        i[n + 1] && i[n + 1][r] && e.push(i[n + 1][r]),
        i[n] && i[n][r - 1] && e.push(i[n][r - 1]),
        i[n] && i[n][r + 1] && e.push(i[n][r + 1]),
        this.diagonal && (i[n - 1] && i[n - 1][r - 1] && e.push(i[n - 1][r - 1]),
        i[n + 1] && i[n + 1][r - 1] && e.push(i[n + 1][r - 1]),
        i[n - 1] && i[n - 1][r + 1] && e.push(i[n - 1][r + 1]),
        i[n + 1] && i[n + 1][r + 1] && e.push(i[n + 1][r + 1])),
        e
    }
    ,
    Ys.prototype.toString = function() {
        for (var t, e, n, r, i = [], o = this.grid, s = 0, a = o.length; s < a; s++) {
            for (t = [],
            n = 0,
            r = (e = o[s]).length; n < r; n++)
                t.push(e[n].weight);
            i.push(t.join(" "))
        }
        return i.join("\n")
    }
    ,
    Hs.prototype.toString = function() {
        return "[" + this.x + " " + this.y + "]"
    }
    ,
    Hs.prototype.getCost = function(t) {
        return t && t.x !== this.x && t.y !== this.y ? 1.41421 * this.weight : this.weight
    }
    ,
    Hs.prototype.isWall = function() {
        return 0 === this.weight
    }
    ,
    Ws.prototype = {
        push: function(t) {
            this.content.push(t),
            this.sinkDown(this.content.length - 1)
        },
        pop: function() {
            var t = this.content[0]
              , e = this.content.pop();
            return this.content.length > 0 && (this.content[0] = e,
            this.bubbleUp(0)),
            t
        },
        remove: function(t) {
            var e = this.content.indexOf(t)
              , n = this.content.pop();
            e !== this.content.length - 1 && (this.content[e] = n,
            this.scoreFunction(n) < this.scoreFunction(t) ? this.sinkDown(e) : this.bubbleUp(e))
        },
        size: function() {
            return this.content.length
        },
        rescoreElement: function(t) {
            this.sinkDown(this.content.indexOf(t))
        },
        sinkDown: function(t) {
            for (var e = this.content[t]; t > 0; ) {
                var n = (t + 1 >> 1) - 1
                  , r = this.content[n];
                if (!(this.scoreFunction(e) < this.scoreFunction(r)))
                    break;
                this.content[n] = e,
                this.content[t] = r,
                t = n
            }
        },
        bubbleUp: function(t) {
            for (var e = this.content.length, n = this.content[t], r = this.scoreFunction(n); ; ) {
                var i, o = t + 1 << 1, s = o - 1, a = null;
                if (s < e) {
                    var u = this.content[s];
                    (i = this.scoreFunction(u)) < r && (a = s)
                }
                if (o < e) {
                    var l = this.content[o];
                    this.scoreFunction(l) < (null === a ? r : i) && (a = o)
                }
                if (null === a)
                    break;
                this.content[t] = this.content[a],
                this.content[a] = n,
                t = a
            }
        }
    },
    $s.prototype = {
        constructor: $s,
        insert: function(t, e) {
            var n, r, i;
            if (t) {
                if (e.P = t,
                e.N = t.N,
                t.N && (t.N.P = e),
                t.N = e,
                t.R) {
                    for (t = t.R; t.L; )
                        t = t.L;
                    t.L = e
                } else
                    t.R = e;
                n = t
            } else
                this._ ? (t = ra(this._),
                e.P = null,
                e.N = t,
                t.P = t.L = e,
                n = t) : (e.P = e.N = null,
                this._ = e,
                n = null);
            for (e.L = e.R = null,
            e.U = n,
            e.C = !0,
            t = e; n && n.C; )
                n === (r = n.U).L ? (i = r.R) && i.C ? (n.C = i.C = !1,
                r.C = !0,
                t = r) : (t === n.R && (ea(this, n),
                n = (t = n).U),
                n.C = !1,
                r.C = !0,
                na(this, r)) : (i = r.L) && i.C ? (n.C = i.C = !1,
                r.C = !0,
                t = r) : (t === n.L && (na(this, n),
                n = (t = n).U),
                n.C = !1,
                r.C = !0,
                ea(this, r)),
                n = t.U;
            this._.C = !1
        },
        remove: function(t) {
            t.N && (t.N.P = t.P),
            t.P && (t.P.N = t.N),
            t.N = t.P = null;
            var e, n, r, i = t.U, o = t.L, s = t.R;
            if (n = o ? s ? ra(s) : o : s,
            i ? i.L === t ? i.L = n : i.R = n : this._ = n,
            o && s ? (r = n.C,
            n.C = t.C,
            n.L = o,
            o.U = n,
            n !== s ? (i = n.U,
            n.U = t.U,
            t = n.R,
            i.L = t,
            n.R = s,
            s.U = n) : (n.U = i,
            i = n,
            t = n.R)) : (r = t.C,
            t = n),
            t && (t.U = i),
            !r)
                if (t && t.C)
                    t.C = !1;
                else {
                    do {
                        if (t === this._)
                            break;
                        if (t === i.L) {
                            if ((e = i.R).C && (e.C = !1,
                            i.C = !0,
                            ea(this, i),
                            e = i.R),
                            e.L && e.L.C || e.R && e.R.C) {
                                e.R && e.R.C || (e.L.C = !1,
                                e.C = !0,
                                na(this, e),
                                e = i.R),
                                e.C = i.C,
                                i.C = e.R.C = !1,
                                ea(this, i),
                                t = this._;
                                break
                            }
                        } else if ((e = i.L).C && (e.C = !1,
                        i.C = !0,
                        na(this, i),
                        e = i.L),
                        e.L && e.L.C || e.R && e.R.C) {
                            e.L && e.L.C || (e.R.C = !1,
                            e.C = !0,
                            ea(this, e),
                            e = i.L),
                            e.C = i.C,
                            i.C = e.L.C = !1,
                            na(this, i),
                            t = this._;
                            break
                        }
                        e.C = !0,
                        t = i,
                        i = i.U
                    } while (!t.C);
                    t && (t.C = !1)
                }
        }
    };
    var pa, fa = [];
    function ga() {
        ta(this),
        this.x = this.y = this.arc = this.site = this.cy = null
    }
    function da(t) {
        var e = t.P
          , n = t.N;
        if (e && n) {
            var r = e.site
              , i = t.site
              , o = n.site;
            if (r !== o) {
                var s = i[0]
                  , a = i[1]
                  , u = r[0] - s
                  , l = r[1] - a
                  , c = o[0] - s
                  , h = o[1] - a
                  , p = 2 * (u * h - l * c);
                if (!(p >= -La)) {
                    var f = u * u + l * l
                      , g = c * c + h * h
                      , d = (h * f - l * g) / p
                      , y = (u * g - c * f) / p
                      , v = fa.pop() || new ga;
                    v.arc = t,
                    v.site = i,
                    v.x = d + s,
                    v.y = (v.cy = y + a) + Math.sqrt(d * d + y * y),
                    t.circle = v;
                    for (var _ = null, m = Ca._; m; )
                        if (v.y < m.y || v.y === m.y && v.x <= m.x) {
                            if (!m.L) {
                                _ = m.P;
                                break
                            }
                            m = m.L
                        } else {
                            if (!m.R) {
                                _ = m;
                                break
                            }
                            m = m.R
                        }
                    Ca.insert(_, v),
                    _ || (pa = v)
                }
            }
        }
    }
    function ya(t) {
        var e = t.circle;
        e && (e.P || (pa = e.N),
        Ca.remove(e),
        fa.push(e),
        ta(e),
        t.circle = null)
    }
    var va = [];
    function _a() {
        ta(this),
        this.edge = this.site = this.circle = null
    }
    function ma(t) {
        var e = va.pop() || new _a;
        return e.site = t,
        e
    }
    function xa(t) {
        ya(t),
        Na.remove(t),
        va.push(t),
        ta(t)
    }
    function Ea(t) {
        var e = t.circle
          , n = e.x
          , r = e.cy
          , i = [n, r]
          , o = t.P
          , s = t.N
          , a = [t];
        xa(t);
        for (var u = o; u.circle && Math.abs(n - u.circle.x) < Ma && Math.abs(r - u.circle.cy) < Ma; )
            o = u.P,
            a.unshift(u),
            xa(u),
            u = o;
        a.unshift(u),
        ya(u);
        for (var l = s; l.circle && Math.abs(n - l.circle.x) < Ma && Math.abs(r - l.circle.cy) < Ma; )
            s = l.N,
            a.push(l),
            xa(l),
            l = s;
        a.push(l),
        ya(l);
        var c, h = a.length;
        for (c = 1; c < h; ++c)
            l = a[c],
            u = a[c - 1],
            sa(l.edge, u.site, l.site, i);
        u = a[0],
        (l = a[h - 1]).edge = ia(u.site, l.site, null, i),
        da(u),
        da(l)
    }
    function ba(t) {
        for (var e, n, r, i, o = t[0], s = t[1], a = Na._; a; )
            if ((r = wa(a, s) - o) > Ma)
                a = a.L;
            else {
                if (!((i = o - Ia(a, s)) > Ma)) {
                    r > -Ma ? (e = a.P,
                    n = a) : i > -Ma ? (e = a,
                    n = a.N) : e = n = a;
                    break
                }
                if (!a.R) {
                    e = a;
                    break
                }
                a = a.R
            }
        !function(t) {
            Sa[t.index] = {
                site: t,
                halfedges: []
            }
        }(t);
        var u = ma(t);
        if (Na.insert(e, u),
        e || n) {
            if (e === n)
                return ya(e),
                n = ma(e.site),
                Na.insert(u, n),
                u.edge = n.edge = ia(e.site, u.site),
                da(e),
                void da(n);
            if (n) {
                ya(e),
                ya(n);
                var l = e.site
                  , c = l[0]
                  , h = l[1]
                  , p = t[0] - c
                  , f = t[1] - h
                  , g = n.site
                  , d = g[0] - c
                  , y = g[1] - h
                  , v = 2 * (p * y - f * d)
                  , _ = p * p + f * f
                  , m = d * d + y * y
                  , x = [(y * _ - f * m) / v + c, (p * m - d * _) / v + h];
                sa(n.edge, l, g, x),
                u.edge = ia(l, t, null, x),
                n.edge = ia(t, g, null, x),
                da(e),
                da(n)
            } else
                u.edge = ia(e.site, u.site)
        }
    }
    function wa(t, e) {
        var n = t.site
          , r = n[0]
          , i = n[1]
          , o = i - e;
        if (!o)
            return r;
        var s = t.P;
        if (!s)
            return -1 / 0;
        var a = (n = s.site)[0]
          , u = n[1]
          , l = u - e;
        if (!l)
            return a;
        var c = a - r
          , h = 1 / o - 1 / l
          , p = c / l;
        return h ? (-p + Math.sqrt(p * p - 2 * h * (c * c / (-2 * l) - u + l / 2 + i - o / 2))) / h + r : (r + a) / 2
    }
    function Ia(t, e) {
        var n = t.N;
        if (n)
            return wa(n, e);
        var r = t.site;
        return r[1] === e ? r[0] : 1 / 0
    }
    var Na, Sa, Ca, Pa, Ma = 1e-6, La = 1e-12;
    function Oa(t, e) {
        return e[1] - t[1] || e[0] - t[0]
    }
    function Ra(t, e) {
        var n, r, i, o = t.sort(Oa).pop();
        for (Pa = [],
        Sa = new Array(t.length),
        Na = new $s,
        Ca = new $s; ; )
            if (i = pa,
            o && (!i || o[1] < i.y || o[1] === i.y && o[0] < i.x))
                o[0] === n && o[1] === r || (ba(o),
                n = o[0],
                r = o[1]),
                o = t.pop();
            else {
                if (!i)
                    break;
                Ea(i.arc)
            }
        if (function() {
            for (var t, e, n, r, i = 0, o = Sa.length; i < o; ++i)
                if ((t = Sa[i]) && (r = (e = t.halfedges).length)) {
                    var s = new Array(r)
                      , a = new Array(r);
                    for (n = 0; n < r; ++n)
                        s[n] = n,
                        a[n] = la(t, Pa[e[n]]);
                    for (s.sort((function(t, e) {
                        return a[e] - a[t]
                    }
                    )),
                    n = 0; n < r; ++n)
                        a[n] = e[s[n]];
                    for (n = 0; n < r; ++n)
                        e[n] = a[n]
                }
        }(),
        e) {
            var s = +e[0][0]
              , a = +e[0][1]
              , u = +e[1][0]
              , l = +e[1][1];
            !function(t, e, n, r) {
                for (var i, o = Pa.length; o--; )
                    ua(i = Pa[o], t, e, n, r) && aa(i, t, e, n, r) && (Math.abs(i[0][0] - i[1][0]) > Ma || Math.abs(i[0][1] - i[1][1]) > Ma) || delete Pa[o]
            }(s, a, u, l),
            function(t, e, n, r) {
                var i, o, s, a, u, l, c, h, p, f, g, d, y = Sa.length, v = !0;
                for (i = 0; i < y; ++i)
                    if (o = Sa[i]) {
                        for (s = o.site,
                        a = (u = o.halfedges).length; a--; )
                            Pa[u[a]] || u.splice(a, 1);
                        for (a = 0,
                        l = u.length; a < l; )
                            g = (f = ha(o, Pa[u[a]]))[0],
                            d = f[1],
                            h = (c = ca(o, Pa[u[++a % l]]))[0],
                            p = c[1],
                            (Math.abs(g - h) > Ma || Math.abs(d - p) > Ma) && (u.splice(a, 0, Pa.push(oa(s, f, Math.abs(g - t) < Ma && r - d > Ma ? [t, Math.abs(h - t) < Ma ? p : r] : Math.abs(d - r) < Ma && n - g > Ma ? [Math.abs(p - r) < Ma ? h : n, r] : Math.abs(g - n) < Ma && d - e > Ma ? [n, Math.abs(h - n) < Ma ? p : e] : Math.abs(d - e) < Ma && g - t > Ma ? [Math.abs(p - e) < Ma ? h : t, e] : null)) - 1),
                            ++l);
                        l && (v = !1)
                    }
                if (v) {
                    var _, m, x, E = 1 / 0;
                    for (i = 0,
                    v = null; i < y; ++i)
                        (o = Sa[i]) && (x = (_ = (s = o.site)[0] - t) * _ + (m = s[1] - e) * m) < E && (E = x,
                        v = o);
                    if (v) {
                        var b = [t, e]
                          , w = [t, r]
                          , I = [n, r]
                          , N = [n, e];
                        v.halfedges.push(Pa.push(oa(s = v.site, b, w)) - 1, Pa.push(oa(s, w, I)) - 1, Pa.push(oa(s, I, N)) - 1, Pa.push(oa(s, N, b)) - 1)
                    }
                }
                for (i = 0; i < y; ++i)
                    (o = Sa[i]) && (o.halfedges.length || delete Sa[i])
            }(s, a, u, l)
        }
        this.edges = Pa,
        this.cells = Sa,
        Na = Ca = Pa = Sa = null
    }
    function Ta(t) {
        return (t = t.slice()).push(t[0]),
        l([t])
    }
    function Aa(t, e, n, r) {
        var i = (r = r || {}).steps || 64
          , o = r.units || "kilometers"
          , s = r.angle || 0
          , a = r.pivot || t
          , u = r.properties || t.properties || {};
        if (!t)
            throw new Error("center is required");
        if (!e)
            throw new Error("xSemiAxis is required");
        if (!n)
            throw new Error("ySemiAxis is required");
        if (!P(r))
            throw new Error("options must be an object");
        if (!C(i))
            throw new Error("steps must be a number");
        if (!C(s))
            throw new Error("angle must be a number");
        var c = K(t);
        if ("degrees" === o)
            var h = I(s);
        else
            e = ji(t, e, 90, {
                units: o
            }),
            n = ji(t, n, 0, {
                units: o
            }),
            e = K(e)[0] - c[0],
            n = K(n)[1] - c[1];
        for (var p = [], f = 0; f < i; f += 1) {
            var g = -360 * f / i
              , d = e * n / Math.sqrt(Math.pow(n, 2) + Math.pow(e, 2) * Math.pow(Da(g), 2))
              , y = e * n / Math.sqrt(Math.pow(e, 2) + Math.pow(n, 2) / Math.pow(Da(g), 2));
            if (g < -90 && g >= -270 && (d = -d),
            g < -180 && g >= -360 && (y = -y),
            "degrees" === o) {
                var v = d * Math.cos(h) + y * Math.sin(h)
                  , _ = y * Math.cos(h) - d * Math.sin(h);
                d = v,
                y = _
            }
            p.push([d + c[0], y + c[1]])
        }
        return p.push(p[0]),
        "degrees" === o ? l([p], u) : $o(l([p], u), s, {
            pivot: a
        })
    }
    function Da(t) {
        var e = t * Math.PI / 180;
        return Math.tan(e)
    }
    function Fa(t, e) {
        void 0 === e && (e = {});
        var n = 0
          , r = 0
          , i = 0;
        return q(t, (function(t, o, s) {
            var a = e.weight ? null == s ? void 0 : s[e.weight] : void 0;
            if (!C(a = null == a ? 1 : a))
                throw new Error("weight value must be a number for feature index " + o);
            (a = Number(a)) > 0 && R(t, (function(t) {
                n += t[0] * a,
                r += t[1] * a,
                i += a
            }
            ))
        }
        )),
        a([n / i, r / i], e.properties, e)
    }
    function ka(t, e, n, r, i) {
        var o = r.tolerance || .001
          , s = 0
          , u = 0
          , l = 0
          , c = 0;
        if (F(n, (function(e) {
            var n, r = null === (n = e.properties) || void 0 === n ? void 0 : n.weight, i = null == r ? 1 : r;
            if (!C(i = Number(i)))
                throw new Error("weight value must be a number");
            if (i > 0) {
                c += 1;
                var o = i * me(e, t);
                0 === o && (o = 1);
                var a = i / o;
                s += e.geometry.coordinates[0] * a,
                u += e.geometry.coordinates[1] * a,
                l += a
            }
        }
        )),
        c < 1)
            throw new Error("no features to measure");
        var h = s / l
          , p = u / l;
        return 1 === c || 0 === i || Math.abs(h - e[0]) < o && Math.abs(p - e[1]) < o ? a([h, p], {
            medianCandidates: r.medianCandidates
        }) : (r.medianCandidates.push([h, p]),
        ka([h, p], t, n, r, i - 1))
    }
    function Ga(t, e) {
        return {
            x: t[0] - e[0],
            y: t[1] - e[1]
        }
    }
    function qa(t, e) {
        var n = 0
          , r = 0;
        R(t, (function(i, o, s, a, u) {
            u > n && (n = u,
            r = o,
            e.push([]));
            var l = o - r
              , c = t.coordinates[u][l + 1]
              , h = i[0]
              , p = i[1]
              , f = c[0]
              , g = c[1];
            e[u].push([.75 * h + .25 * f, .75 * p + .25 * g]),
            e[u].push([.25 * h + .75 * f, .25 * p + .75 * g])
        }
        ), !0),
        e.forEach((function(t) {
            t.push(t[0])
        }
        ))
    }
    function Ba(t, e) {
        var n = 0
          , r = 0
          , i = 0;
        R(t, (function(o, s, a, u, l) {
            u > i && (i = u,
            r = s,
            e.push([[]])),
            l > n && (n = l,
            r = s,
            e[u].push([]));
            var c = s - r
              , h = t.coordinates[u][l][c + 1]
              , p = o[0]
              , f = o[1]
              , g = h[0]
              , d = h[1];
            e[u][l].push([.75 * p + .25 * g, .75 * f + .25 * d]),
            e[u][l].push([.25 * p + .75 * g, .25 * f + .75 * d])
        }
        ), !0),
        e.forEach((function(t) {
            t.forEach((function(t) {
                t.push(t[0])
            }
            ))
        }
        ))
    }
    function za(t, e, n) {
        void 0 === n && (n = 2);
        var r = K(t)
          , i = K(e)
          , o = r[0] - i[0]
          , s = r[1] - i[1];
        return 1 === n ? Math.abs(o) + Math.abs(s) : Math.pow(Math.pow(o, n) + Math.pow(s, n), 1 / n)
    }
    function ja(t, e) {
        var n = (e = e || {}).threshold || 1e4
          , r = e.p || 2
          , i = e.binary || !1
          , o = e.alpha || -1
          , s = e.standardization || !1
          , a = [];
        F(t, (function(t) {
            a.push(En(t))
        }
        ));
        for (var u = [], l = 0; l < a.length; l++)
            u[l] = [];
        for (l = 0; l < a.length; l++)
            for (var c = l; c < a.length; c++) {
                l === c && (u[l][c] = 0);
                var h = za(a[l], a[c], r);
                u[l][c] = h,
                u[c][l] = h
            }
        for (l = 0; l < a.length; l++)
            for (c = 0; c < a.length; c++) {
                0 !== (h = u[l][c]) && (u[l][c] = i ? h <= n ? 1 : 0 : h <= n ? Math.pow(h, o) : 0)
            }
        if (s)
            for (l = 0; l < a.length; l++) {
                var p = u[l].reduce((function(t, e) {
                    return t + e
                }
                ), 0);
                for (c = 0; c < a.length; c++)
                    u[l][c] = u[l][c] / p
            }
        return u
    }
    function Ua(t) {
        for (var e = 0, n = 0, r = t; n < r.length; n++) {
            e += r[n]
        }
        return e / t.length
    }
    function Va(t, e) {
        return void 0 === e && (e = {}),
        Ya(t, "mercator", e)
    }
    function Xa(t, e) {
        return void 0 === e && (e = {}),
        Ya(t, "wgs84", e)
    }
    function Ya(t, e, n) {
        void 0 === n && (n = {});
        var r = (n = n || {}).mutate;
        if (!t)
            throw new Error("geojson is required");
        return Array.isArray(t) && C(t[0]) ? t = "mercator" === e ? Ha(t) : Wa(t) : (!0 !== r && (t = Ie(t)),
        R(t, (function(t) {
            var n = "mercator" === e ? Ha(t) : Wa(t);
            t[0] = n[0],
            t[1] = n[1]
        }
        ))),
        t
    }
    function Ha(t) {
        var e = Math.PI / 180
          , n = 6378137
          , r = 20037508.342789244
          , i = [n * (Math.abs(t[0]) <= 180 ? t[0] : t[0] - 360 * function(t) {
            return t < 0 ? -1 : t > 0 ? 1 : 0
        }(t[0])) * e, n * Math.log(Math.tan(.25 * Math.PI + .5 * t[1] * e))];
        return i[0] > r && (i[0] = r),
        i[0] < -r && (i[0] = -r),
        i[1] > r && (i[1] = r),
        i[1] < -r && (i[1] = -r),
        i
    }
    function Wa(t) {
        var e = 180 / Math.PI
          , n = 6378137;
        return [t[0] * e / n, (.5 * Math.PI - 2 * Math.atan(Math.exp(-t[1] / n))) * e]
    }
    Ra.prototype = {
        constructor: Ra,
        polygons: function() {
            var t = this.edges;
            return this.cells.map((function(e) {
                var n = e.halfedges.map((function(n) {
                    return ca(e, t[n])
                }
                ));
                return n.data = e.site.data,
                n
            }
            ))
        },
        triangles: function() {
            var t = []
              , e = this.edges;
            return this.cells.forEach((function(n, r) {
                if (o = (i = n.halfedges).length)
                    for (var i, o, s, a, u, l, c = n.site, h = -1, p = e[i[o - 1]], f = p.left === c ? p.right : p.left; ++h < o; )
                        s = f,
                        f = (p = e[i[h]]).left === c ? p.right : p.left,
                        s && f && r < s.index && r < f.index && (u = s,
                        l = f,
                        ((a = c)[0] - l[0]) * (u[1] - a[1]) - (a[0] - u[0]) * (l[1] - a[1]) < 0) && t.push([c.data, s.data, f.data])
            }
            )),
            t
        },
        links: function() {
            return this.edges.filter((function(t) {
                return t.right
            }
            )).map((function(t) {
                return {
                    source: t.left.data,
                    target: t.right.data
                }
            }
            ))
        },
        find: function(t, e, n) {
            for (var r, i, o = this, s = o._found || 0, a = o.cells.length; !(i = o.cells[s]); )
                if (++s >= a)
                    return null;
            var u = t - i.site[0]
              , l = e - i.site[1]
              , c = u * u + l * l;
            do {
                i = o.cells[r = s],
                s = null,
                i.halfedges.forEach((function(n) {
                    var r = o.edges[n]
                      , a = r.left;
                    if (a !== i.site && a || (a = r.right)) {
                        var u = t - a[0]
                          , l = e - a[1]
                          , h = u * u + l * l;
                        h < c && (c = h,
                        s = a.index)
                    }
                }
                ))
            } while (null !== s);
            return o._found = r,
            null == n || c <= n * n ? i.site : null
        }
    };
    var Ja = Object.freeze({
        __proto__: null,
        toMercator: Va,
        toWgs84: Xa
    })
      , Za = function() {
        for (var t = 0, e = 0, n = arguments.length; e < n; e++)
            t += arguments[e].length;
        var r = Array(t)
          , i = 0;
        for (e = 0; e < n; e++)
            for (var o = arguments[e], s = 0, a = o.length; s < a; s++,
            i++)
                r[i] = o[s];
        return r
    };
    function Ka(t) {
        return Array.isArray(t) ? nu(t) : t && t.bbox ? nu(t.bbox) : [360 * eu(), 180 * eu()]
    }
    function Qa(t, e) {
        void 0 === e && (e = {}),
        null == t && (t = 1);
        for (var n = [], r = 0; r < t; r++)
            n.push(a(Ka(e.bbox)));
        return f(n)
    }
    function $a(t, e) {
        void 0 === e && (e = {}),
        null == t && (t = 1),
        C(e.num_vertices) && void 0 !== e.num_vertices || (e.num_vertices = 10),
        C(e.max_radial_length) && void 0 !== e.max_radial_length || (e.max_radial_length = 10);
        for (var n = [], r = function(t) {
            var r, i = [], o = Za(Array(e.num_vertices + 1)).map(Math.random);
            o.forEach((function(t, e, n) {
                n[e] = e > 0 ? t + n[e - 1] : t
            }
            )),
            o.forEach((function(t) {
                t = 2 * t * Math.PI / o[o.length - 1];
                var n = Math.random();
                i.push([n * (e.max_radial_length || 10) * Math.sin(t), n * (e.max_radial_length || 10) * Math.cos(t)])
            }
            )),
            i[i.length - 1] = i[0],
            i = i.map((r = Ka(e.bbox),
            function(t) {
                return [t[0] + r[0], t[1] + r[1]]
            }
            )),
            n.push(l([i]))
        }, i = 0; i < t; i++)
            r();
        return f(n)
    }
    function tu(t, e) {
        if (void 0 === e && (e = {}),
        !P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.bbox
          , r = e.num_vertices
          , i = e.max_length
          , o = e.max_rotation;
        null == t && (t = 1),
        (!C(r) || void 0 === r || r < 2) && (r = 10),
        C(i) && void 0 !== i || (i = 1e-4),
        C(o) && void 0 !== o || (o = Math.PI / 8);
        for (var s = [], a = 0; a < t; a++) {
            for (var u = [Ka(n)], l = 0; l < r - 1; l++) {
                var c = (0 === l ? 2 * Math.random() * Math.PI : Math.tan((u[l][1] - u[l - 1][1]) / (u[l][0] - u[l - 1][0]))) + (Math.random() - .5) * o * 2
                  , p = Math.random() * i;
                u.push([u[l][0] + p * Math.cos(c), u[l][1] + p * Math.sin(c)])
            }
            s.push(h(u))
        }
        return f(s)
    }
    function eu() {
        return Math.random() - .5
    }
    function nu(t) {
        return [Math.random() * (t[2] - t[0]) + t[0], Math.random() * (t[3] - t[1]) + t[1]]
    }
    var ru = Object.freeze({
        __proto__: null,
        randomPosition: Ka,
        randomPoint: Qa,
        randomPolygon: $a,
        randomLineString: tu
    });
    function iu(t, e) {
        if (!t)
            throw new Error("geojson is required");
        if ("FeatureCollection" !== t.type)
            throw new Error("geojson must be a FeatureCollection");
        if (null == e)
            throw new Error("filter is required");
        var n = [];
        return F(t, (function(t) {
            uu(t.properties, e) && n.push(t)
        }
        )),
        f(n)
    }
    function ou(t, e, n) {
        if (!t)
            throw new Error("geojson is required");
        if ("FeatureCollection" !== t.type)
            throw new Error("geojson must be a FeatureCollection");
        if (null == e)
            throw new Error("property is required");
        for (var r = au(t, e), i = Object.keys(r), o = 0; o < i.length; o++) {
            for (var s = i[o], a = r[s], u = [], l = 0; l < a.length; l++)
                u.push(t.features[a[l]]);
            n(f(u), s, o)
        }
    }
    function su(t, e, n, r) {
        var i = r;
        return ou(t, e, (function(t, e, o) {
            i = 0 === o && void 0 === r ? t : n(i, t, e, o)
        }
        )),
        i
    }
    function au(t, e) {
        var n = {};
        return F(t, (function(t, r) {
            var i = t.properties || {};
            if (Object.prototype.hasOwnProperty.call(i, String(e))) {
                var o = i[e];
                Object.prototype.hasOwnProperty.call(n, o) ? n[o].push(r) : n[o] = [r]
            }
        }
        )),
        n
    }
    function uu(t, e) {
        if (void 0 === t)
            return !1;
        var n = typeof e;
        if ("number" === n || "string" === n)
            return Object.prototype.hasOwnProperty.call(t, e);
        if (Array.isArray(e)) {
            for (var r = 0; r < e.length; r++)
                if (!uu(t, e[r]))
                    return !1;
            return !0
        }
        return lu(t, e)
    }
    function lu(t, e) {
        for (var n = Object.keys(e), r = 0; r < n.length; r++) {
            var i = n[r];
            if (t[i] !== e[i])
                return !1
        }
        return !0
    }
    function cu(t, e) {
        if (!e)
            return {};
        if (!e.length)
            return {};
        for (var n = {}, r = 0; r < e.length; r++) {
            var i = e[r];
            Object.prototype.hasOwnProperty.call(t, i) && (n[i] = t[i])
        }
        return n
    }
    var hu = Object.freeze({
        __proto__: null,
        getCluster: iu,
        clusterEach: ou,
        clusterReduce: su,
        createBins: au,
        applyFilter: uu,
        propertiesContainsFilter: lu,
        filterProperties: cu
    })
      , pu = function(t, e) {
        this.next = null,
        this.key = t,
        this.data = e,
        this.left = null,
        this.right = null
    };
    /**
     * splaytree v3.1.0
     * Fast Splay tree for Node and browser
     *
     * @author Alexander Milevski <info@w8r.name>
     * @license MIT
     * @preserve
     */
    function fu(t, e) {
        return t > e ? 1 : t < e ? -1 : 0
    }
    function gu(t, e, n) {
        for (var r = new pu(null,null), i = r, o = r; ; ) {
            var s = n(t, e.key);
            if (s < 0) {
                if (null === e.left)
                    break;
                if (n(t, e.left.key) < 0) {
                    var a = e.left;
                    if (e.left = a.right,
                    a.right = e,
                    null === (e = a).left)
                        break
                }
                o.left = e,
                o = e,
                e = e.left
            } else {
                if (!(s > 0))
                    break;
                if (null === e.right)
                    break;
                if (n(t, e.right.key) > 0) {
                    a = e.right;
                    if (e.right = a.left,
                    a.left = e,
                    null === (e = a).right)
                        break
                }
                i.right = e,
                i = e,
                e = e.right
            }
        }
        return i.right = e.left,
        o.left = e.right,
        e.left = r.right,
        e.right = r.left,
        e
    }
    function du(t, e, n, r) {
        var i = new pu(t,e);
        if (null === n)
            return i.left = i.right = null,
            i;
        var o = r(t, (n = gu(t, n, r)).key);
        return o < 0 ? (i.left = n.left,
        i.right = n,
        n.left = null) : o >= 0 && (i.right = n.right,
        i.left = n,
        n.right = null),
        i
    }
    function yu(t, e, n) {
        var r = null
          , i = null;
        if (e) {
            var o = n((e = gu(t, e, n)).key, t);
            0 === o ? (r = e.left,
            i = e.right) : o < 0 ? (i = e.right,
            e.right = null,
            r = e) : (r = e.left,
            e.left = null,
            i = e)
        }
        return {
            left: r,
            right: i
        }
    }
    function vu(t, e, n, r, i) {
        if (t) {
            r(e + (n ? "└── " : "├── ") + i(t) + "\n");
            var o = e + (n ? "    " : "│   ");
            t.left && vu(t.left, o, !1, r, i),
            t.right && vu(t.right, o, !0, r, i)
        }
    }
    var _u = function() {
        function t(t) {
            void 0 === t && (t = fu),
            this._root = null,
            this._size = 0,
            this._comparator = t
        }
        return t.prototype.insert = function(t, e) {
            return this._size++,
            this._root = du(t, e, this._root, this._comparator)
        }
        ,
        t.prototype.add = function(t, e) {
            var n = new pu(t,e);
            null === this._root && (n.left = n.right = null,
            this._size++,
            this._root = n);
            var r = this._comparator
              , i = gu(t, this._root, r)
              , o = r(t, i.key);
            return 0 === o ? this._root = i : (o < 0 ? (n.left = i.left,
            n.right = i,
            i.left = null) : o > 0 && (n.right = i.right,
            n.left = i,
            i.right = null),
            this._size++,
            this._root = n),
            this._root
        }
        ,
        t.prototype.remove = function(t) {
            this._root = this._remove(t, this._root, this._comparator)
        }
        ,
        t.prototype._remove = function(t, e, n) {
            var r;
            return null === e ? null : 0 === n(t, (e = gu(t, e, n)).key) ? (null === e.left ? r = e.right : (r = gu(t, e.left, n)).right = e.right,
            this._size--,
            r) : e
        }
        ,
        t.prototype.pop = function() {
            var t = this._root;
            if (t) {
                for (; t.left; )
                    t = t.left;
                return this._root = gu(t.key, this._root, this._comparator),
                this._root = this._remove(t.key, this._root, this._comparator),
                {
                    key: t.key,
                    data: t.data
                }
            }
            return null
        }
        ,
        t.prototype.findStatic = function(t) {
            for (var e = this._root, n = this._comparator; e; ) {
                var r = n(t, e.key);
                if (0 === r)
                    return e;
                e = r < 0 ? e.left : e.right
            }
            return null
        }
        ,
        t.prototype.find = function(t) {
            return this._root && (this._root = gu(t, this._root, this._comparator),
            0 !== this._comparator(t, this._root.key)) ? null : this._root
        }
        ,
        t.prototype.contains = function(t) {
            for (var e = this._root, n = this._comparator; e; ) {
                var r = n(t, e.key);
                if (0 === r)
                    return !0;
                e = r < 0 ? e.left : e.right
            }
            return !1
        }
        ,
        t.prototype.forEach = function(t, e) {
            for (var n = this._root, r = [], i = !1; !i; )
                null !== n ? (r.push(n),
                n = n.left) : 0 !== r.length ? (n = r.pop(),
                t.call(e, n),
                n = n.right) : i = !0;
            return this
        }
        ,
        t.prototype.range = function(t, e, n, r) {
            for (var i = [], o = this._comparator, s = this._root; 0 !== i.length || s; )
                if (s)
                    i.push(s),
                    s = s.left;
                else {
                    if (o((s = i.pop()).key, e) > 0)
                        break;
                    if (o(s.key, t) >= 0 && n.call(r, s))
                        return this;
                    s = s.right
                }
            return this
        }
        ,
        t.prototype.keys = function() {
            var t = [];
            return this.forEach((function(e) {
                var n = e.key;
                return t.push(n)
            }
            )),
            t
        }
        ,
        t.prototype.values = function() {
            var t = [];
            return this.forEach((function(e) {
                var n = e.data;
                return t.push(n)
            }
            )),
            t
        }
        ,
        t.prototype.min = function() {
            return this._root ? this.minNode(this._root).key : null
        }
        ,
        t.prototype.max = function() {
            return this._root ? this.maxNode(this._root).key : null
        }
        ,
        t.prototype.minNode = function(t) {
            if (void 0 === t && (t = this._root),
            t)
                for (; t.left; )
                    t = t.left;
            return t
        }
        ,
        t.prototype.maxNode = function(t) {
            if (void 0 === t && (t = this._root),
            t)
                for (; t.right; )
                    t = t.right;
            return t
        }
        ,
        t.prototype.at = function(t) {
            for (var e = this._root, n = !1, r = 0, i = []; !n; )
                if (e)
                    i.push(e),
                    e = e.left;
                else if (i.length > 0) {
                    if (e = i.pop(),
                    r === t)
                        return e;
                    r++,
                    e = e.right
                } else
                    n = !0;
            return null
        }
        ,
        t.prototype.next = function(t) {
            var e = this._root
              , n = null;
            if (t.right) {
                for (n = t.right; n.left; )
                    n = n.left;
                return n
            }
            for (var r = this._comparator; e; ) {
                var i = r(t.key, e.key);
                if (0 === i)
                    break;
                i < 0 ? (n = e,
                e = e.left) : e = e.right
            }
            return n
        }
        ,
        t.prototype.prev = function(t) {
            var e = this._root
              , n = null;
            if (null !== t.left) {
                for (n = t.left; n.right; )
                    n = n.right;
                return n
            }
            for (var r = this._comparator; e; ) {
                var i = r(t.key, e.key);
                if (0 === i)
                    break;
                i < 0 ? e = e.left : (n = e,
                e = e.right)
            }
            return n
        }
        ,
        t.prototype.clear = function() {
            return this._root = null,
            this._size = 0,
            this
        }
        ,
        t.prototype.toList = function() {
            return function(t) {
                var e = t
                  , n = []
                  , r = !1
                  , i = new pu(null,null)
                  , o = i;
                for (; !r; )
                    e ? (n.push(e),
                    e = e.left) : n.length > 0 ? e = (e = o = o.next = n.pop()).right : r = !0;
                return o.next = null,
                i.next
            }(this._root)
        }
        ,
        t.prototype.load = function(t, e, n) {
            void 0 === e && (e = []),
            void 0 === n && (n = !1);
            var r = t.length
              , i = this._comparator;
            if (n && Eu(t, e, 0, r - 1, i),
            null === this._root)
                this._root = mu(t, e, 0, r),
                this._size = r;
            else {
                var o = function(t, e, n) {
                    var r = new pu(null,null)
                      , i = r
                      , o = t
                      , s = e;
                    for (; null !== o && null !== s; )
                        n(o.key, s.key) < 0 ? (i.next = o,
                        o = o.next) : (i.next = s,
                        s = s.next),
                        i = i.next;
                    null !== o ? i.next = o : null !== s && (i.next = s);
                    return r.next
                }(this.toList(), function(t, e) {
                    for (var n = new pu(null,null), r = n, i = 0; i < t.length; i++)
                        r = r.next = new pu(t[i],e[i]);
                    return r.next = null,
                    n.next
                }(t, e), i);
                r = this._size + r,
                this._root = xu({
                    head: o
                }, 0, r)
            }
            return this
        }
        ,
        t.prototype.isEmpty = function() {
            return null === this._root
        }
        ,
        Object.defineProperty(t.prototype, "size", {
            get: function() {
                return this._size
            },
            enumerable: !0,
            configurable: !0
        }),
        Object.defineProperty(t.prototype, "root", {
            get: function() {
                return this._root
            },
            enumerable: !0,
            configurable: !0
        }),
        t.prototype.toString = function(t) {
            void 0 === t && (t = function(t) {
                return String(t.key)
            }
            );
            var e = [];
            return vu(this._root, "", !0, (function(t) {
                return e.push(t)
            }
            ), t),
            e.join("")
        }
        ,
        t.prototype.update = function(t, e, n) {
            var r = this._comparator
              , i = yu(t, this._root, r)
              , o = i.left
              , s = i.right;
            r(t, e) < 0 ? s = du(e, n, s, r) : o = du(e, n, o, r),
            this._root = function(t, e, n) {
                return null === e ? t : (null === t || ((e = gu(t.key, e, n)).left = t),
                e)
            }(o, s, r)
        }
        ,
        t.prototype.split = function(t) {
            return yu(t, this._root, this._comparator)
        }
        ,
        t
    }();
    function mu(t, e, n, r) {
        var i = r - n;
        if (i > 0) {
            var o = n + Math.floor(i / 2)
              , s = t[o]
              , a = e[o]
              , u = new pu(s,a);
            return u.left = mu(t, e, n, o),
            u.right = mu(t, e, o + 1, r),
            u
        }
        return null
    }
    function xu(t, e, n) {
        var r = n - e;
        if (r > 0) {
            var i = e + Math.floor(r / 2)
              , o = xu(t, e, i)
              , s = t.head;
            return s.left = o,
            t.head = t.head.next,
            s.right = xu(t, i + 1, n),
            s
        }
        return null
    }
    function Eu(t, e, n, r, i) {
        if (!(n >= r)) {
            for (var o = t[n + r >> 1], s = n - 1, a = r + 1; ; ) {
                do {
                    s++
                } while (i(t[s], o) < 0);
                do {
                    a--
                } while (i(t[a], o) > 0);
                if (s >= a)
                    break;
                var u = t[s];
                t[s] = t[a],
                t[a] = u,
                u = e[s],
                e[s] = e[a],
                e[a] = u
            }
            Eu(t, e, n, a, i),
            Eu(t, e, a + 1, r, i)
        }
    }
    function bu(t, e) {
        if (!(t instanceof e))
            throw new TypeError("Cannot call a class as a function")
    }
    function wu(t, e) {
        for (var n = 0; n < e.length; n++) {
            var r = e[n];
            r.enumerable = r.enumerable || !1,
            r.configurable = !0,
            "value"in r && (r.writable = !0),
            Object.defineProperty(t, r.key, r)
        }
    }
    function Iu(t, e, n) {
        return e && wu(t.prototype, e),
        n && wu(t, n),
        t
    }
    var Nu = function(t, e) {
        return t.ll.x <= e.x && e.x <= t.ur.x && t.ll.y <= e.y && e.y <= t.ur.y
    }
      , Su = function(t, e) {
        if (e.ur.x < t.ll.x || t.ur.x < e.ll.x || e.ur.y < t.ll.y || t.ur.y < e.ll.y)
            return null;
        var n = t.ll.x < e.ll.x ? e.ll.x : t.ll.x
          , r = t.ur.x < e.ur.x ? t.ur.x : e.ur.x;
        return {
            ll: {
                x: n,
                y: t.ll.y < e.ll.y ? e.ll.y : t.ll.y
            },
            ur: {
                x: r,
                y: t.ur.y < e.ur.y ? t.ur.y : e.ur.y
            }
        }
    }
      , Cu = Number.EPSILON;
    void 0 === Cu && (Cu = Math.pow(2, -52));
    var Pu = Cu * Cu
      , Mu = function(t, e) {
        if (-Cu < t && t < Cu && -Cu < e && e < Cu)
            return 0;
        var n = t - e;
        return n * n < Pu * t * e ? 0 : t < e ? -1 : 1
    }
      , Lu = function() {
        function t() {
            bu(this, t),
            this.reset()
        }
        return Iu(t, [{
            key: "reset",
            value: function() {
                this.xRounder = new Ou,
                this.yRounder = new Ou
            }
        }, {
            key: "round",
            value: function(t, e) {
                return {
                    x: this.xRounder.round(t),
                    y: this.yRounder.round(e)
                }
            }
        }]),
        t
    }()
      , Ou = function() {
        function t() {
            bu(this, t),
            this.tree = new _u,
            this.round(0)
        }
        return Iu(t, [{
            key: "round",
            value: function(t) {
                var e = this.tree.add(t)
                  , n = this.tree.prev(e);
                if (null !== n && 0 === Mu(e.key, n.key))
                    return this.tree.remove(t),
                    n.key;
                var r = this.tree.next(e);
                return null !== r && 0 === Mu(e.key, r.key) ? (this.tree.remove(t),
                r.key) : t
            }
        }]),
        t
    }()
      , Ru = new Lu
      , Tu = function(t, e) {
        return t.x * e.y - t.y * e.x
    }
      , Au = function(t, e) {
        return t.x * e.x + t.y * e.y
    }
      , Du = function(t, e, n) {
        var r = {
            x: e.x - t.x,
            y: e.y - t.y
        }
          , i = {
            x: n.x - t.x,
            y: n.y - t.y
        }
          , o = Tu(r, i);
        return Mu(o, 0)
    }
      , Fu = function(t) {
        return Math.sqrt(Au(t, t))
    }
      , ku = function(t, e, n) {
        var r = {
            x: e.x - t.x,
            y: e.y - t.y
        }
          , i = {
            x: n.x - t.x,
            y: n.y - t.y
        };
        return Au(i, r) / Fu(i) / Fu(r)
    }
      , Gu = function(t, e, n) {
        return 0 === e.y ? null : {
            x: t.x + e.x / e.y * (n - t.y),
            y: n
        }
    }
      , qu = function(t, e, n) {
        return 0 === e.x ? null : {
            x: n,
            y: t.y + e.y / e.x * (n - t.x)
        }
    }
      , Bu = function() {
        function t(e, n) {
            bu(this, t),
            void 0 === e.events ? e.events = [this] : e.events.push(this),
            this.point = e,
            this.isLeft = n
        }
        return Iu(t, null, [{
            key: "compare",
            value: function(e, n) {
                var r = t.comparePoints(e.point, n.point);
                return 0 !== r ? r : (e.point !== n.point && e.link(n),
                e.isLeft !== n.isLeft ? e.isLeft ? 1 : -1 : ju.compare(e.segment, n.segment))
            }
        }, {
            key: "comparePoints",
            value: function(t, e) {
                return t.x < e.x ? -1 : t.x > e.x ? 1 : t.y < e.y ? -1 : t.y > e.y ? 1 : 0
            }
        }]),
        Iu(t, [{
            key: "link",
            value: function(t) {
                if (t.point === this.point)
                    throw new Error("Tried to link already linked events");
                for (var e = t.point.events, n = 0, r = e.length; n < r; n++) {
                    var i = e[n];
                    this.point.events.push(i),
                    i.point = this.point
                }
                this.checkForConsuming()
            }
        }, {
            key: "checkForConsuming",
            value: function() {
                for (var t = this.point.events.length, e = 0; e < t; e++) {
                    var n = this.point.events[e];
                    if (void 0 === n.segment.consumedBy)
                        for (var r = e + 1; r < t; r++) {
                            var i = this.point.events[r];
                            void 0 === i.consumedBy && (n.otherSE.point.events === i.otherSE.point.events && n.segment.consume(i.segment))
                        }
                }
            }
        }, {
            key: "getAvailableLinkedEvents",
            value: function() {
                for (var t = [], e = 0, n = this.point.events.length; e < n; e++) {
                    var r = this.point.events[e];
                    r !== this && !r.segment.ringOut && r.segment.isInResult() && t.push(r)
                }
                return t
            }
        }, {
            key: "getLeftmostComparator",
            value: function(t) {
                var e = this
                  , n = new Map
                  , r = function(r) {
                    var i, o, s, a, u, l = r.otherSE;
                    n.set(r, {
                        sine: (i = e.point,
                        o = t.point,
                        s = l.point,
                        a = {
                            x: o.x - i.x,
                            y: o.y - i.y
                        },
                        u = {
                            x: s.x - i.x,
                            y: s.y - i.y
                        },
                        Tu(u, a) / Fu(u) / Fu(a)),
                        cosine: ku(e.point, t.point, l.point)
                    })
                };
                return function(t, e) {
                    n.has(t) || r(t),
                    n.has(e) || r(e);
                    var i = n.get(t)
                      , o = i.sine
                      , s = i.cosine
                      , a = n.get(e)
                      , u = a.sine
                      , l = a.cosine;
                    return o >= 0 && u >= 0 ? s < l ? 1 : s > l ? -1 : 0 : o < 0 && u < 0 ? s < l ? -1 : s > l ? 1 : 0 : u < o ? -1 : u > o ? 1 : 0
                }
            }
        }]),
        t
    }()
      , zu = 0
      , ju = function() {
        function t(e, n, r, i) {
            bu(this, t),
            this.id = ++zu,
            this.leftSE = e,
            e.segment = this,
            e.otherSE = n,
            this.rightSE = n,
            n.segment = this,
            n.otherSE = e,
            this.rings = r,
            this.windings = i
        }
        return Iu(t, null, [{
            key: "compare",
            value: function(t, e) {
                var n = t.leftSE.point.x
                  , r = e.leftSE.point.x
                  , i = t.rightSE.point.x
                  , o = e.rightSE.point.x;
                if (o < n)
                    return 1;
                if (i < r)
                    return -1;
                var s = t.leftSE.point.y
                  , a = e.leftSE.point.y
                  , u = t.rightSE.point.y
                  , l = e.rightSE.point.y;
                if (n < r) {
                    if (a < s && a < u)
                        return 1;
                    if (a > s && a > u)
                        return -1;
                    var c = t.comparePoint(e.leftSE.point);
                    if (c < 0)
                        return 1;
                    if (c > 0)
                        return -1;
                    var h = e.comparePoint(t.rightSE.point);
                    return 0 !== h ? h : -1
                }
                if (n > r) {
                    if (s < a && s < l)
                        return -1;
                    if (s > a && s > l)
                        return 1;
                    var p = e.comparePoint(t.leftSE.point);
                    if (0 !== p)
                        return p;
                    var f = t.comparePoint(e.rightSE.point);
                    return f < 0 ? 1 : f > 0 ? -1 : 1
                }
                if (s < a)
                    return -1;
                if (s > a)
                    return 1;
                if (i < o) {
                    var g = e.comparePoint(t.rightSE.point);
                    if (0 !== g)
                        return g
                }
                if (i > o) {
                    var d = t.comparePoint(e.rightSE.point);
                    if (d < 0)
                        return 1;
                    if (d > 0)
                        return -1
                }
                if (i !== o) {
                    var y = u - s
                      , v = i - n
                      , _ = l - a
                      , m = o - r;
                    if (y > v && _ < m)
                        return 1;
                    if (y < v && _ > m)
                        return -1
                }
                return i > o ? 1 : i < o || u < l ? -1 : u > l ? 1 : t.id < e.id ? -1 : t.id > e.id ? 1 : 0
            }
        }]),
        Iu(t, [{
            key: "replaceRightSE",
            value: function(t) {
                this.rightSE = t,
                this.rightSE.segment = this,
                this.rightSE.otherSE = this.leftSE,
                this.leftSE.otherSE = this.rightSE
            }
        }, {
            key: "bbox",
            value: function() {
                var t = this.leftSE.point.y
                  , e = this.rightSE.point.y;
                return {
                    ll: {
                        x: this.leftSE.point.x,
                        y: t < e ? t : e
                    },
                    ur: {
                        x: this.rightSE.point.x,
                        y: t > e ? t : e
                    }
                }
            }
        }, {
            key: "vector",
            value: function() {
                return {
                    x: this.rightSE.point.x - this.leftSE.point.x,
                    y: this.rightSE.point.y - this.leftSE.point.y
                }
            }
        }, {
            key: "isAnEndpoint",
            value: function(t) {
                return t.x === this.leftSE.point.x && t.y === this.leftSE.point.y || t.x === this.rightSE.point.x && t.y === this.rightSE.point.y
            }
        }, {
            key: "comparePoint",
            value: function(t) {
                if (this.isAnEndpoint(t))
                    return 0;
                var e = this.leftSE.point
                  , n = this.rightSE.point
                  , r = this.vector();
                if (e.x === n.x)
                    return t.x === e.x ? 0 : t.x < e.x ? 1 : -1;
                var i = (t.y - e.y) / r.y
                  , o = e.x + i * r.x;
                if (t.x === o)
                    return 0;
                var s = (t.x - e.x) / r.x
                  , a = e.y + s * r.y;
                return t.y === a ? 0 : t.y < a ? -1 : 1
            }
        }, {
            key: "getIntersection",
            value: function(t) {
                var e = this.bbox()
                  , n = t.bbox()
                  , r = Su(e, n);
                if (null === r)
                    return null;
                var i = this.leftSE.point
                  , o = this.rightSE.point
                  , s = t.leftSE.point
                  , a = t.rightSE.point
                  , u = Nu(e, s) && 0 === this.comparePoint(s)
                  , l = Nu(n, i) && 0 === t.comparePoint(i)
                  , c = Nu(e, a) && 0 === this.comparePoint(a)
                  , h = Nu(n, o) && 0 === t.comparePoint(o);
                if (l && u)
                    return h && !c ? o : !h && c ? a : null;
                if (l)
                    return c && i.x === a.x && i.y === a.y ? null : i;
                if (u)
                    return h && o.x === s.x && o.y === s.y ? null : s;
                if (h && c)
                    return null;
                if (h)
                    return o;
                if (c)
                    return a;
                var p = function(t, e, n, r) {
                    if (0 === e.x)
                        return qu(n, r, t.x);
                    if (0 === r.x)
                        return qu(t, e, n.x);
                    if (0 === e.y)
                        return Gu(n, r, t.y);
                    if (0 === r.y)
                        return Gu(t, e, n.y);
                    var i = Tu(e, r);
                    if (0 == i)
                        return null;
                    var o = {
                        x: n.x - t.x,
                        y: n.y - t.y
                    }
                      , s = Tu(o, e) / i
                      , a = Tu(o, r) / i;
                    return {
                        x: (t.x + a * e.x + (n.x + s * r.x)) / 2,
                        y: (t.y + a * e.y + (n.y + s * r.y)) / 2
                    }
                }(i, this.vector(), s, t.vector());
                return null === p ? null : Nu(r, p) ? Ru.round(p.x, p.y) : null
            }
        }, {
            key: "split",
            value: function(e) {
                var n = []
                  , r = void 0 !== e.events
                  , i = new Bu(e,!0)
                  , o = new Bu(e,!1)
                  , s = this.rightSE;
                this.replaceRightSE(o),
                n.push(o),
                n.push(i);
                var a = new t(i,s,this.rings.slice(),this.windings.slice());
                return Bu.comparePoints(a.leftSE.point, a.rightSE.point) > 0 && a.swapEvents(),
                Bu.comparePoints(this.leftSE.point, this.rightSE.point) > 0 && this.swapEvents(),
                r && (i.checkForConsuming(),
                o.checkForConsuming()),
                n
            }
        }, {
            key: "swapEvents",
            value: function() {
                var t = this.rightSE;
                this.rightSE = this.leftSE,
                this.leftSE = t,
                this.leftSE.isLeft = !0,
                this.rightSE.isLeft = !1;
                for (var e = 0, n = this.windings.length; e < n; e++)
                    this.windings[e] *= -1
            }
        }, {
            key: "consume",
            value: function(e) {
                for (var n = this, r = e; n.consumedBy; )
                    n = n.consumedBy;
                for (; r.consumedBy; )
                    r = r.consumedBy;
                var i = t.compare(n, r);
                if (0 !== i) {
                    if (i > 0) {
                        var o = n;
                        n = r,
                        r = o
                    }
                    if (n.prev === r) {
                        var s = n;
                        n = r,
                        r = s
                    }
                    for (var a = 0, u = r.rings.length; a < u; a++) {
                        var l = r.rings[a]
                          , c = r.windings[a]
                          , h = n.rings.indexOf(l);
                        -1 === h ? (n.rings.push(l),
                        n.windings.push(c)) : n.windings[h] += c
                    }
                    r.rings = null,
                    r.windings = null,
                    r.consumedBy = n,
                    r.leftSE.consumedBy = n.leftSE,
                    r.rightSE.consumedBy = n.rightSE
                }
            }
        }, {
            key: "prevInResult",
            value: function() {
                return void 0 !== this._prevInResult || (this.prev ? this.prev.isInResult() ? this._prevInResult = this.prev : this._prevInResult = this.prev.prevInResult() : this._prevInResult = null),
                this._prevInResult
            }
        }, {
            key: "beforeState",
            value: function() {
                if (void 0 !== this._beforeState)
                    return this._beforeState;
                if (this.prev) {
                    var t = this.prev.consumedBy || this.prev;
                    this._beforeState = t.afterState()
                } else
                    this._beforeState = {
                        rings: [],
                        windings: [],
                        multiPolys: []
                    };
                return this._beforeState
            }
        }, {
            key: "afterState",
            value: function() {
                if (void 0 !== this._afterState)
                    return this._afterState;
                var t = this.beforeState();
                this._afterState = {
                    rings: t.rings.slice(0),
                    windings: t.windings.slice(0),
                    multiPolys: []
                };
                for (var e = this._afterState.rings, n = this._afterState.windings, r = this._afterState.multiPolys, i = 0, o = this.rings.length; i < o; i++) {
                    var s = this.rings[i]
                      , a = this.windings[i]
                      , u = e.indexOf(s);
                    -1 === u ? (e.push(s),
                    n.push(a)) : n[u] += a
                }
                for (var l = [], c = [], h = 0, p = e.length; h < p; h++)
                    if (0 !== n[h]) {
                        var f = e[h]
                          , g = f.poly;
                        if (-1 === c.indexOf(g))
                            if (f.isExterior)
                                l.push(g);
                            else {
                                -1 === c.indexOf(g) && c.push(g);
                                var d = l.indexOf(f.poly);
                                -1 !== d && l.splice(d, 1)
                            }
                    }
                for (var y = 0, v = l.length; y < v; y++) {
                    var _ = l[y].multiPoly;
                    -1 === r.indexOf(_) && r.push(_)
                }
                return this._afterState
            }
        }, {
            key: "isInResult",
            value: function() {
                if (this.consumedBy)
                    return !1;
                if (void 0 !== this._isInResult)
                    return this._isInResult;
                var t = this.beforeState().multiPolys
                  , e = this.afterState().multiPolys;
                switch (Qu.type) {
                case "union":
                    var n = 0 === t.length
                      , r = 0 === e.length;
                    this._isInResult = n !== r;
                    break;
                case "intersection":
                    var i, o;
                    t.length < e.length ? (i = t.length,
                    o = e.length) : (i = e.length,
                    o = t.length),
                    this._isInResult = o === Qu.numMultiPolys && i < o;
                    break;
                case "xor":
                    var s = Math.abs(t.length - e.length);
                    this._isInResult = s % 2 == 1;
                    break;
                case "difference":
                    var a = function(t) {
                        return 1 === t.length && t[0].isSubject
                    };
                    this._isInResult = a(t) !== a(e);
                    break;
                default:
                    throw new Error("Unrecognized operation type found ".concat(Qu.type))
                }
                return this._isInResult
            }
        }], [{
            key: "fromRing",
            value: function(e, n, r) {
                var i, o, s, a = Bu.comparePoints(e, n);
                if (a < 0)
                    i = e,
                    o = n,
                    s = 1;
                else {
                    if (!(a > 0))
                        throw new Error("Tried to create degenerate segment at [".concat(e.x, ", ").concat(e.y, "]"));
                    i = n,
                    o = e,
                    s = -1
                }
                return new t(new Bu(i,!0),new Bu(o,!1),[r],[s])
            }
        }]),
        t
    }()
      , Uu = function() {
        function t(e, n, r) {
            if (bu(this, t),
            !Array.isArray(e) || 0 === e.length)
                throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
            if (this.poly = n,
            this.isExterior = r,
            this.segments = [],
            "number" != typeof e[0][0] || "number" != typeof e[0][1])
                throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
            var i = Ru.round(e[0][0], e[0][1]);
            this.bbox = {
                ll: {
                    x: i.x,
                    y: i.y
                },
                ur: {
                    x: i.x,
                    y: i.y
                }
            };
            for (var o = i, s = 1, a = e.length; s < a; s++) {
                if ("number" != typeof e[s][0] || "number" != typeof e[s][1])
                    throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
                var u = Ru.round(e[s][0], e[s][1]);
                u.x === o.x && u.y === o.y || (this.segments.push(ju.fromRing(o, u, this)),
                u.x < this.bbox.ll.x && (this.bbox.ll.x = u.x),
                u.y < this.bbox.ll.y && (this.bbox.ll.y = u.y),
                u.x > this.bbox.ur.x && (this.bbox.ur.x = u.x),
                u.y > this.bbox.ur.y && (this.bbox.ur.y = u.y),
                o = u)
            }
            i.x === o.x && i.y === o.y || this.segments.push(ju.fromRing(o, i, this))
        }
        return Iu(t, [{
            key: "getSweepEvents",
            value: function() {
                for (var t = [], e = 0, n = this.segments.length; e < n; e++) {
                    var r = this.segments[e];
                    t.push(r.leftSE),
                    t.push(r.rightSE)
                }
                return t
            }
        }]),
        t
    }()
      , Vu = function() {
        function t(e, n) {
            if (bu(this, t),
            !Array.isArray(e))
                throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
            this.exteriorRing = new Uu(e[0],this,!0),
            this.bbox = {
                ll: {
                    x: this.exteriorRing.bbox.ll.x,
                    y: this.exteriorRing.bbox.ll.y
                },
                ur: {
                    x: this.exteriorRing.bbox.ur.x,
                    y: this.exteriorRing.bbox.ur.y
                }
            },
            this.interiorRings = [];
            for (var r = 1, i = e.length; r < i; r++) {
                var o = new Uu(e[r],this,!1);
                o.bbox.ll.x < this.bbox.ll.x && (this.bbox.ll.x = o.bbox.ll.x),
                o.bbox.ll.y < this.bbox.ll.y && (this.bbox.ll.y = o.bbox.ll.y),
                o.bbox.ur.x > this.bbox.ur.x && (this.bbox.ur.x = o.bbox.ur.x),
                o.bbox.ur.y > this.bbox.ur.y && (this.bbox.ur.y = o.bbox.ur.y),
                this.interiorRings.push(o)
            }
            this.multiPoly = n
        }
        return Iu(t, [{
            key: "getSweepEvents",
            value: function() {
                for (var t = this.exteriorRing.getSweepEvents(), e = 0, n = this.interiorRings.length; e < n; e++)
                    for (var r = this.interiorRings[e].getSweepEvents(), i = 0, o = r.length; i < o; i++)
                        t.push(r[i]);
                return t
            }
        }]),
        t
    }()
      , Xu = function() {
        function t(e, n) {
            if (bu(this, t),
            !Array.isArray(e))
                throw new Error("Input geometry is not a valid Polygon or MultiPolygon");
            try {
                "number" == typeof e[0][0][0] && (e = [e])
            } catch (t) {}
            this.polys = [],
            this.bbox = {
                ll: {
                    x: Number.POSITIVE_INFINITY,
                    y: Number.POSITIVE_INFINITY
                },
                ur: {
                    x: Number.NEGATIVE_INFINITY,
                    y: Number.NEGATIVE_INFINITY
                }
            };
            for (var r = 0, i = e.length; r < i; r++) {
                var o = new Vu(e[r],this);
                o.bbox.ll.x < this.bbox.ll.x && (this.bbox.ll.x = o.bbox.ll.x),
                o.bbox.ll.y < this.bbox.ll.y && (this.bbox.ll.y = o.bbox.ll.y),
                o.bbox.ur.x > this.bbox.ur.x && (this.bbox.ur.x = o.bbox.ur.x),
                o.bbox.ur.y > this.bbox.ur.y && (this.bbox.ur.y = o.bbox.ur.y),
                this.polys.push(o)
            }
            this.isSubject = n
        }
        return Iu(t, [{
            key: "getSweepEvents",
            value: function() {
                for (var t = [], e = 0, n = this.polys.length; e < n; e++)
                    for (var r = this.polys[e].getSweepEvents(), i = 0, o = r.length; i < o; i++)
                        t.push(r[i]);
                return t
            }
        }]),
        t
    }()
      , Yu = function() {
        function t(e) {
            bu(this, t),
            this.events = e;
            for (var n = 0, r = e.length; n < r; n++)
                e[n].segment.ringOut = this;
            this.poly = null
        }
        return Iu(t, null, [{
            key: "factory",
            value: function(e) {
                for (var n = [], r = 0, i = e.length; r < i; r++) {
                    var o = e[r];
                    if (o.isInResult() && !o.ringOut) {
                        for (var s = null, a = o.leftSE, u = o.rightSE, l = [a], c = a.point, h = []; s = a,
                        a = u,
                        l.push(a),
                        a.point !== c; )
                            for (; ; ) {
                                var p = a.getAvailableLinkedEvents();
                                if (0 === p.length) {
                                    var f = l[0].point
                                      , g = l[l.length - 1].point;
                                    throw new Error("Unable to complete output ring starting at [".concat(f.x, ",") + " ".concat(f.y, "]. Last matching segment found ends at") + " [".concat(g.x, ", ").concat(g.y, "]."))
                                }
                                if (1 === p.length) {
                                    u = p[0].otherSE;
                                    break
                                }
                                for (var d = null, y = 0, v = h.length; y < v; y++)
                                    if (h[y].point === a.point) {
                                        d = y;
                                        break
                                    }
                                if (null === d) {
                                    h.push({
                                        index: l.length,
                                        point: a.point
                                    });
                                    var _ = a.getLeftmostComparator(s);
                                    u = p.sort(_)[0].otherSE;
                                    break
                                }
                                var m = h.splice(d)[0]
                                  , x = l.splice(m.index);
                                x.unshift(x[0].otherSE),
                                n.push(new t(x.reverse()))
                            }
                        n.push(new t(l))
                    }
                }
                return n
            }
        }]),
        Iu(t, [{
            key: "getGeom",
            value: function() {
                for (var t = this.events[0].point, e = [t], n = 1, r = this.events.length - 1; n < r; n++) {
                    var i = this.events[n].point
                      , o = this.events[n + 1].point;
                    0 !== Du(i, t, o) && (e.push(i),
                    t = i)
                }
                if (1 === e.length)
                    return null;
                var s = e[0]
                  , a = e[1];
                0 === Du(s, t, a) && e.shift(),
                e.push(e[0]);
                for (var u = this.isExteriorRing() ? 1 : -1, l = this.isExteriorRing() ? 0 : e.length - 1, c = this.isExteriorRing() ? e.length : -1, h = [], p = l; p != c; p += u)
                    h.push([e[p].x, e[p].y]);
                return h
            }
        }, {
            key: "isExteriorRing",
            value: function() {
                if (void 0 === this._isExteriorRing) {
                    var t = this.enclosingRing();
                    this._isExteriorRing = !t || !t.isExteriorRing()
                }
                return this._isExteriorRing
            }
        }, {
            key: "enclosingRing",
            value: function() {
                return void 0 === this._enclosingRing && (this._enclosingRing = this._calcEnclosingRing()),
                this._enclosingRing
            }
        }, {
            key: "_calcEnclosingRing",
            value: function() {
                for (var t = this.events[0], e = 1, n = this.events.length; e < n; e++) {
                    var r = this.events[e];
                    Bu.compare(t, r) > 0 && (t = r)
                }
                for (var i = t.segment.prevInResult(), o = i ? i.prevInResult() : null; ; ) {
                    if (!i)
                        return null;
                    if (!o)
                        return i.ringOut;
                    if (o.ringOut !== i.ringOut)
                        return o.ringOut.enclosingRing() !== i.ringOut ? i.ringOut : i.ringOut.enclosingRing();
                    i = o.prevInResult(),
                    o = i ? i.prevInResult() : null
                }
            }
        }]),
        t
    }()
      , Hu = function() {
        function t(e) {
            bu(this, t),
            this.exteriorRing = e,
            e.poly = this,
            this.interiorRings = []
        }
        return Iu(t, [{
            key: "addInterior",
            value: function(t) {
                this.interiorRings.push(t),
                t.poly = this
            }
        }, {
            key: "getGeom",
            value: function() {
                var t = [this.exteriorRing.getGeom()];
                if (null === t[0])
                    return null;
                for (var e = 0, n = this.interiorRings.length; e < n; e++) {
                    var r = this.interiorRings[e].getGeom();
                    null !== r && t.push(r)
                }
                return t
            }
        }]),
        t
    }()
      , Wu = function() {
        function t(e) {
            bu(this, t),
            this.rings = e,
            this.polys = this._composePolys(e)
        }
        return Iu(t, [{
            key: "getGeom",
            value: function() {
                for (var t = [], e = 0, n = this.polys.length; e < n; e++) {
                    var r = this.polys[e].getGeom();
                    null !== r && t.push(r)
                }
                return t
            }
        }, {
            key: "_composePolys",
            value: function(t) {
                for (var e = [], n = 0, r = t.length; n < r; n++) {
                    var i = t[n];
                    if (!i.poly)
                        if (i.isExteriorRing())
                            e.push(new Hu(i));
                        else {
                            var o = i.enclosingRing();
                            o.poly || e.push(new Hu(o)),
                            o.poly.addInterior(i)
                        }
                }
                return e
            }
        }]),
        t
    }()
      , Ju = function() {
        function t(e) {
            var n = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : ju.compare;
            bu(this, t),
            this.queue = e,
            this.tree = new _u(n),
            this.segments = []
        }
        return Iu(t, [{
            key: "process",
            value: function(t) {
                var e = t.segment
                  , n = [];
                if (t.consumedBy)
                    return t.isLeft ? this.queue.remove(t.otherSE) : this.tree.remove(e),
                    n;
                var r = t.isLeft ? this.tree.insert(e) : this.tree.find(e);
                if (!r)
                    throw new Error("Unable to find segment #".concat(e.id, " ") + "[".concat(e.leftSE.point.x, ", ").concat(e.leftSE.point.y, "] -> ") + "[".concat(e.rightSE.point.x, ", ").concat(e.rightSE.point.y, "] ") + "in SweepLine tree. Please submit a bug report.");
                for (var i = r, o = r, s = void 0, a = void 0; void 0 === s; )
                    null === (i = this.tree.prev(i)) ? s = null : void 0 === i.key.consumedBy && (s = i.key);
                for (; void 0 === a; )
                    null === (o = this.tree.next(o)) ? a = null : void 0 === o.key.consumedBy && (a = o.key);
                if (t.isLeft) {
                    var u = null;
                    if (s) {
                        var l = s.getIntersection(e);
                        if (null !== l && (e.isAnEndpoint(l) || (u = l),
                        !s.isAnEndpoint(l)))
                            for (var c = this._splitSafely(s, l), h = 0, p = c.length; h < p; h++)
                                n.push(c[h])
                    }
                    var f = null;
                    if (a) {
                        var g = a.getIntersection(e);
                        if (null !== g && (e.isAnEndpoint(g) || (f = g),
                        !a.isAnEndpoint(g)))
                            for (var d = this._splitSafely(a, g), y = 0, v = d.length; y < v; y++)
                                n.push(d[y])
                    }
                    if (null !== u || null !== f) {
                        var _ = null;
                        if (null === u)
                            _ = f;
                        else if (null === f)
                            _ = u;
                        else {
                            _ = Bu.comparePoints(u, f) <= 0 ? u : f
                        }
                        this.queue.remove(e.rightSE),
                        n.push(e.rightSE);
                        for (var m = e.split(_), x = 0, E = m.length; x < E; x++)
                            n.push(m[x])
                    }
                    n.length > 0 ? (this.tree.remove(e),
                    n.push(t)) : (this.segments.push(e),
                    e.prev = s)
                } else {
                    if (s && a) {
                        var b = s.getIntersection(a);
                        if (null !== b) {
                            if (!s.isAnEndpoint(b))
                                for (var w = this._splitSafely(s, b), I = 0, N = w.length; I < N; I++)
                                    n.push(w[I]);
                            if (!a.isAnEndpoint(b))
                                for (var S = this._splitSafely(a, b), C = 0, P = S.length; C < P; C++)
                                    n.push(S[C])
                        }
                    }
                    this.tree.remove(e)
                }
                return n
            }
        }, {
            key: "_splitSafely",
            value: function(t, e) {
                this.tree.remove(t);
                var n = t.rightSE;
                this.queue.remove(n);
                var r = t.split(e);
                return r.push(n),
                void 0 === t.consumedBy && this.tree.insert(t),
                r
            }
        }]),
        t
    }()
      , Zu = "undefined" != typeof process && process.env.POLYGON_CLIPPING_MAX_QUEUE_SIZE || 1e6
      , Ku = "undefined" != typeof process && process.env.POLYGON_CLIPPING_MAX_SWEEPLINE_SEGMENTS || 1e6
      , Qu = new (function() {
        function t() {
            bu(this, t)
        }
        return Iu(t, [{
            key: "run",
            value: function(t, e, n) {
                Qu.type = t,
                Ru.reset();
                for (var r = [new Xu(e,!0)], i = 0, o = n.length; i < o; i++)
                    r.push(new Xu(n[i],!1));
                if (Qu.numMultiPolys = r.length,
                "difference" === Qu.type)
                    for (var s = r[0], a = 1; a < r.length; )
                        null !== Su(r[a].bbox, s.bbox) ? a++ : r.splice(a, 1);
                if ("intersection" === Qu.type)
                    for (var u = 0, l = r.length; u < l; u++)
                        for (var c = r[u], h = u + 1, p = r.length; h < p; h++)
                            if (null === Su(c.bbox, r[h].bbox))
                                return [];
                for (var f = new _u(Bu.compare), g = 0, d = r.length; g < d; g++)
                    for (var y = r[g].getSweepEvents(), v = 0, _ = y.length; v < _; v++)
                        if (f.insert(y[v]),
                        f.size > Zu)
                            throw new Error("Infinite loop when putting segment endpoints in a priority queue (queue size too big). Please file a bug report.");
                for (var m = new Ju(f), x = f.size, E = f.pop(); E; ) {
                    var b = E.key;
                    if (f.size === x) {
                        var w = b.segment;
                        throw new Error("Unable to pop() ".concat(b.isLeft ? "left" : "right", " SweepEvent ") + "[".concat(b.point.x, ", ").concat(b.point.y, "] from segment #").concat(w.id, " ") + "[".concat(w.leftSE.point.x, ", ").concat(w.leftSE.point.y, "] -> ") + "[".concat(w.rightSE.point.x, ", ").concat(w.rightSE.point.y, "] from queue. ") + "Please file a bug report.")
                    }
                    if (f.size > Zu)
                        throw new Error("Infinite loop when passing sweep line over endpoints (queue size too big). Please file a bug report.");
                    if (m.segments.length > Ku)
                        throw new Error("Infinite loop when passing sweep line over endpoints (too many sweep line segments). Please file a bug report.");
                    for (var I = m.process(b), N = 0, S = I.length; N < S; N++) {
                        var C = I[N];
                        void 0 === C.consumedBy && f.insert(C)
                    }
                    x = f.size,
                    E = f.pop()
                }
                Ru.reset();
                var P = Yu.factory(m.segments);
                return new Wu(P).getGeom()
            }
        }]),
        t
    }())
      , $u = {
        union: function(t) {
            for (var e = arguments.length, n = new Array(e > 1 ? e - 1 : 0), r = 1; r < e; r++)
                n[r - 1] = arguments[r];
            return Qu.run("union", t, n)
        },
        intersection: function(t) {
            for (var e = arguments.length, n = new Array(e > 1 ? e - 1 : 0), r = 1; r < e; r++)
                n[r - 1] = arguments[r];
            return Qu.run("intersection", t, n)
        },
        xor: function(t) {
            for (var e = arguments.length, n = new Array(e > 1 ? e - 1 : 0), r = 1; r < e; r++)
                n[r - 1] = arguments[r];
            return Qu.run("xor", t, n)
        },
        difference: function(t) {
            for (var e = arguments.length, n = new Array(e > 1 ? e - 1 : 0), r = 1; r < e; r++)
                n[r - 1] = arguments[r];
            return Qu.run("difference", t, n)
        }
    };
    "fill"in Array.prototype || Object.defineProperty(Array.prototype, "fill", {
        configurable: !0,
        value: function(t) {
            if (null == this)
                throw new TypeError(this + " is not an object");
            var e = Object(this)
              , n = Math.max(Math.min(e.length, 9007199254740991), 0) || 0
              , r = 1 in arguments && parseInt(Number(arguments[1]), 10) || 0;
            r = r < 0 ? Math.max(n + r, 0) : Math.min(r, n);
            var i = 2 in arguments && void 0 !== arguments[2] ? parseInt(Number(arguments[2]), 10) || 0 : n;
            for (i = i < 0 ? Math.max(n + arguments[2], 0) : Math.min(i, n); r < i; )
                e[r] = t,
                ++r;
            return e
        },
        writable: !0
    }),
    Number.isFinite = Number.isFinite || function(t) {
        return "number" == typeof t && isFinite(t)
    }
    ,
    Number.isInteger = Number.isInteger || function(t) {
        return "number" == typeof t && isFinite(t) && Math.floor(t) === t
    }
    ,
    Number.parseFloat = Number.parseFloat || parseFloat,
    Number.isNaN = Number.isNaN || function(t) {
        return t != t
    }
    ,
    Math.trunc = Math.trunc || function(t) {
        return t < 0 ? Math.ceil(t) : Math.floor(t)
    }
    ;
    var tl = function() {};
    tl.prototype.interfaces_ = function() {
        return []
    }
    ,
    tl.prototype.getClass = function() {
        return tl
    }
    ,
    tl.prototype.equalsWithTolerance = function(t, e, n) {
        return Math.abs(t - e) <= n
    }
    ;
    var el = function(t) {
        function e(e) {
            t.call(this, e),
            this.name = "IllegalArgumentException",
            this.message = e,
            this.stack = (new t).stack
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e
    }(Error)
      , nl = function() {}
      , rl = {
        MAX_VALUE: {
            configurable: !0
        }
    };
    nl.isNaN = function(t) {
        return Number.isNaN(t)
    }
    ,
    nl.doubleToLongBits = function(t) {
        return t
    }
    ,
    nl.longBitsToDouble = function(t) {
        return t
    }
    ,
    nl.isInfinite = function(t) {
        return !Number.isFinite(t)
    }
    ,
    rl.MAX_VALUE.get = function() {
        return Number.MAX_VALUE
    }
    ,
    Object.defineProperties(nl, rl);
    var il = function() {}
      , ol = function() {}
      , sl = function() {};
    function al() {}
    var ul = function t() {
        if (this.x = null,
        this.y = null,
        this.z = null,
        0 === arguments.length)
            this.x = 0,
            this.y = 0,
            this.z = t.NULL_ORDINATE;
        else if (1 === arguments.length) {
            var e = arguments[0];
            this.x = e.x,
            this.y = e.y,
            this.z = e.z
        } else
            2 === arguments.length ? (this.x = arguments[0],
            this.y = arguments[1],
            this.z = t.NULL_ORDINATE) : 3 === arguments.length && (this.x = arguments[0],
            this.y = arguments[1],
            this.z = arguments[2])
    }
      , ll = {
        DimensionalComparator: {
            configurable: !0
        },
        serialVersionUID: {
            configurable: !0
        },
        NULL_ORDINATE: {
            configurable: !0
        },
        X: {
            configurable: !0
        },
        Y: {
            configurable: !0
        },
        Z: {
            configurable: !0
        }
    };
    ul.prototype.setOrdinate = function(t, e) {
        switch (t) {
        case ul.X:
            this.x = e;
            break;
        case ul.Y:
            this.y = e;
            break;
        case ul.Z:
            this.z = e;
            break;
        default:
            throw new el("Invalid ordinate index: " + t)
        }
    }
    ,
    ul.prototype.equals2D = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return this.x === t.x && this.y === t.y
        }
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            return !!tl.equalsWithTolerance(this.x, e.x, n) && !!tl.equalsWithTolerance(this.y, e.y, n)
        }
    }
    ,
    ul.prototype.getOrdinate = function(t) {
        switch (t) {
        case ul.X:
            return this.x;
        case ul.Y:
            return this.y;
        case ul.Z:
            return this.z
        }
        throw new el("Invalid ordinate index: " + t)
    }
    ,
    ul.prototype.equals3D = function(t) {
        return this.x === t.x && this.y === t.y && (this.z === t.z || nl.isNaN(this.z)) && nl.isNaN(t.z)
    }
    ,
    ul.prototype.equals = function(t) {
        return t instanceof ul && this.equals2D(t)
    }
    ,
    ul.prototype.equalInZ = function(t, e) {
        return tl.equalsWithTolerance(this.z, t.z, e)
    }
    ,
    ul.prototype.compareTo = function(t) {
        var e = t;
        return this.x < e.x ? -1 : this.x > e.x ? 1 : this.y < e.y ? -1 : this.y > e.y ? 1 : 0
    }
    ,
    ul.prototype.clone = function() {}
    ,
    ul.prototype.copy = function() {
        return new ul(this)
    }
    ,
    ul.prototype.toString = function() {
        return "(" + this.x + ", " + this.y + ", " + this.z + ")"
    }
    ,
    ul.prototype.distance3D = function(t) {
        var e = this.x - t.x
          , n = this.y - t.y
          , r = this.z - t.z;
        return Math.sqrt(e * e + n * n + r * r)
    }
    ,
    ul.prototype.distance = function(t) {
        var e = this.x - t.x
          , n = this.y - t.y;
        return Math.sqrt(e * e + n * n)
    }
    ,
    ul.prototype.hashCode = function() {
        var t = 17;
        return t = 37 * (t = 37 * t + ul.hashCode(this.x)) + ul.hashCode(this.y)
    }
    ,
    ul.prototype.setCoordinate = function(t) {
        this.x = t.x,
        this.y = t.y,
        this.z = t.z
    }
    ,
    ul.prototype.interfaces_ = function() {
        return [il, ol, al]
    }
    ,
    ul.prototype.getClass = function() {
        return ul
    }
    ,
    ul.hashCode = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = nl.doubleToLongBits(t);
            return Math.trunc((e ^ e) >>> 32)
        }
    }
    ,
    ll.DimensionalComparator.get = function() {
        return cl
    }
    ,
    ll.serialVersionUID.get = function() {
        return 0x5cbf2c235c7e5800
    }
    ,
    ll.NULL_ORDINATE.get = function() {
        return nl.NaN
    }
    ,
    ll.X.get = function() {
        return 0
    }
    ,
    ll.Y.get = function() {
        return 1
    }
    ,
    ll.Z.get = function() {
        return 2
    }
    ,
    Object.defineProperties(ul, ll);
    var cl = function(t) {
        if (this._dimensionsToTest = 2,
        0 === arguments.length)
            ;
        else if (1 === arguments.length) {
            var e = arguments[0];
            if (2 !== e && 3 !== e)
                throw new el("only 2 or 3 dimensions may be specified");
            this._dimensionsToTest = e
        }
    };
    cl.prototype.compare = function(t, e) {
        var n = t
          , r = e
          , i = cl.compare(n.x, r.x);
        if (0 !== i)
            return i;
        var o = cl.compare(n.y, r.y);
        return 0 !== o ? o : this._dimensionsToTest <= 2 ? 0 : cl.compare(n.z, r.z)
    }
    ,
    cl.prototype.interfaces_ = function() {
        return [sl]
    }
    ,
    cl.prototype.getClass = function() {
        return cl
    }
    ,
    cl.compare = function(t, e) {
        return t < e ? -1 : t > e ? 1 : nl.isNaN(t) ? nl.isNaN(e) ? 0 : -1 : nl.isNaN(e) ? 1 : 0
    }
    ;
    var hl = function() {};
    hl.prototype.create = function() {}
    ,
    hl.prototype.interfaces_ = function() {
        return []
    }
    ,
    hl.prototype.getClass = function() {
        return hl
    }
    ;
    var pl = function() {}
      , fl = {
        INTERIOR: {
            configurable: !0
        },
        BOUNDARY: {
            configurable: !0
        },
        EXTERIOR: {
            configurable: !0
        },
        NONE: {
            configurable: !0
        }
    };
    pl.prototype.interfaces_ = function() {
        return []
    }
    ,
    pl.prototype.getClass = function() {
        return pl
    }
    ,
    pl.toLocationSymbol = function(t) {
        switch (t) {
        case pl.EXTERIOR:
            return "e";
        case pl.BOUNDARY:
            return "b";
        case pl.INTERIOR:
            return "i";
        case pl.NONE:
            return "-"
        }
        throw new el("Unknown location value: " + t)
    }
    ,
    fl.INTERIOR.get = function() {
        return 0
    }
    ,
    fl.BOUNDARY.get = function() {
        return 1
    }
    ,
    fl.EXTERIOR.get = function() {
        return 2
    }
    ,
    fl.NONE.get = function() {
        return -1
    }
    ,
    Object.defineProperties(pl, fl);
    var gl = function(t, e) {
        return t.interfaces_ && t.interfaces_().indexOf(e) > -1
    }
      , dl = function() {}
      , yl = {
        LOG_10: {
            configurable: !0
        }
    };
    dl.prototype.interfaces_ = function() {
        return []
    }
    ,
    dl.prototype.getClass = function() {
        return dl
    }
    ,
    dl.log10 = function(t) {
        var e = Math.log(t);
        return nl.isInfinite(e) || nl.isNaN(e) ? e : e / dl.LOG_10
    }
    ,
    dl.min = function(t, e, n, r) {
        var i = t;
        return e < i && (i = e),
        n < i && (i = n),
        r < i && (i = r),
        i
    }
    ,
    dl.clamp = function() {
        if ("number" == typeof arguments[2] && "number" == typeof arguments[0] && "number" == typeof arguments[1]) {
            var t = arguments[0]
              , e = arguments[1]
              , n = arguments[2];
            return t < e ? e : t > n ? n : t
        }
        if (Number.isInteger(arguments[2]) && Number.isInteger(arguments[0]) && Number.isInteger(arguments[1])) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2];
            return r < i ? i : r > o ? o : r
        }
    }
    ,
    dl.wrap = function(t, e) {
        return t < 0 ? e - -t % e : t % e
    }
    ,
    dl.max = function() {
        if (3 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = arguments[2]
              , r = t;
            return e > r && (r = e),
            n > r && (r = n),
            r
        }
        if (4 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1]
              , s = arguments[2]
              , a = arguments[3]
              , u = i;
            return o > u && (u = o),
            s > u && (u = s),
            a > u && (u = a),
            u
        }
    }
    ,
    dl.average = function(t, e) {
        return (t + e) / 2
    }
    ,
    yl.LOG_10.get = function() {
        return Math.log(10)
    }
    ,
    Object.defineProperties(dl, yl);
    var vl = function(t) {
        this.str = t
    };
    vl.prototype.append = function(t) {
        this.str += t
    }
    ,
    vl.prototype.setCharAt = function(t, e) {
        this.str = this.str.substr(0, t) + e + this.str.substr(t + 1)
    }
    ,
    vl.prototype.toString = function(t) {
        return this.str
    }
    ;
    var _l = function(t) {
        this.value = t
    };
    _l.prototype.intValue = function() {
        return this.value
    }
    ,
    _l.prototype.compareTo = function(t) {
        return this.value < t ? -1 : this.value > t ? 1 : 0
    }
    ,
    _l.isNaN = function(t) {
        return Number.isNaN(t)
    }
    ;
    var ml = function() {};
    ml.isWhitespace = function(t) {
        return t <= 32 && t >= 0 || 127 === t
    }
    ,
    ml.toUpperCase = function(t) {
        return t.toUpperCase()
    }
    ;
    var xl = function t() {
        if (this._hi = 0,
        this._lo = 0,
        0 === arguments.length)
            this.init(0);
        else if (1 === arguments.length) {
            if ("number" == typeof arguments[0]) {
                var e = arguments[0];
                this.init(e)
            } else if (arguments[0]instanceof t) {
                var n = arguments[0];
                this.init(n)
            } else if ("string" == typeof arguments[0]) {
                var r = arguments[0];
                t.call(this, t.parse(r))
            }
        } else if (2 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1];
            this.init(i, o)
        }
    }
      , El = {
        PI: {
            configurable: !0
        },
        TWO_PI: {
            configurable: !0
        },
        PI_2: {
            configurable: !0
        },
        E: {
            configurable: !0
        },
        NaN: {
            configurable: !0
        },
        EPS: {
            configurable: !0
        },
        SPLIT: {
            configurable: !0
        },
        MAX_PRINT_DIGITS: {
            configurable: !0
        },
        TEN: {
            configurable: !0
        },
        ONE: {
            configurable: !0
        },
        SCI_NOT_EXPONENT_CHAR: {
            configurable: !0
        },
        SCI_NOT_ZERO: {
            configurable: !0
        }
    };
    xl.prototype.le = function(t) {
        return (this._hi < t._hi || this._hi === t._hi) && this._lo <= t._lo
    }
    ,
    xl.prototype.extractSignificantDigits = function(t, e) {
        var n = this.abs()
          , r = xl.magnitude(n._hi)
          , i = xl.TEN.pow(r);
        (n = n.divide(i)).gt(xl.TEN) ? (n = n.divide(xl.TEN),
        r += 1) : n.lt(xl.ONE) && (n = n.multiply(xl.TEN),
        r -= 1);
        for (var o = r + 1, s = new vl, a = xl.MAX_PRINT_DIGITS - 1, u = 0; u <= a; u++) {
            t && u === o && s.append(".");
            var l = Math.trunc(n._hi);
            if (l < 0)
                break;
            var c = !1
              , h = 0;
            l > 9 ? (c = !0,
            h = "9") : h = "0" + l,
            s.append(h),
            n = n.subtract(xl.valueOf(l)).multiply(xl.TEN),
            c && n.selfAdd(xl.TEN);
            var p = !0
              , f = xl.magnitude(n._hi);
            if (f < 0 && Math.abs(f) >= a - u && (p = !1),
            !p)
                break
        }
        return e[0] = r,
        s.toString()
    }
    ,
    xl.prototype.sqr = function() {
        return this.multiply(this)
    }
    ,
    xl.prototype.doubleValue = function() {
        return this._hi + this._lo
    }
    ,
    xl.prototype.subtract = function() {
        if (arguments[0]instanceof xl) {
            var t = arguments[0];
            return this.add(t.negate())
        }
        if ("number" == typeof arguments[0]) {
            var e = arguments[0];
            return this.add(-e)
        }
    }
    ,
    xl.prototype.equals = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return this._hi === t._hi && this._lo === t._lo
        }
    }
    ,
    xl.prototype.isZero = function() {
        return 0 === this._hi && 0 === this._lo
    }
    ,
    xl.prototype.selfSubtract = function() {
        if (arguments[0]instanceof xl) {
            var t = arguments[0];
            return this.isNaN() ? this : this.selfAdd(-t._hi, -t._lo)
        }
        if ("number" == typeof arguments[0]) {
            var e = arguments[0];
            return this.isNaN() ? this : this.selfAdd(-e, 0)
        }
    }
    ,
    xl.prototype.getSpecialNumberString = function() {
        return this.isZero() ? "0.0" : this.isNaN() ? "NaN " : null
    }
    ,
    xl.prototype.min = function(t) {
        return this.le(t) ? this : t
    }
    ,
    xl.prototype.selfDivide = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof xl) {
                var t = arguments[0];
                return this.selfDivide(t._hi, t._lo)
            }
            if ("number" == typeof arguments[0]) {
                var e = arguments[0];
                return this.selfDivide(e, 0)
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = null
              , o = null
              , s = null
              , a = null
              , u = null
              , l = null
              , c = null
              , h = null;
            return u = this._hi / n,
            h = (i = (l = xl.SPLIT * u) - (i = l - u)) * (s = (h = xl.SPLIT * n) - (s = h - n)) - (c = u * n) + i * (a = n - s) + (o = u - i) * s + o * a,
            h = u + (l = (this._hi - c - h + this._lo - u * r) / n),
            this._hi = h,
            this._lo = u - h + l,
            this
        }
    }
    ,
    xl.prototype.dump = function() {
        return "DD<" + this._hi + ", " + this._lo + ">"
    }
    ,
    xl.prototype.divide = function() {
        if (arguments[0]instanceof xl) {
            var t = arguments[0]
              , e = null
              , n = null
              , r = null
              , i = null
              , o = null
              , s = null
              , a = null
              , u = null;
            n = (o = this._hi / t._hi) - (e = (s = xl.SPLIT * o) - (e = s - o)),
            u = e * (r = (u = xl.SPLIT * t._hi) - (r = u - t._hi)) - (a = o * t._hi) + e * (i = t._hi - r) + n * r + n * i;
            var l = u = o + (s = (this._hi - a - u + this._lo - o * t._lo) / t._hi)
              , c = o - u + s;
            return new xl(l,c)
        }
        if ("number" == typeof arguments[0]) {
            var h = arguments[0];
            return nl.isNaN(h) ? xl.createNaN() : xl.copy(this).selfDivide(h, 0)
        }
    }
    ,
    xl.prototype.ge = function(t) {
        return (this._hi > t._hi || this._hi === t._hi) && this._lo >= t._lo
    }
    ,
    xl.prototype.pow = function(t) {
        if (0 === t)
            return xl.valueOf(1);
        var e = new xl(this)
          , n = xl.valueOf(1)
          , r = Math.abs(t);
        if (r > 1)
            for (; r > 0; )
                r % 2 == 1 && n.selfMultiply(e),
                (r /= 2) > 0 && (e = e.sqr());
        else
            n = e;
        return t < 0 ? n.reciprocal() : n
    }
    ,
    xl.prototype.ceil = function() {
        if (this.isNaN())
            return xl.NaN;
        var t = Math.ceil(this._hi)
          , e = 0;
        return t === this._hi && (e = Math.ceil(this._lo)),
        new xl(t,e)
    }
    ,
    xl.prototype.compareTo = function(t) {
        var e = t;
        return this._hi < e._hi ? -1 : this._hi > e._hi ? 1 : this._lo < e._lo ? -1 : this._lo > e._lo ? 1 : 0
    }
    ,
    xl.prototype.rint = function() {
        return this.isNaN() ? this : this.add(.5).floor()
    }
    ,
    xl.prototype.setValue = function() {
        if (arguments[0]instanceof xl) {
            var t = arguments[0];
            return this.init(t),
            this
        }
        if ("number" == typeof arguments[0]) {
            var e = arguments[0];
            return this.init(e),
            this
        }
    }
    ,
    xl.prototype.max = function(t) {
        return this.ge(t) ? this : t
    }
    ,
    xl.prototype.sqrt = function() {
        if (this.isZero())
            return xl.valueOf(0);
        if (this.isNegative())
            return xl.NaN;
        var t = 1 / Math.sqrt(this._hi)
          , e = this._hi * t
          , n = xl.valueOf(e)
          , r = this.subtract(n.sqr())._hi * (.5 * t);
        return n.add(r)
    }
    ,
    xl.prototype.selfAdd = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof xl) {
                var t = arguments[0];
                return this.selfAdd(t._hi, t._lo)
            }
            if ("number" == typeof arguments[0]) {
                var e = arguments[0]
                  , n = null
                  , r = null
                  , i = null
                  , o = null
                  , s = null
                  , a = null;
                return o = (i = this._hi + e) - (s = i - this._hi),
                r = (a = (o = e - s + (this._hi - o)) + this._lo) + (i - (n = i + a)),
                this._hi = n + r,
                this._lo = r + (n - this._hi),
                this
            }
        } else if (2 === arguments.length) {
            var u = arguments[0]
              , l = arguments[1]
              , c = null
              , h = null
              , p = null
              , f = null
              , g = null
              , d = null
              , y = null;
            f = this._hi + u,
            h = this._lo + l,
            g = f - (d = f - this._hi),
            p = h - (y = h - this._lo);
            var v = (c = f + (d = (g = u - d + (this._hi - g)) + h)) + (d = (p = l - y + (this._lo - p)) + (d + (f - c)))
              , _ = d + (c - v);
            return this._hi = v,
            this._lo = _,
            this
        }
    }
    ,
    xl.prototype.selfMultiply = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof xl) {
                var t = arguments[0];
                return this.selfMultiply(t._hi, t._lo)
            }
            if ("number" == typeof arguments[0]) {
                var e = arguments[0];
                return this.selfMultiply(e, 0)
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = null
              , o = null
              , s = null
              , a = null
              , u = null
              , l = null;
            i = (u = xl.SPLIT * this._hi) - this._hi,
            l = xl.SPLIT * n,
            i = u - i,
            o = this._hi - i,
            s = l - n;
            var c = (u = this._hi * n) + (l = i * (s = l - s) - u + i * (a = n - s) + o * s + o * a + (this._hi * r + this._lo * n))
              , h = l + (i = u - c);
            return this._hi = c,
            this._lo = h,
            this
        }
    }
    ,
    xl.prototype.selfSqr = function() {
        return this.selfMultiply(this)
    }
    ,
    xl.prototype.floor = function() {
        if (this.isNaN())
            return xl.NaN;
        var t = Math.floor(this._hi)
          , e = 0;
        return t === this._hi && (e = Math.floor(this._lo)),
        new xl(t,e)
    }
    ,
    xl.prototype.negate = function() {
        return this.isNaN() ? this : new xl(-this._hi,-this._lo)
    }
    ,
    xl.prototype.clone = function() {}
    ,
    xl.prototype.multiply = function() {
        if (arguments[0]instanceof xl) {
            var t = arguments[0];
            return t.isNaN() ? xl.createNaN() : xl.copy(this).selfMultiply(t)
        }
        if ("number" == typeof arguments[0]) {
            var e = arguments[0];
            return nl.isNaN(e) ? xl.createNaN() : xl.copy(this).selfMultiply(e, 0)
        }
    }
    ,
    xl.prototype.isNaN = function() {
        return nl.isNaN(this._hi)
    }
    ,
    xl.prototype.intValue = function() {
        return Math.trunc(this._hi)
    }
    ,
    xl.prototype.toString = function() {
        var t = xl.magnitude(this._hi);
        return t >= -3 && t <= 20 ? this.toStandardNotation() : this.toSciNotation()
    }
    ,
    xl.prototype.toStandardNotation = function() {
        var t = this.getSpecialNumberString();
        if (null !== t)
            return t;
        var e = new Array(1).fill(null)
          , n = this.extractSignificantDigits(!0, e)
          , r = e[0] + 1
          , i = n;
        if ("." === n.charAt(0))
            i = "0" + n;
        else if (r < 0)
            i = "0." + xl.stringOfChar("0", -r) + n;
        else if (-1 === n.indexOf(".")) {
            var o = r - n.length;
            i = n + xl.stringOfChar("0", o) + ".0"
        }
        return this.isNegative() ? "-" + i : i
    }
    ,
    xl.prototype.reciprocal = function() {
        var t, e, n, r, i = null, o = null, s = null, a = null;
        t = (n = 1 / this._hi) - (i = (s = xl.SPLIT * n) - (i = s - n)),
        o = (a = xl.SPLIT * this._hi) - this._hi;
        var u = n + (s = (1 - (r = n * this._hi) - (a = i * (o = a - o) - r + i * (e = this._hi - o) + t * o + t * e) - n * this._lo) / this._hi);
        return new xl(u,n - u + s)
    }
    ,
    xl.prototype.toSciNotation = function() {
        if (this.isZero())
            return xl.SCI_NOT_ZERO;
        var t = this.getSpecialNumberString();
        if (null !== t)
            return t;
        var e = new Array(1).fill(null)
          , n = this.extractSignificantDigits(!1, e)
          , r = xl.SCI_NOT_EXPONENT_CHAR + e[0];
        if ("0" === n.charAt(0))
            throw new Error("Found leading zero: " + n);
        var i = "";
        n.length > 1 && (i = n.substring(1));
        var o = n.charAt(0) + "." + i;
        return this.isNegative() ? "-" + o + r : o + r
    }
    ,
    xl.prototype.abs = function() {
        return this.isNaN() ? xl.NaN : this.isNegative() ? this.negate() : new xl(this)
    }
    ,
    xl.prototype.isPositive = function() {
        return (this._hi > 0 || 0 === this._hi) && this._lo > 0
    }
    ,
    xl.prototype.lt = function(t) {
        return (this._hi < t._hi || this._hi === t._hi) && this._lo < t._lo
    }
    ,
    xl.prototype.add = function() {
        if (arguments[0]instanceof xl) {
            var t = arguments[0];
            return xl.copy(this).selfAdd(t)
        }
        if ("number" == typeof arguments[0]) {
            var e = arguments[0];
            return xl.copy(this).selfAdd(e)
        }
    }
    ,
    xl.prototype.init = function() {
        if (1 === arguments.length) {
            if ("number" == typeof arguments[0]) {
                var t = arguments[0];
                this._hi = t,
                this._lo = 0
            } else if (arguments[0]instanceof xl) {
                var e = arguments[0];
                this._hi = e._hi,
                this._lo = e._lo
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            this._hi = n,
            this._lo = r
        }
    }
    ,
    xl.prototype.gt = function(t) {
        return (this._hi > t._hi || this._hi === t._hi) && this._lo > t._lo
    }
    ,
    xl.prototype.isNegative = function() {
        return (this._hi < 0 || 0 === this._hi) && this._lo < 0
    }
    ,
    xl.prototype.trunc = function() {
        return this.isNaN() ? xl.NaN : this.isPositive() ? this.floor() : this.ceil()
    }
    ,
    xl.prototype.signum = function() {
        return this._hi > 0 ? 1 : this._hi < 0 ? -1 : this._lo > 0 ? 1 : this._lo < 0 ? -1 : 0
    }
    ,
    xl.prototype.interfaces_ = function() {
        return [al, il, ol]
    }
    ,
    xl.prototype.getClass = function() {
        return xl
    }
    ,
    xl.sqr = function(t) {
        return xl.valueOf(t).selfMultiply(t)
    }
    ,
    xl.valueOf = function() {
        if ("string" == typeof arguments[0]) {
            var t = arguments[0];
            return xl.parse(t)
        }
        if ("number" == typeof arguments[0]) {
            var e = arguments[0];
            return new xl(e)
        }
    }
    ,
    xl.sqrt = function(t) {
        return xl.valueOf(t).sqrt()
    }
    ,
    xl.parse = function(t) {
        for (var e = 0, n = t.length; ml.isWhitespace(t.charAt(e)); )
            e++;
        var r = !1;
        if (e < n) {
            var i = t.charAt(e);
            "-" !== i && "+" !== i || (e++,
            "-" === i && (r = !0))
        }
        for (var o = new xl, s = 0, a = 0, u = 0; !(e >= n); ) {
            var l = t.charAt(e);
            if (e++,
            ml.isDigit(l)) {
                var c = l - "0";
                o.selfMultiply(xl.TEN),
                o.selfAdd(c),
                s++
            } else {
                if ("." !== l) {
                    if ("e" === l || "E" === l) {
                        var h = t.substring(e);
                        try {
                            u = _l.parseInt(h)
                        } catch (e) {
                            throw e instanceof Error ? new Error("Invalid exponent " + h + " in string " + t) : e
                        }
                        break
                    }
                    throw new Error("Unexpected character '" + l + "' at position " + e + " in string " + t)
                }
                a = s
            }
        }
        var p = o
          , f = s - a - u;
        if (0 === f)
            p = o;
        else if (f > 0) {
            var g = xl.TEN.pow(f);
            p = o.divide(g)
        } else if (f < 0) {
            var d = xl.TEN.pow(-f);
            p = o.multiply(d)
        }
        return r ? p.negate() : p
    }
    ,
    xl.createNaN = function() {
        return new xl(nl.NaN,nl.NaN)
    }
    ,
    xl.copy = function(t) {
        return new xl(t)
    }
    ,
    xl.magnitude = function(t) {
        var e = Math.abs(t)
          , n = Math.log(e) / Math.log(10)
          , r = Math.trunc(Math.floor(n));
        return 10 * Math.pow(10, r) <= e && (r += 1),
        r
    }
    ,
    xl.stringOfChar = function(t, e) {
        for (var n = new vl, r = 0; r < e; r++)
            n.append(t);
        return n.toString()
    }
    ,
    El.PI.get = function() {
        return new xl(3.141592653589793,12246467991473532e-32)
    }
    ,
    El.TWO_PI.get = function() {
        return new xl(6.283185307179586,24492935982947064e-32)
    }
    ,
    El.PI_2.get = function() {
        return new xl(1.5707963267948966,6123233995736766e-32)
    }
    ,
    El.E.get = function() {
        return new xl(2.718281828459045,14456468917292502e-32)
    }
    ,
    El.NaN.get = function() {
        return new xl(nl.NaN,nl.NaN)
    }
    ,
    El.EPS.get = function() {
        return 123259516440783e-46
    }
    ,
    El.SPLIT.get = function() {
        return 134217729
    }
    ,
    El.MAX_PRINT_DIGITS.get = function() {
        return 32
    }
    ,
    El.TEN.get = function() {
        return xl.valueOf(10)
    }
    ,
    El.ONE.get = function() {
        return xl.valueOf(1)
    }
    ,
    El.SCI_NOT_EXPONENT_CHAR.get = function() {
        return "E"
    }
    ,
    El.SCI_NOT_ZERO.get = function() {
        return "0.0E0"
    }
    ,
    Object.defineProperties(xl, El);
    var bl = function() {}
      , wl = {
        DP_SAFE_EPSILON: {
            configurable: !0
        }
    };
    bl.prototype.interfaces_ = function() {
        return []
    }
    ,
    bl.prototype.getClass = function() {
        return bl
    }
    ,
    bl.orientationIndex = function(t, e, n) {
        var r = bl.orientationIndexFilter(t, e, n);
        if (r <= 1)
            return r;
        var i = xl.valueOf(e.x).selfAdd(-t.x)
          , o = xl.valueOf(e.y).selfAdd(-t.y)
          , s = xl.valueOf(n.x).selfAdd(-e.x)
          , a = xl.valueOf(n.y).selfAdd(-e.y);
        return i.selfMultiply(a).selfSubtract(o.selfMultiply(s)).signum()
    }
    ,
    bl.signOfDet2x2 = function(t, e, n, r) {
        return t.multiply(r).selfSubtract(e.multiply(n)).signum()
    }
    ,
    bl.intersection = function(t, e, n, r) {
        var i = xl.valueOf(r.y).selfSubtract(n.y).selfMultiply(xl.valueOf(e.x).selfSubtract(t.x))
          , o = xl.valueOf(r.x).selfSubtract(n.x).selfMultiply(xl.valueOf(e.y).selfSubtract(t.y))
          , s = i.subtract(o)
          , a = xl.valueOf(r.x).selfSubtract(n.x).selfMultiply(xl.valueOf(t.y).selfSubtract(n.y))
          , u = xl.valueOf(r.y).selfSubtract(n.y).selfMultiply(xl.valueOf(t.x).selfSubtract(n.x))
          , l = a.subtract(u).selfDivide(s).doubleValue()
          , c = xl.valueOf(t.x).selfAdd(xl.valueOf(e.x).selfSubtract(t.x).selfMultiply(l)).doubleValue()
          , h = xl.valueOf(e.x).selfSubtract(t.x).selfMultiply(xl.valueOf(t.y).selfSubtract(n.y))
          , p = xl.valueOf(e.y).selfSubtract(t.y).selfMultiply(xl.valueOf(t.x).selfSubtract(n.x))
          , f = h.subtract(p).selfDivide(s).doubleValue()
          , g = xl.valueOf(n.y).selfAdd(xl.valueOf(r.y).selfSubtract(n.y).selfMultiply(f)).doubleValue();
        return new ul(c,g)
    }
    ,
    bl.orientationIndexFilter = function(t, e, n) {
        var r = null
          , i = (t.x - n.x) * (e.y - n.y)
          , o = (t.y - n.y) * (e.x - n.x)
          , s = i - o;
        if (i > 0) {
            if (o <= 0)
                return bl.signum(s);
            r = i + o
        } else {
            if (!(i < 0))
                return bl.signum(s);
            if (o >= 0)
                return bl.signum(s);
            r = -i - o
        }
        var a = bl.DP_SAFE_EPSILON * r;
        return s >= a || -s >= a ? bl.signum(s) : 2
    }
    ,
    bl.signum = function(t) {
        return t > 0 ? 1 : t < 0 ? -1 : 0
    }
    ,
    wl.DP_SAFE_EPSILON.get = function() {
        return 1e-15
    }
    ,
    Object.defineProperties(bl, wl);
    var Il = function() {}
      , Nl = {
        X: {
            configurable: !0
        },
        Y: {
            configurable: !0
        },
        Z: {
            configurable: !0
        },
        M: {
            configurable: !0
        }
    };
    Nl.X.get = function() {
        return 0
    }
    ,
    Nl.Y.get = function() {
        return 1
    }
    ,
    Nl.Z.get = function() {
        return 2
    }
    ,
    Nl.M.get = function() {
        return 3
    }
    ,
    Il.prototype.setOrdinate = function(t, e, n) {}
    ,
    Il.prototype.size = function() {}
    ,
    Il.prototype.getOrdinate = function(t, e) {}
    ,
    Il.prototype.getCoordinate = function() {}
    ,
    Il.prototype.getCoordinateCopy = function(t) {}
    ,
    Il.prototype.getDimension = function() {}
    ,
    Il.prototype.getX = function(t) {}
    ,
    Il.prototype.clone = function() {}
    ,
    Il.prototype.expandEnvelope = function(t) {}
    ,
    Il.prototype.copy = function() {}
    ,
    Il.prototype.getY = function(t) {}
    ,
    Il.prototype.toCoordinateArray = function() {}
    ,
    Il.prototype.interfaces_ = function() {
        return [ol]
    }
    ,
    Il.prototype.getClass = function() {
        return Il
    }
    ,
    Object.defineProperties(Il, Nl);
    var Sl = function() {}
      , Cl = function(t) {
        function e() {
            t.call(this, "Projective point not representable on the Cartesian plane.")
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(Sl)
      , Pl = function() {};
    Pl.arraycopy = function(t, e, n, r, i) {
        for (var o = 0, s = e; s < e + i; s++)
            n[r + o] = t[s],
            o++
    }
    ,
    Pl.getProperty = function(t) {
        return {
            "line.separator": "\n"
        }[t]
    }
    ;
    var Ml = function t() {
        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) {
            var e = arguments[0];
            this.x = e.x,
            this.y = e.y,
            this.w = 1
        } else if (2 === arguments.length) {
            if ("number" == typeof arguments[0] && "number" == typeof arguments[1]) {
                var n = arguments[0]
                  , r = arguments[1];
                this.x = n,
                this.y = r,
                this.w = 1
            } else if (arguments[0]instanceof t && arguments[1]instanceof t) {
                var i = arguments[0]
                  , o = arguments[1];
                this.x = i.y * o.w - o.y * i.w,
                this.y = o.x * i.w - i.x * o.w,
                this.w = i.x * o.y - o.x * i.y
            } else if (arguments[0]instanceof ul && arguments[1]instanceof ul) {
                var s = arguments[0]
                  , a = arguments[1];
                this.x = s.y - a.y,
                this.y = a.x - s.x,
                this.w = s.x * a.y - a.x * s.y
            }
        } else if (3 === arguments.length) {
            var u = arguments[0]
              , l = arguments[1]
              , c = arguments[2];
            this.x = u,
            this.y = l,
            this.w = c
        } else if (4 === arguments.length) {
            var h = arguments[0]
              , p = arguments[1]
              , f = arguments[2]
              , g = arguments[3]
              , d = h.y - p.y
              , y = p.x - h.x
              , v = h.x * p.y - p.x * h.y
              , _ = f.y - g.y
              , m = g.x - f.x
              , x = f.x * g.y - g.x * f.y;
            this.x = y * x - m * v,
            this.y = _ * v - d * x,
            this.w = d * m - _ * y
        }
    };
    Ml.prototype.getY = function() {
        var t = this.y / this.w;
        if (nl.isNaN(t) || nl.isInfinite(t))
            throw new Cl;
        return t
    }
    ,
    Ml.prototype.getX = function() {
        var t = this.x / this.w;
        if (nl.isNaN(t) || nl.isInfinite(t))
            throw new Cl;
        return t
    }
    ,
    Ml.prototype.getCoordinate = function() {
        var t = new ul;
        return t.x = this.getX(),
        t.y = this.getY(),
        t
    }
    ,
    Ml.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ml.prototype.getClass = function() {
        return Ml
    }
    ,
    Ml.intersection = function(t, e, n, r) {
        var i = t.y - e.y
          , o = e.x - t.x
          , s = t.x * e.y - e.x * t.y
          , a = n.y - r.y
          , u = r.x - n.x
          , l = n.x * r.y - r.x * n.y
          , c = i * u - a * o
          , h = (o * l - u * s) / c
          , p = (a * s - i * l) / c;
        if (nl.isNaN(h) || nl.isInfinite(h) || nl.isNaN(p) || nl.isInfinite(p))
            throw new Cl;
        return new ul(h,p)
    }
    ;
    var Ll = function t() {
        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 ul) {
                var e = arguments[0];
                this.init(e.x, e.x, e.y, e.y)
            } else if (arguments[0]instanceof t) {
                var n = arguments[0];
                this.init(n)
            }
        } else if (2 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1];
            this.init(r.x, i.x, r.y, i.y)
        } else if (4 === arguments.length) {
            var o = arguments[0]
              , s = arguments[1]
              , a = arguments[2]
              , u = arguments[3];
            this.init(o, s, a, u)
        }
    }
      , Ol = {
        serialVersionUID: {
            configurable: !0
        }
    };
    Ll.prototype.getArea = function() {
        return this.getWidth() * this.getHeight()
    }
    ,
    Ll.prototype.equals = function(t) {
        if (!(t instanceof Ll))
            return !1;
        var e = t;
        return this.isNull() ? e.isNull() : this._maxx === e.getMaxX() && this._maxy === e.getMaxY() && this._minx === e.getMinX() && this._miny === e.getMinY()
    }
    ,
    Ll.prototype.intersection = function(t) {
        if (this.isNull() || t.isNull() || !this.intersects(t))
            return new Ll;
        var e = this._minx > t._minx ? this._minx : t._minx
          , n = this._miny > t._miny ? this._miny : t._miny
          , r = this._maxx < t._maxx ? this._maxx : t._maxx
          , i = this._maxy < t._maxy ? this._maxy : t._maxy;
        return new Ll(e,r,n,i)
    }
    ,
    Ll.prototype.isNull = function() {
        return this._maxx < this._minx
    }
    ,
    Ll.prototype.getMaxX = function() {
        return this._maxx
    }
    ,
    Ll.prototype.covers = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof ul) {
                var t = arguments[0];
                return this.covers(t.x, t.y)
            }
            if (arguments[0]instanceof Ll) {
                var e = arguments[0];
                return !this.isNull() && !e.isNull() && (e.getMinX() >= this._minx && e.getMaxX() <= this._maxx && e.getMinY() >= this._miny && e.getMaxY() <= this._maxy)
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            return !this.isNull() && (n >= this._minx && n <= this._maxx && r >= this._miny && r <= this._maxy)
        }
    }
    ,
    Ll.prototype.intersects = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof Ll) {
                var 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 ul) {
                var e = arguments[0];
                return this.intersects(e.x, e.y)
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            return !this.isNull() && !(n > this._maxx || n < this._minx || r > this._maxy || r < this._miny)
        }
    }
    ,
    Ll.prototype.getMinY = function() {
        return this._miny
    }
    ,
    Ll.prototype.getMinX = function() {
        return this._minx
    }
    ,
    Ll.prototype.expandToInclude = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof ul) {
                var t = arguments[0];
                this.expandToInclude(t.x, t.y)
            } else if (arguments[0]instanceof Ll) {
                var e = arguments[0];
                if (e.isNull())
                    return null;
                this.isNull() ? (this._minx = e.getMinX(),
                this._maxx = e.getMaxX(),
                this._miny = e.getMinY(),
                this._maxy = e.getMaxY()) : (e._minx < this._minx && (this._minx = e._minx),
                e._maxx > this._maxx && (this._maxx = e._maxx),
                e._miny < this._miny && (this._miny = e._miny),
                e._maxy > this._maxy && (this._maxy = e._maxy))
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            this.isNull() ? (this._minx = n,
            this._maxx = n,
            this._miny = r,
            this._maxy = r) : (n < this._minx && (this._minx = n),
            n > this._maxx && (this._maxx = n),
            r < this._miny && (this._miny = r),
            r > this._maxy && (this._maxy = r))
        }
    }
    ,
    Ll.prototype.minExtent = function() {
        if (this.isNull())
            return 0;
        var t = this.getWidth()
          , e = this.getHeight();
        return t < e ? t : e
    }
    ,
    Ll.prototype.getWidth = function() {
        return this.isNull() ? 0 : this._maxx - this._minx
    }
    ,
    Ll.prototype.compareTo = function(t) {
        var 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
    }
    ,
    Ll.prototype.translate = function(t, e) {
        if (this.isNull())
            return null;
        this.init(this.getMinX() + t, this.getMaxX() + t, this.getMinY() + e, this.getMaxY() + e)
    }
    ,
    Ll.prototype.toString = function() {
        return "Env[" + this._minx + " : " + this._maxx + ", " + this._miny + " : " + this._maxy + "]"
    }
    ,
    Ll.prototype.setToNull = function() {
        this._minx = 0,
        this._maxx = -1,
        this._miny = 0,
        this._maxy = -1
    }
    ,
    Ll.prototype.getHeight = function() {
        return this.isNull() ? 0 : this._maxy - this._miny
    }
    ,
    Ll.prototype.maxExtent = function() {
        if (this.isNull())
            return 0;
        var t = this.getWidth()
          , e = this.getHeight();
        return t > e ? t : e
    }
    ,
    Ll.prototype.expandBy = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.expandBy(t, t)
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            if (this.isNull())
                return null;
            this._minx -= e,
            this._maxx += e,
            this._miny -= n,
            this._maxy += n,
            (this._minx > this._maxx || this._miny > this._maxy) && this.setToNull()
        }
    }
    ,
    Ll.prototype.contains = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof Ll) {
                var t = arguments[0];
                return this.covers(t)
            }
            if (arguments[0]instanceof ul) {
                var e = arguments[0];
                return this.covers(e)
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            return this.covers(n, r)
        }
    }
    ,
    Ll.prototype.centre = function() {
        return this.isNull() ? null : new ul((this.getMinX() + this.getMaxX()) / 2,(this.getMinY() + this.getMaxY()) / 2)
    }
    ,
    Ll.prototype.init = function() {
        if (0 === arguments.length)
            this.setToNull();
        else if (1 === arguments.length) {
            if (arguments[0]instanceof ul) {
                var t = arguments[0];
                this.init(t.x, t.x, t.y, t.y)
            } else if (arguments[0]instanceof Ll) {
                var e = arguments[0];
                this._minx = e._minx,
                this._maxx = e._maxx,
                this._miny = e._miny,
                this._maxy = e._maxy
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            this.init(n.x, r.x, n.y, r.y)
        } else if (4 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1]
              , s = arguments[2]
              , a = arguments[3];
            i < o ? (this._minx = i,
            this._maxx = o) : (this._minx = o,
            this._maxx = i),
            s < a ? (this._miny = s,
            this._maxy = a) : (this._miny = a,
            this._maxy = s)
        }
    }
    ,
    Ll.prototype.getMaxY = function() {
        return this._maxy
    }
    ,
    Ll.prototype.distance = function(t) {
        if (this.intersects(t))
            return 0;
        var e = 0;
        this._maxx < t._minx ? e = t._minx - this._maxx : this._minx > t._maxx && (e = this._minx - t._maxx);
        var n = 0;
        return this._maxy < t._miny ? n = t._miny - this._maxy : this._miny > t._maxy && (n = this._miny - t._maxy),
        0 === e ? n : 0 === n ? e : Math.sqrt(e * e + n * n)
    }
    ,
    Ll.prototype.hashCode = function() {
        var t = 17;
        return t = 37 * (t = 37 * (t = 37 * (t = 37 * t + ul.hashCode(this._minx)) + ul.hashCode(this._maxx)) + ul.hashCode(this._miny)) + ul.hashCode(this._maxy)
    }
    ,
    Ll.prototype.interfaces_ = function() {
        return [il, al]
    }
    ,
    Ll.prototype.getClass = function() {
        return Ll
    }
    ,
    Ll.intersects = function() {
        if (3 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = arguments[2];
            return n.x >= (t.x < e.x ? t.x : e.x) && n.x <= (t.x > e.x ? t.x : e.x) && n.y >= (t.y < e.y ? t.y : e.y) && n.y <= (t.y > e.y ? t.y : e.y)
        }
        if (4 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2]
              , s = arguments[3]
              , a = Math.min(o.x, s.x)
              , u = Math.max(o.x, s.x)
              , l = Math.min(r.x, i.x)
              , c = Math.max(r.x, i.x);
            return !(l > u) && (!(c < a) && (a = Math.min(o.y, s.y),
            u = Math.max(o.y, s.y),
            l = Math.min(r.y, i.y),
            c = Math.max(r.y, i.y),
            !(l > u) && !(c < a)))
        }
    }
    ,
    Ol.serialVersionUID.get = function() {
        return 0x51845cd552189800
    }
    ,
    Object.defineProperties(Ll, Ol);
    var Rl = {
        typeStr: /^\s*(\w+)\s*\(\s*(.*)\s*\)\s*$/,
        emptyTypeStr: /^\s*(\w+)\s*EMPTY\s*$/,
        spaces: /\s+/,
        parenComma: /\)\s*,\s*\(/,
        doubleParenComma: /\)\s*\)\s*,\s*\(\s*\(/,
        trimParens: /^\s*\(?(.*?)\)?\s*$/
    }
      , Tl = function(t) {
        this.geometryFactory = t || new _h
    };
    Tl.prototype.read = function(t) {
        var e, n, r;
        t = t.replace(/[\n\r]/g, " ");
        var i = Rl.typeStr.exec(t);
        if (-1 !== t.search("EMPTY") && ((i = Rl.emptyTypeStr.exec(t))[2] = void 0),
        i && (n = i[1].toLowerCase(),
        r = i[2],
        Dl[n] && (e = Dl[n].apply(this, [r]))),
        void 0 === e)
            throw new Error("Could not parse WKT " + t);
        return e
    }
    ,
    Tl.prototype.write = function(t) {
        return this.extractGeometry(t)
    }
    ,
    Tl.prototype.extractGeometry = function(t) {
        var e = t.getGeometryType().toLowerCase();
        if (!Al[e])
            return null;
        var n = e.toUpperCase();
        return t.isEmpty() ? n + " EMPTY" : n + "(" + Al[e].apply(this, [t]) + ")"
    }
    ;
    var Al = {
        coordinate: function(t) {
            return t.x + " " + t.y
        },
        point: function(t) {
            return Al.coordinate.call(this, t._coordinates._coordinates[0])
        },
        multipoint: function(t) {
            for (var e = [], n = 0, r = t._geometries.length; n < r; ++n)
                e.push("(" + Al.point.apply(this, [t._geometries[n]]) + ")");
            return e.join(",")
        },
        linestring: function(t) {
            for (var e = [], n = 0, r = t._points._coordinates.length; n < r; ++n)
                e.push(Al.coordinate.apply(this, [t._points._coordinates[n]]));
            return e.join(",")
        },
        linearring: function(t) {
            for (var e = [], n = 0, r = t._points._coordinates.length; n < r; ++n)
                e.push(Al.coordinate.apply(this, [t._points._coordinates[n]]));
            return e.join(",")
        },
        multilinestring: function(t) {
            for (var e = [], n = 0, r = t._geometries.length; n < r; ++n)
                e.push("(" + Al.linestring.apply(this, [t._geometries[n]]) + ")");
            return e.join(",")
        },
        polygon: function(t) {
            var e = [];
            e.push("(" + Al.linestring.apply(this, [t._shell]) + ")");
            for (var n = 0, r = t._holes.length; n < r; ++n)
                e.push("(" + Al.linestring.apply(this, [t._holes[n]]) + ")");
            return e.join(",")
        },
        multipolygon: function(t) {
            for (var e = [], n = 0, r = t._geometries.length; n < r; ++n)
                e.push("(" + Al.polygon.apply(this, [t._geometries[n]]) + ")");
            return e.join(",")
        },
        geometrycollection: function(t) {
            for (var e = [], n = 0, r = t._geometries.length; n < r; ++n)
                e.push(this.extractGeometry(t._geometries[n]));
            return e.join(",")
        }
    }
      , Dl = {
        point: function(t) {
            if (void 0 === t)
                return this.geometryFactory.createPoint();
            var e = t.trim().split(Rl.spaces);
            return this.geometryFactory.createPoint(new ul(Number.parseFloat(e[0]),Number.parseFloat(e[1])))
        },
        multipoint: function(t) {
            var e;
            if (void 0 === t)
                return this.geometryFactory.createMultiPoint();
            for (var n = t.trim().split(","), r = [], i = 0, o = n.length; i < o; ++i)
                e = n[i].replace(Rl.trimParens, "$1"),
                r.push(Dl.point.apply(this, [e]));
            return this.geometryFactory.createMultiPoint(r)
        },
        linestring: function(t) {
            if (void 0 === t)
                return this.geometryFactory.createLineString();
            for (var e, n = t.trim().split(","), r = [], i = 0, o = n.length; i < o; ++i)
                e = n[i].trim().split(Rl.spaces),
                r.push(new ul(Number.parseFloat(e[0]),Number.parseFloat(e[1])));
            return this.geometryFactory.createLineString(r)
        },
        linearring: function(t) {
            if (void 0 === t)
                return this.geometryFactory.createLinearRing();
            for (var e, n = t.trim().split(","), r = [], i = 0, o = n.length; i < o; ++i)
                e = n[i].trim().split(Rl.spaces),
                r.push(new ul(Number.parseFloat(e[0]),Number.parseFloat(e[1])));
            return this.geometryFactory.createLinearRing(r)
        },
        multilinestring: function(t) {
            var e;
            if (void 0 === t)
                return this.geometryFactory.createMultiLineString();
            for (var n = t.trim().split(Rl.parenComma), r = [], i = 0, o = n.length; i < o; ++i)
                e = n[i].replace(Rl.trimParens, "$1"),
                r.push(Dl.linestring.apply(this, [e]));
            return this.geometryFactory.createMultiLineString(r)
        },
        polygon: function(t) {
            var e, n, r;
            if (void 0 === t)
                return this.geometryFactory.createPolygon();
            for (var i, o = t.trim().split(Rl.parenComma), s = [], a = 0, u = o.length; a < u; ++a)
                e = o[a].replace(Rl.trimParens, "$1"),
                n = Dl.linestring.apply(this, [e]),
                r = this.geometryFactory.createLinearRing(n._points),
                0 === a ? i = r : s.push(r);
            return this.geometryFactory.createPolygon(i, s)
        },
        multipolygon: function(t) {
            var e;
            if (void 0 === t)
                return this.geometryFactory.createMultiPolygon();
            for (var n = t.trim().split(Rl.doubleParenComma), r = [], i = 0, o = n.length; i < o; ++i)
                e = n[i].replace(Rl.trimParens, "$1"),
                r.push(Dl.polygon.apply(this, [e]));
            return this.geometryFactory.createMultiPolygon(r)
        },
        geometrycollection: function(t) {
            if (void 0 === t)
                return this.geometryFactory.createGeometryCollection();
            for (var e = (t = t.replace(/,\s*([A-Za-z])/g, "|$1")).trim().split("|"), n = [], r = 0, i = e.length; r < i; ++r)
                n.push(this.read(e[r]));
            return this.geometryFactory.createGeometryCollection(n)
        }
    }
      , Fl = function(t) {
        this.parser = new Tl(t)
    };
    Fl.prototype.write = function(t) {
        return this.parser.write(t)
    }
    ,
    Fl.toLineString = function(t, e) {
        if (2 !== arguments.length)
            throw new Error("Not implemented");
        return "LINESTRING ( " + t.x + " " + t.y + ", " + e.x + " " + e.y + " )"
    }
    ;
    var kl = function(t) {
        function e(e) {
            t.call(this, e),
            this.name = "RuntimeException",
            this.message = e,
            this.stack = (new t).stack
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e
    }(Error)
      , Gl = function(t) {
        function e() {
            if (t.call(this),
            0 === arguments.length)
                t.call(this);
            else if (1 === arguments.length) {
                var e = arguments[0];
                t.call(this, e)
            }
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(kl)
      , ql = function() {};
    ql.prototype.interfaces_ = function() {
        return []
    }
    ,
    ql.prototype.getClass = function() {
        return ql
    }
    ,
    ql.shouldNeverReachHere = function() {
        if (0 === arguments.length)
            ql.shouldNeverReachHere(null);
        else if (1 === arguments.length) {
            var t = arguments[0];
            throw new Gl("Should never reach here" + (null !== t ? ": " + t : ""))
        }
    }
    ,
    ql.isTrue = function() {
        var t;
        if (1 === arguments.length)
            ql.isTrue(arguments[0], null);
        else if (2 === arguments.length && (t = arguments[1],
        !arguments[0]))
            throw null === t ? new Gl : new Gl(t)
    }
    ,
    ql.equals = function() {
        var t, e, n;
        if (2 === arguments.length)
            ql.equals(t = arguments[0], e = arguments[1], null);
        else if (3 === arguments.length && (t = arguments[0],
        n = arguments[2],
        !(e = arguments[1]).equals(t)))
            throw new Gl("Expected " + t + " but encountered " + e + (null !== n ? ": " + n : ""))
    }
    ;
    var Bl = function() {
        this._result = null,
        this._inputLines = Array(2).fill().map((function() {
            return 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 ul,
        this._intPt[1] = new ul,
        this._pa = this._intPt[0],
        this._pb = this._intPt[1],
        this._result = 0
    }
      , zl = {
        DONT_INTERSECT: {
            configurable: !0
        },
        DO_INTERSECT: {
            configurable: !0
        },
        COLLINEAR: {
            configurable: !0
        },
        NO_INTERSECTION: {
            configurable: !0
        },
        POINT_INTERSECTION: {
            configurable: !0
        },
        COLLINEAR_INTERSECTION: {
            configurable: !0
        }
    };
    Bl.prototype.getIndexAlongSegment = function(t, e) {
        return this.computeIntLineIndex(),
        this._intLineIndex[t][e]
    }
    ,
    Bl.prototype.getTopologySummary = function() {
        var t = new vl;
        return this.isEndPoint() && t.append(" endpoint"),
        this._isProper && t.append(" proper"),
        this.isCollinear() && t.append(" collinear"),
        t.toString()
    }
    ,
    Bl.prototype.computeIntersection = function(t, e, n, r) {
        this._inputLines[0][0] = t,
        this._inputLines[0][1] = e,
        this._inputLines[1][0] = n,
        this._inputLines[1][1] = r,
        this._result = this.computeIntersect(t, e, n, r)
    }
    ,
    Bl.prototype.getIntersectionNum = function() {
        return this._result
    }
    ,
    Bl.prototype.computeIntLineIndex = function() {
        if (0 === arguments.length)
            null === this._intLineIndex && (this._intLineIndex = Array(2).fill().map((function() {
                return Array(2)
            }
            )),
            this.computeIntLineIndex(0),
            this.computeIntLineIndex(1));
        else if (1 === arguments.length) {
            var t = arguments[0]
              , e = this.getEdgeDistance(t, 0)
              , n = this.getEdgeDistance(t, 1);
            e > n ? (this._intLineIndex[t][0] = 0,
            this._intLineIndex[t][1] = 1) : (this._intLineIndex[t][0] = 1,
            this._intLineIndex[t][1] = 0)
        }
    }
    ,
    Bl.prototype.isProper = function() {
        return this.hasIntersection() && this._isProper
    }
    ,
    Bl.prototype.setPrecisionModel = function(t) {
        this._precisionModel = t
    }
    ,
    Bl.prototype.isInteriorIntersection = function() {
        var t = this;
        if (0 === arguments.length)
            return !!this.isInteriorIntersection(0) || !!this.isInteriorIntersection(1);
        if (1 === arguments.length) {
            for (var e = arguments[0], n = 0; n < this._result; n++)
                if (!t._intPt[n].equals2D(t._inputLines[e][0]) && !t._intPt[n].equals2D(t._inputLines[e][1]))
                    return !0;
            return !1
        }
    }
    ,
    Bl.prototype.getIntersection = function(t) {
        return this._intPt[t]
    }
    ,
    Bl.prototype.isEndPoint = function() {
        return this.hasIntersection() && !this._isProper
    }
    ,
    Bl.prototype.hasIntersection = function() {
        return this._result !== Bl.NO_INTERSECTION
    }
    ,
    Bl.prototype.getEdgeDistance = function(t, e) {
        return Bl.computeEdgeDistance(this._intPt[e], this._inputLines[t][0], this._inputLines[t][1])
    }
    ,
    Bl.prototype.isCollinear = function() {
        return this._result === Bl.COLLINEAR_INTERSECTION
    }
    ,
    Bl.prototype.toString = function() {
        return Fl.toLineString(this._inputLines[0][0], this._inputLines[0][1]) + " - " + Fl.toLineString(this._inputLines[1][0], this._inputLines[1][1]) + this.getTopologySummary()
    }
    ,
    Bl.prototype.getEndpoint = function(t, e) {
        return this._inputLines[t][e]
    }
    ,
    Bl.prototype.isIntersection = function(t) {
        for (var e = 0; e < this._result; e++)
            if (this._intPt[e].equals2D(t))
                return !0;
        return !1
    }
    ,
    Bl.prototype.getIntersectionAlongSegment = function(t, e) {
        return this.computeIntLineIndex(),
        this._intPt[this._intLineIndex[t][e]]
    }
    ,
    Bl.prototype.interfaces_ = function() {
        return []
    }
    ,
    Bl.prototype.getClass = function() {
        return Bl
    }
    ,
    Bl.computeEdgeDistance = function(t, e, n) {
        var r = Math.abs(n.x - e.x)
          , i = Math.abs(n.y - e.y)
          , o = -1;
        if (t.equals(e))
            o = 0;
        else if (t.equals(n))
            o = r > i ? r : i;
        else {
            var s = Math.abs(t.x - e.x)
              , a = Math.abs(t.y - e.y);
            0 !== (o = r > i ? s : a) || t.equals(e) || (o = Math.max(s, a))
        }
        return ql.isTrue(!(0 === o && !t.equals(e)), "Bad distance calculation"),
        o
    }
    ,
    Bl.nonRobustComputeEdgeDistance = function(t, e, n) {
        var r = t.x - e.x
          , i = t.y - e.y
          , o = Math.sqrt(r * r + i * i);
        return ql.isTrue(!(0 === o && !t.equals(e)), "Invalid distance calculation"),
        o
    }
    ,
    zl.DONT_INTERSECT.get = function() {
        return 0
    }
    ,
    zl.DO_INTERSECT.get = function() {
        return 1
    }
    ,
    zl.COLLINEAR.get = function() {
        return 2
    }
    ,
    zl.NO_INTERSECTION.get = function() {
        return 0
    }
    ,
    zl.POINT_INTERSECTION.get = function() {
        return 1
    }
    ,
    zl.COLLINEAR_INTERSECTION.get = function() {
        return 2
    }
    ,
    Object.defineProperties(Bl, zl);
    var jl = function(t) {
        function e() {
            t.apply(this, arguments)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.isInSegmentEnvelopes = function(t) {
            var e = new Ll(this._inputLines[0][0],this._inputLines[0][1])
              , n = new Ll(this._inputLines[1][0],this._inputLines[1][1]);
            return e.contains(t) && n.contains(t)
        }
        ,
        e.prototype.computeIntersection = function() {
            if (3 !== arguments.length)
                return t.prototype.computeIntersection.apply(this, arguments);
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2];
            if (this._isProper = !1,
            Ll.intersects(n, r, e) && 0 === Xl.orientationIndex(n, r, e) && 0 === Xl.orientationIndex(r, n, e))
                return this._isProper = !0,
                (e.equals(n) || e.equals(r)) && (this._isProper = !1),
                this._result = t.POINT_INTERSECTION,
                null;
            this._result = t.NO_INTERSECTION
        }
        ,
        e.prototype.normalizeToMinimum = function(t, e, n, r, i) {
            i.x = this.smallestInAbsValue(t.x, e.x, n.x, r.x),
            i.y = this.smallestInAbsValue(t.y, e.y, n.y, r.y),
            t.x -= i.x,
            t.y -= i.y,
            e.x -= i.x,
            e.y -= i.y,
            n.x -= i.x,
            n.y -= i.y,
            r.x -= i.x,
            r.y -= i.y
        }
        ,
        e.prototype.safeHCoordinateIntersection = function(t, n, r, i) {
            var o = null;
            try {
                o = Ml.intersection(t, n, r, i)
            } catch (s) {
                if (!(s instanceof Cl))
                    throw s;
                o = e.nearestEndpoint(t, n, r, i)
            }
            return o
        }
        ,
        e.prototype.intersection = function(t, n, r, i) {
            var o = this.intersectionWithNormalization(t, n, r, i);
            return this.isInSegmentEnvelopes(o) || (o = new ul(e.nearestEndpoint(t, n, r, i))),
            null !== this._precisionModel && this._precisionModel.makePrecise(o),
            o
        }
        ,
        e.prototype.smallestInAbsValue = function(t, e, n, r) {
            var i = t
              , o = Math.abs(i);
            return Math.abs(e) < o && (i = e,
            o = Math.abs(e)),
            Math.abs(n) < o && (i = n,
            o = Math.abs(n)),
            Math.abs(r) < o && (i = r),
            i
        }
        ,
        e.prototype.checkDD = function(t, e, n, r, i) {
            var o = bl.intersection(t, e, n, r)
              , s = this.isInSegmentEnvelopes(o);
            Pl.out.println("DD in env = " + s + "  --------------------- " + o),
            i.distance(o) > 1e-4 && Pl.out.println("Distance = " + i.distance(o))
        }
        ,
        e.prototype.intersectionWithNormalization = function(t, e, n, r) {
            var i = new ul(t)
              , o = new ul(e)
              , s = new ul(n)
              , a = new ul(r)
              , u = new ul;
            this.normalizeToEnvCentre(i, o, s, a, u);
            var l = this.safeHCoordinateIntersection(i, o, s, a);
            return l.x += u.x,
            l.y += u.y,
            l
        }
        ,
        e.prototype.computeCollinearIntersection = function(e, n, r, i) {
            var o = Ll.intersects(e, n, r)
              , s = Ll.intersects(e, n, i)
              , a = Ll.intersects(r, i, e)
              , u = Ll.intersects(r, i, n);
            return o && s ? (this._intPt[0] = r,
            this._intPt[1] = i,
            t.COLLINEAR_INTERSECTION) : a && u ? (this._intPt[0] = e,
            this._intPt[1] = n,
            t.COLLINEAR_INTERSECTION) : o && a ? (this._intPt[0] = r,
            this._intPt[1] = e,
            !r.equals(e) || s || u ? t.COLLINEAR_INTERSECTION : t.POINT_INTERSECTION) : o && u ? (this._intPt[0] = r,
            this._intPt[1] = n,
            !r.equals(n) || s || a ? t.COLLINEAR_INTERSECTION : t.POINT_INTERSECTION) : s && a ? (this._intPt[0] = i,
            this._intPt[1] = e,
            !i.equals(e) || o || u ? t.COLLINEAR_INTERSECTION : t.POINT_INTERSECTION) : s && u ? (this._intPt[0] = i,
            this._intPt[1] = n,
            !i.equals(n) || o || a ? t.COLLINEAR_INTERSECTION : t.POINT_INTERSECTION) : t.NO_INTERSECTION
        }
        ,
        e.prototype.normalizeToEnvCentre = function(t, e, n, r, i) {
            var o = t.x < e.x ? t.x : e.x
              , s = t.y < e.y ? t.y : e.y
              , a = t.x > e.x ? t.x : e.x
              , u = t.y > e.y ? t.y : e.y
              , l = n.x < r.x ? n.x : r.x
              , c = n.y < r.y ? n.y : r.y
              , h = n.x > r.x ? n.x : r.x
              , p = n.y > r.y ? n.y : r.y
              , f = ((o > l ? o : l) + (a < h ? a : h)) / 2
              , g = ((s > c ? s : c) + (u < p ? u : p)) / 2;
            i.x = f,
            i.y = g,
            t.x -= i.x,
            t.y -= i.y,
            e.x -= i.x,
            e.y -= i.y,
            n.x -= i.x,
            n.y -= i.y,
            r.x -= i.x,
            r.y -= i.y
        }
        ,
        e.prototype.computeIntersect = function(e, n, r, i) {
            if (this._isProper = !1,
            !Ll.intersects(e, n, r, i))
                return t.NO_INTERSECTION;
            var o = Xl.orientationIndex(e, n, r)
              , s = Xl.orientationIndex(e, n, i);
            if (o > 0 && s > 0 || o < 0 && s < 0)
                return t.NO_INTERSECTION;
            var a = Xl.orientationIndex(r, i, e)
              , u = Xl.orientationIndex(r, i, n);
            return a > 0 && u > 0 || a < 0 && u < 0 ? t.NO_INTERSECTION : 0 === o && 0 === s && 0 === a && 0 === u ? this.computeCollinearIntersection(e, n, r, i) : (0 === o || 0 === s || 0 === a || 0 === u ? (this._isProper = !1,
            e.equals2D(r) || e.equals2D(i) ? this._intPt[0] = e : n.equals2D(r) || n.equals2D(i) ? this._intPt[0] = n : 0 === o ? this._intPt[0] = new ul(r) : 0 === s ? this._intPt[0] = new ul(i) : 0 === a ? this._intPt[0] = new ul(e) : 0 === u && (this._intPt[0] = new ul(n))) : (this._isProper = !0,
            this._intPt[0] = this.intersection(e, n, r, i)),
            t.POINT_INTERSECTION)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e.nearestEndpoint = function(t, e, n, r) {
            var i = t
              , o = Xl.distancePointLine(t, n, r)
              , s = Xl.distancePointLine(e, n, r);
            return s < o && (o = s,
            i = e),
            (s = Xl.distancePointLine(n, t, e)) < o && (o = s,
            i = n),
            (s = Xl.distancePointLine(r, t, e)) < o && (o = s,
            i = r),
            i
        }
        ,
        e
    }(Bl)
      , Ul = function() {};
    Ul.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ul.prototype.getClass = function() {
        return Ul
    }
    ,
    Ul.orientationIndex = function(t, e, n) {
        var r = e.x - t.x
          , i = e.y - t.y
          , o = n.x - e.x
          , s = n.y - e.y;
        return Ul.signOfDet2x2(r, i, o, s)
    }
    ,
    Ul.signOfDet2x2 = function(t, e, n, r) {
        var i = null
          , o = null
          , s = null;
        if (i = 1,
        0 === t || 0 === r)
            return 0 === e || 0 === n ? 0 : e > 0 ? n > 0 ? -i : i : n > 0 ? i : -i;
        if (0 === e || 0 === n)
            return r > 0 ? t > 0 ? i : -i : t > 0 ? -i : i;
        if (e > 0 ? r > 0 ? e <= r || (i = -i,
        o = t,
        t = n,
        n = o,
        o = e,
        e = r,
        r = o) : e <= -r ? (i = -i,
        n = -n,
        r = -r) : (o = t,
        t = -n,
        n = o,
        o = e,
        e = -r,
        r = o) : r > 0 ? -e <= r ? (i = -i,
        t = -t,
        e = -e) : (o = -t,
        t = n,
        n = o,
        o = -e,
        e = r,
        r = o) : e >= r ? (t = -t,
        e = -e,
        n = -n,
        r = -r) : (i = -i,
        o = -t,
        t = -n,
        n = o,
        o = -e,
        e = -r,
        r = o),
        t > 0) {
            if (!(n > 0))
                return i;
            if (!(t <= n))
                return i
        } else {
            if (n > 0)
                return -i;
            if (!(t >= n))
                return -i;
            i = -i,
            t = -t,
            n = -n
        }
        for (; ; ) {
            if ((r -= (s = Math.floor(n / t)) * e) < 0)
                return -i;
            if (r > e)
                return i;
            if (t > (n -= s * t) + n) {
                if (e < r + r)
                    return i
            } else {
                if (e > r + r)
                    return -i;
                n = t - n,
                r = e - r,
                i = -i
            }
            if (0 === r)
                return 0 === n ? 0 : -i;
            if (0 === n)
                return i;
            if ((e -= (s = Math.floor(t / n)) * r) < 0)
                return i;
            if (e > r)
                return -i;
            if (n > (t -= s * n) + t) {
                if (r < e + e)
                    return -i
            } else {
                if (r > e + e)
                    return i;
                t = n - t,
                e = r - e,
                i = -i
            }
            if (0 === e)
                return 0 === t ? 0 : i;
            if (0 === t)
                return -i
        }
    }
    ;
    var Vl = function() {
        this._p = null,
        this._crossingCount = 0,
        this._isPointOnSegment = !1;
        var t = arguments[0];
        this._p = t
    };
    Vl.prototype.countSegment = function(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) {
            var n = t.x
              , r = e.x;
            return n > r && (n = e.x,
            r = t.x),
            this._p.x >= n && this._p.x <= r && (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) {
            var i = t.x - this._p.x
              , o = t.y - this._p.y
              , s = e.x - this._p.x
              , a = e.y - this._p.y
              , u = Ul.signOfDet2x2(i, o, s, a);
            if (0 === u)
                return this._isPointOnSegment = !0,
                null;
            a < o && (u = -u),
            u > 0 && this._crossingCount++
        }
    }
    ,
    Vl.prototype.isPointInPolygon = function() {
        return this.getLocation() !== pl.EXTERIOR
    }
    ,
    Vl.prototype.getLocation = function() {
        return this._isPointOnSegment ? pl.BOUNDARY : this._crossingCount % 2 == 1 ? pl.INTERIOR : pl.EXTERIOR
    }
    ,
    Vl.prototype.isOnSegment = function() {
        return this._isPointOnSegment
    }
    ,
    Vl.prototype.interfaces_ = function() {
        return []
    }
    ,
    Vl.prototype.getClass = function() {
        return Vl
    }
    ,
    Vl.locatePointInRing = function() {
        if (arguments[0]instanceof ul && gl(arguments[1], Il)) {
            for (var t = arguments[0], e = arguments[1], n = new Vl(t), r = new ul, i = new ul, o = 1; o < e.size(); o++)
                if (e.getCoordinate(o, r),
                e.getCoordinate(o - 1, i),
                n.countSegment(r, i),
                n.isOnSegment())
                    return n.getLocation();
            return n.getLocation()
        }
        if (arguments[0]instanceof ul && arguments[1]instanceof Array) {
            for (var s = arguments[0], a = arguments[1], u = new Vl(s), l = 1; l < a.length; l++) {
                var c = a[l]
                  , h = a[l - 1];
                if (u.countSegment(c, h),
                u.isOnSegment())
                    return u.getLocation()
            }
            return u.getLocation()
        }
    }
    ;
    var Xl = function() {}
      , Yl = {
        CLOCKWISE: {
            configurable: !0
        },
        RIGHT: {
            configurable: !0
        },
        COUNTERCLOCKWISE: {
            configurable: !0
        },
        LEFT: {
            configurable: !0
        },
        COLLINEAR: {
            configurable: !0
        },
        STRAIGHT: {
            configurable: !0
        }
    };
    Xl.prototype.interfaces_ = function() {
        return []
    }
    ,
    Xl.prototype.getClass = function() {
        return Xl
    }
    ,
    Xl.orientationIndex = function(t, e, n) {
        return bl.orientationIndex(t, e, n)
    }
    ,
    Xl.signedArea = function() {
        if (arguments[0]instanceof Array) {
            var t = arguments[0];
            if (t.length < 3)
                return 0;
            for (var e = 0, n = t[0].x, r = 1; r < t.length - 1; r++) {
                var i = t[r].x - n
                  , o = t[r + 1].y
                  , s = t[r - 1].y;
                e += i * (s - o)
            }
            return e / 2
        }
        if (gl(arguments[0], Il)) {
            var a = arguments[0]
              , u = a.size();
            if (u < 3)
                return 0;
            var l = new ul
              , c = new ul
              , h = new ul;
            a.getCoordinate(0, c),
            a.getCoordinate(1, h);
            var p = c.x;
            h.x -= p;
            for (var f = 0, g = 1; g < u - 1; g++)
                l.y = c.y,
                c.x = h.x,
                c.y = h.y,
                a.getCoordinate(g + 1, h),
                h.x -= p,
                f += c.x * (l.y - h.y);
            return f / 2
        }
    }
    ,
    Xl.distanceLineLine = function(t, e, n, r) {
        if (t.equals(e))
            return Xl.distancePointLine(t, n, r);
        if (n.equals(r))
            return Xl.distancePointLine(r, t, e);
        var i = !1;
        if (Ll.intersects(t, e, n, r)) {
            var o = (e.x - t.x) * (r.y - n.y) - (e.y - t.y) * (r.x - n.x);
            if (0 === o)
                i = !0;
            else {
                var s = (t.y - n.y) * (r.x - n.x) - (t.x - n.x) * (r.y - n.y)
                  , a = ((t.y - n.y) * (e.x - t.x) - (t.x - n.x) * (e.y - t.y)) / o
                  , u = s / o;
                (u < 0 || u > 1 || a < 0 || a > 1) && (i = !0)
            }
        } else
            i = !0;
        return i ? dl.min(Xl.distancePointLine(t, n, r), Xl.distancePointLine(e, n, r), Xl.distancePointLine(n, t, e), Xl.distancePointLine(r, t, e)) : 0
    }
    ,
    Xl.isPointInRing = function(t, e) {
        return Xl.locatePointInRing(t, e) !== pl.EXTERIOR
    }
    ,
    Xl.computeLength = function(t) {
        var e = t.size();
        if (e <= 1)
            return 0;
        var n = 0
          , r = new ul;
        t.getCoordinate(0, r);
        for (var i = r.x, o = r.y, s = 1; s < e; s++) {
            t.getCoordinate(s, r);
            var a = r.x
              , u = r.y
              , l = a - i
              , c = u - o;
            n += Math.sqrt(l * l + c * c),
            i = a,
            o = u
        }
        return n
    }
    ,
    Xl.isCCW = function(t) {
        var e = t.length - 1;
        if (e < 3)
            throw new el("Ring has fewer than 4 points, so orientation cannot be determined");
        for (var n = t[0], r = 0, i = 1; i <= e; i++) {
            var o = t[i];
            o.y > n.y && (n = o,
            r = i)
        }
        var s = r;
        do {
            (s -= 1) < 0 && (s = e)
        } while (t[s].equals2D(n) && s !== r);
        var a = r;
        do {
            a = (a + 1) % e
        } while (t[a].equals2D(n) && a !== r);
        var u = t[s]
          , l = t[a];
        if (u.equals2D(n) || l.equals2D(n) || u.equals2D(l))
            return !1;
        var c = Xl.computeOrientation(u, n, l)
          , h = !1;
        return h = 0 === c ? u.x > l.x : c > 0,
        h
    }
    ,
    Xl.locatePointInRing = function(t, e) {
        return Vl.locatePointInRing(t, e)
    }
    ,
    Xl.distancePointLinePerpendicular = function(t, e, n) {
        var r = (n.x - e.x) * (n.x - e.x) + (n.y - e.y) * (n.y - e.y)
          , i = ((e.y - t.y) * (n.x - e.x) - (e.x - t.x) * (n.y - e.y)) / r;
        return Math.abs(i) * Math.sqrt(r)
    }
    ,
    Xl.computeOrientation = function(t, e, n) {
        return Xl.orientationIndex(t, e, n)
    }
    ,
    Xl.distancePointLine = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1];
            if (0 === e.length)
                throw new el("Line array must contain at least one vertex");
            for (var n = t.distance(e[0]), r = 0; r < e.length - 1; r++) {
                var i = Xl.distancePointLine(t, e[r], e[r + 1]);
                i < n && (n = i)
            }
            return n
        }
        if (3 === arguments.length) {
            var o = arguments[0]
              , s = arguments[1]
              , a = arguments[2];
            if (s.x === a.x && s.y === a.y)
                return o.distance(s);
            var u = (a.x - s.x) * (a.x - s.x) + (a.y - s.y) * (a.y - s.y)
              , l = ((o.x - s.x) * (a.x - s.x) + (o.y - s.y) * (a.y - s.y)) / u;
            if (l <= 0)
                return o.distance(s);
            if (l >= 1)
                return o.distance(a);
            var c = ((s.y - o.y) * (a.x - s.x) - (s.x - o.x) * (a.y - s.y)) / u;
            return Math.abs(c) * Math.sqrt(u)
        }
    }
    ,
    Xl.isOnLine = function(t, e) {
        for (var n = new jl, r = 1; r < e.length; r++) {
            var i = e[r - 1]
              , o = e[r];
            if (n.computeIntersection(t, i, o),
            n.hasIntersection())
                return !0
        }
        return !1
    }
    ,
    Yl.CLOCKWISE.get = function() {
        return -1
    }
    ,
    Yl.RIGHT.get = function() {
        return Xl.CLOCKWISE
    }
    ,
    Yl.COUNTERCLOCKWISE.get = function() {
        return 1
    }
    ,
    Yl.LEFT.get = function() {
        return Xl.COUNTERCLOCKWISE
    }
    ,
    Yl.COLLINEAR.get = function() {
        return 0
    }
    ,
    Yl.STRAIGHT.get = function() {
        return Xl.COLLINEAR
    }
    ,
    Object.defineProperties(Xl, Yl);
    var Hl = function() {};
    Hl.prototype.filter = function(t) {}
    ,
    Hl.prototype.interfaces_ = function() {
        return []
    }
    ,
    Hl.prototype.getClass = function() {
        return Hl
    }
    ;
    var Wl = function() {
        var t = arguments[0];
        this._envelope = null,
        this._factory = null,
        this._SRID = null,
        this._userData = null,
        this._factory = t,
        this._SRID = t.getSRID()
    }
      , Jl = {
        serialVersionUID: {
            configurable: !0
        },
        SORTINDEX_POINT: {
            configurable: !0
        },
        SORTINDEX_MULTIPOINT: {
            configurable: !0
        },
        SORTINDEX_LINESTRING: {
            configurable: !0
        },
        SORTINDEX_LINEARRING: {
            configurable: !0
        },
        SORTINDEX_MULTILINESTRING: {
            configurable: !0
        },
        SORTINDEX_POLYGON: {
            configurable: !0
        },
        SORTINDEX_MULTIPOLYGON: {
            configurable: !0
        },
        SORTINDEX_GEOMETRYCOLLECTION: {
            configurable: !0
        },
        geometryChangedFilter: {
            configurable: !0
        }
    };
    Wl.prototype.isGeometryCollection = function() {
        return this.getSortIndex() === Wl.SORTINDEX_GEOMETRYCOLLECTION
    }
    ,
    Wl.prototype.getFactory = function() {
        return this._factory
    }
    ,
    Wl.prototype.getGeometryN = function(t) {
        return this
    }
    ,
    Wl.prototype.getArea = function() {
        return 0
    }
    ,
    Wl.prototype.isRectangle = function() {
        return !1
    }
    ,
    Wl.prototype.equals = function() {
        if (arguments[0]instanceof Wl) {
            var t = arguments[0];
            return null !== t && this.equalsTopo(t)
        }
        if (arguments[0]instanceof Object) {
            var e = arguments[0];
            if (!(e instanceof Wl))
                return !1;
            var n = e;
            return this.equalsExact(n)
        }
    }
    ,
    Wl.prototype.equalsExact = function(t) {
        return this === t || this.equalsExact(t, 0)
    }
    ,
    Wl.prototype.geometryChanged = function() {
        this.apply(Wl.geometryChangedFilter)
    }
    ,
    Wl.prototype.geometryChangedAction = function() {
        this._envelope = null
    }
    ,
    Wl.prototype.equalsNorm = function(t) {
        return null !== t && this.norm().equalsExact(t.norm())
    }
    ,
    Wl.prototype.getLength = function() {
        return 0
    }
    ,
    Wl.prototype.getNumGeometries = function() {
        return 1
    }
    ,
    Wl.prototype.compareTo = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = t;
            return this.getSortIndex() !== e.getSortIndex() ? this.getSortIndex() - e.getSortIndex() : this.isEmpty() && e.isEmpty() ? 0 : this.isEmpty() ? -1 : e.isEmpty() ? 1 : this.compareToSameClass(t)
        }
        if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            return this.getSortIndex() !== n.getSortIndex() ? this.getSortIndex() - n.getSortIndex() : this.isEmpty() && n.isEmpty() ? 0 : this.isEmpty() ? -1 : n.isEmpty() ? 1 : this.compareToSameClass(n, r)
        }
    }
    ,
    Wl.prototype.getUserData = function() {
        return this._userData
    }
    ,
    Wl.prototype.getSRID = function() {
        return this._SRID
    }
    ,
    Wl.prototype.getEnvelope = function() {
        return this.getFactory().toGeometry(this.getEnvelopeInternal())
    }
    ,
    Wl.prototype.checkNotGeometryCollection = function(t) {
        if (t.getSortIndex() === Wl.SORTINDEX_GEOMETRYCOLLECTION)
            throw new el("This method does not support GeometryCollection arguments")
    }
    ,
    Wl.prototype.equal = function(t, e, n) {
        return 0 === n ? t.equals(e) : t.distance(e) <= n
    }
    ,
    Wl.prototype.norm = function() {
        var t = this.copy();
        return t.normalize(),
        t
    }
    ,
    Wl.prototype.getPrecisionModel = function() {
        return this._factory.getPrecisionModel()
    }
    ,
    Wl.prototype.getEnvelopeInternal = function() {
        return null === this._envelope && (this._envelope = this.computeEnvelopeInternal()),
        new Ll(this._envelope)
    }
    ,
    Wl.prototype.setSRID = function(t) {
        this._SRID = t
    }
    ,
    Wl.prototype.setUserData = function(t) {
        this._userData = t
    }
    ,
    Wl.prototype.compare = function(t, e) {
        for (var n = t.iterator(), r = e.iterator(); n.hasNext() && r.hasNext(); ) {
            var i = n.next()
              , o = r.next()
              , s = i.compareTo(o);
            if (0 !== s)
                return s
        }
        return n.hasNext() ? 1 : r.hasNext() ? -1 : 0
    }
    ,
    Wl.prototype.hashCode = function() {
        return this.getEnvelopeInternal().hashCode()
    }
    ,
    Wl.prototype.isGeometryCollectionOrDerived = function() {
        return this.getSortIndex() === Wl.SORTINDEX_GEOMETRYCOLLECTION || this.getSortIndex() === Wl.SORTINDEX_MULTIPOINT || this.getSortIndex() === Wl.SORTINDEX_MULTILINESTRING || this.getSortIndex() === Wl.SORTINDEX_MULTIPOLYGON
    }
    ,
    Wl.prototype.interfaces_ = function() {
        return [ol, il, al]
    }
    ,
    Wl.prototype.getClass = function() {
        return Wl
    }
    ,
    Wl.hasNonEmptyElements = function(t) {
        for (var e = 0; e < t.length; e++)
            if (!t[e].isEmpty())
                return !0;
        return !1
    }
    ,
    Wl.hasNullElements = function(t) {
        for (var e = 0; e < t.length; e++)
            if (null === t[e])
                return !0;
        return !1
    }
    ,
    Jl.serialVersionUID.get = function() {
        return 0x799ea46522854c00
    }
    ,
    Jl.SORTINDEX_POINT.get = function() {
        return 0
    }
    ,
    Jl.SORTINDEX_MULTIPOINT.get = function() {
        return 1
    }
    ,
    Jl.SORTINDEX_LINESTRING.get = function() {
        return 2
    }
    ,
    Jl.SORTINDEX_LINEARRING.get = function() {
        return 3
    }
    ,
    Jl.SORTINDEX_MULTILINESTRING.get = function() {
        return 4
    }
    ,
    Jl.SORTINDEX_POLYGON.get = function() {
        return 5
    }
    ,
    Jl.SORTINDEX_MULTIPOLYGON.get = function() {
        return 6
    }
    ,
    Jl.SORTINDEX_GEOMETRYCOLLECTION.get = function() {
        return 7
    }
    ,
    Jl.geometryChangedFilter.get = function() {
        return Zl
    }
    ,
    Object.defineProperties(Wl, Jl);
    var Zl = function() {};
    Zl.interfaces_ = function() {
        return [Hl]
    }
    ,
    Zl.filter = function(t) {
        t.geometryChangedAction()
    }
    ;
    var Kl = function() {};
    Kl.prototype.filter = function(t) {}
    ,
    Kl.prototype.interfaces_ = function() {
        return []
    }
    ,
    Kl.prototype.getClass = function() {
        return Kl
    }
    ;
    var Ql = function() {}
      , $l = {
        Mod2BoundaryNodeRule: {
            configurable: !0
        },
        EndPointBoundaryNodeRule: {
            configurable: !0
        },
        MultiValentEndPointBoundaryNodeRule: {
            configurable: !0
        },
        MonoValentEndPointBoundaryNodeRule: {
            configurable: !0
        },
        MOD2_BOUNDARY_RULE: {
            configurable: !0
        },
        ENDPOINT_BOUNDARY_RULE: {
            configurable: !0
        },
        MULTIVALENT_ENDPOINT_BOUNDARY_RULE: {
            configurable: !0
        },
        MONOVALENT_ENDPOINT_BOUNDARY_RULE: {
            configurable: !0
        },
        OGC_SFS_BOUNDARY_RULE: {
            configurable: !0
        }
    };
    Ql.prototype.isInBoundary = function(t) {}
    ,
    Ql.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ql.prototype.getClass = function() {
        return Ql
    }
    ,
    $l.Mod2BoundaryNodeRule.get = function() {
        return tc
    }
    ,
    $l.EndPointBoundaryNodeRule.get = function() {
        return ec
    }
    ,
    $l.MultiValentEndPointBoundaryNodeRule.get = function() {
        return nc
    }
    ,
    $l.MonoValentEndPointBoundaryNodeRule.get = function() {
        return rc
    }
    ,
    $l.MOD2_BOUNDARY_RULE.get = function() {
        return new tc
    }
    ,
    $l.ENDPOINT_BOUNDARY_RULE.get = function() {
        return new ec
    }
    ,
    $l.MULTIVALENT_ENDPOINT_BOUNDARY_RULE.get = function() {
        return new nc
    }
    ,
    $l.MONOVALENT_ENDPOINT_BOUNDARY_RULE.get = function() {
        return new rc
    }
    ,
    $l.OGC_SFS_BOUNDARY_RULE.get = function() {
        return Ql.MOD2_BOUNDARY_RULE
    }
    ,
    Object.defineProperties(Ql, $l);
    var tc = function() {};
    tc.prototype.isInBoundary = function(t) {
        return t % 2 == 1
    }
    ,
    tc.prototype.interfaces_ = function() {
        return [Ql]
    }
    ,
    tc.prototype.getClass = function() {
        return tc
    }
    ;
    var ec = function() {};
    ec.prototype.isInBoundary = function(t) {
        return t > 0
    }
    ,
    ec.prototype.interfaces_ = function() {
        return [Ql]
    }
    ,
    ec.prototype.getClass = function() {
        return ec
    }
    ;
    var nc = function() {};
    nc.prototype.isInBoundary = function(t) {
        return t > 1
    }
    ,
    nc.prototype.interfaces_ = function() {
        return [Ql]
    }
    ,
    nc.prototype.getClass = function() {
        return nc
    }
    ;
    var rc = function() {};
    rc.prototype.isInBoundary = function(t) {
        return 1 === t
    }
    ,
    rc.prototype.interfaces_ = function() {
        return [Ql]
    }
    ,
    rc.prototype.getClass = function() {
        return rc
    }
    ;
    var ic = function() {};
    function oc(t) {
        this.message = t || ""
    }
    ic.prototype.add = function() {}
    ,
    ic.prototype.addAll = function() {}
    ,
    ic.prototype.isEmpty = function() {}
    ,
    ic.prototype.iterator = function() {}
    ,
    ic.prototype.size = function() {}
    ,
    ic.prototype.toArray = function() {}
    ,
    ic.prototype.remove = function() {}
    ,
    oc.prototype = new Error,
    oc.prototype.name = "IndexOutOfBoundsException";
    var sc = function() {};
    sc.prototype.hasNext = function() {}
    ,
    sc.prototype.next = function() {}
    ,
    sc.prototype.remove = function() {}
    ;
    var ac = function(t) {
        function e() {
            t.apply(this, arguments)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.get = function() {}
        ,
        e.prototype.set = function() {}
        ,
        e.prototype.isEmpty = function() {}
        ,
        e
    }(ic);
    function uc(t) {
        this.message = t || ""
    }
    uc.prototype = new Error,
    uc.prototype.name = "NoSuchElementException";
    var lc = function(t) {
        function e() {
            t.call(this),
            this.array_ = [],
            arguments[0]instanceof ic && this.addAll(arguments[0])
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.ensureCapacity = function() {}
        ,
        e.prototype.interfaces_ = function() {
            return [t, ic]
        }
        ,
        e.prototype.add = function(t) {
            return 1 === arguments.length ? this.array_.push(t) : this.array_.splice(arguments[0], arguments[1]),
            !0
        }
        ,
        e.prototype.clear = function() {
            this.array_ = []
        }
        ,
        e.prototype.addAll = function(t) {
            for (var e = t.iterator(); e.hasNext(); )
                this.add(e.next());
            return !0
        }
        ,
        e.prototype.set = function(t, e) {
            var n = this.array_[t];
            return this.array_[t] = e,
            n
        }
        ,
        e.prototype.iterator = function() {
            return new cc(this)
        }
        ,
        e.prototype.get = function(t) {
            if (t < 0 || t >= this.size())
                throw new oc;
            return this.array_[t]
        }
        ,
        e.prototype.isEmpty = function() {
            return 0 === this.array_.length
        }
        ,
        e.prototype.size = function() {
            return this.array_.length
        }
        ,
        e.prototype.toArray = function() {
            for (var t = [], e = 0, n = this.array_.length; e < n; e++)
                t.push(this.array_[e]);
            return t
        }
        ,
        e.prototype.remove = function(t) {
            for (var e = !1, n = 0, r = this.array_.length; n < r; n++)
                if (this.array_[n] === t) {
                    this.array_.splice(n, 1),
                    e = !0;
                    break
                }
            return e
        }
        ,
        e
    }(ac)
      , cc = function(t) {
        function e(e) {
            t.call(this),
            this.arrayList_ = e,
            this.position_ = 0
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.next = function() {
            if (this.position_ === this.arrayList_.size())
                throw new uc;
            return this.arrayList_.get(this.position_++)
        }
        ,
        e.prototype.hasNext = function() {
            return this.position_ < this.arrayList_.size()
        }
        ,
        e.prototype.set = function(t) {
            return this.arrayList_.set(this.position_ - 1, t)
        }
        ,
        e.prototype.remove = function() {
            this.arrayList_.remove(this.arrayList_.get(this.position_))
        }
        ,
        e
    }(sc)
      , hc = function(t) {
        function e() {
            if (t.call(this),
            0 === arguments.length)
                ;
            else if (1 === arguments.length) {
                var e = arguments[0];
                this.ensureCapacity(e.length),
                this.add(e, !0)
            } else if (2 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1];
                this.ensureCapacity(n.length),
                this.add(n, r)
            }
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            coordArrayType: {
                configurable: !0
            }
        };
        return n.coordArrayType.get = function() {
            return new Array(0).fill(null)
        }
        ,
        e.prototype.getCoordinate = function(t) {
            return this.get(t)
        }
        ,
        e.prototype.addAll = function() {
            var e = this;
            if (2 === arguments.length) {
                for (var n = arguments[0], r = arguments[1], i = !1, o = n.iterator(); o.hasNext(); )
                    e.add(o.next(), r),
                    i = !0;
                return i
            }
            return t.prototype.addAll.apply(this, arguments)
        }
        ,
        e.prototype.clone = function() {
            for (var e = t.prototype.clone.call(this), n = 0; n < this.size(); n++)
                e.add(n, this.get(n).copy());
            return e
        }
        ,
        e.prototype.toCoordinateArray = function() {
            return this.toArray(e.coordArrayType)
        }
        ,
        e.prototype.add = function() {
            var e = this;
            if (1 === arguments.length) {
                var n = arguments[0];
                t.prototype.add.call(this, n)
            } else if (2 === arguments.length) {
                if (arguments[0]instanceof Array && "boolean" == typeof arguments[1]) {
                    var r = arguments[0]
                      , i = arguments[1];
                    return this.add(r, i, !0),
                    !0
                }
                if (arguments[0]instanceof ul && "boolean" == typeof arguments[1]) {
                    var o = arguments[0]
                      , s = arguments[1];
                    if (!s && this.size() >= 1) {
                        var a = this.get(this.size() - 1);
                        if (a.equals2D(o))
                            return null
                    }
                    t.prototype.add.call(this, o)
                } else if (arguments[0]instanceof Object && "boolean" == typeof arguments[1]) {
                    var u = arguments[0]
                      , l = arguments[1];
                    return this.add(u, l),
                    !0
                }
            } else if (3 === arguments.length) {
                if ("boolean" == typeof arguments[2] && arguments[0]instanceof Array && "boolean" == typeof arguments[1]) {
                    var c = arguments[0]
                      , h = arguments[1]
                      , p = arguments[2];
                    if (p)
                        for (var f = 0; f < c.length; f++)
                            e.add(c[f], h);
                    else
                        for (var g = c.length - 1; g >= 0; g--)
                            e.add(c[g], h);
                    return !0
                }
                if ("boolean" == typeof arguments[2] && Number.isInteger(arguments[0]) && arguments[1]instanceof ul) {
                    var d = arguments[0]
                      , y = arguments[1]
                      , v = arguments[2];
                    if (!v) {
                        var _ = this.size();
                        if (_ > 0) {
                            if (d > 0) {
                                var m = this.get(d - 1);
                                if (m.equals2D(y))
                                    return null
                            }
                            if (d < _) {
                                var x = this.get(d);
                                if (x.equals2D(y))
                                    return null
                            }
                        }
                    }
                    t.prototype.add.call(this, d, y)
                }
            } else if (4 === arguments.length) {
                var E = arguments[0]
                  , b = arguments[1]
                  , w = arguments[2]
                  , I = arguments[3]
                  , N = 1;
                w > I && (N = -1);
                for (var S = w; S !== I; S += N)
                    e.add(E[S], b);
                return !0
            }
        }
        ,
        e.prototype.closeRing = function() {
            this.size() > 0 && this.add(new ul(this.get(0)), !1)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        Object.defineProperties(e, n),
        e
    }(lc)
      , pc = function() {}
      , fc = {
        ForwardComparator: {
            configurable: !0
        },
        BidirectionalComparator: {
            configurable: !0
        },
        coordArrayType: {
            configurable: !0
        }
    };
    fc.ForwardComparator.get = function() {
        return gc
    }
    ,
    fc.BidirectionalComparator.get = function() {
        return dc
    }
    ,
    fc.coordArrayType.get = function() {
        return new Array(0).fill(null)
    }
    ,
    pc.prototype.interfaces_ = function() {
        return []
    }
    ,
    pc.prototype.getClass = function() {
        return pc
    }
    ,
    pc.isRing = function(t) {
        return !(t.length < 4) && !!t[0].equals2D(t[t.length - 1])
    }
    ,
    pc.ptNotInList = function(t, e) {
        for (var n = 0; n < t.length; n++) {
            var r = t[n];
            if (pc.indexOf(r, e) < 0)
                return r
        }
        return null
    }
    ,
    pc.scroll = function(t, e) {
        var n = pc.indexOf(e, t);
        if (n < 0)
            return null;
        var r = new Array(t.length).fill(null);
        Pl.arraycopy(t, n, r, 0, t.length - n),
        Pl.arraycopy(t, 0, r, t.length - n, n),
        Pl.arraycopy(r, 0, t, 0, t.length)
    }
    ,
    pc.equals = function() {
        if (2 === arguments.length) {
            var 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 (var n = 0; n < t.length; n++)
                if (!t[n].equals(e[n]))
                    return !1;
            return !0
        }
        if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2];
            if (r === i)
                return !0;
            if (null === r || null === i)
                return !1;
            if (r.length !== i.length)
                return !1;
            for (var s = 0; s < r.length; s++)
                if (0 !== o.compare(r[s], i[s]))
                    return !1;
            return !0
        }
    }
    ,
    pc.intersection = function(t, e) {
        for (var n = new hc, r = 0; r < t.length; r++)
            e.intersects(t[r]) && n.add(t[r], !0);
        return n.toCoordinateArray()
    }
    ,
    pc.hasRepeatedPoints = function(t) {
        for (var e = 1; e < t.length; e++)
            if (t[e - 1].equals(t[e]))
                return !0;
        return !1
    }
    ,
    pc.removeRepeatedPoints = function(t) {
        return pc.hasRepeatedPoints(t) ? new hc(t,!1).toCoordinateArray() : t
    }
    ,
    pc.reverse = function(t) {
        for (var e = t.length - 1, n = Math.trunc(e / 2), r = 0; r <= n; r++) {
            var i = t[r];
            t[r] = t[e - r],
            t[e - r] = i
        }
    }
    ,
    pc.removeNull = function(t) {
        for (var e = 0, n = 0; n < t.length; n++)
            null !== t[n] && e++;
        var r = new Array(e).fill(null);
        if (0 === e)
            return r;
        for (var i = 0, o = 0; o < t.length; o++)
            null !== t[o] && (r[i++] = t[o]);
        return r
    }
    ,
    pc.copyDeep = function() {
        if (1 === arguments.length) {
            for (var t = arguments[0], e = new Array(t.length).fill(null), n = 0; n < t.length; n++)
                e[n] = new ul(t[n]);
            return e
        }
        if (5 === arguments.length)
            for (var r = arguments[0], i = arguments[1], o = arguments[2], s = arguments[3], a = arguments[4], u = 0; u < a; u++)
                o[s + u] = new ul(r[i + u])
    }
    ,
    pc.isEqualReversed = function(t, e) {
        for (var n = 0; n < t.length; n++) {
            var r = t[n]
              , i = e[t.length - n - 1];
            if (0 !== r.compareTo(i))
                return !1
        }
        return !0
    }
    ,
    pc.envelope = function(t) {
        for (var e = new Ll, n = 0; n < t.length; n++)
            e.expandToInclude(t[n]);
        return e
    }
    ,
    pc.toCoordinateArray = function(t) {
        return t.toArray(pc.coordArrayType)
    }
    ,
    pc.atLeastNCoordinatesOrNothing = function(t, e) {
        return e.length >= t ? e : []
    }
    ,
    pc.indexOf = function(t, e) {
        for (var n = 0; n < e.length; n++)
            if (t.equals(e[n]))
                return n;
        return -1
    }
    ,
    pc.increasingDirection = function(t) {
        for (var e = 0; e < Math.trunc(t.length / 2); e++) {
            var n = t.length - 1 - e
              , r = t[e].compareTo(t[n]);
            if (0 !== r)
                return r
        }
        return 1
    }
    ,
    pc.compare = function(t, e) {
        for (var n = 0; n < t.length && n < e.length; ) {
            var r = t[n].compareTo(e[n]);
            if (0 !== r)
                return r;
            n++
        }
        return n < e.length ? -1 : n < t.length ? 1 : 0
    }
    ,
    pc.minCoordinate = function(t) {
        for (var e = null, n = 0; n < t.length; n++)
            (null === e || e.compareTo(t[n]) > 0) && (e = t[n]);
        return e
    }
    ,
    pc.extract = function(t, e, n) {
        e = dl.clamp(e, 0, t.length);
        var r = (n = dl.clamp(n, -1, t.length)) - e + 1;
        n < 0 && (r = 0),
        e >= t.length && (r = 0),
        n < e && (r = 0);
        var i = new Array(r).fill(null);
        if (0 === r)
            return i;
        for (var o = 0, s = e; s <= n; s++)
            i[o++] = t[s];
        return i
    }
    ,
    Object.defineProperties(pc, fc);
    var gc = function() {};
    gc.prototype.compare = function(t, e) {
        return pc.compare(t, e)
    }
    ,
    gc.prototype.interfaces_ = function() {
        return [sl]
    }
    ,
    gc.prototype.getClass = function() {
        return gc
    }
    ;
    var dc = function() {};
    dc.prototype.compare = function(t, e) {
        var n = t
          , r = e;
        if (n.length < r.length)
            return -1;
        if (n.length > r.length)
            return 1;
        if (0 === n.length)
            return 0;
        var i = pc.compare(n, r);
        return pc.isEqualReversed(n, r) ? 0 : i
    }
    ,
    dc.prototype.OLDcompare = function(t, e) {
        var n = t
          , r = e;
        if (n.length < r.length)
            return -1;
        if (n.length > r.length)
            return 1;
        if (0 === n.length)
            return 0;
        for (var i = pc.increasingDirection(n), o = pc.increasingDirection(r), s = i > 0 ? 0 : n.length - 1, a = o > 0 ? 0 : n.length - 1, u = 0; u < n.length; u++) {
            var l = n[s].compareTo(r[a]);
            if (0 !== l)
                return l;
            s += i,
            a += o
        }
        return 0
    }
    ,
    dc.prototype.interfaces_ = function() {
        return [sl]
    }
    ,
    dc.prototype.getClass = function() {
        return dc
    }
    ;
    var yc = function() {};
    yc.prototype.get = function() {}
    ,
    yc.prototype.put = function() {}
    ,
    yc.prototype.size = function() {}
    ,
    yc.prototype.values = function() {}
    ,
    yc.prototype.entrySet = function() {}
    ;
    var vc = function(t) {
        function e() {
            t.apply(this, arguments)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e
    }(yc);
    function _c(t) {
        this.message = t || ""
    }
    function mc() {}
    _c.prototype = new Error,
    _c.prototype.name = "OperationNotSupported",
    mc.prototype = new ic,
    mc.prototype.contains = function() {}
    ;
    var xc = function(t) {
        function e() {
            t.call(this),
            this.array_ = [],
            arguments[0]instanceof ic && this.addAll(arguments[0])
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.contains = function(t) {
            for (var e = 0, n = this.array_.length; e < n; e++) {
                if (this.array_[e] === t)
                    return !0
            }
            return !1
        }
        ,
        e.prototype.add = function(t) {
            return !this.contains(t) && (this.array_.push(t),
            !0)
        }
        ,
        e.prototype.addAll = function(t) {
            for (var e = t.iterator(); e.hasNext(); )
                this.add(e.next());
            return !0
        }
        ,
        e.prototype.remove = function(t) {
            throw new Error
        }
        ,
        e.prototype.size = function() {
            return this.array_.length
        }
        ,
        e.prototype.isEmpty = function() {
            return 0 === this.array_.length
        }
        ,
        e.prototype.toArray = function() {
            for (var t = [], e = 0, n = this.array_.length; e < n; e++)
                t.push(this.array_[e]);
            return t
        }
        ,
        e.prototype.iterator = function() {
            return new Ec(this)
        }
        ,
        e
    }(mc)
      , Ec = function(t) {
        function e(e) {
            t.call(this),
            this.hashSet_ = e,
            this.position_ = 0
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.next = function() {
            if (this.position_ === this.hashSet_.size())
                throw new uc;
            return this.hashSet_.array_[this.position_++]
        }
        ,
        e.prototype.hasNext = function() {
            return this.position_ < this.hashSet_.size()
        }
        ,
        e.prototype.remove = function() {
            throw new _c
        }
        ,
        e
    }(sc);
    function bc(t) {
        return null === t ? 0 : t.color
    }
    function wc(t) {
        return null === t ? null : t.parent
    }
    function Ic(t, e) {
        null !== t && (t.color = e)
    }
    function Nc(t) {
        return null === t ? null : t.left
    }
    function Sc(t) {
        return null === t ? null : t.right
    }
    function Cc() {
        this.root_ = null,
        this.size_ = 0
    }
    Cc.prototype = new vc,
    Cc.prototype.get = function(t) {
        for (var e = this.root_; null !== e; ) {
            var n = t.compareTo(e.key);
            if (n < 0)
                e = e.left;
            else {
                if (!(n > 0))
                    return e.value;
                e = e.right
            }
        }
        return null
    }
    ,
    Cc.prototype.put = function(t, e) {
        if (null === this.root_)
            return this.root_ = {
                key: t,
                value: e,
                left: null,
                right: null,
                parent: null,
                color: 0,
                getValue: function() {
                    return this.value
                },
                getKey: function() {
                    return this.key
                }
            },
            this.size_ = 1,
            null;
        var n, r, i = this.root_;
        do {
            if (n = i,
            (r = t.compareTo(i.key)) < 0)
                i = i.left;
            else {
                if (!(r > 0)) {
                    var o = i.value;
                    return i.value = e,
                    o
                }
                i = i.right
            }
        } while (null !== i);
        var s = {
            key: t,
            left: null,
            right: null,
            value: e,
            parent: n,
            color: 0,
            getValue: function() {
                return this.value
            },
            getKey: function() {
                return this.key
            }
        };
        return r < 0 ? n.left = s : n.right = s,
        this.fixAfterInsertion(s),
        this.size_++,
        null
    }
    ,
    Cc.prototype.fixAfterInsertion = function(t) {
        var e = this;
        for (t.color = 1; null != t && t !== this.root_ && 1 === t.parent.color; )
            if (wc(t) === Nc(wc(wc(t)))) {
                var n = Sc(wc(wc(t)));
                1 === bc(n) ? (Ic(wc(t), 0),
                Ic(n, 0),
                Ic(wc(wc(t)), 1),
                t = wc(wc(t))) : (t === Sc(wc(t)) && (t = wc(t),
                e.rotateLeft(t)),
                Ic(wc(t), 0),
                Ic(wc(wc(t)), 1),
                e.rotateRight(wc(wc(t))))
            } else {
                var r = Nc(wc(wc(t)));
                1 === bc(r) ? (Ic(wc(t), 0),
                Ic(r, 0),
                Ic(wc(wc(t)), 1),
                t = wc(wc(t))) : (t === Nc(wc(t)) && (t = wc(t),
                e.rotateRight(t)),
                Ic(wc(t), 0),
                Ic(wc(wc(t)), 1),
                e.rotateLeft(wc(wc(t))))
            }
        this.root_.color = 0
    }
    ,
    Cc.prototype.values = function() {
        var t = new lc
          , e = this.getFirstEntry();
        if (null !== e)
            for (t.add(e.value); null !== (e = Cc.successor(e)); )
                t.add(e.value);
        return t
    }
    ,
    Cc.prototype.entrySet = function() {
        var t = new xc
          , e = this.getFirstEntry();
        if (null !== e)
            for (t.add(e); null !== (e = Cc.successor(e)); )
                t.add(e);
        return t
    }
    ,
    Cc.prototype.rotateLeft = function(t) {
        if (null != t) {
            var 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
        }
    }
    ,
    Cc.prototype.rotateRight = function(t) {
        if (null != t) {
            var 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
        }
    }
    ,
    Cc.prototype.getFirstEntry = function() {
        var t = this.root_;
        if (null != t)
            for (; null != t.left; )
                t = t.left;
        return t
    }
    ,
    Cc.successor = function(t) {
        if (null === t)
            return null;
        if (null !== t.right) {
            for (var e = t.right; null !== e.left; )
                e = e.left;
            return e
        }
        for (var n = t.parent, r = t; null !== n && r === n.right; )
            r = n,
            n = n.parent;
        return n
    }
    ,
    Cc.prototype.size = function() {
        return this.size_
    }
    ;
    var Pc = function() {};
    function Mc() {}
    function Lc() {
        this.array_ = [],
        arguments[0]instanceof ic && this.addAll(arguments[0])
    }
    Pc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Pc.prototype.getClass = function() {
        return Pc
    }
    ,
    Mc.prototype = new mc,
    Lc.prototype = new Mc,
    Lc.prototype.contains = function(t) {
        for (var e = 0, n = this.array_.length; e < n; e++) {
            if (0 === this.array_[e].compareTo(t))
                return !0
        }
        return !1
    }
    ,
    Lc.prototype.add = function(t) {
        if (this.contains(t))
            return !1;
        for (var e = 0, n = this.array_.length; e < n; e++) {
            if (1 === this.array_[e].compareTo(t))
                return this.array_.splice(e, 0, t),
                !0
        }
        return this.array_.push(t),
        !0
    }
    ,
    Lc.prototype.addAll = function(t) {
        for (var e = t.iterator(); e.hasNext(); )
            this.add(e.next());
        return !0
    }
    ,
    Lc.prototype.remove = function(t) {
        throw new _c
    }
    ,
    Lc.prototype.size = function() {
        return this.array_.length
    }
    ,
    Lc.prototype.isEmpty = function() {
        return 0 === this.array_.length
    }
    ,
    Lc.prototype.toArray = function() {
        for (var t = [], e = 0, n = this.array_.length; e < n; e++)
            t.push(this.array_[e]);
        return t
    }
    ,
    Lc.prototype.iterator = function() {
        return new Oc(this)
    }
    ;
    var Oc = function(t) {
        this.treeSet_ = t,
        this.position_ = 0
    };
    Oc.prototype.next = function() {
        if (this.position_ === this.treeSet_.size())
            throw new uc;
        return this.treeSet_.array_[this.position_++]
    }
    ,
    Oc.prototype.hasNext = function() {
        return this.position_ < this.treeSet_.size()
    }
    ,
    Oc.prototype.remove = function() {
        throw new _c
    }
    ;
    var Rc = function() {};
    Rc.sort = function() {
        var t, e, n, r, i = arguments[0];
        if (1 === arguments.length)
            r = function(t, e) {
                return t.compareTo(e)
            }
            ,
            i.sort(r);
        else if (2 === arguments.length)
            n = arguments[1],
            r = function(t, e) {
                return n.compare(t, e)
            }
            ,
            i.sort(r);
        else if (3 === arguments.length) {
            (e = i.slice(arguments[1], arguments[2])).sort();
            var o = i.slice(0, arguments[1]).concat(e, i.slice(arguments[2], i.length));
            for (i.splice(0, i.length),
            t = 0; t < o.length; t++)
                i.push(o[t])
        } else if (4 === arguments.length)
            for (e = i.slice(arguments[1], arguments[2]),
            n = arguments[3],
            r = function(t, e) {
                return n.compare(t, e)
            }
            ,
            e.sort(r),
            o = i.slice(0, arguments[1]).concat(e, i.slice(arguments[2], i.length)),
            i.splice(0, i.length),
            t = 0; t < o.length; t++)
                i.push(o[t])
    }
    ,
    Rc.asList = function(t) {
        for (var e = new lc, n = 0, r = t.length; n < r; n++)
            e.add(t[n]);
        return e
    }
    ;
    var Tc = function() {}
      , Ac = {
        P: {
            configurable: !0
        },
        L: {
            configurable: !0
        },
        A: {
            configurable: !0
        },
        FALSE: {
            configurable: !0
        },
        TRUE: {
            configurable: !0
        },
        DONTCARE: {
            configurable: !0
        },
        SYM_FALSE: {
            configurable: !0
        },
        SYM_TRUE: {
            configurable: !0
        },
        SYM_DONTCARE: {
            configurable: !0
        },
        SYM_P: {
            configurable: !0
        },
        SYM_L: {
            configurable: !0
        },
        SYM_A: {
            configurable: !0
        }
    };
    Ac.P.get = function() {
        return 0
    }
    ,
    Ac.L.get = function() {
        return 1
    }
    ,
    Ac.A.get = function() {
        return 2
    }
    ,
    Ac.FALSE.get = function() {
        return -1
    }
    ,
    Ac.TRUE.get = function() {
        return -2
    }
    ,
    Ac.DONTCARE.get = function() {
        return -3
    }
    ,
    Ac.SYM_FALSE.get = function() {
        return "F"
    }
    ,
    Ac.SYM_TRUE.get = function() {
        return "T"
    }
    ,
    Ac.SYM_DONTCARE.get = function() {
        return "*"
    }
    ,
    Ac.SYM_P.get = function() {
        return "0"
    }
    ,
    Ac.SYM_L.get = function() {
        return "1"
    }
    ,
    Ac.SYM_A.get = function() {
        return "2"
    }
    ,
    Tc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Tc.prototype.getClass = function() {
        return Tc
    }
    ,
    Tc.toDimensionSymbol = function(t) {
        switch (t) {
        case Tc.FALSE:
            return Tc.SYM_FALSE;
        case Tc.TRUE:
            return Tc.SYM_TRUE;
        case Tc.DONTCARE:
            return Tc.SYM_DONTCARE;
        case Tc.P:
            return Tc.SYM_P;
        case Tc.L:
            return Tc.SYM_L;
        case Tc.A:
            return Tc.SYM_A
        }
        throw new el("Unknown dimension value: " + t)
    }
    ,
    Tc.toDimensionValue = function(t) {
        switch (ml.toUpperCase(t)) {
        case Tc.SYM_FALSE:
            return Tc.FALSE;
        case Tc.SYM_TRUE:
            return Tc.TRUE;
        case Tc.SYM_DONTCARE:
            return Tc.DONTCARE;
        case Tc.SYM_P:
            return Tc.P;
        case Tc.SYM_L:
            return Tc.L;
        case Tc.SYM_A:
            return Tc.A
        }
        throw new el("Unknown dimension symbol: " + t)
    }
    ,
    Object.defineProperties(Tc, Ac);
    var Dc = function() {};
    Dc.prototype.filter = function(t) {}
    ,
    Dc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Dc.prototype.getClass = function() {
        return Dc
    }
    ;
    var Fc = function() {};
    Fc.prototype.filter = function(t, e) {}
    ,
    Fc.prototype.isDone = function() {}
    ,
    Fc.prototype.isGeometryChanged = function() {}
    ,
    Fc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Fc.prototype.getClass = function() {
        return Fc
    }
    ;
    var kc = function(t) {
        function e(e, n) {
            if (t.call(this, n),
            this._geometries = e || [],
            t.hasNullElements(this._geometries))
                throw new el("geometries must not contain null elements")
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.computeEnvelopeInternal = function() {
            for (var t = new Ll, e = 0; e < this._geometries.length; e++)
                t.expandToInclude(this._geometries[e].getEnvelopeInternal());
            return t
        }
        ,
        e.prototype.getGeometryN = function(t) {
            return this._geometries[t]
        }
        ,
        e.prototype.getSortIndex = function() {
            return t.SORTINDEX_GEOMETRYCOLLECTION
        }
        ,
        e.prototype.getCoordinates = function() {
            for (var t = new Array(this.getNumPoints()).fill(null), e = -1, n = 0; n < this._geometries.length; n++)
                for (var r = this._geometries[n].getCoordinates(), i = 0; i < r.length; i++)
                    t[++e] = r[i];
            return t
        }
        ,
        e.prototype.getArea = function() {
            for (var t = 0, e = 0; e < this._geometries.length; e++)
                t += this._geometries[e].getArea();
            return t
        }
        ,
        e.prototype.equalsExact = function() {
            var e = this;
            if (2 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1];
                if (!this.isEquivalentClass(n))
                    return !1;
                var i = n;
                if (this._geometries.length !== i._geometries.length)
                    return !1;
                for (var o = 0; o < this._geometries.length; o++)
                    if (!e._geometries[o].equalsExact(i._geometries[o], r))
                        return !1;
                return !0
            }
            return t.prototype.equalsExact.apply(this, arguments)
        }
        ,
        e.prototype.normalize = function() {
            for (var t = 0; t < this._geometries.length; t++)
                this._geometries[t].normalize();
            Rc.sort(this._geometries)
        }
        ,
        e.prototype.getCoordinate = function() {
            return this.isEmpty() ? null : this._geometries[0].getCoordinate()
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            for (var t = Tc.FALSE, e = 0; e < this._geometries.length; e++)
                t = Math.max(t, this._geometries[e].getBoundaryDimension());
            return t
        }
        ,
        e.prototype.getDimension = function() {
            for (var t = Tc.FALSE, e = 0; e < this._geometries.length; e++)
                t = Math.max(t, this._geometries[e].getDimension());
            return t
        }
        ,
        e.prototype.getLength = function() {
            for (var t = 0, e = 0; e < this._geometries.length; e++)
                t += this._geometries[e].getLength();
            return t
        }
        ,
        e.prototype.getNumPoints = function() {
            for (var t = 0, e = 0; e < this._geometries.length; e++)
                t += this._geometries[e].getNumPoints();
            return t
        }
        ,
        e.prototype.getNumGeometries = function() {
            return this._geometries.length
        }
        ,
        e.prototype.reverse = function() {
            for (var t = this._geometries.length, e = new Array(t).fill(null), n = 0; n < this._geometries.length; n++)
                e[n] = this._geometries[n].reverse();
            return this.getFactory().createGeometryCollection(e)
        }
        ,
        e.prototype.compareToSameClass = function() {
            var t = this;
            if (1 === arguments.length) {
                var e = arguments[0]
                  , n = new Lc(Rc.asList(this._geometries))
                  , r = new Lc(Rc.asList(e._geometries));
                return this.compare(n, r)
            }
            if (2 === arguments.length) {
                for (var i = arguments[0], o = arguments[1], s = i, a = this.getNumGeometries(), u = s.getNumGeometries(), l = 0; l < a && l < u; ) {
                    var c = t.getGeometryN(l)
                      , h = s.getGeometryN(l)
                      , p = c.compareToSameClass(h, o);
                    if (0 !== p)
                        return p;
                    l++
                }
                return l < a ? 1 : l < u ? -1 : 0
            }
        }
        ,
        e.prototype.apply = function() {
            var t = this;
            if (gl(arguments[0], Kl))
                for (var e = arguments[0], n = 0; n < this._geometries.length; n++)
                    t._geometries[n].apply(e);
            else if (gl(arguments[0], Fc)) {
                var r = arguments[0];
                if (0 === this._geometries.length)
                    return null;
                for (var i = 0; i < this._geometries.length && (t._geometries[i].apply(r),
                !r.isDone()); i++)
                    ;
                r.isGeometryChanged() && this.geometryChanged()
            } else if (gl(arguments[0], Dc)) {
                var o = arguments[0];
                o.filter(this);
                for (var s = 0; s < this._geometries.length; s++)
                    t._geometries[s].apply(o)
            } else if (gl(arguments[0], Hl)) {
                var a = arguments[0];
                a.filter(this);
                for (var u = 0; u < this._geometries.length; u++)
                    t._geometries[u].apply(a)
            }
        }
        ,
        e.prototype.getBoundary = function() {
            return this.checkNotGeometryCollection(this),
            ql.shouldNeverReachHere(),
            null
        }
        ,
        e.prototype.clone = function() {
            var e = t.prototype.clone.call(this);
            e._geometries = new Array(this._geometries.length).fill(null);
            for (var n = 0; n < this._geometries.length; n++)
                e._geometries[n] = this._geometries[n].clone();
            return e
        }
        ,
        e.prototype.getGeometryType = function() {
            return "GeometryCollection"
        }
        ,
        e.prototype.copy = function() {
            for (var t = new Array(this._geometries.length).fill(null), n = 0; n < t.length; n++)
                t[n] = this._geometries[n].copy();
            return new e(t,this._factory)
        }
        ,
        e.prototype.isEmpty = function() {
            for (var t = 0; t < this._geometries.length; t++)
                if (!this._geometries[t].isEmpty())
                    return !1;
            return !0
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.serialVersionUID.get = function() {
            return -0x4f07bcb1f857d800
        }
        ,
        Object.defineProperties(e, n),
        e
    }(Wl)
      , Gc = function(t) {
        function e() {
            t.apply(this, arguments)
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.getSortIndex = function() {
            return Wl.SORTINDEX_MULTILINESTRING
        }
        ,
        e.prototype.equalsExact = function() {
            if (2 === arguments.length) {
                var e = arguments[0]
                  , n = arguments[1];
                return !!this.isEquivalentClass(e) && t.prototype.equalsExact.call(this, e, n)
            }
            return t.prototype.equalsExact.apply(this, arguments)
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            return this.isClosed() ? Tc.FALSE : 0
        }
        ,
        e.prototype.isClosed = function() {
            if (this.isEmpty())
                return !1;
            for (var t = 0; t < this._geometries.length; t++)
                if (!this._geometries[t].isClosed())
                    return !1;
            return !0
        }
        ,
        e.prototype.getDimension = function() {
            return 1
        }
        ,
        e.prototype.reverse = function() {
            for (var t = this._geometries.length, e = new Array(t).fill(null), n = 0; n < this._geometries.length; n++)
                e[t - 1 - n] = this._geometries[n].reverse();
            return this.getFactory().createMultiLineString(e)
        }
        ,
        e.prototype.getBoundary = function() {
            return new qc(this).getBoundary()
        }
        ,
        e.prototype.getGeometryType = function() {
            return "MultiLineString"
        }
        ,
        e.prototype.copy = function() {
            for (var t = new Array(this._geometries.length).fill(null), n = 0; n < t.length; n++)
                t[n] = this._geometries[n].copy();
            return new e(t,this._factory)
        }
        ,
        e.prototype.interfaces_ = function() {
            return [Pc]
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.serialVersionUID.get = function() {
            return 0x7155d2ab4afa8000
        }
        ,
        Object.defineProperties(e, n),
        e
    }(kc)
      , qc = function() {
        if (this._geom = null,
        this._geomFact = null,
        this._bnRule = null,
        this._endpointMap = null,
        1 === arguments.length) {
            var t = arguments[0]
              , e = Ql.MOD2_BOUNDARY_RULE;
            this._geom = t,
            this._geomFact = t.getFactory(),
            this._bnRule = e
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            this._geom = n,
            this._geomFact = n.getFactory(),
            this._bnRule = r
        }
    };
    qc.prototype.boundaryMultiLineString = function(t) {
        if (this._geom.isEmpty())
            return this.getEmptyMultiPoint();
        var e = this.computeBoundaryCoordinates(t);
        return 1 === e.length ? this._geomFact.createPoint(e[0]) : this._geomFact.createMultiPointFromCoords(e)
    }
    ,
    qc.prototype.getBoundary = function() {
        return this._geom instanceof Zc ? this.boundaryLineString(this._geom) : this._geom instanceof Gc ? this.boundaryMultiLineString(this._geom) : this._geom.getBoundary()
    }
    ,
    qc.prototype.boundaryLineString = function(t) {
        return this._geom.isEmpty() ? this.getEmptyMultiPoint() : t.isClosed() ? this._bnRule.isInBoundary(2) ? t.getStartPoint() : this._geomFact.createMultiPoint() : this._geomFact.createMultiPoint([t.getStartPoint(), t.getEndPoint()])
    }
    ,
    qc.prototype.getEmptyMultiPoint = function() {
        return this._geomFact.createMultiPoint()
    }
    ,
    qc.prototype.computeBoundaryCoordinates = function(t) {
        var e = this
          , n = new lc;
        this._endpointMap = new Cc;
        for (var r = 0; r < t.getNumGeometries(); r++) {
            var i = t.getGeometryN(r);
            0 !== i.getNumPoints() && (e.addEndpoint(i.getCoordinateN(0)),
            e.addEndpoint(i.getCoordinateN(i.getNumPoints() - 1)))
        }
        for (var o = this._endpointMap.entrySet().iterator(); o.hasNext(); ) {
            var s = o.next()
              , a = s.getValue().count;
            e._bnRule.isInBoundary(a) && n.add(s.getKey())
        }
        return pc.toCoordinateArray(n)
    }
    ,
    qc.prototype.addEndpoint = function(t) {
        var e = this._endpointMap.get(t);
        null === e && (e = new Bc,
        this._endpointMap.put(t, e)),
        e.count++
    }
    ,
    qc.prototype.interfaces_ = function() {
        return []
    }
    ,
    qc.prototype.getClass = function() {
        return qc
    }
    ,
    qc.getBoundary = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = new qc(t);
            return e.getBoundary()
        }
        if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = new qc(n,r);
            return i.getBoundary()
        }
    }
    ;
    var Bc = function() {
        this.count = null
    };
    function zc() {}
    function jc() {}
    Bc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Bc.prototype.getClass = function() {
        return Bc
    }
    ;
    var Uc = function() {};
    function Vc() {}
    function Xc() {}
    function Yc() {}
    var Hc = function() {}
      , Wc = {
        NEWLINE: {
            configurable: !0
        },
        SIMPLE_ORDINATE_FORMAT: {
            configurable: !0
        }
    };
    Hc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Hc.prototype.getClass = function() {
        return Hc
    }
    ,
    Hc.chars = function(t, e) {
        for (var n = new Array(e).fill(null), r = 0; r < e; r++)
            n[r] = t;
        return String(n)
    }
    ,
    Hc.getStackTrace = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = new Vc
              , n = new zc(e);
            return t.printStackTrace(n),
            e.toString()
        }
        if (2 === arguments.length) {
            for (var r = arguments[0], i = arguments[1], o = "", s = new jc(Hc.getStackTrace(r)), a = new Yc(s), u = 0; u < i; u++)
                try {
                    o += a.readLine() + Hc.NEWLINE
                } catch (t) {
                    if (!(t instanceof Xc))
                        throw t;
                    ql.shouldNeverReachHere()
                }
            return o
        }
    }
    ,
    Hc.split = function(t, e) {
        for (var n = e.length, r = new lc, i = "" + t, o = i.indexOf(e); o >= 0; ) {
            var s = i.substring(0, o);
            r.add(s),
            o = (i = i.substring(o + n)).indexOf(e)
        }
        i.length > 0 && r.add(i);
        for (var a = new Array(r.size()).fill(null), u = 0; u < a.length; u++)
            a[u] = r.get(u);
        return a
    }
    ,
    Hc.toString = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return Hc.SIMPLE_ORDINATE_FORMAT.format(t)
        }
    }
    ,
    Hc.spaces = function(t) {
        return Hc.chars(" ", t)
    }
    ,
    Wc.NEWLINE.get = function() {
        return Pl.getProperty("line.separator")
    }
    ,
    Wc.SIMPLE_ORDINATE_FORMAT.get = function() {
        return new Uc("0.#")
    }
    ,
    Object.defineProperties(Hc, Wc);
    var Jc = function() {};
    Jc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Jc.prototype.getClass = function() {
        return Jc
    }
    ,
    Jc.copyCoord = function(t, e, n, r) {
        for (var i = Math.min(t.getDimension(), n.getDimension()), o = 0; o < i; o++)
            n.setOrdinate(r, o, t.getOrdinate(e, o))
    }
    ,
    Jc.isRing = function(t) {
        var e = t.size();
        return 0 === e || !(e <= 3) && (t.getOrdinate(0, Il.X) === t.getOrdinate(e - 1, Il.X) && t.getOrdinate(0, Il.Y) === t.getOrdinate(e - 1, Il.Y))
    }
    ,
    Jc.isEqual = function(t, e) {
        var n = t.size();
        if (n !== e.size())
            return !1;
        for (var r = Math.min(t.getDimension(), e.getDimension()), i = 0; i < n; i++)
            for (var o = 0; o < r; o++) {
                var s = t.getOrdinate(i, o)
                  , a = e.getOrdinate(i, o);
                if (t.getOrdinate(i, o) !== e.getOrdinate(i, o) && (!nl.isNaN(s) || !nl.isNaN(a)))
                    return !1
            }
        return !0
    }
    ,
    Jc.extend = function(t, e, n) {
        var r = t.create(n, e.getDimension())
          , i = e.size();
        if (Jc.copy(e, 0, r, 0, i),
        i > 0)
            for (var o = i; o < n; o++)
                Jc.copy(e, i - 1, r, o, 1);
        return r
    }
    ,
    Jc.reverse = function(t) {
        for (var e = t.size() - 1, n = Math.trunc(e / 2), r = 0; r <= n; r++)
            Jc.swap(t, r, e - r)
    }
    ,
    Jc.swap = function(t, e, n) {
        if (e === n)
            return null;
        for (var r = 0; r < t.getDimension(); r++) {
            var i = t.getOrdinate(e, r);
            t.setOrdinate(e, r, t.getOrdinate(n, r)),
            t.setOrdinate(n, r, i)
        }
    }
    ,
    Jc.copy = function(t, e, n, r, i) {
        for (var o = 0; o < i; o++)
            Jc.copyCoord(t, e + o, n, r + o)
    }
    ,
    Jc.toString = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = t.size();
            if (0 === e)
                return "()";
            var n = t.getDimension()
              , r = new vl;
            r.append("(");
            for (var i = 0; i < e; i++) {
                i > 0 && r.append(" ");
                for (var o = 0; o < n; o++)
                    o > 0 && r.append(","),
                    r.append(Hc.toString(t.getOrdinate(i, o)))
            }
            return r.append(")"),
            r.toString()
        }
    }
    ,
    Jc.ensureValidRing = function(t, e) {
        var n = e.size();
        return 0 === n ? e : n <= 3 ? Jc.createClosedRing(t, e, 4) : e.getOrdinate(0, Il.X) === e.getOrdinate(n - 1, Il.X) && e.getOrdinate(0, Il.Y) === e.getOrdinate(n - 1, Il.Y) ? e : Jc.createClosedRing(t, e, n + 1)
    }
    ,
    Jc.createClosedRing = function(t, e, n) {
        var r = t.create(n, e.getDimension())
          , i = e.size();
        Jc.copy(e, 0, r, 0, i);
        for (var o = i; o < n; o++)
            Jc.copy(e, 0, r, o, 1);
        return r
    }
    ;
    var Zc = function(t) {
        function e(e, n) {
            t.call(this, n),
            this._points = null,
            this.init(e)
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.computeEnvelopeInternal = function() {
            return this.isEmpty() ? new Ll : this._points.expandEnvelope(new Ll)
        }
        ,
        e.prototype.isRing = function() {
            return this.isClosed() && this.isSimple()
        }
        ,
        e.prototype.getSortIndex = function() {
            return t.SORTINDEX_LINESTRING
        }
        ,
        e.prototype.getCoordinates = function() {
            return this._points.toCoordinateArray()
        }
        ,
        e.prototype.equalsExact = function() {
            var e = this;
            if (2 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1];
                if (!this.isEquivalentClass(n))
                    return !1;
                var i = n;
                if (this._points.size() !== i._points.size())
                    return !1;
                for (var o = 0; o < this._points.size(); o++)
                    if (!e.equal(e._points.getCoordinate(o), i._points.getCoordinate(o), r))
                        return !1;
                return !0
            }
            return t.prototype.equalsExact.apply(this, arguments)
        }
        ,
        e.prototype.normalize = function() {
            for (var t = this, e = 0; e < Math.trunc(this._points.size() / 2); e++) {
                var n = t._points.size() - 1 - e;
                if (!t._points.getCoordinate(e).equals(t._points.getCoordinate(n)))
                    return t._points.getCoordinate(e).compareTo(t._points.getCoordinate(n)) > 0 && Jc.reverse(t._points),
                    null
            }
        }
        ,
        e.prototype.getCoordinate = function() {
            return this.isEmpty() ? null : this._points.getCoordinate(0)
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            return this.isClosed() ? Tc.FALSE : 0
        }
        ,
        e.prototype.isClosed = function() {
            return !this.isEmpty() && this.getCoordinateN(0).equals2D(this.getCoordinateN(this.getNumPoints() - 1))
        }
        ,
        e.prototype.getEndPoint = function() {
            return this.isEmpty() ? null : this.getPointN(this.getNumPoints() - 1)
        }
        ,
        e.prototype.getDimension = function() {
            return 1
        }
        ,
        e.prototype.getLength = function() {
            return Xl.computeLength(this._points)
        }
        ,
        e.prototype.getNumPoints = function() {
            return this._points.size()
        }
        ,
        e.prototype.reverse = function() {
            var t = this._points.copy();
            return Jc.reverse(t),
            this.getFactory().createLineString(t)
        }
        ,
        e.prototype.compareToSameClass = function() {
            var t = this;
            if (1 === arguments.length) {
                for (var e = arguments[0], n = e, r = 0, i = 0; r < this._points.size() && i < n._points.size(); ) {
                    var o = t._points.getCoordinate(r).compareTo(n._points.getCoordinate(i));
                    if (0 !== o)
                        return o;
                    r++,
                    i++
                }
                return r < this._points.size() ? 1 : i < n._points.size() ? -1 : 0
            }
            if (2 === arguments.length) {
                var s = arguments[0]
                  , a = arguments[1]
                  , u = s;
                return a.compare(this._points, u._points)
            }
        }
        ,
        e.prototype.apply = function() {
            var t = this;
            if (gl(arguments[0], Kl))
                for (var e = arguments[0], n = 0; n < this._points.size(); n++)
                    e.filter(t._points.getCoordinate(n));
            else if (gl(arguments[0], Fc)) {
                var r = arguments[0];
                if (0 === this._points.size())
                    return null;
                for (var i = 0; i < this._points.size() && (r.filter(t._points, i),
                !r.isDone()); i++)
                    ;
                r.isGeometryChanged() && this.geometryChanged()
            } else if (gl(arguments[0], Dc)) {
                var o = arguments[0];
                o.filter(this)
            } else if (gl(arguments[0], Hl)) {
                var s = arguments[0];
                s.filter(this)
            }
        }
        ,
        e.prototype.getBoundary = function() {
            return new qc(this).getBoundary()
        }
        ,
        e.prototype.isEquivalentClass = function(t) {
            return t instanceof e
        }
        ,
        e.prototype.clone = function() {
            var e = t.prototype.clone.call(this);
            return e._points = this._points.clone(),
            e
        }
        ,
        e.prototype.getCoordinateN = function(t) {
            return this._points.getCoordinate(t)
        }
        ,
        e.prototype.getGeometryType = function() {
            return "LineString"
        }
        ,
        e.prototype.copy = function() {
            return new e(this._points.copy(),this._factory)
        }
        ,
        e.prototype.getCoordinateSequence = function() {
            return this._points
        }
        ,
        e.prototype.isEmpty = function() {
            return 0 === this._points.size()
        }
        ,
        e.prototype.init = function(t) {
            if (null === t && (t = this.getFactory().getCoordinateSequenceFactory().create([])),
            1 === t.size())
                throw new el("Invalid number of points in LineString (found " + t.size() + " - must be 0 or >= 2)");
            this._points = t
        }
        ,
        e.prototype.isCoordinate = function(t) {
            for (var e = 0; e < this._points.size(); e++)
                if (this._points.getCoordinate(e).equals(t))
                    return !0;
            return !1
        }
        ,
        e.prototype.getStartPoint = function() {
            return this.isEmpty() ? null : this.getPointN(0)
        }
        ,
        e.prototype.getPointN = function(t) {
            return this.getFactory().createPoint(this._points.getCoordinate(t))
        }
        ,
        e.prototype.interfaces_ = function() {
            return [Pc]
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.serialVersionUID.get = function() {
            return 0x2b2b51ba435c8e00
        }
        ,
        Object.defineProperties(e, n),
        e
    }(Wl)
      , Kc = function() {};
    Kc.prototype.interfaces_ = function() {
        return []
    }
    ,
    Kc.prototype.getClass = function() {
        return Kc
    }
    ;
    var Qc = function(t) {
        function e(e, n) {
            t.call(this, n),
            this._coordinates = e || null,
            this.init(this._coordinates)
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.computeEnvelopeInternal = function() {
            if (this.isEmpty())
                return new Ll;
            var t = new Ll;
            return t.expandToInclude(this._coordinates.getX(0), this._coordinates.getY(0)),
            t
        }
        ,
        e.prototype.getSortIndex = function() {
            return t.SORTINDEX_POINT
        }
        ,
        e.prototype.getCoordinates = function() {
            return this.isEmpty() ? [] : [this.getCoordinate()]
        }
        ,
        e.prototype.equalsExact = function() {
            if (2 === arguments.length) {
                var e = arguments[0]
                  , n = arguments[1];
                return !!this.isEquivalentClass(e) && (!(!this.isEmpty() || !e.isEmpty()) || this.isEmpty() === e.isEmpty() && this.equal(e.getCoordinate(), this.getCoordinate(), n))
            }
            return t.prototype.equalsExact.apply(this, arguments)
        }
        ,
        e.prototype.normalize = function() {}
        ,
        e.prototype.getCoordinate = function() {
            return 0 !== this._coordinates.size() ? this._coordinates.getCoordinate(0) : null
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            return Tc.FALSE
        }
        ,
        e.prototype.getDimension = function() {
            return 0
        }
        ,
        e.prototype.getNumPoints = function() {
            return this.isEmpty() ? 0 : 1
        }
        ,
        e.prototype.reverse = function() {
            return this.copy()
        }
        ,
        e.prototype.getX = function() {
            if (null === this.getCoordinate())
                throw new Error("getX called on empty Point");
            return this.getCoordinate().x
        }
        ,
        e.prototype.compareToSameClass = function() {
            if (1 === arguments.length) {
                var t = arguments[0]
                  , e = t;
                return this.getCoordinate().compareTo(e.getCoordinate())
            }
            if (2 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1]
                  , i = n;
                return r.compare(this._coordinates, i._coordinates)
            }
        }
        ,
        e.prototype.apply = function() {
            if (gl(arguments[0], Kl)) {
                var t = arguments[0];
                if (this.isEmpty())
                    return null;
                t.filter(this.getCoordinate())
            } else if (gl(arguments[0], Fc)) {
                var e = arguments[0];
                if (this.isEmpty())
                    return null;
                e.filter(this._coordinates, 0),
                e.isGeometryChanged() && this.geometryChanged()
            } else if (gl(arguments[0], Dc)) {
                var n = arguments[0];
                n.filter(this)
            } else if (gl(arguments[0], Hl)) {
                var r = arguments[0];
                r.filter(this)
            }
        }
        ,
        e.prototype.getBoundary = function() {
            return this.getFactory().createGeometryCollection(null)
        }
        ,
        e.prototype.clone = function() {
            var e = t.prototype.clone.call(this);
            return e._coordinates = this._coordinates.clone(),
            e
        }
        ,
        e.prototype.getGeometryType = function() {
            return "Point"
        }
        ,
        e.prototype.copy = function() {
            return new e(this._coordinates.copy(),this._factory)
        }
        ,
        e.prototype.getCoordinateSequence = function() {
            return this._coordinates
        }
        ,
        e.prototype.getY = function() {
            if (null === this.getCoordinate())
                throw new Error("getY called on empty Point");
            return this.getCoordinate().y
        }
        ,
        e.prototype.isEmpty = function() {
            return 0 === this._coordinates.size()
        }
        ,
        e.prototype.init = function(t) {
            null === t && (t = this.getFactory().getCoordinateSequenceFactory().create([])),
            ql.isTrue(t.size() <= 1),
            this._coordinates = t
        }
        ,
        e.prototype.isSimple = function() {
            return !0
        }
        ,
        e.prototype.interfaces_ = function() {
            return [Kc]
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.serialVersionUID.get = function() {
            return 0x44077bad161cbc00
        }
        ,
        Object.defineProperties(e, n),
        e
    }(Wl)
      , $c = function() {};
    $c.prototype.interfaces_ = function() {
        return []
    }
    ,
    $c.prototype.getClass = function() {
        return $c
    }
    ;
    var th = function(t) {
        function e(e, n, r) {
            if (t.call(this, r),
            this._shell = null,
            this._holes = null,
            null === e && (e = this.getFactory().createLinearRing()),
            null === n && (n = []),
            t.hasNullElements(n))
                throw new el("holes must not contain null elements");
            if (e.isEmpty() && t.hasNonEmptyElements(n))
                throw new el("shell is empty but holes are not");
            this._shell = e,
            this._holes = n
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.computeEnvelopeInternal = function() {
            return this._shell.getEnvelopeInternal()
        }
        ,
        e.prototype.getSortIndex = function() {
            return t.SORTINDEX_POLYGON
        }
        ,
        e.prototype.getCoordinates = function() {
            if (this.isEmpty())
                return [];
            for (var t = new Array(this.getNumPoints()).fill(null), e = -1, n = this._shell.getCoordinates(), r = 0; r < n.length; r++)
                t[++e] = n[r];
            for (var i = 0; i < this._holes.length; i++)
                for (var o = this._holes[i].getCoordinates(), s = 0; s < o.length; s++)
                    t[++e] = o[s];
            return t
        }
        ,
        e.prototype.getArea = function() {
            var t = 0;
            t += Math.abs(Xl.signedArea(this._shell.getCoordinateSequence()));
            for (var e = 0; e < this._holes.length; e++)
                t -= Math.abs(Xl.signedArea(this._holes[e].getCoordinateSequence()));
            return t
        }
        ,
        e.prototype.isRectangle = function() {
            if (0 !== this.getNumInteriorRing())
                return !1;
            if (null === this._shell)
                return !1;
            if (5 !== this._shell.getNumPoints())
                return !1;
            for (var t = this._shell.getCoordinateSequence(), e = this.getEnvelopeInternal(), n = 0; n < 5; n++) {
                var r = t.getX(n);
                if (r !== e.getMinX() && r !== e.getMaxX())
                    return !1;
                var i = t.getY(n);
                if (i !== e.getMinY() && i !== e.getMaxY())
                    return !1
            }
            for (var o = t.getX(0), s = t.getY(0), a = 1; a <= 4; a++) {
                var u = t.getX(a)
                  , l = t.getY(a);
                if (u !== o === (l !== s))
                    return !1;
                o = u,
                s = l
            }
            return !0
        }
        ,
        e.prototype.equalsExact = function() {
            var e = this;
            if (2 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1];
                if (!this.isEquivalentClass(n))
                    return !1;
                var i = n
                  , o = this._shell
                  , s = i._shell;
                if (!o.equalsExact(s, r))
                    return !1;
                if (this._holes.length !== i._holes.length)
                    return !1;
                for (var a = 0; a < this._holes.length; a++)
                    if (!e._holes[a].equalsExact(i._holes[a], r))
                        return !1;
                return !0
            }
            return t.prototype.equalsExact.apply(this, arguments)
        }
        ,
        e.prototype.normalize = function() {
            var t = this;
            if (0 === arguments.length) {
                this.normalize(this._shell, !0);
                for (var e = 0; e < this._holes.length; e++)
                    t.normalize(t._holes[e], !1);
                Rc.sort(this._holes)
            } else if (2 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1];
                if (n.isEmpty())
                    return null;
                var i = new Array(n.getCoordinates().length - 1).fill(null);
                Pl.arraycopy(n.getCoordinates(), 0, i, 0, i.length);
                var o = pc.minCoordinate(n.getCoordinates());
                pc.scroll(i, o),
                Pl.arraycopy(i, 0, n.getCoordinates(), 0, i.length),
                n.getCoordinates()[i.length] = i[0],
                Xl.isCCW(n.getCoordinates()) === r && pc.reverse(n.getCoordinates())
            }
        }
        ,
        e.prototype.getCoordinate = function() {
            return this._shell.getCoordinate()
        }
        ,
        e.prototype.getNumInteriorRing = function() {
            return this._holes.length
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            return 1
        }
        ,
        e.prototype.getDimension = function() {
            return 2
        }
        ,
        e.prototype.getLength = function() {
            var t = 0;
            t += this._shell.getLength();
            for (var e = 0; e < this._holes.length; e++)
                t += this._holes[e].getLength();
            return t
        }
        ,
        e.prototype.getNumPoints = function() {
            for (var t = this._shell.getNumPoints(), e = 0; e < this._holes.length; e++)
                t += this._holes[e].getNumPoints();
            return t
        }
        ,
        e.prototype.reverse = function() {
            var t = this.copy();
            t._shell = this._shell.copy().reverse(),
            t._holes = new Array(this._holes.length).fill(null);
            for (var e = 0; e < this._holes.length; e++)
                t._holes[e] = this._holes[e].copy().reverse();
            return t
        }
        ,
        e.prototype.convexHull = function() {
            return this.getExteriorRing().convexHull()
        }
        ,
        e.prototype.compareToSameClass = function() {
            var t = this;
            if (1 === arguments.length) {
                var e = arguments[0]
                  , n = this._shell
                  , r = e._shell;
                return n.compareToSameClass(r)
            }
            if (2 === arguments.length) {
                var i = arguments[0]
                  , o = arguments[1]
                  , s = i
                  , a = this._shell
                  , u = s._shell
                  , l = a.compareToSameClass(u, o);
                if (0 !== l)
                    return l;
                for (var c = this.getNumInteriorRing(), h = s.getNumInteriorRing(), p = 0; p < c && p < h; ) {
                    var f = t.getInteriorRingN(p)
                      , g = s.getInteriorRingN(p)
                      , d = f.compareToSameClass(g, o);
                    if (0 !== d)
                        return d;
                    p++
                }
                return p < c ? 1 : p < h ? -1 : 0
            }
        }
        ,
        e.prototype.apply = function(t) {
            var e = this;
            if (gl(t, Kl)) {
                this._shell.apply(t);
                for (var n = 0; n < this._holes.length; n++)
                    e._holes[n].apply(t)
            } else if (gl(t, Fc)) {
                if (this._shell.apply(t),
                !t.isDone())
                    for (var r = 0; r < this._holes.length && (e._holes[r].apply(t),
                    !t.isDone()); r++)
                        ;
                t.isGeometryChanged() && this.geometryChanged()
            } else if (gl(t, Dc))
                t.filter(this);
            else if (gl(t, Hl)) {
                t.filter(this),
                this._shell.apply(t);
                for (var i = 0; i < this._holes.length; i++)
                    e._holes[i].apply(t)
            }
        }
        ,
        e.prototype.getBoundary = function() {
            if (this.isEmpty())
                return this.getFactory().createMultiLineString();
            var t = new Array(this._holes.length + 1).fill(null);
            t[0] = this._shell;
            for (var 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)
        }
        ,
        e.prototype.clone = function() {
            var e = t.prototype.clone.call(this);
            e._shell = this._shell.clone(),
            e._holes = new Array(this._holes.length).fill(null);
            for (var n = 0; n < this._holes.length; n++)
                e._holes[n] = this._holes[n].clone();
            return e
        }
        ,
        e.prototype.getGeometryType = function() {
            return "Polygon"
        }
        ,
        e.prototype.copy = function() {
            for (var t = this._shell.copy(), n = new Array(this._holes.length).fill(null), r = 0; r < n.length; r++)
                n[r] = this._holes[r].copy();
            return new e(t,n,this._factory)
        }
        ,
        e.prototype.getExteriorRing = function() {
            return this._shell
        }
        ,
        e.prototype.isEmpty = function() {
            return this._shell.isEmpty()
        }
        ,
        e.prototype.getInteriorRingN = function(t) {
            return this._holes[t]
        }
        ,
        e.prototype.interfaces_ = function() {
            return [$c]
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.serialVersionUID.get = function() {
            return -0x307ffefd8dc97200
        }
        ,
        Object.defineProperties(e, n),
        e
    }(Wl)
      , eh = function(t) {
        function e() {
            t.apply(this, arguments)
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.getSortIndex = function() {
            return Wl.SORTINDEX_MULTIPOINT
        }
        ,
        e.prototype.isValid = function() {
            return !0
        }
        ,
        e.prototype.equalsExact = function() {
            if (2 === arguments.length) {
                var e = arguments[0]
                  , n = arguments[1];
                return !!this.isEquivalentClass(e) && t.prototype.equalsExact.call(this, e, n)
            }
            return t.prototype.equalsExact.apply(this, arguments)
        }
        ,
        e.prototype.getCoordinate = function() {
            if (1 === arguments.length) {
                var e = arguments[0];
                return this._geometries[e].getCoordinate()
            }
            return t.prototype.getCoordinate.apply(this, arguments)
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            return Tc.FALSE
        }
        ,
        e.prototype.getDimension = function() {
            return 0
        }
        ,
        e.prototype.getBoundary = function() {
            return this.getFactory().createGeometryCollection(null)
        }
        ,
        e.prototype.getGeometryType = function() {
            return "MultiPoint"
        }
        ,
        e.prototype.copy = function() {
            for (var t = new Array(this._geometries.length).fill(null), n = 0; n < t.length; n++)
                t[n] = this._geometries[n].copy();
            return new e(t,this._factory)
        }
        ,
        e.prototype.interfaces_ = function() {
            return [Kc]
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.serialVersionUID.get = function() {
            return -0x6fb1ed4162e0fc00
        }
        ,
        Object.defineProperties(e, n),
        e
    }(kc)
      , nh = function(t) {
        function e(e, n) {
            e instanceof ul && n instanceof _h && (e = n.getCoordinateSequenceFactory().create(e)),
            t.call(this, e, n),
            this.validateConstruction()
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            MINIMUM_VALID_SIZE: {
                configurable: !0
            },
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.getSortIndex = function() {
            return Wl.SORTINDEX_LINEARRING
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            return Tc.FALSE
        }
        ,
        e.prototype.isClosed = function() {
            return !!this.isEmpty() || t.prototype.isClosed.call(this)
        }
        ,
        e.prototype.reverse = function() {
            var t = this._points.copy();
            return Jc.reverse(t),
            this.getFactory().createLinearRing(t)
        }
        ,
        e.prototype.validateConstruction = function() {
            if (!this.isEmpty() && !t.prototype.isClosed.call(this))
                throw new el("Points of LinearRing do not form a closed linestring");
            if (this.getCoordinateSequence().size() >= 1 && this.getCoordinateSequence().size() < e.MINIMUM_VALID_SIZE)
                throw new el("Invalid number of points in LinearRing (found " + this.getCoordinateSequence().size() + " - must be 0 or >= 4)")
        }
        ,
        e.prototype.getGeometryType = function() {
            return "LinearRing"
        }
        ,
        e.prototype.copy = function() {
            return new e(this._points.copy(),this._factory)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.MINIMUM_VALID_SIZE.get = function() {
            return 4
        }
        ,
        n.serialVersionUID.get = function() {
            return -0x3b229e262367a600
        }
        ,
        Object.defineProperties(e, n),
        e
    }(Zc)
      , rh = function(t) {
        function e() {
            t.apply(this, arguments)
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            serialVersionUID: {
                configurable: !0
            }
        };
        return e.prototype.getSortIndex = function() {
            return Wl.SORTINDEX_MULTIPOLYGON
        }
        ,
        e.prototype.equalsExact = function() {
            if (2 === arguments.length) {
                var e = arguments[0]
                  , n = arguments[1];
                return !!this.isEquivalentClass(e) && t.prototype.equalsExact.call(this, e, n)
            }
            return t.prototype.equalsExact.apply(this, arguments)
        }
        ,
        e.prototype.getBoundaryDimension = function() {
            return 1
        }
        ,
        e.prototype.getDimension = function() {
            return 2
        }
        ,
        e.prototype.reverse = function() {
            for (var t = this._geometries.length, e = new Array(t).fill(null), n = 0; n < this._geometries.length; n++)
                e[n] = this._geometries[n].reverse();
            return this.getFactory().createMultiPolygon(e)
        }
        ,
        e.prototype.getBoundary = function() {
            if (this.isEmpty())
                return this.getFactory().createMultiLineString();
            for (var t = new lc, e = 0; e < this._geometries.length; e++)
                for (var n = this._geometries[e].getBoundary(), r = 0; r < n.getNumGeometries(); r++)
                    t.add(n.getGeometryN(r));
            var i = new Array(t.size()).fill(null);
            return this.getFactory().createMultiLineString(t.toArray(i))
        }
        ,
        e.prototype.getGeometryType = function() {
            return "MultiPolygon"
        }
        ,
        e.prototype.copy = function() {
            for (var t = new Array(this._geometries.length).fill(null), n = 0; n < t.length; n++)
                t[n] = this._geometries[n].copy();
            return new e(t,this._factory)
        }
        ,
        e.prototype.interfaces_ = function() {
            return [$c]
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.serialVersionUID.get = function() {
            return -0x7a5aa1369171980
        }
        ,
        Object.defineProperties(e, n),
        e
    }(kc)
      , ih = function(t) {
        this._factory = t || null,
        this._isUserDataCopied = !1
    }
      , oh = {
        NoOpGeometryOperation: {
            configurable: !0
        },
        CoordinateOperation: {
            configurable: !0
        },
        CoordinateSequenceOperation: {
            configurable: !0
        }
    };
    ih.prototype.setCopyUserData = function(t) {
        this._isUserDataCopied = t
    }
    ,
    ih.prototype.edit = function(t, e) {
        if (null === t)
            return null;
        var n = this.editInternal(t, e);
        return this._isUserDataCopied && n.setUserData(t.getUserData()),
        n
    }
    ,
    ih.prototype.editInternal = function(t, e) {
        return null === this._factory && (this._factory = t.getFactory()),
        t instanceof kc ? this.editGeometryCollection(t, e) : t instanceof th ? this.editPolygon(t, e) : t instanceof Qc || t instanceof Zc ? e.edit(t, this._factory) : (ql.shouldNeverReachHere("Unsupported Geometry class: " + t.getClass().getName()),
        null)
    }
    ,
    ih.prototype.editGeometryCollection = function(t, e) {
        for (var n = e.edit(t, this._factory), r = new lc, i = 0; i < n.getNumGeometries(); i++) {
            var o = this.edit(n.getGeometryN(i), e);
            null === o || o.isEmpty() || r.add(o)
        }
        return n.getClass() === eh ? this._factory.createMultiPoint(r.toArray([])) : n.getClass() === Gc ? this._factory.createMultiLineString(r.toArray([])) : n.getClass() === rh ? this._factory.createMultiPolygon(r.toArray([])) : this._factory.createGeometryCollection(r.toArray([]))
    }
    ,
    ih.prototype.editPolygon = function(t, e) {
        var n = e.edit(t, this._factory);
        if (null === n && (n = this._factory.createPolygon(null)),
        n.isEmpty())
            return n;
        var r = this.edit(n.getExteriorRing(), e);
        if (null === r || r.isEmpty())
            return this._factory.createPolygon();
        for (var i = new lc, o = 0; o < n.getNumInteriorRing(); o++) {
            var s = this.edit(n.getInteriorRingN(o), e);
            null === s || s.isEmpty() || i.add(s)
        }
        return this._factory.createPolygon(r, i.toArray([]))
    }
    ,
    ih.prototype.interfaces_ = function() {
        return []
    }
    ,
    ih.prototype.getClass = function() {
        return ih
    }
    ,
    ih.GeometryEditorOperation = function() {}
    ,
    oh.NoOpGeometryOperation.get = function() {
        return sh
    }
    ,
    oh.CoordinateOperation.get = function() {
        return ah
    }
    ,
    oh.CoordinateSequenceOperation.get = function() {
        return uh
    }
    ,
    Object.defineProperties(ih, oh);
    var sh = function() {};
    sh.prototype.edit = function(t, e) {
        return t
    }
    ,
    sh.prototype.interfaces_ = function() {
        return [ih.GeometryEditorOperation]
    }
    ,
    sh.prototype.getClass = function() {
        return sh
    }
    ;
    var ah = function() {};
    ah.prototype.edit = function(t, e) {
        var n = this.editCoordinates(t.getCoordinates(), t);
        return null === n ? t : t instanceof nh ? e.createLinearRing(n) : t instanceof Zc ? e.createLineString(n) : t instanceof Qc ? n.length > 0 ? e.createPoint(n[0]) : e.createPoint() : t
    }
    ,
    ah.prototype.interfaces_ = function() {
        return [ih.GeometryEditorOperation]
    }
    ,
    ah.prototype.getClass = function() {
        return ah
    }
    ;
    var uh = function() {};
    uh.prototype.edit = function(t, e) {
        return t instanceof nh ? e.createLinearRing(this.edit(t.getCoordinateSequence(), t)) : t instanceof Zc ? e.createLineString(this.edit(t.getCoordinateSequence(), t)) : t instanceof Qc ? e.createPoint(this.edit(t.getCoordinateSequence(), t)) : t
    }
    ,
    uh.prototype.interfaces_ = function() {
        return [ih.GeometryEditorOperation]
    }
    ,
    uh.prototype.getClass = function() {
        return uh
    }
    ;
    var lh = function() {
        var t = this;
        if (this._dimension = 3,
        this._coordinates = null,
        1 === arguments.length) {
            if (arguments[0]instanceof Array)
                this._coordinates = arguments[0],
                this._dimension = 3;
            else if (Number.isInteger(arguments[0])) {
                var e = arguments[0];
                this._coordinates = new Array(e).fill(null);
                for (var n = 0; n < e; n++)
                    t._coordinates[n] = new ul
            } else if (gl(arguments[0], Il)) {
                var r = arguments[0];
                if (null === r)
                    return this._coordinates = new Array(0).fill(null),
                    null;
                this._dimension = r.getDimension(),
                this._coordinates = new Array(r.size()).fill(null);
                for (var i = 0; i < this._coordinates.length; i++)
                    t._coordinates[i] = r.getCoordinateCopy(i)
            }
        } else if (2 === arguments.length)
            if (arguments[0]instanceof Array && Number.isInteger(arguments[1])) {
                var o = arguments[0]
                  , s = arguments[1];
                this._coordinates = o,
                this._dimension = s,
                null === o && (this._coordinates = new Array(0).fill(null))
            } else if (Number.isInteger(arguments[0]) && Number.isInteger(arguments[1])) {
                var a = arguments[0]
                  , u = arguments[1];
                this._coordinates = new Array(a).fill(null),
                this._dimension = u;
                for (var l = 0; l < a; l++)
                    t._coordinates[l] = new ul
            }
    }
      , ch = {
        serialVersionUID: {
            configurable: !0
        }
    };
    lh.prototype.setOrdinate = function(t, e, n) {
        switch (e) {
        case Il.X:
            this._coordinates[t].x = n;
            break;
        case Il.Y:
            this._coordinates[t].y = n;
            break;
        case Il.Z:
            this._coordinates[t].z = n;
            break;
        default:
            throw new el("invalid ordinateIndex")
        }
    }
    ,
    lh.prototype.size = function() {
        return this._coordinates.length
    }
    ,
    lh.prototype.getOrdinate = function(t, e) {
        switch (e) {
        case Il.X:
            return this._coordinates[t].x;
        case Il.Y:
            return this._coordinates[t].y;
        case Il.Z:
            return this._coordinates[t].z
        }
        return nl.NaN
    }
    ,
    lh.prototype.getCoordinate = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return this._coordinates[t]
        }
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            n.x = this._coordinates[e].x,
            n.y = this._coordinates[e].y,
            n.z = this._coordinates[e].z
        }
    }
    ,
    lh.prototype.getCoordinateCopy = function(t) {
        return new ul(this._coordinates[t])
    }
    ,
    lh.prototype.getDimension = function() {
        return this._dimension
    }
    ,
    lh.prototype.getX = function(t) {
        return this._coordinates[t].x
    }
    ,
    lh.prototype.clone = function() {
        for (var t = new Array(this.size()).fill(null), e = 0; e < this._coordinates.length; e++)
            t[e] = this._coordinates[e].clone();
        return new lh(t,this._dimension)
    }
    ,
    lh.prototype.expandEnvelope = function(t) {
        for (var e = 0; e < this._coordinates.length; e++)
            t.expandToInclude(this._coordinates[e]);
        return t
    }
    ,
    lh.prototype.copy = function() {
        for (var t = new Array(this.size()).fill(null), e = 0; e < this._coordinates.length; e++)
            t[e] = this._coordinates[e].copy();
        return new lh(t,this._dimension)
    }
    ,
    lh.prototype.toString = function() {
        if (this._coordinates.length > 0) {
            var t = new vl(17 * this._coordinates.length);
            t.append("("),
            t.append(this._coordinates[0]);
            for (var e = 1; e < this._coordinates.length; e++)
                t.append(", "),
                t.append(this._coordinates[e]);
            return t.append(")"),
            t.toString()
        }
        return "()"
    }
    ,
    lh.prototype.getY = function(t) {
        return this._coordinates[t].y
    }
    ,
    lh.prototype.toCoordinateArray = function() {
        return this._coordinates
    }
    ,
    lh.prototype.interfaces_ = function() {
        return [Il, al]
    }
    ,
    lh.prototype.getClass = function() {
        return lh
    }
    ,
    ch.serialVersionUID.get = function() {
        return -0xcb44a778db18e00
    }
    ,
    Object.defineProperties(lh, ch);
    var hh = function() {}
      , ph = {
        serialVersionUID: {
            configurable: !0
        },
        instanceObject: {
            configurable: !0
        }
    };
    hh.prototype.readResolve = function() {
        return hh.instance()
    }
    ,
    hh.prototype.create = function() {
        if (1 === arguments.length) {
            if (arguments[0]instanceof Array) {
                var t = arguments[0];
                return new lh(t)
            }
            if (gl(arguments[0], Il)) {
                var e = arguments[0];
                return new lh(e)
            }
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            return r > 3 && (r = 3),
            r < 2 ? new lh(n) : new lh(n,r)
        }
    }
    ,
    hh.prototype.interfaces_ = function() {
        return [hl, al]
    }
    ,
    hh.prototype.getClass = function() {
        return hh
    }
    ,
    hh.instance = function() {
        return hh.instanceObject
    }
    ,
    ph.serialVersionUID.get = function() {
        return -0x38e49fa6cf6f2e00
    }
    ,
    ph.instanceObject.get = function() {
        return new hh
    }
    ,
    Object.defineProperties(hh, ph);
    var fh = function(t) {
        function e() {
            t.call(this),
            this.map_ = new Map
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.get = function(t) {
            return this.map_.get(t) || null
        }
        ,
        e.prototype.put = function(t, e) {
            return this.map_.set(t, e),
            e
        }
        ,
        e.prototype.values = function() {
            for (var t = new lc, e = this.map_.values(), n = e.next(); !n.done; )
                t.add(n.value),
                n = e.next();
            return t
        }
        ,
        e.prototype.entrySet = function() {
            var t = new xc;
            return this.map_.entries().forEach((function(e) {
                return t.add(e)
            }
            )),
            t
        }
        ,
        e.prototype.size = function() {
            return this.map_.size()
        }
        ,
        e
    }(yc)
      , gh = function t() {
        if (this._modelType = null,
        this._scale = null,
        0 === arguments.length)
            this._modelType = t.FLOATING;
        else if (1 === arguments.length)
            if (arguments[0]instanceof yh) {
                var e = arguments[0];
                this._modelType = e,
                e === t.FIXED && this.setScale(1)
            } else if ("number" == typeof arguments[0]) {
                var n = arguments[0];
                this._modelType = t.FIXED,
                this.setScale(n)
            } else if (arguments[0]instanceof t) {
                var r = arguments[0];
                this._modelType = r._modelType,
                this._scale = r._scale
            }
    }
      , dh = {
        serialVersionUID: {
            configurable: !0
        },
        maximumPreciseValue: {
            configurable: !0
        }
    };
    gh.prototype.equals = function(t) {
        if (!(t instanceof gh))
            return !1;
        var e = t;
        return this._modelType === e._modelType && this._scale === e._scale
    }
    ,
    gh.prototype.compareTo = function(t) {
        var e = t
          , n = this.getMaximumSignificantDigits()
          , r = e.getMaximumSignificantDigits();
        return new _l(n).compareTo(new _l(r))
    }
    ,
    gh.prototype.getScale = function() {
        return this._scale
    }
    ,
    gh.prototype.isFloating = function() {
        return this._modelType === gh.FLOATING || this._modelType === gh.FLOATING_SINGLE
    }
    ,
    gh.prototype.getType = function() {
        return this._modelType
    }
    ,
    gh.prototype.toString = function() {
        var t = "UNKNOWN";
        return this._modelType === gh.FLOATING ? t = "Floating" : this._modelType === gh.FLOATING_SINGLE ? t = "Floating-Single" : this._modelType === gh.FIXED && (t = "Fixed (Scale=" + this.getScale() + ")"),
        t
    }
    ,
    gh.prototype.makePrecise = function() {
        if ("number" == typeof arguments[0]) {
            var t = arguments[0];
            if (nl.isNaN(t))
                return t;
            if (this._modelType === gh.FLOATING_SINGLE) {
                return t
            }
            return this._modelType === gh.FIXED ? Math.round(t * this._scale) / this._scale : t
        }
        if (arguments[0]instanceof ul) {
            var e = arguments[0];
            if (this._modelType === gh.FLOATING)
                return null;
            e.x = this.makePrecise(e.x),
            e.y = this.makePrecise(e.y)
        }
    }
    ,
    gh.prototype.getMaximumSignificantDigits = function() {
        var t = 16;
        return this._modelType === gh.FLOATING ? t = 16 : this._modelType === gh.FLOATING_SINGLE ? t = 6 : this._modelType === gh.FIXED && (t = 1 + Math.trunc(Math.ceil(Math.log(this.getScale()) / Math.log(10)))),
        t
    }
    ,
    gh.prototype.setScale = function(t) {
        this._scale = Math.abs(t)
    }
    ,
    gh.prototype.interfaces_ = function() {
        return [al, il]
    }
    ,
    gh.prototype.getClass = function() {
        return gh
    }
    ,
    gh.mostPrecise = function(t, e) {
        return t.compareTo(e) >= 0 ? t : e
    }
    ,
    dh.serialVersionUID.get = function() {
        return 0x6bee6404e9a25c00
    }
    ,
    dh.maximumPreciseValue.get = function() {
        return 9007199254740992
    }
    ,
    Object.defineProperties(gh, dh);
    var yh = function t(e) {
        this._name = e || null,
        t.nameToTypeMap.put(e, this)
    }
      , vh = {
        serialVersionUID: {
            configurable: !0
        },
        nameToTypeMap: {
            configurable: !0
        }
    };
    yh.prototype.readResolve = function() {
        return yh.nameToTypeMap.get(this._name)
    }
    ,
    yh.prototype.toString = function() {
        return this._name
    }
    ,
    yh.prototype.interfaces_ = function() {
        return [al]
    }
    ,
    yh.prototype.getClass = function() {
        return yh
    }
    ,
    vh.serialVersionUID.get = function() {
        return -552860263173159e4
    }
    ,
    vh.nameToTypeMap.get = function() {
        return new fh
    }
    ,
    Object.defineProperties(yh, vh),
    gh.Type = yh,
    gh.FIXED = new yh("FIXED"),
    gh.FLOATING = new yh("FLOATING"),
    gh.FLOATING_SINGLE = new yh("FLOATING SINGLE");
    var _h = function t() {
        this._precisionModel = new gh,
        this._SRID = 0,
        this._coordinateSequenceFactory = t.getDefaultCoordinateSequenceFactory(),
        0 === arguments.length || (1 === arguments.length ? gl(arguments[0], hl) ? this._coordinateSequenceFactory = arguments[0] : arguments[0]instanceof gh && (this._precisionModel = arguments[0]) : 2 === arguments.length ? (this._precisionModel = arguments[0],
        this._SRID = arguments[1]) : 3 === arguments.length && (this._precisionModel = arguments[0],
        this._SRID = arguments[1],
        this._coordinateSequenceFactory = arguments[2]))
    }
      , mh = {
        serialVersionUID: {
            configurable: !0
        }
    };
    _h.prototype.toGeometry = function(t) {
        return t.isNull() ? this.createPoint(null) : t.getMinX() === t.getMaxX() && t.getMinY() === t.getMaxY() ? this.createPoint(new ul(t.getMinX(),t.getMinY())) : t.getMinX() === t.getMaxX() || t.getMinY() === t.getMaxY() ? this.createLineString([new ul(t.getMinX(),t.getMinY()), new ul(t.getMaxX(),t.getMaxY())]) : this.createPolygon(this.createLinearRing([new ul(t.getMinX(),t.getMinY()), new ul(t.getMinX(),t.getMaxY()), new ul(t.getMaxX(),t.getMaxY()), new ul(t.getMaxX(),t.getMinY()), new ul(t.getMinX(),t.getMinY())]), null)
    }
    ,
    _h.prototype.createLineString = function(t) {
        return t ? t instanceof Array ? new Zc(this.getCoordinateSequenceFactory().create(t),this) : gl(t, Il) ? new Zc(t,this) : void 0 : new Zc(this.getCoordinateSequenceFactory().create([]),this)
    }
    ,
    _h.prototype.createMultiLineString = function() {
        if (0 === arguments.length)
            return new Gc(null,this);
        if (1 === arguments.length) {
            var t = arguments[0];
            return new Gc(t,this)
        }
    }
    ,
    _h.prototype.buildGeometry = function(t) {
        for (var e = null, n = !1, r = !1, i = t.iterator(); i.hasNext(); ) {
            var o = i.next()
              , s = o.getClass();
            null === e && (e = s),
            s !== e && (n = !0),
            o.isGeometryCollectionOrDerived() && (r = !0)
        }
        if (null === e)
            return this.createGeometryCollection();
        if (n || r)
            return this.createGeometryCollection(_h.toGeometryArray(t));
        var a = t.iterator().next();
        if (t.size() > 1) {
            if (a instanceof th)
                return this.createMultiPolygon(_h.toPolygonArray(t));
            if (a instanceof Zc)
                return this.createMultiLineString(_h.toLineStringArray(t));
            if (a instanceof Qc)
                return this.createMultiPoint(_h.toPointArray(t));
            ql.shouldNeverReachHere("Unhandled class: " + a.getClass().getName())
        }
        return a
    }
    ,
    _h.prototype.createMultiPointFromCoords = function(t) {
        return this.createMultiPoint(null !== t ? this.getCoordinateSequenceFactory().create(t) : null)
    }
    ,
    _h.prototype.createPoint = function() {
        if (0 === arguments.length)
            return this.createPoint(this.getCoordinateSequenceFactory().create([]));
        if (1 === arguments.length) {
            if (arguments[0]instanceof ul) {
                var t = arguments[0];
                return this.createPoint(null !== t ? this.getCoordinateSequenceFactory().create([t]) : null)
            }
            if (gl(arguments[0], Il)) {
                var e = arguments[0];
                return new Qc(e,this)
            }
        }
    }
    ,
    _h.prototype.getCoordinateSequenceFactory = function() {
        return this._coordinateSequenceFactory
    }
    ,
    _h.prototype.createPolygon = function() {
        if (0 === arguments.length)
            return new th(null,null,this);
        if (1 === arguments.length) {
            if (gl(arguments[0], Il)) {
                var t = arguments[0];
                return this.createPolygon(this.createLinearRing(t))
            }
            if (arguments[0]instanceof Array) {
                var e = arguments[0];
                return this.createPolygon(this.createLinearRing(e))
            }
            if (arguments[0]instanceof nh) {
                var n = arguments[0];
                return this.createPolygon(n, null)
            }
        } else if (2 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1];
            return new th(r,i,this)
        }
    }
    ,
    _h.prototype.getSRID = function() {
        return this._SRID
    }
    ,
    _h.prototype.createGeometryCollection = function() {
        if (0 === arguments.length)
            return new kc(null,this);
        if (1 === arguments.length) {
            var t = arguments[0];
            return new kc(t,this)
        }
    }
    ,
    _h.prototype.createGeometry = function(t) {
        return new ih(this).edit(t, {
            edit: function() {
                if (2 === arguments.length) {
                    var t = arguments[0];
                    return this._coordinateSequenceFactory.create(t)
                }
            }
        })
    }
    ,
    _h.prototype.getPrecisionModel = function() {
        return this._precisionModel
    }
    ,
    _h.prototype.createLinearRing = function() {
        if (0 === arguments.length)
            return this.createLinearRing(this.getCoordinateSequenceFactory().create([]));
        if (1 === arguments.length) {
            if (arguments[0]instanceof Array) {
                var t = arguments[0];
                return this.createLinearRing(null !== t ? this.getCoordinateSequenceFactory().create(t) : null)
            }
            if (gl(arguments[0], Il)) {
                var e = arguments[0];
                return new nh(e,this)
            }
        }
    }
    ,
    _h.prototype.createMultiPolygon = function() {
        if (0 === arguments.length)
            return new rh(null,this);
        if (1 === arguments.length) {
            var t = arguments[0];
            return new rh(t,this)
        }
    }
    ,
    _h.prototype.createMultiPoint = function() {
        var t = this;
        if (0 === arguments.length)
            return new eh(null,this);
        if (1 === arguments.length) {
            if (arguments[0]instanceof Array) {
                var e = arguments[0];
                return new eh(e,this)
            }
            if (arguments[0]instanceof Array) {
                var n = arguments[0];
                return this.createMultiPoint(null !== n ? this.getCoordinateSequenceFactory().create(n) : null)
            }
            if (gl(arguments[0], Il)) {
                var r = arguments[0];
                if (null === r)
                    return this.createMultiPoint(new Array(0).fill(null));
                for (var i = new Array(r.size()).fill(null), o = 0; o < r.size(); o++) {
                    var s = t.getCoordinateSequenceFactory().create(1, r.getDimension());
                    Jc.copy(r, o, s, 0, 1),
                    i[o] = t.createPoint(s)
                }
                return this.createMultiPoint(i)
            }
        }
    }
    ,
    _h.prototype.interfaces_ = function() {
        return [al]
    }
    ,
    _h.prototype.getClass = function() {
        return _h
    }
    ,
    _h.toMultiPolygonArray = function(t) {
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.toGeometryArray = function(t) {
        if (null === t)
            return null;
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.getDefaultCoordinateSequenceFactory = function() {
        return hh.instance()
    }
    ,
    _h.toMultiLineStringArray = function(t) {
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.toLineStringArray = function(t) {
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.toMultiPointArray = function(t) {
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.toLinearRingArray = function(t) {
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.toPointArray = function(t) {
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.toPolygonArray = function(t) {
        var e = new Array(t.size()).fill(null);
        return t.toArray(e)
    }
    ,
    _h.createPointFromInternalCoord = function(t, e) {
        return e.getPrecisionModel().makePrecise(t),
        e.getFactory().createPoint(t)
    }
    ,
    mh.serialVersionUID.get = function() {
        return -0x5ea75f2051eeb400
    }
    ,
    Object.defineProperties(_h, mh);
    var xh = ["Point", "MultiPoint", "LineString", "MultiLineString", "Polygon", "MultiPolygon"]
      , Eh = function(t) {
        this.geometryFactory = t || new _h
    };
    Eh.prototype.read = function(t) {
        var e, n = (e = "string" == typeof t ? JSON.parse(t) : t).type;
        if (!bh[n])
            throw new Error("Unknown GeoJSON type: " + e.type);
        return -1 !== xh.indexOf(n) ? bh[n].apply(this, [e.coordinates]) : "GeometryCollection" === n ? bh[n].apply(this, [e.geometries]) : bh[n].apply(this, [e])
    }
    ,
    Eh.prototype.write = function(t) {
        var e = t.getGeometryType();
        if (!wh[e])
            throw new Error("Geometry is not supported");
        return wh[e].apply(this, [t])
    }
    ;
    var bh = {
        Feature: function(t) {
            var e = {};
            for (var n in t)
                e[n] = t[n];
            if (t.geometry) {
                var r = t.geometry.type;
                if (!bh[r])
                    throw new Error("Unknown GeoJSON type: " + t.type);
                e.geometry = this.read(t.geometry)
            }
            return t.bbox && (e.bbox = bh.bbox.apply(this, [t.bbox])),
            e
        },
        FeatureCollection: function(t) {
            var e = {};
            if (t.features) {
                e.features = [];
                for (var n = 0; n < t.features.length; ++n)
                    e.features.push(this.read(t.features[n]))
            }
            return t.bbox && (e.bbox = this.parse.bbox.apply(this, [t.bbox])),
            e
        },
        coordinates: function(t) {
            for (var e = [], n = 0; n < t.length; ++n) {
                var r = t[n];
                e.push(new ul(r[0],r[1]))
            }
            return e
        },
        bbox: function(t) {
            return this.geometryFactory.createLinearRing([new ul(t[0],t[1]), new ul(t[2],t[1]), new ul(t[2],t[3]), new ul(t[0],t[3]), new ul(t[0],t[1])])
        },
        Point: function(t) {
            var e = new ul(t[0],t[1]);
            return this.geometryFactory.createPoint(e)
        },
        MultiPoint: function(t) {
            for (var e = [], n = 0; n < t.length; ++n)
                e.push(bh.Point.apply(this, [t[n]]));
            return this.geometryFactory.createMultiPoint(e)
        },
        LineString: function(t) {
            var e = bh.coordinates.apply(this, [t]);
            return this.geometryFactory.createLineString(e)
        },
        MultiLineString: function(t) {
            for (var e = [], n = 0; n < t.length; ++n)
                e.push(bh.LineString.apply(this, [t[n]]));
            return this.geometryFactory.createMultiLineString(e)
        },
        Polygon: function(t) {
            for (var e = bh.coordinates.apply(this, [t[0]]), n = this.geometryFactory.createLinearRing(e), r = [], i = 1; i < t.length; ++i) {
                var o = t[i]
                  , s = bh.coordinates.apply(this, [o])
                  , a = this.geometryFactory.createLinearRing(s);
                r.push(a)
            }
            return this.geometryFactory.createPolygon(n, r)
        },
        MultiPolygon: function(t) {
            for (var e = [], n = 0; n < t.length; ++n) {
                var r = t[n];
                e.push(bh.Polygon.apply(this, [r]))
            }
            return this.geometryFactory.createMultiPolygon(e)
        },
        GeometryCollection: function(t) {
            for (var e = [], n = 0; n < t.length; ++n) {
                var r = t[n];
                e.push(this.read(r))
            }
            return this.geometryFactory.createGeometryCollection(e)
        }
    }
      , wh = {
        coordinate: function(t) {
            return [t.x, t.y]
        },
        Point: function(t) {
            return {
                type: "Point",
                coordinates: wh.coordinate.apply(this, [t.getCoordinate()])
            }
        },
        MultiPoint: function(t) {
            for (var e = [], n = 0; n < t._geometries.length; ++n) {
                var r = t._geometries[n]
                  , i = wh.Point.apply(this, [r]);
                e.push(i.coordinates)
            }
            return {
                type: "MultiPoint",
                coordinates: e
            }
        },
        LineString: function(t) {
            for (var e = [], n = t.getCoordinates(), r = 0; r < n.length; ++r) {
                var i = n[r];
                e.push(wh.coordinate.apply(this, [i]))
            }
            return {
                type: "LineString",
                coordinates: e
            }
        },
        MultiLineString: function(t) {
            for (var e = [], n = 0; n < t._geometries.length; ++n) {
                var r = t._geometries[n]
                  , i = wh.LineString.apply(this, [r]);
                e.push(i.coordinates)
            }
            return {
                type: "MultiLineString",
                coordinates: e
            }
        },
        Polygon: function(t) {
            var e = []
              , n = wh.LineString.apply(this, [t._shell]);
            e.push(n.coordinates);
            for (var r = 0; r < t._holes.length; ++r) {
                var i = t._holes[r]
                  , o = wh.LineString.apply(this, [i]);
                e.push(o.coordinates)
            }
            return {
                type: "Polygon",
                coordinates: e
            }
        },
        MultiPolygon: function(t) {
            for (var e = [], n = 0; n < t._geometries.length; ++n) {
                var r = t._geometries[n]
                  , i = wh.Polygon.apply(this, [r]);
                e.push(i.coordinates)
            }
            return {
                type: "MultiPolygon",
                coordinates: e
            }
        },
        GeometryCollection: function(t) {
            for (var e = [], n = 0; n < t._geometries.length; ++n) {
                var r = t._geometries[n]
                  , i = r.getGeometryType();
                e.push(wh[i].apply(this, [r]))
            }
            return {
                type: "GeometryCollection",
                geometries: e
            }
        }
    }
      , Ih = function(t) {
        this.geometryFactory = t || new _h,
        this.precisionModel = this.geometryFactory.getPrecisionModel(),
        this.parser = new Eh(this.geometryFactory)
    };
    Ih.prototype.read = function(t) {
        var e = this.parser.read(t);
        return this.precisionModel.getType() === gh.FIXED && this.reducePrecision(e),
        e
    }
    ,
    Ih.prototype.reducePrecision = function(t) {
        var e, n;
        if (t.coordinate)
            this.precisionModel.makePrecise(t.coordinate);
        else if (t.points)
            for (e = 0,
            n = t.points.length; e < n; e++)
                this.precisionModel.makePrecise(t.points[e]);
        else if (t.geometries)
            for (e = 0,
            n = t.geometries.length; e < n; e++)
                this.reducePrecision(t.geometries[e])
    }
    ;
    var Nh = function() {
        this.parser = new Eh(this.geometryFactory)
    };
    Nh.prototype.write = function(t) {
        return this.parser.write(t)
    }
    ;
    var Sh = function() {}
      , Ch = {
        ON: {
            configurable: !0
        },
        LEFT: {
            configurable: !0
        },
        RIGHT: {
            configurable: !0
        }
    };
    function Ph(t) {
        this.message = t || ""
    }
    function Mh() {
        this.array_ = []
    }
    Sh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Sh.prototype.getClass = function() {
        return Sh
    }
    ,
    Sh.opposite = function(t) {
        return t === Sh.LEFT ? Sh.RIGHT : t === Sh.RIGHT ? Sh.LEFT : t
    }
    ,
    Ch.ON.get = function() {
        return 0
    }
    ,
    Ch.LEFT.get = function() {
        return 1
    }
    ,
    Ch.RIGHT.get = function() {
        return 2
    }
    ,
    Object.defineProperties(Sh, Ch),
    Ph.prototype = new Error,
    Ph.prototype.name = "EmptyStackException",
    Mh.prototype = new ac,
    Mh.prototype.add = function(t) {
        return this.array_.push(t),
        !0
    }
    ,
    Mh.prototype.get = function(t) {
        if (t < 0 || t >= this.size())
            throw new Error;
        return this.array_[t]
    }
    ,
    Mh.prototype.push = function(t) {
        return this.array_.push(t),
        t
    }
    ,
    Mh.prototype.pop = function(t) {
        if (0 === this.array_.length)
            throw new Ph;
        return this.array_.pop()
    }
    ,
    Mh.prototype.peek = function() {
        if (0 === this.array_.length)
            throw new Ph;
        return this.array_[this.array_.length - 1]
    }
    ,
    Mh.prototype.empty = function() {
        return 0 === this.array_.length
    }
    ,
    Mh.prototype.isEmpty = function() {
        return this.empty()
    }
    ,
    Mh.prototype.search = function(t) {
        return this.array_.indexOf(t)
    }
    ,
    Mh.prototype.size = function() {
        return this.array_.length
    }
    ,
    Mh.prototype.toArray = function() {
        for (var t = [], e = 0, n = this.array_.length; e < n; e++)
            t.push(this.array_[e]);
        return t
    }
    ;
    var Lh = function() {
        this._minIndex = -1,
        this._minCoord = null,
        this._minDe = null,
        this._orientedDe = null
    };
    Lh.prototype.getCoordinate = function() {
        return this._minCoord
    }
    ,
    Lh.prototype.getRightmostSide = function(t, e) {
        var n = this.getRightmostSideOfSegment(t, e);
        return n < 0 && (n = this.getRightmostSideOfSegment(t, e - 1)),
        n < 0 && (this._minCoord = null,
        this.checkForRightmostCoordinate(t)),
        n
    }
    ,
    Lh.prototype.findRightmostEdgeAtVertex = function() {
        var t = this._minDe.getEdge().getCoordinates();
        ql.isTrue(this._minIndex > 0 && this._minIndex < t.length, "rightmost point expected to be interior vertex of edge");
        var e = t[this._minIndex - 1]
          , n = t[this._minIndex + 1]
          , r = Xl.computeOrientation(this._minCoord, n, e)
          , i = !1;
        (e.y < this._minCoord.y && n.y < this._minCoord.y && r === Xl.COUNTERCLOCKWISE || e.y > this._minCoord.y && n.y > this._minCoord.y && r === Xl.CLOCKWISE) && (i = !0),
        i && (this._minIndex = this._minIndex - 1)
    }
    ,
    Lh.prototype.getRightmostSideOfSegment = function(t, e) {
        var n = t.getEdge().getCoordinates();
        if (e < 0 || e + 1 >= n.length)
            return -1;
        if (n[e].y === n[e + 1].y)
            return -1;
        var r = Sh.LEFT;
        return n[e].y < n[e + 1].y && (r = Sh.RIGHT),
        r
    }
    ,
    Lh.prototype.getEdge = function() {
        return this._orientedDe
    }
    ,
    Lh.prototype.checkForRightmostCoordinate = function(t) {
        for (var e = this, n = t.getEdge().getCoordinates(), r = 0; r < n.length - 1; r++)
            (null === e._minCoord || n[r].x > e._minCoord.x) && (e._minDe = t,
            e._minIndex = r,
            e._minCoord = n[r])
    }
    ,
    Lh.prototype.findRightmostEdgeAtNode = function() {
        var 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)
    }
    ,
    Lh.prototype.findEdge = function(t) {
        for (var e = t.iterator(); e.hasNext(); ) {
            var n = e.next();
            n.isForward() && this.checkForRightmostCoordinate(n)
        }
        ql.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) === Sh.LEFT && (this._orientedDe = this._minDe.getSym())
    }
    ,
    Lh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Lh.prototype.getClass = function() {
        return Lh
    }
    ;
    var Oh = function(t) {
        function e(n, r) {
            t.call(this, e.msgWithCoord(n, r)),
            this.pt = r ? new ul(r) : null,
            this.name = "TopologyException"
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.getCoordinate = function() {
            return this.pt
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e.msgWithCoord = function(t, e) {
            return e ? t : t + " [ " + e + " ]"
        }
        ,
        e
    }(kl)
      , Rh = function() {
        this.array_ = []
    };
    Rh.prototype.addLast = function(t) {
        this.array_.push(t)
    }
    ,
    Rh.prototype.removeFirst = function() {
        return this.array_.shift()
    }
    ,
    Rh.prototype.isEmpty = function() {
        return 0 === this.array_.length
    }
    ;
    var Th = function() {
        this._finder = null,
        this._dirEdgeList = new lc,
        this._nodes = new lc,
        this._rightMostCoord = null,
        this._env = null,
        this._finder = new Lh
    };
    Th.prototype.clearVisitedEdges = function() {
        for (var t = this._dirEdgeList.iterator(); t.hasNext(); ) {
            t.next().setVisited(!1)
        }
    }
    ,
    Th.prototype.getRightmostCoordinate = function() {
        return this._rightMostCoord
    }
    ,
    Th.prototype.computeNodeDepth = function(t) {
        for (var e = null, n = t.getEdges().iterator(); n.hasNext(); ) {
            var r = n.next();
            if (r.isVisited() || r.getSym().isVisited()) {
                e = r;
                break
            }
        }
        if (null === e)
            throw new Oh("unable to find edge to compute depths at " + t.getCoordinate());
        t.getEdges().computeDepths(e);
        for (var i = t.getEdges().iterator(); i.hasNext(); ) {
            var o = i.next();
            o.setVisited(!0),
            this.copySymDepths(o)
        }
    }
    ,
    Th.prototype.computeDepth = function(t) {
        this.clearVisitedEdges();
        var e = this._finder.getEdge();
        e.setEdgeDepths(Sh.RIGHT, t),
        this.copySymDepths(e),
        this.computeDepths(e)
    }
    ,
    Th.prototype.create = function(t) {
        this.addReachable(t),
        this._finder.findEdge(this._dirEdgeList),
        this._rightMostCoord = this._finder.getCoordinate()
    }
    ,
    Th.prototype.findResultEdges = function() {
        for (var t = this._dirEdgeList.iterator(); t.hasNext(); ) {
            var e = t.next();
            e.getDepth(Sh.RIGHT) >= 1 && e.getDepth(Sh.LEFT) <= 0 && !e.isInteriorAreaEdge() && e.setInResult(!0)
        }
    }
    ,
    Th.prototype.computeDepths = function(t) {
        var e = new xc
          , n = new Rh
          , r = t.getNode();
        for (n.addLast(r),
        e.add(r),
        t.setVisited(!0); !n.isEmpty(); ) {
            var i = n.removeFirst();
            e.add(i),
            this.computeNodeDepth(i);
            for (var o = i.getEdges().iterator(); o.hasNext(); ) {
                var s = o.next().getSym();
                if (!s.isVisited()) {
                    var a = s.getNode();
                    e.contains(a) || (n.addLast(a),
                    e.add(a))
                }
            }
        }
    }
    ,
    Th.prototype.compareTo = function(t) {
        var e = t;
        return this._rightMostCoord.x < e._rightMostCoord.x ? -1 : this._rightMostCoord.x > e._rightMostCoord.x ? 1 : 0
    }
    ,
    Th.prototype.getEnvelope = function() {
        if (null === this._env) {
            for (var t = new Ll, e = this._dirEdgeList.iterator(); e.hasNext(); )
                for (var n = e.next().getEdge().getCoordinates(), r = 0; r < n.length - 1; r++)
                    t.expandToInclude(n[r]);
            this._env = t
        }
        return this._env
    }
    ,
    Th.prototype.addReachable = function(t) {
        var e = new Mh;
        for (e.add(t); !e.empty(); ) {
            var n = e.pop();
            this.add(n, e)
        }
    }
    ,
    Th.prototype.copySymDepths = function(t) {
        var e = t.getSym();
        e.setDepth(Sh.LEFT, t.getDepth(Sh.RIGHT)),
        e.setDepth(Sh.RIGHT, t.getDepth(Sh.LEFT))
    }
    ,
    Th.prototype.add = function(t, e) {
        t.setVisited(!0),
        this._nodes.add(t);
        for (var n = t.getEdges().iterator(); n.hasNext(); ) {
            var r = n.next();
            this._dirEdgeList.add(r);
            var i = r.getSym().getNode();
            i.isVisited() || e.push(i)
        }
    }
    ,
    Th.prototype.getNodes = function() {
        return this._nodes
    }
    ,
    Th.prototype.getDirectedEdges = function() {
        return this._dirEdgeList
    }
    ,
    Th.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    Th.prototype.getClass = function() {
        return Th
    }
    ;
    var Ah = function t() {
        var e = this;
        if (this.location = null,
        1 === arguments.length) {
            if (arguments[0]instanceof Array) {
                var n = arguments[0];
                this.init(n.length)
            } else if (Number.isInteger(arguments[0])) {
                var r = arguments[0];
                this.init(1),
                this.location[Sh.ON] = r
            } else if (arguments[0]instanceof t) {
                var i = arguments[0];
                if (this.init(i.location.length),
                null !== i)
                    for (var o = 0; o < this.location.length; o++)
                        e.location[o] = i.location[o]
            }
        } else if (3 === arguments.length) {
            var s = arguments[0]
              , a = arguments[1]
              , u = arguments[2];
            this.init(3),
            this.location[Sh.ON] = s,
            this.location[Sh.LEFT] = a,
            this.location[Sh.RIGHT] = u
        }
    };
    Ah.prototype.setAllLocations = function(t) {
        for (var e = 0; e < this.location.length; e++)
            this.location[e] = t
    }
    ,
    Ah.prototype.isNull = function() {
        for (var t = 0; t < this.location.length; t++)
            if (this.location[t] !== pl.NONE)
                return !1;
        return !0
    }
    ,
    Ah.prototype.setAllLocationsIfNull = function(t) {
        for (var e = 0; e < this.location.length; e++)
            this.location[e] === pl.NONE && (this.location[e] = t)
    }
    ,
    Ah.prototype.isLine = function() {
        return 1 === this.location.length
    }
    ,
    Ah.prototype.merge = function(t) {
        if (t.location.length > this.location.length) {
            var e = new Array(3).fill(null);
            e[Sh.ON] = this.location[Sh.ON],
            e[Sh.LEFT] = pl.NONE,
            e[Sh.RIGHT] = pl.NONE,
            this.location = e
        }
        for (var n = 0; n < this.location.length; n++)
            this.location[n] === pl.NONE && n < t.location.length && (this.location[n] = t.location[n])
    }
    ,
    Ah.prototype.getLocations = function() {
        return this.location
    }
    ,
    Ah.prototype.flip = function() {
        if (this.location.length <= 1)
            return null;
        var t = this.location[Sh.LEFT];
        this.location[Sh.LEFT] = this.location[Sh.RIGHT],
        this.location[Sh.RIGHT] = t
    }
    ,
    Ah.prototype.toString = function() {
        var t = new vl;
        return this.location.length > 1 && t.append(pl.toLocationSymbol(this.location[Sh.LEFT])),
        t.append(pl.toLocationSymbol(this.location[Sh.ON])),
        this.location.length > 1 && t.append(pl.toLocationSymbol(this.location[Sh.RIGHT])),
        t.toString()
    }
    ,
    Ah.prototype.setLocations = function(t, e, n) {
        this.location[Sh.ON] = t,
        this.location[Sh.LEFT] = e,
        this.location[Sh.RIGHT] = n
    }
    ,
    Ah.prototype.get = function(t) {
        return t < this.location.length ? this.location[t] : pl.NONE
    }
    ,
    Ah.prototype.isArea = function() {
        return this.location.length > 1
    }
    ,
    Ah.prototype.isAnyNull = function() {
        for (var t = 0; t < this.location.length; t++)
            if (this.location[t] === pl.NONE)
                return !0;
        return !1
    }
    ,
    Ah.prototype.setLocation = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.setLocation(Sh.ON, t)
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            this.location[e] = n
        }
    }
    ,
    Ah.prototype.init = function(t) {
        this.location = new Array(t).fill(null),
        this.setAllLocations(pl.NONE)
    }
    ,
    Ah.prototype.isEqualOnSide = function(t, e) {
        return this.location[e] === t.location[e]
    }
    ,
    Ah.prototype.allPositionsEqual = function(t) {
        for (var e = 0; e < this.location.length; e++)
            if (this.location[e] !== t)
                return !1;
        return !0
    }
    ,
    Ah.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ah.prototype.getClass = function() {
        return Ah
    }
    ;
    var Dh = function t() {
        if (this.elt = new Array(2).fill(null),
        1 === arguments.length) {
            if (Number.isInteger(arguments[0])) {
                var e = arguments[0];
                this.elt[0] = new Ah(e),
                this.elt[1] = new Ah(e)
            } else if (arguments[0]instanceof t) {
                var n = arguments[0];
                this.elt[0] = new Ah(n.elt[0]),
                this.elt[1] = new Ah(n.elt[1])
            }
        } else if (2 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1];
            this.elt[0] = new Ah(pl.NONE),
            this.elt[1] = new Ah(pl.NONE),
            this.elt[r].setLocation(i)
        } else if (3 === arguments.length) {
            var o = arguments[0]
              , s = arguments[1]
              , a = arguments[2];
            this.elt[0] = new Ah(o,s,a),
            this.elt[1] = new Ah(o,s,a)
        } else if (4 === arguments.length) {
            var u = arguments[0]
              , l = arguments[1]
              , c = arguments[2]
              , h = arguments[3];
            this.elt[0] = new Ah(pl.NONE,pl.NONE,pl.NONE),
            this.elt[1] = new Ah(pl.NONE,pl.NONE,pl.NONE),
            this.elt[u].setLocations(l, c, h)
        }
    };
    Dh.prototype.getGeometryCount = function() {
        var t = 0;
        return this.elt[0].isNull() || t++,
        this.elt[1].isNull() || t++,
        t
    }
    ,
    Dh.prototype.setAllLocations = function(t, e) {
        this.elt[t].setAllLocations(e)
    }
    ,
    Dh.prototype.isNull = function(t) {
        return this.elt[t].isNull()
    }
    ,
    Dh.prototype.setAllLocationsIfNull = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.setAllLocationsIfNull(0, t),
            this.setAllLocationsIfNull(1, t)
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            this.elt[e].setAllLocationsIfNull(n)
        }
    }
    ,
    Dh.prototype.isLine = function(t) {
        return this.elt[t].isLine()
    }
    ,
    Dh.prototype.merge = function(t) {
        for (var e = this, n = 0; n < 2; n++)
            null === e.elt[n] && null !== t.elt[n] ? e.elt[n] = new Ah(t.elt[n]) : e.elt[n].merge(t.elt[n])
    }
    ,
    Dh.prototype.flip = function() {
        this.elt[0].flip(),
        this.elt[1].flip()
    }
    ,
    Dh.prototype.getLocation = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return this.elt[t].get(Sh.ON)
        }
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            return this.elt[e].get(n)
        }
    }
    ,
    Dh.prototype.toString = function() {
        var t = new vl;
        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()
    }
    ,
    Dh.prototype.isArea = function() {
        if (0 === arguments.length)
            return this.elt[0].isArea() || this.elt[1].isArea();
        if (1 === arguments.length) {
            var t = arguments[0];
            return this.elt[t].isArea()
        }
    }
    ,
    Dh.prototype.isAnyNull = function(t) {
        return this.elt[t].isAnyNull()
    }
    ,
    Dh.prototype.setLocation = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1];
            this.elt[t].setLocation(Sh.ON, e)
        } else if (3 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = arguments[2];
            this.elt[n].setLocation(r, i)
        }
    }
    ,
    Dh.prototype.isEqualOnSide = function(t, e) {
        return this.elt[0].isEqualOnSide(t.elt[0], e) && this.elt[1].isEqualOnSide(t.elt[1], e)
    }
    ,
    Dh.prototype.allPositionsEqual = function(t, e) {
        return this.elt[t].allPositionsEqual(e)
    }
    ,
    Dh.prototype.toLine = function(t) {
        this.elt[t].isArea() && (this.elt[t] = new Ah(this.elt[t].location[0]))
    }
    ,
    Dh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Dh.prototype.getClass = function() {
        return Dh
    }
    ,
    Dh.toLineLabel = function(t) {
        for (var e = new Dh(pl.NONE), n = 0; n < 2; n++)
            e.setLocation(n, t.getLocation(n));
        return e
    }
    ;
    var Fh = function() {
        this._startDe = null,
        this._maxNodeDegree = -1,
        this._edges = new lc,
        this._pts = new lc,
        this._label = new Dh(pl.NONE),
        this._ring = null,
        this._isHole = null,
        this._shell = null,
        this._holes = new lc,
        this._geometryFactory = null;
        var t = arguments[0]
          , e = arguments[1];
        this._geometryFactory = e,
        this.computePoints(t),
        this.computeRing()
    };
    Fh.prototype.computeRing = function() {
        if (null !== this._ring)
            return null;
        for (var t = new Array(this._pts.size()).fill(null), e = 0; e < this._pts.size(); e++)
            t[e] = this._pts.get(e);
        this._ring = this._geometryFactory.createLinearRing(t),
        this._isHole = Xl.isCCW(this._ring.getCoordinates())
    }
    ,
    Fh.prototype.isIsolated = function() {
        return 1 === this._label.getGeometryCount()
    }
    ,
    Fh.prototype.computePoints = function(t) {
        var e = this;
        this._startDe = t;
        var n = t
          , r = !0;
        do {
            if (null === n)
                throw new Oh("Found null DirectedEdge");
            if (n.getEdgeRing() === e)
                throw new Oh("Directed Edge visited twice during ring-building at " + n.getCoordinate());
            e._edges.add(n);
            var i = n.getLabel();
            ql.isTrue(i.isArea()),
            e.mergeLabel(i),
            e.addPoints(n.getEdge(), n.isForward(), r),
            r = !1,
            e.setEdgeRing(n, e),
            n = e.getNext(n)
        } while (n !== this._startDe)
    }
    ,
    Fh.prototype.getLinearRing = function() {
        return this._ring
    }
    ,
    Fh.prototype.getCoordinate = function(t) {
        return this._pts.get(t)
    }
    ,
    Fh.prototype.computeMaxNodeDegree = function() {
        var t = this;
        this._maxNodeDegree = 0;
        var e = this._startDe;
        do {
            var n = e.getNode().getEdges().getOutgoingDegree(t);
            n > t._maxNodeDegree && (t._maxNodeDegree = n),
            e = t.getNext(e)
        } while (e !== this._startDe);
        this._maxNodeDegree *= 2
    }
    ,
    Fh.prototype.addPoints = function(t, e, n) {
        var r = t.getCoordinates();
        if (e) {
            var i = 1;
            n && (i = 0);
            for (var o = i; o < r.length; o++)
                this._pts.add(r[o])
        } else {
            var s = r.length - 2;
            n && (s = r.length - 1);
            for (var a = s; a >= 0; a--)
                this._pts.add(r[a])
        }
    }
    ,
    Fh.prototype.isHole = function() {
        return this._isHole
    }
    ,
    Fh.prototype.setInResult = function() {
        var t = this._startDe;
        do {
            t.getEdge().setInResult(!0),
            t = t.getNext()
        } while (t !== this._startDe)
    }
    ,
    Fh.prototype.containsPoint = function(t) {
        var e = this.getLinearRing();
        if (!e.getEnvelopeInternal().contains(t))
            return !1;
        if (!Xl.isPointInRing(t, e.getCoordinates()))
            return !1;
        for (var n = this._holes.iterator(); n.hasNext(); ) {
            if (n.next().containsPoint(t))
                return !1
        }
        return !0
    }
    ,
    Fh.prototype.addHole = function(t) {
        this._holes.add(t)
    }
    ,
    Fh.prototype.isShell = function() {
        return null === this._shell
    }
    ,
    Fh.prototype.getLabel = function() {
        return this._label
    }
    ,
    Fh.prototype.getEdges = function() {
        return this._edges
    }
    ,
    Fh.prototype.getMaxNodeDegree = function() {
        return this._maxNodeDegree < 0 && this.computeMaxNodeDegree(),
        this._maxNodeDegree
    }
    ,
    Fh.prototype.getShell = function() {
        return this._shell
    }
    ,
    Fh.prototype.mergeLabel = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.mergeLabel(t, 0),
            this.mergeLabel(t, 1)
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1]
              , r = e.getLocation(n, Sh.RIGHT);
            if (r === pl.NONE)
                return null;
            if (this._label.getLocation(n) === pl.NONE)
                return this._label.setLocation(n, r),
                null
        }
    }
    ,
    Fh.prototype.setShell = function(t) {
        this._shell = t,
        null !== t && t.addHole(this)
    }
    ,
    Fh.prototype.toPolygon = function(t) {
        for (var e = new Array(this._holes.size()).fill(null), n = 0; n < this._holes.size(); n++)
            e[n] = this._holes.get(n).getLinearRing();
        return t.createPolygon(this.getLinearRing(), e)
    }
    ,
    Fh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Fh.prototype.getClass = function() {
        return Fh
    }
    ;
    var kh = function(t) {
        function e() {
            var e = arguments[0]
              , n = arguments[1];
            t.call(this, e, n)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.setEdgeRing = function(t, e) {
            t.setMinEdgeRing(e)
        }
        ,
        e.prototype.getNext = function(t) {
            return t.getNextMin()
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(Fh)
      , Gh = function(t) {
        function e() {
            var e = arguments[0]
              , n = arguments[1];
            t.call(this, e, n)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.buildMinimalRings = function() {
            var t = new lc
              , e = this._startDe;
            do {
                if (null === e.getMinEdgeRing()) {
                    var n = new kh(e,this._geometryFactory);
                    t.add(n)
                }
                e = e.getNext()
            } while (e !== this._startDe);
            return t
        }
        ,
        e.prototype.setEdgeRing = function(t, e) {
            t.setEdgeRing(e)
        }
        ,
        e.prototype.linkDirectedEdgesForMinimalEdgeRings = function() {
            var t = this._startDe;
            do {
                t.getNode().getEdges().linkMinimalDirectedEdges(this),
                t = t.getNext()
            } while (t !== this._startDe)
        }
        ,
        e.prototype.getNext = function(t) {
            return t.getNext()
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(Fh)
      , qh = function() {
        if (this._label = null,
        this._isInResult = !1,
        this._isCovered = !1,
        this._isCoveredSet = !1,
        this._isVisited = !1,
        0 === arguments.length)
            ;
        else if (1 === arguments.length) {
            var t = arguments[0];
            this._label = t
        }
    };
    qh.prototype.setVisited = function(t) {
        this._isVisited = t
    }
    ,
    qh.prototype.setInResult = function(t) {
        this._isInResult = t
    }
    ,
    qh.prototype.isCovered = function() {
        return this._isCovered
    }
    ,
    qh.prototype.isCoveredSet = function() {
        return this._isCoveredSet
    }
    ,
    qh.prototype.setLabel = function(t) {
        this._label = t
    }
    ,
    qh.prototype.getLabel = function() {
        return this._label
    }
    ,
    qh.prototype.setCovered = function(t) {
        this._isCovered = t,
        this._isCoveredSet = !0
    }
    ,
    qh.prototype.updateIM = function(t) {
        ql.isTrue(this._label.getGeometryCount() >= 2, "found partial label"),
        this.computeIM(t)
    }
    ,
    qh.prototype.isInResult = function() {
        return this._isInResult
    }
    ,
    qh.prototype.isVisited = function() {
        return this._isVisited
    }
    ,
    qh.prototype.interfaces_ = function() {
        return []
    }
    ,
    qh.prototype.getClass = function() {
        return qh
    }
    ;
    var Bh = function(t) {
        function e() {
            t.call(this),
            this._coord = null,
            this._edges = null;
            var e = arguments[0]
              , n = arguments[1];
            this._coord = e,
            this._edges = n,
            this._label = new Dh(0,pl.NONE)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.isIncidentEdgeInResult = function() {
            for (var t = this.getEdges().getEdges().iterator(); t.hasNext(); ) {
                if (t.next().getEdge().isInResult())
                    return !0
            }
            return !1
        }
        ,
        e.prototype.isIsolated = function() {
            return 1 === this._label.getGeometryCount()
        }
        ,
        e.prototype.getCoordinate = function() {
            return this._coord
        }
        ,
        e.prototype.print = function(t) {
            t.println("node " + this._coord + " lbl: " + this._label)
        }
        ,
        e.prototype.computeIM = function(t) {}
        ,
        e.prototype.computeMergedLocation = function(t, e) {
            var n = pl.NONE;
            if (n = this._label.getLocation(e),
            !t.isNull(e)) {
                var r = t.getLocation(e);
                n !== pl.BOUNDARY && (n = r)
            }
            return n
        }
        ,
        e.prototype.setLabel = function() {
            if (2 !== arguments.length)
                return t.prototype.setLabel.apply(this, arguments);
            var e = arguments[0]
              , n = arguments[1];
            null === this._label ? this._label = new Dh(e,n) : this._label.setLocation(e, n)
        }
        ,
        e.prototype.getEdges = function() {
            return this._edges
        }
        ,
        e.prototype.mergeLabel = function() {
            var t = this;
            if (arguments[0]instanceof e) {
                var n = arguments[0];
                this.mergeLabel(n._label)
            } else if (arguments[0]instanceof Dh)
                for (var r = arguments[0], i = 0; i < 2; i++) {
                    var o = t.computeMergedLocation(r, i)
                      , s = t._label.getLocation(i);
                    s === pl.NONE && t._label.setLocation(i, o)
                }
        }
        ,
        e.prototype.add = function(t) {
            this._edges.insert(t),
            t.setNode(this)
        }
        ,
        e.prototype.setLabelBoundary = function(t) {
            if (null === this._label)
                return null;
            var e = pl.NONE;
            null !== this._label && (e = this._label.getLocation(t));
            var n = null;
            switch (e) {
            case pl.BOUNDARY:
                n = pl.INTERIOR;
                break;
            case pl.INTERIOR:
            default:
                n = pl.BOUNDARY
            }
            this._label.setLocation(t, n)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(qh)
      , zh = function() {
        this.nodeMap = new Cc,
        this.nodeFact = null;
        var t = arguments[0];
        this.nodeFact = t
    };
    zh.prototype.find = function(t) {
        return this.nodeMap.get(t)
    }
    ,
    zh.prototype.addNode = function() {
        if (arguments[0]instanceof ul) {
            var t = arguments[0]
              , e = this.nodeMap.get(t);
            return null === e && (e = this.nodeFact.createNode(t),
            this.nodeMap.put(t, e)),
            e
        }
        if (arguments[0]instanceof Bh) {
            var n = arguments[0]
              , r = this.nodeMap.get(n.getCoordinate());
            return null === r ? (this.nodeMap.put(n.getCoordinate(), n),
            n) : (r.mergeLabel(n),
            r)
        }
    }
    ,
    zh.prototype.print = function(t) {
        for (var e = this.iterator(); e.hasNext(); ) {
            e.next().print(t)
        }
    }
    ,
    zh.prototype.iterator = function() {
        return this.nodeMap.values().iterator()
    }
    ,
    zh.prototype.values = function() {
        return this.nodeMap.values()
    }
    ,
    zh.prototype.getBoundaryNodes = function(t) {
        for (var e = new lc, n = this.iterator(); n.hasNext(); ) {
            var r = n.next();
            r.getLabel().getLocation(t) === pl.BOUNDARY && e.add(r)
        }
        return e
    }
    ,
    zh.prototype.add = function(t) {
        var e = t.getCoordinate();
        this.addNode(e).add(t)
    }
    ,
    zh.prototype.interfaces_ = function() {
        return []
    }
    ,
    zh.prototype.getClass = function() {
        return zh
    }
    ;
    var jh = function() {}
      , Uh = {
        NE: {
            configurable: !0
        },
        NW: {
            configurable: !0
        },
        SW: {
            configurable: !0
        },
        SE: {
            configurable: !0
        }
    };
    jh.prototype.interfaces_ = function() {
        return []
    }
    ,
    jh.prototype.getClass = function() {
        return jh
    }
    ,
    jh.isNorthern = function(t) {
        return t === jh.NE || t === jh.NW
    }
    ,
    jh.isOpposite = function(t, e) {
        return t !== e && 2 === (t - e + 4) % 4
    }
    ,
    jh.commonHalfPlane = function(t, e) {
        if (t === e)
            return t;
        if (2 === (t - e + 4) % 4)
            return -1;
        var n = t < e ? t : e;
        return 0 === n && 3 === (t > e ? t : e) ? 3 : n
    }
    ,
    jh.isInHalfPlane = function(t, e) {
        return e === jh.SE ? t === jh.SE || t === jh.SW : t === e || t === e + 1
    }
    ,
    jh.quadrant = function() {
        if ("number" == typeof arguments[0] && "number" == typeof arguments[1]) {
            var t = arguments[0]
              , e = arguments[1];
            if (0 === t && 0 === e)
                throw new el("Cannot compute the quadrant for point ( " + t + ", " + e + " )");
            return t >= 0 ? e >= 0 ? jh.NE : jh.SE : e >= 0 ? jh.NW : jh.SW
        }
        if (arguments[0]instanceof ul && arguments[1]instanceof ul) {
            var n = arguments[0]
              , r = arguments[1];
            if (r.x === n.x && r.y === n.y)
                throw new el("Cannot compute the quadrant for two identical points " + n);
            return r.x >= n.x ? r.y >= n.y ? jh.NE : jh.SE : r.y >= n.y ? jh.NW : jh.SW
        }
    }
    ,
    Uh.NE.get = function() {
        return 0
    }
    ,
    Uh.NW.get = function() {
        return 1
    }
    ,
    Uh.SW.get = function() {
        return 2
    }
    ,
    Uh.SE.get = function() {
        return 3
    }
    ,
    Object.defineProperties(jh, Uh);
    var Vh = function() {
        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) {
            var t = arguments[0];
            this._edge = t
        } else if (3 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2]
              , i = null;
            this._edge = e,
            this.init(n, r),
            this._label = i
        } else if (4 === arguments.length) {
            var o = arguments[0]
              , s = arguments[1]
              , a = arguments[2]
              , u = arguments[3];
            this._edge = o,
            this.init(s, a),
            this._label = u
        }
    };
    Vh.prototype.compareDirection = function(t) {
        return this._dx === t._dx && this._dy === t._dy ? 0 : this._quadrant > t._quadrant ? 1 : this._quadrant < t._quadrant ? -1 : Xl.computeOrientation(t._p0, t._p1, this._p1)
    }
    ,
    Vh.prototype.getDy = function() {
        return this._dy
    }
    ,
    Vh.prototype.getCoordinate = function() {
        return this._p0
    }
    ,
    Vh.prototype.setNode = function(t) {
        this._node = t
    }
    ,
    Vh.prototype.print = function(t) {
        var e = Math.atan2(this._dy, this._dx)
          , n = this.getClass().getName()
          , r = n.lastIndexOf(".")
          , i = n.substring(r + 1);
        t.print("  " + i + ": " + this._p0 + " - " + this._p1 + " " + this._quadrant + ":" + e + "   " + this._label)
    }
    ,
    Vh.prototype.compareTo = function(t) {
        var e = t;
        return this.compareDirection(e)
    }
    ,
    Vh.prototype.getDirectedCoordinate = function() {
        return this._p1
    }
    ,
    Vh.prototype.getDx = function() {
        return this._dx
    }
    ,
    Vh.prototype.getLabel = function() {
        return this._label
    }
    ,
    Vh.prototype.getEdge = function() {
        return this._edge
    }
    ,
    Vh.prototype.getQuadrant = function() {
        return this._quadrant
    }
    ,
    Vh.prototype.getNode = function() {
        return this._node
    }
    ,
    Vh.prototype.toString = function() {
        var t = Math.atan2(this._dy, this._dx)
          , e = this.getClass().getName()
          , n = e.lastIndexOf(".");
        return "  " + e.substring(n + 1) + ": " + this._p0 + " - " + this._p1 + " " + this._quadrant + ":" + t + "   " + this._label
    }
    ,
    Vh.prototype.computeLabel = function(t) {}
    ,
    Vh.prototype.init = function(t, e) {
        this._p0 = t,
        this._p1 = e,
        this._dx = e.x - t.x,
        this._dy = e.y - t.y,
        this._quadrant = jh.quadrant(this._dx, this._dy),
        ql.isTrue(!(0 === this._dx && 0 === this._dy), "EdgeEnd with identical endpoints found")
    }
    ,
    Vh.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    Vh.prototype.getClass = function() {
        return Vh
    }
    ;
    var Xh = function(t) {
        function e() {
            var e = arguments[0]
              , n = arguments[1];
            if (t.call(this, e),
            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],
            this._isForward = n,
            n)
                this.init(e.getCoordinate(0), e.getCoordinate(1));
            else {
                var r = e.getNumPoints() - 1;
                this.init(e.getCoordinate(r), e.getCoordinate(r - 1))
            }
            this.computeDirectedLabel()
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.getNextMin = function() {
            return this._nextMin
        }
        ,
        e.prototype.getDepth = function(t) {
            return this._depth[t]
        }
        ,
        e.prototype.setVisited = function(t) {
            this._isVisited = t
        }
        ,
        e.prototype.computeDirectedLabel = function() {
            this._label = new Dh(this._edge.getLabel()),
            this._isForward || this._label.flip()
        }
        ,
        e.prototype.getNext = function() {
            return this._next
        }
        ,
        e.prototype.setDepth = function(t, e) {
            if (-999 !== this._depth[t] && this._depth[t] !== e)
                throw new Oh("assigned depths do not match",this.getCoordinate());
            this._depth[t] = e
        }
        ,
        e.prototype.isInteriorAreaEdge = function() {
            for (var t = this, e = !0, n = 0; n < 2; n++)
                t._label.isArea(n) && t._label.getLocation(n, Sh.LEFT) === pl.INTERIOR && t._label.getLocation(n, Sh.RIGHT) === pl.INTERIOR || (e = !1);
            return e
        }
        ,
        e.prototype.setNextMin = function(t) {
            this._nextMin = t
        }
        ,
        e.prototype.print = function(e) {
            t.prototype.print.call(this, e),
            e.print(" " + this._depth[Sh.LEFT] + "/" + this._depth[Sh.RIGHT]),
            e.print(" (" + this.getDepthDelta() + ")"),
            this._isInResult && e.print(" inResult")
        }
        ,
        e.prototype.setMinEdgeRing = function(t) {
            this._minEdgeRing = t
        }
        ,
        e.prototype.isLineEdge = function() {
            var t = this._label.isLine(0) || this._label.isLine(1)
              , e = !this._label.isArea(0) || this._label.allPositionsEqual(0, pl.EXTERIOR)
              , n = !this._label.isArea(1) || this._label.allPositionsEqual(1, pl.EXTERIOR);
            return t && e && n
        }
        ,
        e.prototype.setEdgeRing = function(t) {
            this._edgeRing = t
        }
        ,
        e.prototype.getMinEdgeRing = function() {
            return this._minEdgeRing
        }
        ,
        e.prototype.getDepthDelta = function() {
            var t = this._edge.getDepthDelta();
            return this._isForward || (t = -t),
            t
        }
        ,
        e.prototype.setInResult = function(t) {
            this._isInResult = t
        }
        ,
        e.prototype.getSym = function() {
            return this._sym
        }
        ,
        e.prototype.isForward = function() {
            return this._isForward
        }
        ,
        e.prototype.getEdge = function() {
            return this._edge
        }
        ,
        e.prototype.printEdge = function(t) {
            this.print(t),
            t.print(" "),
            this._isForward ? this._edge.print(t) : this._edge.printReverse(t)
        }
        ,
        e.prototype.setSym = function(t) {
            this._sym = t
        }
        ,
        e.prototype.setVisitedEdge = function(t) {
            this.setVisited(t),
            this._sym.setVisited(t)
        }
        ,
        e.prototype.setEdgeDepths = function(t, e) {
            var n = this.getEdge().getDepthDelta();
            this._isForward || (n = -n);
            var r = 1;
            t === Sh.LEFT && (r = -1);
            var i = Sh.opposite(t)
              , o = e + n * r;
            this.setDepth(t, e),
            this.setDepth(i, o)
        }
        ,
        e.prototype.getEdgeRing = function() {
            return this._edgeRing
        }
        ,
        e.prototype.isInResult = function() {
            return this._isInResult
        }
        ,
        e.prototype.setNext = function(t) {
            this._next = t
        }
        ,
        e.prototype.isVisited = function() {
            return this._isVisited
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e.depthFactor = function(t, e) {
            return t === pl.EXTERIOR && e === pl.INTERIOR ? 1 : t === pl.INTERIOR && e === pl.EXTERIOR ? -1 : 0
        }
        ,
        e
    }(Vh)
      , Yh = function() {};
    Yh.prototype.createNode = function(t) {
        return new Bh(t,null)
    }
    ,
    Yh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Yh.prototype.getClass = function() {
        return Yh
    }
    ;
    var Hh = function() {
        if (this._edges = new lc,
        this._nodes = null,
        this._edgeEndList = new lc,
        0 === arguments.length)
            this._nodes = new zh(new Yh);
        else if (1 === arguments.length) {
            var t = arguments[0];
            this._nodes = new zh(t)
        }
    };
    Hh.prototype.printEdges = function(t) {
        t.println("Edges:");
        for (var e = 0; e < this._edges.size(); e++) {
            t.println("edge " + e + ":");
            var n = this._edges.get(e);
            n.print(t),
            n.eiList.print(t)
        }
    }
    ,
    Hh.prototype.find = function(t) {
        return this._nodes.find(t)
    }
    ,
    Hh.prototype.addNode = function() {
        if (arguments[0]instanceof Bh) {
            var t = arguments[0];
            return this._nodes.addNode(t)
        }
        if (arguments[0]instanceof ul) {
            var e = arguments[0];
            return this._nodes.addNode(e)
        }
    }
    ,
    Hh.prototype.getNodeIterator = function() {
        return this._nodes.iterator()
    }
    ,
    Hh.prototype.linkResultDirectedEdges = function() {
        for (var t = this._nodes.iterator(); t.hasNext(); ) {
            t.next().getEdges().linkResultDirectedEdges()
        }
    }
    ,
    Hh.prototype.debugPrintln = function(t) {
        Pl.out.println(t)
    }
    ,
    Hh.prototype.isBoundaryNode = function(t, e) {
        var n = this._nodes.find(e);
        if (null === n)
            return !1;
        var r = n.getLabel();
        return null !== r && r.getLocation(t) === pl.BOUNDARY
    }
    ,
    Hh.prototype.linkAllDirectedEdges = function() {
        for (var t = this._nodes.iterator(); t.hasNext(); ) {
            t.next().getEdges().linkAllDirectedEdges()
        }
    }
    ,
    Hh.prototype.matchInSameDirection = function(t, e, n, r) {
        return !!t.equals(n) && (Xl.computeOrientation(t, e, r) === Xl.COLLINEAR && jh.quadrant(t, e) === jh.quadrant(n, r))
    }
    ,
    Hh.prototype.getEdgeEnds = function() {
        return this._edgeEndList
    }
    ,
    Hh.prototype.debugPrint = function(t) {
        Pl.out.print(t)
    }
    ,
    Hh.prototype.getEdgeIterator = function() {
        return this._edges.iterator()
    }
    ,
    Hh.prototype.findEdgeInSameDirection = function(t, e) {
        for (var n = this, r = 0; r < this._edges.size(); r++) {
            var i = n._edges.get(r)
              , o = i.getCoordinates();
            if (n.matchInSameDirection(t, e, o[0], o[1]))
                return i;
            if (n.matchInSameDirection(t, e, o[o.length - 1], o[o.length - 2]))
                return i
        }
        return null
    }
    ,
    Hh.prototype.insertEdge = function(t) {
        this._edges.add(t)
    }
    ,
    Hh.prototype.findEdgeEnd = function(t) {
        for (var e = this.getEdgeEnds().iterator(); e.hasNext(); ) {
            var n = e.next();
            if (n.getEdge() === t)
                return n
        }
        return null
    }
    ,
    Hh.prototype.addEdges = function(t) {
        for (var e = this, n = t.iterator(); n.hasNext(); ) {
            var r = n.next();
            e._edges.add(r);
            var i = new Xh(r,!0)
              , o = new Xh(r,!1);
            i.setSym(o),
            o.setSym(i),
            e.add(i),
            e.add(o)
        }
    }
    ,
    Hh.prototype.add = function(t) {
        this._nodes.add(t),
        this._edgeEndList.add(t)
    }
    ,
    Hh.prototype.getNodes = function() {
        return this._nodes.values()
    }
    ,
    Hh.prototype.findEdge = function(t, e) {
        for (var n = 0; n < this._edges.size(); n++) {
            var r = this._edges.get(n)
              , i = r.getCoordinates();
            if (t.equals(i[0]) && e.equals(i[1]))
                return r
        }
        return null
    }
    ,
    Hh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Hh.prototype.getClass = function() {
        return Hh
    }
    ,
    Hh.linkResultDirectedEdges = function(t) {
        for (var e = t.iterator(); e.hasNext(); ) {
            e.next().getEdges().linkResultDirectedEdges()
        }
    }
    ;
    var Wh = function() {
        this._geometryFactory = null,
        this._shellList = new lc;
        var t = arguments[0];
        this._geometryFactory = t
    };
    Wh.prototype.sortShellsAndHoles = function(t, e, n) {
        for (var r = t.iterator(); r.hasNext(); ) {
            var i = r.next();
            i.isHole() ? n.add(i) : e.add(i)
        }
    }
    ,
    Wh.prototype.computePolygons = function(t) {
        for (var e = new lc, n = t.iterator(); n.hasNext(); ) {
            var r = n.next().toPolygon(this._geometryFactory);
            e.add(r)
        }
        return e
    }
    ,
    Wh.prototype.placeFreeHoles = function(t, e) {
        for (var n = e.iterator(); n.hasNext(); ) {
            var r = n.next();
            if (null === r.getShell()) {
                var i = this.findEdgeRingContaining(r, t);
                if (null === i)
                    throw new Oh("unable to assign hole to a shell",r.getCoordinate(0));
                r.setShell(i)
            }
        }
    }
    ,
    Wh.prototype.buildMinimalEdgeRings = function(t, e, n) {
        for (var r = new lc, i = t.iterator(); i.hasNext(); ) {
            var o = i.next();
            if (o.getMaxNodeDegree() > 2) {
                o.linkDirectedEdgesForMinimalEdgeRings();
                var s = o.buildMinimalRings()
                  , a = this.findShell(s);
                null !== a ? (this.placePolygonHoles(a, s),
                e.add(a)) : n.addAll(s)
            } else
                r.add(o)
        }
        return r
    }
    ,
    Wh.prototype.containsPoint = function(t) {
        for (var e = this._shellList.iterator(); e.hasNext(); ) {
            if (e.next().containsPoint(t))
                return !0
        }
        return !1
    }
    ,
    Wh.prototype.buildMaximalEdgeRings = function(t) {
        for (var e = new lc, n = t.iterator(); n.hasNext(); ) {
            var r = n.next();
            if (r.isInResult() && r.getLabel().isArea() && null === r.getEdgeRing()) {
                var i = new Gh(r,this._geometryFactory);
                e.add(i),
                i.setInResult()
            }
        }
        return e
    }
    ,
    Wh.prototype.placePolygonHoles = function(t, e) {
        for (var n = e.iterator(); n.hasNext(); ) {
            var r = n.next();
            r.isHole() && r.setShell(t)
        }
    }
    ,
    Wh.prototype.getPolygons = function() {
        return this.computePolygons(this._shellList)
    }
    ,
    Wh.prototype.findEdgeRingContaining = function(t, e) {
        for (var n = t.getLinearRing(), r = n.getEnvelopeInternal(), i = n.getCoordinateN(0), o = null, s = null, a = e.iterator(); a.hasNext(); ) {
            var u = a.next()
              , l = u.getLinearRing()
              , c = l.getEnvelopeInternal();
            null !== o && (s = o.getLinearRing().getEnvelopeInternal());
            var h = !1;
            c.contains(r) && Xl.isPointInRing(i, l.getCoordinates()) && (h = !0),
            h && (null === o || s.contains(c)) && (o = u)
        }
        return o
    }
    ,
    Wh.prototype.findShell = function(t) {
        for (var e = 0, n = null, r = t.iterator(); r.hasNext(); ) {
            var i = r.next();
            i.isHole() || (n = i,
            e++)
        }
        return ql.isTrue(e <= 1, "found two shells in MinimalEdgeRing list"),
        n
    }
    ,
    Wh.prototype.add = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.add(t.getEdgeEnds(), t.getNodes())
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            Hh.linkResultDirectedEdges(n);
            var r = this.buildMaximalEdgeRings(e)
              , i = new lc
              , o = this.buildMinimalEdgeRings(r, this._shellList, i);
            this.sortShellsAndHoles(o, this._shellList, i),
            this.placeFreeHoles(this._shellList, i)
        }
    }
    ,
    Wh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Wh.prototype.getClass = function() {
        return Wh
    }
    ;
    var Jh = function() {};
    Jh.prototype.getBounds = function() {}
    ,
    Jh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Jh.prototype.getClass = function() {
        return Jh
    }
    ;
    var Zh = function() {
        this._bounds = null,
        this._item = null;
        var t = arguments[0]
          , e = arguments[1];
        this._bounds = t,
        this._item = e
    };
    Zh.prototype.getItem = function() {
        return this._item
    }
    ,
    Zh.prototype.getBounds = function() {
        return this._bounds
    }
    ,
    Zh.prototype.interfaces_ = function() {
        return [Jh, al]
    }
    ,
    Zh.prototype.getClass = function() {
        return Zh
    }
    ;
    var Kh = function() {
        this._size = null,
        this._items = null,
        this._size = 0,
        this._items = new lc,
        this._items.add(null)
    };
    Kh.prototype.poll = function() {
        if (this.isEmpty())
            return null;
        var t = this._items.get(1);
        return this._items.set(1, this._items.get(this._size)),
        this._size -= 1,
        this.reorder(1),
        t
    }
    ,
    Kh.prototype.size = function() {
        return this._size
    }
    ,
    Kh.prototype.reorder = function(t) {
        for (var e = this, n = null, r = this._items.get(t); 2 * t <= this._size && ((n = 2 * t) !== e._size && e._items.get(n + 1).compareTo(e._items.get(n)) < 0 && n++,
        e._items.get(n).compareTo(r) < 0); t = n)
            e._items.set(t, e._items.get(n));
        this._items.set(t, r)
    }
    ,
    Kh.prototype.clear = function() {
        this._size = 0,
        this._items.clear()
    }
    ,
    Kh.prototype.isEmpty = function() {
        return 0 === this._size
    }
    ,
    Kh.prototype.add = function(t) {
        this._items.add(null),
        this._size += 1;
        var 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)
    }
    ,
    Kh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Kh.prototype.getClass = function() {
        return Kh
    }
    ;
    var Qh = function() {};
    Qh.prototype.visitItem = function(t) {}
    ,
    Qh.prototype.interfaces_ = function() {
        return []
    }
    ,
    Qh.prototype.getClass = function() {
        return Qh
    }
    ;
    var $h = function() {};
    $h.prototype.insert = function(t, e) {}
    ,
    $h.prototype.remove = function(t, e) {}
    ,
    $h.prototype.query = function() {}
    ,
    $h.prototype.interfaces_ = function() {
        return []
    }
    ,
    $h.prototype.getClass = function() {
        return $h
    }
    ;
    var tp = function() {
        if (this._childBoundables = new lc,
        this._bounds = null,
        this._level = null,
        0 === arguments.length)
            ;
        else if (1 === arguments.length) {
            var t = arguments[0];
            this._level = t
        }
    }
      , ep = {
        serialVersionUID: {
            configurable: !0
        }
    };
    tp.prototype.getLevel = function() {
        return this._level
    }
    ,
    tp.prototype.size = function() {
        return this._childBoundables.size()
    }
    ,
    tp.prototype.getChildBoundables = function() {
        return this._childBoundables
    }
    ,
    tp.prototype.addChildBoundable = function(t) {
        ql.isTrue(null === this._bounds),
        this._childBoundables.add(t)
    }
    ,
    tp.prototype.isEmpty = function() {
        return this._childBoundables.isEmpty()
    }
    ,
    tp.prototype.getBounds = function() {
        return null === this._bounds && (this._bounds = this.computeBounds()),
        this._bounds
    }
    ,
    tp.prototype.interfaces_ = function() {
        return [Jh, al]
    }
    ,
    tp.prototype.getClass = function() {
        return tp
    }
    ,
    ep.serialVersionUID.get = function() {
        return 0x5a1e55ec41369800
    }
    ,
    Object.defineProperties(tp, ep);
    var np = function() {};
    np.reverseOrder = function() {
        return {
            compare: function(t, e) {
                return e.compareTo(t)
            }
        }
    }
    ,
    np.min = function(t) {
        return np.sort(t),
        t.get(0)
    }
    ,
    np.sort = function(t, e) {
        var n = t.toArray();
        e ? Rc.sort(n, e) : Rc.sort(n);
        for (var r = t.iterator(), i = 0, o = n.length; i < o; i++)
            r.next(),
            r.set(n[i])
    }
    ,
    np.singletonList = function(t) {
        var e = new lc;
        return e.add(t),
        e
    }
    ;
    var rp = function() {
        this._boundable1 = null,
        this._boundable2 = null,
        this._distance = null,
        this._itemDistance = null;
        var t = arguments[0]
          , e = arguments[1]
          , n = arguments[2];
        this._boundable1 = t,
        this._boundable2 = e,
        this._itemDistance = n,
        this._distance = this.distance()
    };
    rp.prototype.expandToQueue = function(t, e) {
        var n = rp.isComposite(this._boundable1)
          , r = rp.isComposite(this._boundable2);
        if (n && r)
            return rp.area(this._boundable1) > rp.area(this._boundable2) ? (this.expand(this._boundable1, this._boundable2, t, e),
            null) : (this.expand(this._boundable2, this._boundable1, t, e),
            null);
        if (n)
            return this.expand(this._boundable1, this._boundable2, t, e),
            null;
        if (r)
            return this.expand(this._boundable2, this._boundable1, t, e),
            null;
        throw new el("neither boundable is composite")
    }
    ,
    rp.prototype.isLeaves = function() {
        return !(rp.isComposite(this._boundable1) || rp.isComposite(this._boundable2))
    }
    ,
    rp.prototype.compareTo = function(t) {
        var e = t;
        return this._distance < e._distance ? -1 : this._distance > e._distance ? 1 : 0
    }
    ,
    rp.prototype.expand = function(t, e, n, r) {
        for (var i = t.getChildBoundables().iterator(); i.hasNext(); ) {
            var o = i.next()
              , s = new rp(o,e,this._itemDistance);
            s.getDistance() < r && n.add(s)
        }
    }
    ,
    rp.prototype.getBoundable = function(t) {
        return 0 === t ? this._boundable1 : this._boundable2
    }
    ,
    rp.prototype.getDistance = function() {
        return this._distance
    }
    ,
    rp.prototype.distance = function() {
        return this.isLeaves() ? this._itemDistance.distance(this._boundable1, this._boundable2) : this._boundable1.getBounds().distance(this._boundable2.getBounds())
    }
    ,
    rp.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    rp.prototype.getClass = function() {
        return rp
    }
    ,
    rp.area = function(t) {
        return t.getBounds().getArea()
    }
    ,
    rp.isComposite = function(t) {
        return t instanceof tp
    }
    ;
    var ip = function t() {
        if (this._root = null,
        this._built = !1,
        this._itemBoundables = new lc,
        this._nodeCapacity = null,
        0 === arguments.length) {
            var e = t.DEFAULT_NODE_CAPACITY;
            this._nodeCapacity = e
        } else if (1 === arguments.length) {
            var n = arguments[0];
            ql.isTrue(n > 1, "Node capacity must be greater than 1"),
            this._nodeCapacity = n
        }
    }
      , op = {
        IntersectsOp: {
            configurable: !0
        },
        serialVersionUID: {
            configurable: !0
        },
        DEFAULT_NODE_CAPACITY: {
            configurable: !0
        }
    };
    ip.prototype.getNodeCapacity = function() {
        return this._nodeCapacity
    }
    ,
    ip.prototype.lastNode = function(t) {
        return t.get(t.size() - 1)
    }
    ,
    ip.prototype.size = function() {
        var t = this;
        if (0 === arguments.length)
            return this.isEmpty() ? 0 : (this.build(),
            this.size(this._root));
        if (1 === arguments.length) {
            for (var e = arguments[0], n = 0, r = e.getChildBoundables().iterator(); r.hasNext(); ) {
                var i = r.next();
                i instanceof tp ? n += t.size(i) : i instanceof Zh && (n += 1)
            }
            return n
        }
    }
    ,
    ip.prototype.removeItem = function(t, e) {
        for (var n = null, r = t.getChildBoundables().iterator(); r.hasNext(); ) {
            var i = r.next();
            i instanceof Zh && i.getItem() === e && (n = i)
        }
        return null !== n && (t.getChildBoundables().remove(n),
        !0)
    }
    ,
    ip.prototype.itemsTree = function() {
        var t = this;
        if (0 === arguments.length) {
            this.build();
            var e = this.itemsTree(this._root);
            return null === e ? new lc : e
        }
        if (1 === arguments.length) {
            for (var n = arguments[0], r = new lc, i = n.getChildBoundables().iterator(); i.hasNext(); ) {
                var o = i.next();
                if (o instanceof tp) {
                    var s = t.itemsTree(o);
                    null !== s && r.add(s)
                } else
                    o instanceof Zh ? r.add(o.getItem()) : ql.shouldNeverReachHere()
            }
            return r.size() <= 0 ? null : r
        }
    }
    ,
    ip.prototype.insert = function(t, e) {
        ql.isTrue(!this._built, "Cannot insert items into an STR packed R-tree after it has been built."),
        this._itemBoundables.add(new Zh(t,e))
    }
    ,
    ip.prototype.boundablesAtLevel = function() {
        var t = this;
        if (1 === arguments.length) {
            var e = arguments[0]
              , n = new lc;
            return this.boundablesAtLevel(e, this._root, n),
            n
        }
        if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2];
            if (ql.isTrue(r > -2),
            i.getLevel() === r)
                return o.add(i),
                null;
            for (var s = i.getChildBoundables().iterator(); s.hasNext(); ) {
                var a = s.next();
                a instanceof tp ? t.boundablesAtLevel(r, a, o) : (ql.isTrue(a instanceof Zh),
                -1 === r && o.add(a))
            }
            return null
        }
    }
    ,
    ip.prototype.query = function() {
        var t = this;
        if (1 === arguments.length) {
            var e = arguments[0];
            this.build();
            var n = new lc;
            return this.isEmpty() || this.getIntersectsOp().intersects(this._root.getBounds(), e) && this.query(e, this._root, n),
            n
        }
        if (2 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1];
            if (this.build(),
            this.isEmpty())
                return null;
            this.getIntersectsOp().intersects(this._root.getBounds(), r) && this.query(r, this._root, i)
        } else if (3 === arguments.length)
            if (gl(arguments[2], Qh) && arguments[0]instanceof Object && arguments[1]instanceof tp)
                for (var o = arguments[0], s = arguments[1], a = arguments[2], u = s.getChildBoundables(), l = 0; l < u.size(); l++) {
                    var c = u.get(l);
                    t.getIntersectsOp().intersects(c.getBounds(), o) && (c instanceof tp ? t.query(o, c, a) : c instanceof Zh ? a.visitItem(c.getItem()) : ql.shouldNeverReachHere())
                }
            else if (gl(arguments[2], ac) && arguments[0]instanceof Object && arguments[1]instanceof tp)
                for (var h = arguments[0], p = arguments[1], f = arguments[2], g = p.getChildBoundables(), d = 0; d < g.size(); d++) {
                    var y = g.get(d);
                    t.getIntersectsOp().intersects(y.getBounds(), h) && (y instanceof tp ? t.query(h, y, f) : y instanceof Zh ? f.add(y.getItem()) : ql.shouldNeverReachHere())
                }
    }
    ,
    ip.prototype.build = function() {
        if (this._built)
            return null;
        this._root = this._itemBoundables.isEmpty() ? this.createNode(0) : this.createHigherLevels(this._itemBoundables, -1),
        this._itemBoundables = null,
        this._built = !0
    }
    ,
    ip.prototype.getRoot = function() {
        return this.build(),
        this._root
    }
    ,
    ip.prototype.remove = function() {
        var t = this;
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            return this.build(),
            !!this.getIntersectsOp().intersects(this._root.getBounds(), e) && this.remove(e, this._root, n)
        }
        if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2]
              , s = this.removeItem(i, o);
            if (s)
                return !0;
            for (var a = null, u = i.getChildBoundables().iterator(); u.hasNext(); ) {
                var l = u.next();
                if (t.getIntersectsOp().intersects(l.getBounds(), r) && (l instanceof tp && (s = t.remove(r, l, o)))) {
                    a = l;
                    break
                }
            }
            return null !== a && a.getChildBoundables().isEmpty() && i.getChildBoundables().remove(a),
            s
        }
    }
    ,
    ip.prototype.createHigherLevels = function(t, e) {
        ql.isTrue(!t.isEmpty());
        var n = this.createParentBoundables(t, e + 1);
        return 1 === n.size() ? n.get(0) : this.createHigherLevels(n, e + 1)
    }
    ,
    ip.prototype.depth = function() {
        var t = this;
        if (0 === arguments.length)
            return this.isEmpty() ? 0 : (this.build(),
            this.depth(this._root));
        if (1 === arguments.length) {
            for (var e = arguments[0], n = 0, r = e.getChildBoundables().iterator(); r.hasNext(); ) {
                var i = r.next();
                if (i instanceof tp) {
                    var o = t.depth(i);
                    o > n && (n = o)
                }
            }
            return n + 1
        }
    }
    ,
    ip.prototype.createParentBoundables = function(t, e) {
        var n = this;
        ql.isTrue(!t.isEmpty());
        var r = new lc;
        r.add(this.createNode(e));
        var i = new lc(t);
        np.sort(i, this.getComparator());
        for (var o = i.iterator(); o.hasNext(); ) {
            var s = o.next();
            n.lastNode(r).getChildBoundables().size() === n.getNodeCapacity() && r.add(n.createNode(e)),
            n.lastNode(r).addChildBoundable(s)
        }
        return r
    }
    ,
    ip.prototype.isEmpty = function() {
        return this._built ? this._root.isEmpty() : this._itemBoundables.isEmpty()
    }
    ,
    ip.prototype.interfaces_ = function() {
        return [al]
    }
    ,
    ip.prototype.getClass = function() {
        return ip
    }
    ,
    ip.compareDoubles = function(t, e) {
        return t > e ? 1 : t < e ? -1 : 0
    }
    ,
    op.IntersectsOp.get = function() {
        return sp
    }
    ,
    op.serialVersionUID.get = function() {
        return -0x35ef64c82d4c5400
    }
    ,
    op.DEFAULT_NODE_CAPACITY.get = function() {
        return 10
    }
    ,
    Object.defineProperties(ip, op);
    var sp = function() {}
      , ap = function() {};
    ap.prototype.distance = function(t, e) {}
    ,
    ap.prototype.interfaces_ = function() {
        return []
    }
    ,
    ap.prototype.getClass = function() {
        return ap
    }
    ;
    var up = function(t) {
        function e(n) {
            n = n || e.DEFAULT_NODE_CAPACITY,
            t.call(this, n)
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            STRtreeNode: {
                configurable: !0
            },
            serialVersionUID: {
                configurable: !0
            },
            xComparator: {
                configurable: !0
            },
            yComparator: {
                configurable: !0
            },
            intersectsOp: {
                configurable: !0
            },
            DEFAULT_NODE_CAPACITY: {
                configurable: !0
            }
        };
        return e.prototype.createParentBoundablesFromVerticalSlices = function(t, e) {
            ql.isTrue(t.length > 0);
            for (var n = new lc, r = 0; r < t.length; r++)
                n.addAll(this.createParentBoundablesFromVerticalSlice(t[r], e));
            return n
        }
        ,
        e.prototype.createNode = function(t) {
            return new lp(t)
        }
        ,
        e.prototype.size = function() {
            return 0 === arguments.length ? t.prototype.size.call(this) : t.prototype.size.apply(this, arguments)
        }
        ,
        e.prototype.insert = function() {
            if (2 !== arguments.length)
                return t.prototype.insert.apply(this, arguments);
            var e = arguments[0]
              , n = arguments[1];
            if (e.isNull())
                return null;
            t.prototype.insert.call(this, e, n)
        }
        ,
        e.prototype.getIntersectsOp = function() {
            return e.intersectsOp
        }
        ,
        e.prototype.verticalSlices = function(t, e) {
            for (var n = Math.trunc(Math.ceil(t.size() / e)), r = new Array(e).fill(null), i = t.iterator(), o = 0; o < e; o++) {
                r[o] = new lc;
                for (var s = 0; i.hasNext() && s < n; ) {
                    var a = i.next();
                    r[o].add(a),
                    s++
                }
            }
            return r
        }
        ,
        e.prototype.query = function() {
            if (1 === arguments.length) {
                var e = arguments[0];
                return t.prototype.query.call(this, e)
            }
            if (2 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1];
                t.prototype.query.call(this, n, r)
            } else if (3 === arguments.length)
                if (gl(arguments[2], Qh) && arguments[0]instanceof Object && arguments[1]instanceof tp) {
                    var i = arguments[0]
                      , o = arguments[1]
                      , s = arguments[2];
                    t.prototype.query.call(this, i, o, s)
                } else if (gl(arguments[2], ac) && arguments[0]instanceof Object && arguments[1]instanceof tp) {
                    var a = arguments[0]
                      , u = arguments[1]
                      , l = arguments[2];
                    t.prototype.query.call(this, a, u, l)
                }
        }
        ,
        e.prototype.getComparator = function() {
            return e.yComparator
        }
        ,
        e.prototype.createParentBoundablesFromVerticalSlice = function(e, n) {
            return t.prototype.createParentBoundables.call(this, e, n)
        }
        ,
        e.prototype.remove = function() {
            if (2 === arguments.length) {
                var e = arguments[0]
                  , n = arguments[1];
                return t.prototype.remove.call(this, e, n)
            }
            return t.prototype.remove.apply(this, arguments)
        }
        ,
        e.prototype.depth = function() {
            return 0 === arguments.length ? t.prototype.depth.call(this) : t.prototype.depth.apply(this, arguments)
        }
        ,
        e.prototype.createParentBoundables = function(t, n) {
            ql.isTrue(!t.isEmpty());
            var r = Math.trunc(Math.ceil(t.size() / this.getNodeCapacity()))
              , i = new lc(t);
            np.sort(i, e.xComparator);
            var o = this.verticalSlices(i, Math.trunc(Math.ceil(Math.sqrt(r))));
            return this.createParentBoundablesFromVerticalSlices(o, n)
        }
        ,
        e.prototype.nearestNeighbour = function() {
            if (1 === arguments.length) {
                if (gl(arguments[0], ap)) {
                    var t = arguments[0]
                      , n = new rp(this.getRoot(),this.getRoot(),t);
                    return this.nearestNeighbour(n)
                }
                if (arguments[0]instanceof rp) {
                    var r = arguments[0];
                    return this.nearestNeighbour(r, nl.POSITIVE_INFINITY)
                }
            } else if (2 === arguments.length) {
                if (arguments[0]instanceof e && gl(arguments[1], ap)) {
                    var i = arguments[0]
                      , o = arguments[1]
                      , s = new rp(this.getRoot(),i.getRoot(),o);
                    return this.nearestNeighbour(s)
                }
                if (arguments[0]instanceof rp && "number" == typeof arguments[1]) {
                    var a = arguments[0]
                      , u = arguments[1]
                      , l = u
                      , c = null
                      , h = new Kh;
                    for (h.add(a); !h.isEmpty() && l > 0; ) {
                        var p = h.poll()
                          , f = p.getDistance();
                        if (f >= l)
                            break;
                        p.isLeaves() ? (l = f,
                        c = p) : p.expandToQueue(h, l)
                    }
                    return [c.getBoundable(0).getItem(), c.getBoundable(1).getItem()]
                }
            } else if (3 === arguments.length) {
                var g = arguments[0]
                  , d = arguments[1]
                  , y = arguments[2]
                  , v = new Zh(g,d)
                  , _ = new rp(this.getRoot(),v,y);
                return this.nearestNeighbour(_)[0]
            }
        }
        ,
        e.prototype.interfaces_ = function() {
            return [$h, al]
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e.centreX = function(t) {
            return e.avg(t.getMinX(), t.getMaxX())
        }
        ,
        e.avg = function(t, e) {
            return (t + e) / 2
        }
        ,
        e.centreY = function(t) {
            return e.avg(t.getMinY(), t.getMaxY())
        }
        ,
        n.STRtreeNode.get = function() {
            return lp
        }
        ,
        n.serialVersionUID.get = function() {
            return 0x39920f7d5f261e0
        }
        ,
        n.xComparator.get = function() {
            return {
                interfaces_: function() {
                    return [sl]
                },
                compare: function(n, r) {
                    return t.compareDoubles(e.centreX(n.getBounds()), e.centreX(r.getBounds()))
                }
            }
        }
        ,
        n.yComparator.get = function() {
            return {
                interfaces_: function() {
                    return [sl]
                },
                compare: function(n, r) {
                    return t.compareDoubles(e.centreY(n.getBounds()), e.centreY(r.getBounds()))
                }
            }
        }
        ,
        n.intersectsOp.get = function() {
            return {
                interfaces_: function() {
                    return [t.IntersectsOp]
                },
                intersects: function(t, e) {
                    return t.intersects(e)
                }
            }
        }
        ,
        n.DEFAULT_NODE_CAPACITY.get = function() {
            return 10
        }
        ,
        Object.defineProperties(e, n),
        e
    }(ip)
      , lp = function(t) {
        function e() {
            var e = arguments[0];
            t.call(this, e)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.computeBounds = function() {
            for (var t = null, e = this.getChildBoundables().iterator(); e.hasNext(); ) {
                var n = e.next();
                null === t ? t = new Ll(n.getBounds()) : t.expandToInclude(n.getBounds())
            }
            return t
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(tp)
      , cp = function() {};
    cp.prototype.interfaces_ = function() {
        return []
    }
    ,
    cp.prototype.getClass = function() {
        return cp
    }
    ,
    cp.relativeSign = function(t, e) {
        return t < e ? -1 : t > e ? 1 : 0
    }
    ,
    cp.compare = function(t, e, n) {
        if (e.equals2D(n))
            return 0;
        var r = cp.relativeSign(e.x, n.x)
          , i = cp.relativeSign(e.y, n.y);
        switch (t) {
        case 0:
            return cp.compareValue(r, i);
        case 1:
            return cp.compareValue(i, r);
        case 2:
            return cp.compareValue(i, -r);
        case 3:
            return cp.compareValue(-r, i);
        case 4:
            return cp.compareValue(-r, -i);
        case 5:
            return cp.compareValue(-i, -r);
        case 6:
            return cp.compareValue(-i, r);
        case 7:
            return cp.compareValue(r, -i)
        }
        return ql.shouldNeverReachHere("invalid octant value"),
        0
    }
    ,
    cp.compareValue = function(t, e) {
        return t < 0 ? -1 : t > 0 ? 1 : e < 0 ? -1 : e > 0 ? 1 : 0
    }
    ;
    var hp = function() {
        this._segString = null,
        this.coord = null,
        this.segmentIndex = null,
        this._segmentOctant = null,
        this._isInterior = null;
        var t = arguments[0]
          , e = arguments[1]
          , n = arguments[2]
          , r = arguments[3];
        this._segString = t,
        this.coord = new ul(e),
        this.segmentIndex = n,
        this._segmentOctant = r,
        this._isInterior = !e.equals2D(t.getCoordinate(n))
    };
    hp.prototype.getCoordinate = function() {
        return this.coord
    }
    ,
    hp.prototype.print = function(t) {
        t.print(this.coord),
        t.print(" seg # = " + this.segmentIndex)
    }
    ,
    hp.prototype.compareTo = function(t) {
        var e = t;
        return this.segmentIndex < e.segmentIndex ? -1 : this.segmentIndex > e.segmentIndex ? 1 : this.coord.equals2D(e.coord) ? 0 : cp.compare(this._segmentOctant, this.coord, e.coord)
    }
    ,
    hp.prototype.isEndPoint = function(t) {
        return 0 === this.segmentIndex && !this._isInterior || this.segmentIndex === t
    }
    ,
    hp.prototype.isInterior = function() {
        return this._isInterior
    }
    ,
    hp.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    hp.prototype.getClass = function() {
        return hp
    }
    ;
    var pp = function() {
        this._nodeMap = new Cc,
        this._edge = null;
        var t = arguments[0];
        this._edge = t
    };
    pp.prototype.getSplitCoordinates = function() {
        var t = new hc;
        this.addEndpoints();
        for (var e = this.iterator(), n = e.next(); e.hasNext(); ) {
            var r = e.next();
            this.addEdgeCoordinates(n, r, t),
            n = r
        }
        return t.toCoordinateArray()
    }
    ,
    pp.prototype.addCollapsedNodes = function() {
        var t = new lc;
        this.findCollapsesFromInsertedNodes(t),
        this.findCollapsesFromExistingVertices(t);
        for (var e = t.iterator(); e.hasNext(); ) {
            var n = e.next().intValue();
            this.add(this._edge.getCoordinate(n), n)
        }
    }
    ,
    pp.prototype.print = function(t) {
        t.println("Intersections:");
        for (var e = this.iterator(); e.hasNext(); ) {
            e.next().print(t)
        }
    }
    ,
    pp.prototype.findCollapsesFromExistingVertices = function(t) {
        for (var e = 0; e < this._edge.size() - 2; e++) {
            var n = this._edge.getCoordinate(e)
              , r = this._edge.getCoordinate(e + 2);
            n.equals2D(r) && t.add(new _l(e + 1))
        }
    }
    ,
    pp.prototype.addEdgeCoordinates = function(t, e, n) {
        var r = this._edge.getCoordinate(e.segmentIndex)
          , i = e.isInterior() || !e.coord.equals2D(r);
        n.add(new ul(t.coord), !1);
        for (var o = t.segmentIndex + 1; o <= e.segmentIndex; o++)
            n.add(this._edge.getCoordinate(o));
        i && n.add(new ul(e.coord))
    }
    ,
    pp.prototype.iterator = function() {
        return this._nodeMap.values().iterator()
    }
    ,
    pp.prototype.addSplitEdges = function(t) {
        this.addEndpoints(),
        this.addCollapsedNodes();
        for (var e = this.iterator(), n = e.next(); e.hasNext(); ) {
            var r = e.next()
              , i = this.createSplitEdge(n, r);
            t.add(i),
            n = r
        }
    }
    ,
    pp.prototype.findCollapseIndex = function(t, e, n) {
        if (!t.coord.equals2D(e.coord))
            return !1;
        var r = e.segmentIndex - t.segmentIndex;
        return e.isInterior() || r--,
        1 === r && (n[0] = t.segmentIndex + 1,
        !0)
    }
    ,
    pp.prototype.findCollapsesFromInsertedNodes = function(t) {
        for (var e = new Array(1).fill(null), n = this.iterator(), r = n.next(); n.hasNext(); ) {
            var i = n.next();
            this.findCollapseIndex(r, i, e) && t.add(new _l(e[0])),
            r = i
        }
    }
    ,
    pp.prototype.getEdge = function() {
        return this._edge
    }
    ,
    pp.prototype.addEndpoints = function() {
        var t = this._edge.size() - 1;
        this.add(this._edge.getCoordinate(0), 0),
        this.add(this._edge.getCoordinate(t), t)
    }
    ,
    pp.prototype.createSplitEdge = function(t, e) {
        var n = e.segmentIndex - t.segmentIndex + 2
          , r = this._edge.getCoordinate(e.segmentIndex)
          , i = e.isInterior() || !e.coord.equals2D(r);
        i || n--;
        var o = new Array(n).fill(null)
          , s = 0;
        o[s++] = new ul(t.coord);
        for (var a = t.segmentIndex + 1; a <= e.segmentIndex; a++)
            o[s++] = this._edge.getCoordinate(a);
        return i && (o[s] = new ul(e.coord)),
        new yp(o,this._edge.getData())
    }
    ,
    pp.prototype.add = function(t, e) {
        var n = new hp(this._edge,t,e,this._edge.getSegmentOctant(e))
          , r = this._nodeMap.get(n);
        return null !== r ? (ql.isTrue(r.coord.equals2D(t), "Found equal nodes with different coordinates"),
        r) : (this._nodeMap.put(n, n),
        n)
    }
    ,
    pp.prototype.checkSplitEdgesCorrectness = function(t) {
        var e = this._edge.getCoordinates()
          , n = t.get(0).getCoordinate(0);
        if (!n.equals2D(e[0]))
            throw new kl("bad split edge start point at " + n);
        var r = t.get(t.size() - 1).getCoordinates()
          , i = r[r.length - 1];
        if (!i.equals2D(e[e.length - 1]))
            throw new kl("bad split edge end point at " + i)
    }
    ,
    pp.prototype.interfaces_ = function() {
        return []
    }
    ,
    pp.prototype.getClass = function() {
        return pp
    }
    ;
    var fp = function() {};
    fp.prototype.interfaces_ = function() {
        return []
    }
    ,
    fp.prototype.getClass = function() {
        return fp
    }
    ,
    fp.octant = function() {
        if ("number" == typeof arguments[0] && "number" == typeof arguments[1]) {
            var t = arguments[0]
              , e = arguments[1];
            if (0 === t && 0 === e)
                throw new el("Cannot compute the octant for point ( " + t + ", " + e + " )");
            var n = Math.abs(t)
              , r = Math.abs(e);
            return t >= 0 ? e >= 0 ? n >= r ? 0 : 1 : n >= r ? 7 : 6 : e >= 0 ? n >= r ? 3 : 2 : n >= r ? 4 : 5
        }
        if (arguments[0]instanceof ul && arguments[1]instanceof ul) {
            var i = arguments[0]
              , o = arguments[1]
              , s = o.x - i.x
              , a = o.y - i.y;
            if (0 === s && 0 === a)
                throw new el("Cannot compute the octant for two identical points " + i);
            return fp.octant(s, a)
        }
    }
    ;
    var gp = function() {};
    gp.prototype.getCoordinates = function() {}
    ,
    gp.prototype.size = function() {}
    ,
    gp.prototype.getCoordinate = function(t) {}
    ,
    gp.prototype.isClosed = function() {}
    ,
    gp.prototype.setData = function(t) {}
    ,
    gp.prototype.getData = function() {}
    ,
    gp.prototype.interfaces_ = function() {
        return []
    }
    ,
    gp.prototype.getClass = function() {
        return gp
    }
    ;
    var dp = function() {};
    dp.prototype.addIntersection = function(t, e) {}
    ,
    dp.prototype.interfaces_ = function() {
        return [gp]
    }
    ,
    dp.prototype.getClass = function() {
        return dp
    }
    ;
    var yp = function() {
        this._nodeList = new pp(this),
        this._pts = null,
        this._data = null;
        var t = arguments[0]
          , e = arguments[1];
        this._pts = t,
        this._data = e
    };
    yp.prototype.getCoordinates = function() {
        return this._pts
    }
    ,
    yp.prototype.size = function() {
        return this._pts.length
    }
    ,
    yp.prototype.getCoordinate = function(t) {
        return this._pts[t]
    }
    ,
    yp.prototype.isClosed = function() {
        return this._pts[0].equals(this._pts[this._pts.length - 1])
    }
    ,
    yp.prototype.getSegmentOctant = function(t) {
        return t === this._pts.length - 1 ? -1 : this.safeOctant(this.getCoordinate(t), this.getCoordinate(t + 1))
    }
    ,
    yp.prototype.setData = function(t) {
        this._data = t
    }
    ,
    yp.prototype.safeOctant = function(t, e) {
        return t.equals2D(e) ? 0 : fp.octant(t, e)
    }
    ,
    yp.prototype.getData = function() {
        return this._data
    }
    ,
    yp.prototype.addIntersection = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1];
            this.addIntersectionNode(t, e)
        } else if (4 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = arguments[3]
              , o = new ul(n.getIntersection(i));
            this.addIntersection(o, r)
        }
    }
    ,
    yp.prototype.toString = function() {
        return Fl.toLineString(new lh(this._pts))
    }
    ,
    yp.prototype.getNodeList = function() {
        return this._nodeList
    }
    ,
    yp.prototype.addIntersectionNode = function(t, e) {
        var n = e
          , r = n + 1;
        if (r < this._pts.length) {
            var i = this._pts[r];
            t.equals2D(i) && (n = r)
        }
        return this._nodeList.add(t, n)
    }
    ,
    yp.prototype.addIntersections = function(t, e, n) {
        for (var r = 0; r < t.getIntersectionNum(); r++)
            this.addIntersection(t, e, n, r)
    }
    ,
    yp.prototype.interfaces_ = function() {
        return [dp]
    }
    ,
    yp.prototype.getClass = function() {
        return yp
    }
    ,
    yp.getNodedSubstrings = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = new lc;
            return yp.getNodedSubstrings(t, e),
            e
        }
        if (2 === arguments.length)
            for (var n = arguments[0], r = arguments[1], i = n.iterator(); i.hasNext(); ) {
                var o = i.next();
                o.getNodeList().addSplitEdges(r)
            }
    }
    ;
    var vp = function() {
        if (this.p0 = null,
        this.p1 = null,
        0 === arguments.length)
            this.p0 = new ul,
            this.p1 = new ul;
        else if (1 === arguments.length) {
            var t = arguments[0];
            this.p0 = new ul(t.p0),
            this.p1 = new ul(t.p1)
        } else if (2 === arguments.length)
            this.p0 = arguments[0],
            this.p1 = arguments[1];
        else if (4 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2]
              , i = arguments[3];
            this.p0 = new ul(e,n),
            this.p1 = new ul(r,i)
        }
    }
      , _p = {
        serialVersionUID: {
            configurable: !0
        }
    };
    vp.prototype.minX = function() {
        return Math.min(this.p0.x, this.p1.x)
    }
    ,
    vp.prototype.orientationIndex = function() {
        if (arguments[0]instanceof vp) {
            var t = arguments[0]
              , e = Xl.orientationIndex(this.p0, this.p1, t.p0)
              , n = Xl.orientationIndex(this.p0, this.p1, t.p1);
            return e >= 0 && n >= 0 || e <= 0 && n <= 0 ? Math.max(e, n) : 0
        }
        if (arguments[0]instanceof ul) {
            var r = arguments[0];
            return Xl.orientationIndex(this.p0, this.p1, r)
        }
    }
    ,
    vp.prototype.toGeometry = function(t) {
        return t.createLineString([this.p0, this.p1])
    }
    ,
    vp.prototype.isVertical = function() {
        return this.p0.x === this.p1.x
    }
    ,
    vp.prototype.equals = function(t) {
        if (!(t instanceof vp))
            return !1;
        var e = t;
        return this.p0.equals(e.p0) && this.p1.equals(e.p1)
    }
    ,
    vp.prototype.intersection = function(t) {
        var e = new jl;
        return e.computeIntersection(this.p0, this.p1, t.p0, t.p1),
        e.hasIntersection() ? e.getIntersection(0) : null
    }
    ,
    vp.prototype.project = function() {
        if (arguments[0]instanceof ul) {
            var t = arguments[0];
            if (t.equals(this.p0) || t.equals(this.p1))
                return new ul(t);
            var e = this.projectionFactor(t)
              , n = new ul;
            return n.x = this.p0.x + e * (this.p1.x - this.p0.x),
            n.y = this.p0.y + e * (this.p1.y - this.p0.y),
            n
        }
        if (arguments[0]instanceof vp) {
            var r = arguments[0]
              , i = this.projectionFactor(r.p0)
              , o = this.projectionFactor(r.p1);
            if (i >= 1 && o >= 1)
                return null;
            if (i <= 0 && o <= 0)
                return null;
            var s = this.project(r.p0);
            i < 0 && (s = this.p0),
            i > 1 && (s = this.p1);
            var a = this.project(r.p1);
            return o < 0 && (a = this.p0),
            o > 1 && (a = this.p1),
            new vp(s,a)
        }
    }
    ,
    vp.prototype.normalize = function() {
        this.p1.compareTo(this.p0) < 0 && this.reverse()
    }
    ,
    vp.prototype.angle = function() {
        return Math.atan2(this.p1.y - this.p0.y, this.p1.x - this.p0.x)
    }
    ,
    vp.prototype.getCoordinate = function(t) {
        return 0 === t ? this.p0 : this.p1
    }
    ,
    vp.prototype.distancePerpendicular = function(t) {
        return Xl.distancePointLinePerpendicular(t, this.p0, this.p1)
    }
    ,
    vp.prototype.minY = function() {
        return Math.min(this.p0.y, this.p1.y)
    }
    ,
    vp.prototype.midPoint = function() {
        return vp.midPoint(this.p0, this.p1)
    }
    ,
    vp.prototype.projectionFactor = function(t) {
        if (t.equals(this.p0))
            return 0;
        if (t.equals(this.p1))
            return 1;
        var e = this.p1.x - this.p0.x
          , n = this.p1.y - this.p0.y
          , r = e * e + n * n;
        return r <= 0 ? nl.NaN : ((t.x - this.p0.x) * e + (t.y - this.p0.y) * n) / r
    }
    ,
    vp.prototype.closestPoints = function(t) {
        var e = this.intersection(t);
        if (null !== e)
            return [e, e];
        var n = new Array(2).fill(null)
          , r = nl.MAX_VALUE
          , i = null
          , o = this.closestPoint(t.p0);
        r = o.distance(t.p0),
        n[0] = o,
        n[1] = t.p0;
        var s = this.closestPoint(t.p1);
        (i = s.distance(t.p1)) < r && (r = i,
        n[0] = s,
        n[1] = t.p1);
        var a = t.closestPoint(this.p0);
        (i = a.distance(this.p0)) < r && (r = i,
        n[0] = this.p0,
        n[1] = a);
        var u = t.closestPoint(this.p1);
        return (i = u.distance(this.p1)) < r && (r = i,
        n[0] = this.p1,
        n[1] = u),
        n
    }
    ,
    vp.prototype.closestPoint = function(t) {
        var e = this.projectionFactor(t);
        return e > 0 && e < 1 ? this.project(t) : this.p0.distance(t) < this.p1.distance(t) ? this.p0 : this.p1
    }
    ,
    vp.prototype.maxX = function() {
        return Math.max(this.p0.x, this.p1.x)
    }
    ,
    vp.prototype.getLength = function() {
        return this.p0.distance(this.p1)
    }
    ,
    vp.prototype.compareTo = function(t) {
        var e = t
          , n = this.p0.compareTo(e.p0);
        return 0 !== n ? n : this.p1.compareTo(e.p1)
    }
    ,
    vp.prototype.reverse = function() {
        var t = this.p0;
        this.p0 = this.p1,
        this.p1 = t
    }
    ,
    vp.prototype.equalsTopo = function(t) {
        return this.p0.equals(t.p0) && (this.p1.equals(t.p1) || this.p0.equals(t.p1)) && this.p1.equals(t.p0)
    }
    ,
    vp.prototype.lineIntersection = function(t) {
        try {
            return Ml.intersection(this.p0, this.p1, t.p0, t.p1)
        } catch (t) {
            if (!(t instanceof Cl))
                throw t
        }
        return null
    }
    ,
    vp.prototype.maxY = function() {
        return Math.max(this.p0.y, this.p1.y)
    }
    ,
    vp.prototype.pointAlongOffset = function(t, e) {
        var n = this.p0.x + t * (this.p1.x - this.p0.x)
          , r = this.p0.y + t * (this.p1.y - this.p0.y)
          , i = this.p1.x - this.p0.x
          , o = this.p1.y - this.p0.y
          , s = Math.sqrt(i * i + o * o)
          , a = 0
          , u = 0;
        if (0 !== e) {
            if (s <= 0)
                throw new Error("Cannot compute offset from zero-length line segment");
            a = e * i / s,
            u = e * o / s
        }
        return new ul(n - u,r + a)
    }
    ,
    vp.prototype.setCoordinates = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.setCoordinates(t.p0, t.p1)
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            this.p0.x = e.x,
            this.p0.y = e.y,
            this.p1.x = n.x,
            this.p1.y = n.y
        }
    }
    ,
    vp.prototype.segmentFraction = function(t) {
        var e = this.projectionFactor(t);
        return e < 0 ? e = 0 : (e > 1 || nl.isNaN(e)) && (e = 1),
        e
    }
    ,
    vp.prototype.toString = function() {
        return "LINESTRING( " + this.p0.x + " " + this.p0.y + ", " + this.p1.x + " " + this.p1.y + ")"
    }
    ,
    vp.prototype.isHorizontal = function() {
        return this.p0.y === this.p1.y
    }
    ,
    vp.prototype.distance = function() {
        if (arguments[0]instanceof vp) {
            var t = arguments[0];
            return Xl.distanceLineLine(this.p0, this.p1, t.p0, t.p1)
        }
        if (arguments[0]instanceof ul) {
            var e = arguments[0];
            return Xl.distancePointLine(e, this.p0, this.p1)
        }
    }
    ,
    vp.prototype.pointAlong = function(t) {
        var e = new ul;
        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
    }
    ,
    vp.prototype.hashCode = function() {
        var t = nl.doubleToLongBits(this.p0.x);
        t ^= 31 * nl.doubleToLongBits(this.p0.y);
        var e = Math.trunc(t) ^ Math.trunc(t >> 32)
          , n = nl.doubleToLongBits(this.p1.x);
        return n ^= 31 * nl.doubleToLongBits(this.p1.y),
        e ^ (Math.trunc(n) ^ Math.trunc(n >> 32))
    }
    ,
    vp.prototype.interfaces_ = function() {
        return [il, al]
    }
    ,
    vp.prototype.getClass = function() {
        return vp
    }
    ,
    vp.midPoint = function(t, e) {
        return new ul((t.x + e.x) / 2,(t.y + e.y) / 2)
    }
    ,
    _p.serialVersionUID.get = function() {
        return 0x2d2172135f411c00
    }
    ,
    Object.defineProperties(vp, _p);
    var mp = function() {
        this.tempEnv1 = new Ll,
        this.tempEnv2 = new Ll,
        this._overlapSeg1 = new vp,
        this._overlapSeg2 = new vp
    };
    mp.prototype.overlap = function() {
        if (2 === arguments.length)
            ;
        else if (4 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = arguments[2]
              , r = arguments[3];
            t.getLineSegment(e, this._overlapSeg1),
            n.getLineSegment(r, this._overlapSeg2),
            this.overlap(this._overlapSeg1, this._overlapSeg2)
        }
    }
    ,
    mp.prototype.interfaces_ = function() {
        return []
    }
    ,
    mp.prototype.getClass = function() {
        return mp
    }
    ;
    var xp = function() {
        this._pts = null,
        this._start = null,
        this._end = null,
        this._env = null,
        this._context = null,
        this._id = null;
        var t = arguments[0]
          , e = arguments[1]
          , n = arguments[2]
          , r = arguments[3];
        this._pts = t,
        this._start = e,
        this._end = n,
        this._context = r
    };
    xp.prototype.getLineSegment = function(t, e) {
        e.p0 = this._pts[t],
        e.p1 = this._pts[t + 1]
    }
    ,
    xp.prototype.computeSelect = function(t, e, n, r) {
        var i = this._pts[e]
          , o = this._pts[n];
        if (r.tempEnv1.init(i, o),
        n - e == 1)
            return r.select(this, e),
            null;
        if (!t.intersects(r.tempEnv1))
            return null;
        var s = Math.trunc((e + n) / 2);
        e < s && this.computeSelect(t, e, s, r),
        s < n && this.computeSelect(t, s, n, r)
    }
    ,
    xp.prototype.getCoordinates = function() {
        for (var t = new Array(this._end - this._start + 1).fill(null), e = 0, n = this._start; n <= this._end; n++)
            t[e++] = this._pts[n];
        return t
    }
    ,
    xp.prototype.computeOverlaps = function(t, e) {
        this.computeOverlapsInternal(this._start, this._end, t, t._start, t._end, e)
    }
    ,
    xp.prototype.setId = function(t) {
        this._id = t
    }
    ,
    xp.prototype.select = function(t, e) {
        this.computeSelect(t, this._start, this._end, e)
    }
    ,
    xp.prototype.getEnvelope = function() {
        if (null === this._env) {
            var t = this._pts[this._start]
              , e = this._pts[this._end];
            this._env = new Ll(t,e)
        }
        return this._env
    }
    ,
    xp.prototype.getEndIndex = function() {
        return this._end
    }
    ,
    xp.prototype.getStartIndex = function() {
        return this._start
    }
    ,
    xp.prototype.getContext = function() {
        return this._context
    }
    ,
    xp.prototype.getId = function() {
        return this._id
    }
    ,
    xp.prototype.computeOverlapsInternal = function(t, e, n, r, i, o) {
        var s = this._pts[t]
          , a = this._pts[e]
          , u = n._pts[r]
          , l = n._pts[i];
        if (e - t == 1 && i - r == 1)
            return o.overlap(this, t, n, r),
            null;
        if (o.tempEnv1.init(s, a),
        o.tempEnv2.init(u, l),
        !o.tempEnv1.intersects(o.tempEnv2))
            return null;
        var c = Math.trunc((t + e) / 2)
          , h = Math.trunc((r + i) / 2);
        t < c && (r < h && this.computeOverlapsInternal(t, c, n, r, h, o),
        h < i && this.computeOverlapsInternal(t, c, n, h, i, o)),
        c < e && (r < h && this.computeOverlapsInternal(c, e, n, r, h, o),
        h < i && this.computeOverlapsInternal(c, e, n, h, i, o))
    }
    ,
    xp.prototype.interfaces_ = function() {
        return []
    }
    ,
    xp.prototype.getClass = function() {
        return xp
    }
    ;
    var Ep = function() {};
    Ep.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ep.prototype.getClass = function() {
        return Ep
    }
    ,
    Ep.getChainStartIndices = function(t) {
        var e = 0
          , n = new lc;
        n.add(new _l(e));
        do {
            var r = Ep.findChainEnd(t, e);
            n.add(new _l(r)),
            e = r
        } while (e < t.length - 1);
        return Ep.toIntArray(n)
    }
    ,
    Ep.findChainEnd = function(t, e) {
        for (var n = e; n < t.length - 1 && t[n].equals2D(t[n + 1]); )
            n++;
        if (n >= t.length - 1)
            return t.length - 1;
        for (var r = jh.quadrant(t[n], t[n + 1]), i = e + 1; i < t.length; ) {
            if (!t[i - 1].equals2D(t[i]))
                if (jh.quadrant(t[i - 1], t[i]) !== r)
                    break;
            i++
        }
        return i - 1
    }
    ,
    Ep.getChains = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return Ep.getChains(t, null)
        }
        if (2 === arguments.length) {
            for (var e = arguments[0], n = arguments[1], r = new lc, i = Ep.getChainStartIndices(e), o = 0; o < i.length - 1; o++) {
                var s = new xp(e,i[o],i[o + 1],n);
                r.add(s)
            }
            return r
        }
    }
    ,
    Ep.toIntArray = function(t) {
        for (var e = new Array(t.size()).fill(null), n = 0; n < e.length; n++)
            e[n] = t.get(n).intValue();
        return e
    }
    ;
    var bp = function() {};
    bp.prototype.computeNodes = function(t) {}
    ,
    bp.prototype.getNodedSubstrings = function() {}
    ,
    bp.prototype.interfaces_ = function() {
        return []
    }
    ,
    bp.prototype.getClass = function() {
        return bp
    }
    ;
    var wp = function() {
        if (this._segInt = null,
        0 === arguments.length)
            ;
        else if (1 === arguments.length) {
            var t = arguments[0];
            this.setSegmentIntersector(t)
        }
    };
    wp.prototype.setSegmentIntersector = function(t) {
        this._segInt = t
    }
    ,
    wp.prototype.interfaces_ = function() {
        return [bp]
    }
    ,
    wp.prototype.getClass = function() {
        return wp
    }
    ;
    var Ip = function(t) {
        function e(e) {
            e ? t.call(this, e) : t.call(this),
            this._monoChains = new lc,
            this._index = new up,
            this._idCounter = 0,
            this._nodedSegStrings = null,
            this._nOverlaps = 0
        }
        t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e;
        var n = {
            SegmentOverlapAction: {
                configurable: !0
            }
        };
        return e.prototype.getMonotoneChains = function() {
            return this._monoChains
        }
        ,
        e.prototype.getNodedSubstrings = function() {
            return yp.getNodedSubstrings(this._nodedSegStrings)
        }
        ,
        e.prototype.getIndex = function() {
            return this._index
        }
        ,
        e.prototype.add = function(t) {
            for (var e = this, n = Ep.getChains(t.getCoordinates(), t).iterator(); n.hasNext(); ) {
                var r = n.next();
                r.setId(e._idCounter++),
                e._index.insert(r.getEnvelope(), r),
                e._monoChains.add(r)
            }
        }
        ,
        e.prototype.computeNodes = function(t) {
            this._nodedSegStrings = t;
            for (var e = t.iterator(); e.hasNext(); )
                this.add(e.next());
            this.intersectChains()
        }
        ,
        e.prototype.intersectChains = function() {
            for (var t = this, e = new Np(this._segInt), n = this._monoChains.iterator(); n.hasNext(); )
                for (var r = n.next(), i = t._index.query(r.getEnvelope()).iterator(); i.hasNext(); ) {
                    var o = i.next();
                    if (o.getId() > r.getId() && (r.computeOverlaps(o, e),
                    t._nOverlaps++),
                    t._segInt.isDone())
                        return null
                }
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        n.SegmentOverlapAction.get = function() {
            return Np
        }
        ,
        Object.defineProperties(e, n),
        e
    }(wp)
      , Np = function(t) {
        function e() {
            t.call(this),
            this._si = null;
            var e = arguments[0];
            this._si = e
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.overlap = function() {
            if (4 !== arguments.length)
                return t.prototype.overlap.apply(this, arguments);
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2]
              , i = arguments[3]
              , o = e.getContext()
              , s = r.getContext();
            this._si.processIntersections(o, n, s, i)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(mp)
      , Sp = function t() {
        if (this._quadrantSegments = t.DEFAULT_QUADRANT_SEGMENTS,
        this._endCapStyle = t.CAP_ROUND,
        this._joinStyle = t.JOIN_ROUND,
        this._mitreLimit = t.DEFAULT_MITRE_LIMIT,
        this._isSingleSided = !1,
        this._simplifyFactor = t.DEFAULT_SIMPLIFY_FACTOR,
        0 === arguments.length)
            ;
        else if (1 === arguments.length) {
            var e = arguments[0];
            this.setQuadrantSegments(e)
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1];
            this.setQuadrantSegments(n),
            this.setEndCapStyle(r)
        } else if (4 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1]
              , s = arguments[2]
              , a = arguments[3];
            this.setQuadrantSegments(i),
            this.setEndCapStyle(o),
            this.setJoinStyle(s),
            this.setMitreLimit(a)
        }
    }
      , Cp = {
        CAP_ROUND: {
            configurable: !0
        },
        CAP_FLAT: {
            configurable: !0
        },
        CAP_SQUARE: {
            configurable: !0
        },
        JOIN_ROUND: {
            configurable: !0
        },
        JOIN_MITRE: {
            configurable: !0
        },
        JOIN_BEVEL: {
            configurable: !0
        },
        DEFAULT_QUADRANT_SEGMENTS: {
            configurable: !0
        },
        DEFAULT_MITRE_LIMIT: {
            configurable: !0
        },
        DEFAULT_SIMPLIFY_FACTOR: {
            configurable: !0
        }
    };
    Sp.prototype.getEndCapStyle = function() {
        return this._endCapStyle
    }
    ,
    Sp.prototype.isSingleSided = function() {
        return this._isSingleSided
    }
    ,
    Sp.prototype.setQuadrantSegments = function(t) {
        this._quadrantSegments = t,
        0 === this._quadrantSegments && (this._joinStyle = Sp.JOIN_BEVEL),
        this._quadrantSegments < 0 && (this._joinStyle = Sp.JOIN_MITRE,
        this._mitreLimit = Math.abs(this._quadrantSegments)),
        t <= 0 && (this._quadrantSegments = 1),
        this._joinStyle !== Sp.JOIN_ROUND && (this._quadrantSegments = Sp.DEFAULT_QUADRANT_SEGMENTS)
    }
    ,
    Sp.prototype.getJoinStyle = function() {
        return this._joinStyle
    }
    ,
    Sp.prototype.setJoinStyle = function(t) {
        this._joinStyle = t
    }
    ,
    Sp.prototype.setSimplifyFactor = function(t) {
        this._simplifyFactor = t < 0 ? 0 : t
    }
    ,
    Sp.prototype.getSimplifyFactor = function() {
        return this._simplifyFactor
    }
    ,
    Sp.prototype.getQuadrantSegments = function() {
        return this._quadrantSegments
    }
    ,
    Sp.prototype.setEndCapStyle = function(t) {
        this._endCapStyle = t
    }
    ,
    Sp.prototype.getMitreLimit = function() {
        return this._mitreLimit
    }
    ,
    Sp.prototype.setMitreLimit = function(t) {
        this._mitreLimit = t
    }
    ,
    Sp.prototype.setSingleSided = function(t) {
        this._isSingleSided = t
    }
    ,
    Sp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Sp.prototype.getClass = function() {
        return Sp
    }
    ,
    Sp.bufferDistanceError = function(t) {
        var e = Math.PI / 2 / t;
        return 1 - Math.cos(e / 2)
    }
    ,
    Cp.CAP_ROUND.get = function() {
        return 1
    }
    ,
    Cp.CAP_FLAT.get = function() {
        return 2
    }
    ,
    Cp.CAP_SQUARE.get = function() {
        return 3
    }
    ,
    Cp.JOIN_ROUND.get = function() {
        return 1
    }
    ,
    Cp.JOIN_MITRE.get = function() {
        return 2
    }
    ,
    Cp.JOIN_BEVEL.get = function() {
        return 3
    }
    ,
    Cp.DEFAULT_QUADRANT_SEGMENTS.get = function() {
        return 8
    }
    ,
    Cp.DEFAULT_MITRE_LIMIT.get = function() {
        return 5
    }
    ,
    Cp.DEFAULT_SIMPLIFY_FACTOR.get = function() {
        return .01
    }
    ,
    Object.defineProperties(Sp, Cp);
    var Pp = function(t) {
        this._distanceTol = null,
        this._isDeleted = null,
        this._angleOrientation = Xl.COUNTERCLOCKWISE,
        this._inputLine = t || null
    }
      , Mp = {
        INIT: {
            configurable: !0
        },
        DELETE: {
            configurable: !0
        },
        KEEP: {
            configurable: !0
        },
        NUM_PTS_TO_CHECK: {
            configurable: !0
        }
    };
    Pp.prototype.isDeletable = function(t, e, n, r) {
        var i = this._inputLine[t]
          , o = this._inputLine[e]
          , s = this._inputLine[n];
        return !!this.isConcave(i, o, s) && (!!this.isShallow(i, o, s, r) && this.isShallowSampled(i, o, t, n, r))
    }
    ,
    Pp.prototype.deleteShallowConcavities = function() {
        for (var t = this, e = 1, n = this.findNextNonDeletedIndex(e), r = this.findNextNonDeletedIndex(n), i = !1; r < this._inputLine.length; ) {
            var o = !1;
            t.isDeletable(e, n, r, t._distanceTol) && (t._isDeleted[n] = Pp.DELETE,
            o = !0,
            i = !0),
            e = o ? r : n,
            n = t.findNextNonDeletedIndex(e),
            r = t.findNextNonDeletedIndex(n)
        }
        return i
    }
    ,
    Pp.prototype.isShallowConcavity = function(t, e, n, r) {
        return Xl.computeOrientation(t, e, n) === this._angleOrientation && Xl.distancePointLine(e, t, n) < r
    }
    ,
    Pp.prototype.isShallowSampled = function(t, e, n, r, i) {
        var o = Math.trunc((r - n) / Pp.NUM_PTS_TO_CHECK);
        o <= 0 && (o = 1);
        for (var s = n; s < r; s += o)
            if (!this.isShallow(t, e, this._inputLine[s], i))
                return !1;
        return !0
    }
    ,
    Pp.prototype.isConcave = function(t, e, n) {
        var r = Xl.computeOrientation(t, e, n) === this._angleOrientation;
        return r
    }
    ,
    Pp.prototype.simplify = function(t) {
        this._distanceTol = Math.abs(t),
        t < 0 && (this._angleOrientation = Xl.CLOCKWISE),
        this._isDeleted = new Array(this._inputLine.length).fill(null);
        var e = !1;
        do {
            e = this.deleteShallowConcavities()
        } while (e);
        return this.collapseLine()
    }
    ,
    Pp.prototype.findNextNonDeletedIndex = function(t) {
        for (var e = t + 1; e < this._inputLine.length && this._isDeleted[e] === Pp.DELETE; )
            e++;
        return e
    }
    ,
    Pp.prototype.isShallow = function(t, e, n, r) {
        return Xl.distancePointLine(e, t, n) < r
    }
    ,
    Pp.prototype.collapseLine = function() {
        for (var t = new hc, e = 0; e < this._inputLine.length; e++)
            this._isDeleted[e] !== Pp.DELETE && t.add(this._inputLine[e]);
        return t.toCoordinateArray()
    }
    ,
    Pp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Pp.prototype.getClass = function() {
        return Pp
    }
    ,
    Pp.simplify = function(t, e) {
        return new Pp(t).simplify(e)
    }
    ,
    Mp.INIT.get = function() {
        return 0
    }
    ,
    Mp.DELETE.get = function() {
        return 1
    }
    ,
    Mp.KEEP.get = function() {
        return 1
    }
    ,
    Mp.NUM_PTS_TO_CHECK.get = function() {
        return 10
    }
    ,
    Object.defineProperties(Pp, Mp);
    var Lp = function() {
        this._ptList = null,
        this._precisionModel = null,
        this._minimimVertexDistance = 0,
        this._ptList = new lc
    }
      , Op = {
        COORDINATE_ARRAY_TYPE: {
            configurable: !0
        }
    };
    Lp.prototype.getCoordinates = function() {
        return this._ptList.toArray(Lp.COORDINATE_ARRAY_TYPE)
    }
    ,
    Lp.prototype.setPrecisionModel = function(t) {
        this._precisionModel = t
    }
    ,
    Lp.prototype.addPt = function(t) {
        var e = new ul(t);
        if (this._precisionModel.makePrecise(e),
        this.isRedundant(e))
            return null;
        this._ptList.add(e)
    }
    ,
    Lp.prototype.revere = function() {}
    ,
    Lp.prototype.addPts = function(t, e) {
        if (e)
            for (var n = 0; n < t.length; n++)
                this.addPt(t[n]);
        else
            for (var r = t.length - 1; r >= 0; r--)
                this.addPt(t[r])
    }
    ,
    Lp.prototype.isRedundant = function(t) {
        if (this._ptList.size() < 1)
            return !1;
        var e = this._ptList.get(this._ptList.size() - 1);
        return t.distance(e) < this._minimimVertexDistance
    }
    ,
    Lp.prototype.toString = function() {
        return (new _h).createLineString(this.getCoordinates()).toString()
    }
    ,
    Lp.prototype.closeRing = function() {
        if (this._ptList.size() < 1)
            return null;
        var t = new ul(this._ptList.get(0))
          , e = this._ptList.get(this._ptList.size() - 1);
        if (t.equals(e))
            return null;
        this._ptList.add(t)
    }
    ,
    Lp.prototype.setMinimumVertexDistance = function(t) {
        this._minimimVertexDistance = t
    }
    ,
    Lp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Lp.prototype.getClass = function() {
        return Lp
    }
    ,
    Op.COORDINATE_ARRAY_TYPE.get = function() {
        return new Array(0).fill(null)
    }
    ,
    Object.defineProperties(Lp, Op);
    var Rp = function() {}
      , Tp = {
        PI_TIMES_2: {
            configurable: !0
        },
        PI_OVER_2: {
            configurable: !0
        },
        PI_OVER_4: {
            configurable: !0
        },
        COUNTERCLOCKWISE: {
            configurable: !0
        },
        CLOCKWISE: {
            configurable: !0
        },
        NONE: {
            configurable: !0
        }
    };
    Rp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Rp.prototype.getClass = function() {
        return Rp
    }
    ,
    Rp.toDegrees = function(t) {
        return 180 * t / Math.PI
    }
    ,
    Rp.normalize = function(t) {
        for (; t > Math.PI; )
            t -= Rp.PI_TIMES_2;
        for (; t <= -Math.PI; )
            t += Rp.PI_TIMES_2;
        return t
    }
    ,
    Rp.angle = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return Math.atan2(t.y, t.x)
        }
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1]
              , r = n.x - e.x
              , i = n.y - e.y;
            return Math.atan2(i, r)
        }
    }
    ,
    Rp.isAcute = function(t, e, n) {
        var r = t.x - e.x
          , i = t.y - e.y;
        return r * (n.x - e.x) + i * (n.y - e.y) > 0
    }
    ,
    Rp.isObtuse = function(t, e, n) {
        var r = t.x - e.x
          , i = t.y - e.y;
        return r * (n.x - e.x) + i * (n.y - e.y) < 0
    }
    ,
    Rp.interiorAngle = function(t, e, n) {
        var r = Rp.angle(e, t)
          , i = Rp.angle(e, n);
        return Math.abs(i - r)
    }
    ,
    Rp.normalizePositive = function(t) {
        if (t < 0) {
            for (; t < 0; )
                t += Rp.PI_TIMES_2;
            t >= Rp.PI_TIMES_2 && (t = 0)
        } else {
            for (; t >= Rp.PI_TIMES_2; )
                t -= Rp.PI_TIMES_2;
            t < 0 && (t = 0)
        }
        return t
    }
    ,
    Rp.angleBetween = function(t, e, n) {
        var r = Rp.angle(e, t)
          , i = Rp.angle(e, n);
        return Rp.diff(r, i)
    }
    ,
    Rp.diff = function(t, e) {
        var n = null;
        return (n = t < e ? e - t : t - e) > Math.PI && (n = 2 * Math.PI - n),
        n
    }
    ,
    Rp.toRadians = function(t) {
        return t * Math.PI / 180
    }
    ,
    Rp.getTurn = function(t, e) {
        var n = Math.sin(e - t);
        return n > 0 ? Rp.COUNTERCLOCKWISE : n < 0 ? Rp.CLOCKWISE : Rp.NONE
    }
    ,
    Rp.angleBetweenOriented = function(t, e, n) {
        var r = Rp.angle(e, t)
          , i = Rp.angle(e, n) - r;
        return i <= -Math.PI ? i + Rp.PI_TIMES_2 : i > Math.PI ? i - Rp.PI_TIMES_2 : i
    }
    ,
    Tp.PI_TIMES_2.get = function() {
        return 2 * Math.PI
    }
    ,
    Tp.PI_OVER_2.get = function() {
        return Math.PI / 2
    }
    ,
    Tp.PI_OVER_4.get = function() {
        return Math.PI / 4
    }
    ,
    Tp.COUNTERCLOCKWISE.get = function() {
        return Xl.COUNTERCLOCKWISE
    }
    ,
    Tp.CLOCKWISE.get = function() {
        return Xl.CLOCKWISE
    }
    ,
    Tp.NONE.get = function() {
        return Xl.COLLINEAR
    }
    ,
    Object.defineProperties(Rp, Tp);
    var Ap = function t() {
        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 vp,
        this._seg1 = new vp,
        this._offset0 = new vp,
        this._offset1 = new vp,
        this._side = 0,
        this._hasNarrowConcaveAngle = !1;
        var e = arguments[0]
          , n = arguments[1]
          , r = arguments[2];
        this._precisionModel = e,
        this._bufParams = n,
        this._li = new jl,
        this._filletAngleQuantum = Math.PI / 2 / n.getQuadrantSegments(),
        n.getQuadrantSegments() >= 8 && n.getJoinStyle() === Sp.JOIN_ROUND && (this._closingSegLengthFactor = t.MAX_CLOSING_SEG_LEN_FACTOR),
        this.init(r)
    }
      , Dp = {
        OFFSET_SEGMENT_SEPARATION_FACTOR: {
            configurable: !0
        },
        INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR: {
            configurable: !0
        },
        CURVE_VERTEX_SNAP_DISTANCE_FACTOR: {
            configurable: !0
        },
        MAX_CLOSING_SEG_LEN_FACTOR: {
            configurable: !0
        }
    };
    Ap.prototype.addNextSegment = function(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;
        var n = Xl.computeOrientation(this._s0, this._s1, this._s2)
          , r = n === Xl.CLOCKWISE && this._side === Sh.LEFT || n === Xl.COUNTERCLOCKWISE && this._side === Sh.RIGHT;
        0 === n ? this.addCollinear(e) : r ? this.addOutsideTurn(n, e) : this.addInsideTurn(n, e)
    }
    ,
    Ap.prototype.addLineEndCap = function(t, e) {
        var n = new vp(t,e)
          , r = new vp;
        this.computeOffsetSegment(n, Sh.LEFT, this._distance, r);
        var i = new vp;
        this.computeOffsetSegment(n, Sh.RIGHT, this._distance, i);
        var o = e.x - t.x
          , s = e.y - t.y
          , a = Math.atan2(s, o);
        switch (this._bufParams.getEndCapStyle()) {
        case Sp.CAP_ROUND:
            this._segList.addPt(r.p1),
            this.addFilletArc(e, a + Math.PI / 2, a - Math.PI / 2, Xl.CLOCKWISE, this._distance),
            this._segList.addPt(i.p1);
            break;
        case Sp.CAP_FLAT:
            this._segList.addPt(r.p1),
            this._segList.addPt(i.p1);
            break;
        case Sp.CAP_SQUARE:
            var u = new ul;
            u.x = Math.abs(this._distance) * Math.cos(a),
            u.y = Math.abs(this._distance) * Math.sin(a);
            var l = new ul(r.p1.x + u.x,r.p1.y + u.y)
              , c = new ul(i.p1.x + u.x,i.p1.y + u.y);
            this._segList.addPt(l),
            this._segList.addPt(c)
        }
    }
    ,
    Ap.prototype.getCoordinates = function() {
        return this._segList.getCoordinates()
    }
    ,
    Ap.prototype.addMitreJoin = function(t, e, n, r) {
        var i = !0
          , o = null;
        try {
            o = Ml.intersection(e.p0, e.p1, n.p0, n.p1),
            (r <= 0 ? 1 : o.distance(t) / Math.abs(r)) > this._bufParams.getMitreLimit() && (i = !1)
        } catch (t) {
            if (!(t instanceof Cl))
                throw t;
            o = new ul(0,0),
            i = !1
        }
        i ? this._segList.addPt(o) : this.addLimitedMitreJoin(e, n, r, this._bufParams.getMitreLimit())
    }
    ,
    Ap.prototype.addFilletCorner = function(t, e, n, r, i) {
        var o = e.x - t.x
          , s = e.y - t.y
          , a = Math.atan2(s, o)
          , u = n.x - t.x
          , l = n.y - t.y
          , c = Math.atan2(l, u);
        r === Xl.CLOCKWISE ? a <= c && (a += 2 * Math.PI) : a >= c && (a -= 2 * Math.PI),
        this._segList.addPt(e),
        this.addFilletArc(t, a, c, r, i),
        this._segList.addPt(n)
    }
    ,
    Ap.prototype.addOutsideTurn = function(t, e) {
        if (this._offset0.p1.distance(this._offset1.p0) < this._distance * Ap.OFFSET_SEGMENT_SEPARATION_FACTOR)
            return this._segList.addPt(this._offset0.p1),
            null;
        this._bufParams.getJoinStyle() === Sp.JOIN_MITRE ? this.addMitreJoin(this._s1, this._offset0, this._offset1, this._distance) : this._bufParams.getJoinStyle() === Sp.JOIN_BEVEL ? this.addBevelJoin(this._offset0, this._offset1) : (e && this._segList.addPt(this._offset0.p1),
        this.addFilletCorner(this._s1, this._offset0.p1, this._offset1.p0, t, this._distance),
        this._segList.addPt(this._offset1.p0))
    }
    ,
    Ap.prototype.createSquare = function(t) {
        this._segList.addPt(new ul(t.x + this._distance,t.y + this._distance)),
        this._segList.addPt(new ul(t.x + this._distance,t.y - this._distance)),
        this._segList.addPt(new ul(t.x - this._distance,t.y - this._distance)),
        this._segList.addPt(new ul(t.x - this._distance,t.y + this._distance)),
        this._segList.closeRing()
    }
    ,
    Ap.prototype.addSegments = function(t, e) {
        this._segList.addPts(t, e)
    }
    ,
    Ap.prototype.addFirstSegment = function() {
        this._segList.addPt(this._offset1.p0)
    }
    ,
    Ap.prototype.addLastSegment = function() {
        this._segList.addPt(this._offset1.p1)
    }
    ,
    Ap.prototype.initSideSegments = function(t, e, n) {
        this._s1 = t,
        this._s2 = e,
        this._side = n,
        this._seg1.setCoordinates(t, e),
        this.computeOffsetSegment(this._seg1, n, this._distance, this._offset1)
    }
    ,
    Ap.prototype.addLimitedMitreJoin = function(t, e, n, r) {
        var i = this._seg0.p1
          , o = Rp.angle(i, this._seg0.p0)
          , s = Rp.angleBetweenOriented(this._seg0.p0, i, this._seg1.p1) / 2
          , a = Rp.normalize(o + s)
          , u = Rp.normalize(a + Math.PI)
          , l = r * n
          , c = n - l * Math.abs(Math.sin(s))
          , h = i.x + l * Math.cos(u)
          , p = i.y + l * Math.sin(u)
          , f = new ul(h,p)
          , g = new vp(i,f)
          , d = g.pointAlongOffset(1, c)
          , y = g.pointAlongOffset(1, -c);
        this._side === Sh.LEFT ? (this._segList.addPt(d),
        this._segList.addPt(y)) : (this._segList.addPt(y),
        this._segList.addPt(d))
    }
    ,
    Ap.prototype.computeOffsetSegment = function(t, e, n, r) {
        var i = e === Sh.LEFT ? 1 : -1
          , o = t.p1.x - t.p0.x
          , s = t.p1.y - t.p0.y
          , a = Math.sqrt(o * o + s * s)
          , u = i * n * o / a
          , l = i * n * s / a;
        r.p0.x = t.p0.x - l,
        r.p0.y = t.p0.y + u,
        r.p1.x = t.p1.x - l,
        r.p1.y = t.p1.y + u
    }
    ,
    Ap.prototype.addFilletArc = function(t, e, n, r, i) {
        var o = r === Xl.CLOCKWISE ? -1 : 1
          , s = Math.abs(e - n)
          , a = Math.trunc(s / this._filletAngleQuantum + .5);
        if (a < 1)
            return null;
        for (var u = s / a, l = 0, c = new ul; l < s; ) {
            var h = e + o * l;
            c.x = t.x + i * Math.cos(h),
            c.y = t.y + i * Math.sin(h),
            this._segList.addPt(c),
            l += u
        }
    }
    ,
    Ap.prototype.addInsideTurn = function(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 * Ap.INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR)
            this._segList.addPt(this._offset0.p1);
        else {
            if (this._segList.addPt(this._offset0.p1),
            this._closingSegLengthFactor > 0) {
                var n = new ul((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(n);
                var r = new ul((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(r)
            } else
                this._segList.addPt(this._s1);
            this._segList.addPt(this._offset1.p0)
        }
    }
    ,
    Ap.prototype.createCircle = function(t) {
        var e = new ul(t.x + this._distance,t.y);
        this._segList.addPt(e),
        this.addFilletArc(t, 0, 2 * Math.PI, -1, this._distance),
        this._segList.closeRing()
    }
    ,
    Ap.prototype.addBevelJoin = function(t, e) {
        this._segList.addPt(t.p1),
        this._segList.addPt(e.p0)
    }
    ,
    Ap.prototype.init = function(t) {
        this._distance = t,
        this._maxCurveSegmentError = t * (1 - Math.cos(this._filletAngleQuantum / 2)),
        this._segList = new Lp,
        this._segList.setPrecisionModel(this._precisionModel),
        this._segList.setMinimumVertexDistance(t * Ap.CURVE_VERTEX_SNAP_DISTANCE_FACTOR)
    }
    ,
    Ap.prototype.addCollinear = function(t) {
        this._li.computeIntersection(this._s0, this._s1, this._s1, this._s2),
        this._li.getIntersectionNum() >= 2 && (this._bufParams.getJoinStyle() === Sp.JOIN_BEVEL || this._bufParams.getJoinStyle() === Sp.JOIN_MITRE ? (t && this._segList.addPt(this._offset0.p1),
        this._segList.addPt(this._offset1.p0)) : this.addFilletCorner(this._s1, this._offset0.p1, this._offset1.p0, Xl.CLOCKWISE, this._distance))
    }
    ,
    Ap.prototype.closeRing = function() {
        this._segList.closeRing()
    }
    ,
    Ap.prototype.hasNarrowConcaveAngle = function() {
        return this._hasNarrowConcaveAngle
    }
    ,
    Ap.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ap.prototype.getClass = function() {
        return Ap
    }
    ,
    Dp.OFFSET_SEGMENT_SEPARATION_FACTOR.get = function() {
        return .001
    }
    ,
    Dp.INSIDE_TURN_VERTEX_SNAP_DISTANCE_FACTOR.get = function() {
        return .001
    }
    ,
    Dp.CURVE_VERTEX_SNAP_DISTANCE_FACTOR.get = function() {
        return 1e-6
    }
    ,
    Dp.MAX_CLOSING_SEG_LEN_FACTOR.get = function() {
        return 80
    }
    ,
    Object.defineProperties(Ap, Dp);
    var Fp = function() {
        this._distance = 0,
        this._precisionModel = null,
        this._bufParams = null;
        var t = arguments[0]
          , e = arguments[1];
        this._precisionModel = t,
        this._bufParams = e
    };
    Fp.prototype.getOffsetCurve = function(t, e) {
        if (this._distance = e,
        0 === e)
            return null;
        var n = e < 0
          , r = Math.abs(e)
          , i = this.getSegGen(r);
        t.length <= 1 ? this.computePointCurve(t[0], i) : this.computeOffsetCurve(t, n, i);
        var o = i.getCoordinates();
        return n && pc.reverse(o),
        o
    }
    ,
    Fp.prototype.computeSingleSidedBufferCurve = function(t, e, n) {
        var r = this.simplifyTolerance(this._distance);
        if (e) {
            n.addSegments(t, !0);
            var i = Pp.simplify(t, -r)
              , o = i.length - 1;
            n.initSideSegments(i[o], i[o - 1], Sh.LEFT),
            n.addFirstSegment();
            for (var s = o - 2; s >= 0; s--)
                n.addNextSegment(i[s], !0)
        } else {
            n.addSegments(t, !1);
            var a = Pp.simplify(t, r)
              , u = a.length - 1;
            n.initSideSegments(a[0], a[1], Sh.LEFT),
            n.addFirstSegment();
            for (var l = 2; l <= u; l++)
                n.addNextSegment(a[l], !0)
        }
        n.addLastSegment(),
        n.closeRing()
    }
    ,
    Fp.prototype.computeRingBufferCurve = function(t, e, n) {
        var r = this.simplifyTolerance(this._distance);
        e === Sh.RIGHT && (r = -r);
        var i = Pp.simplify(t, r)
          , o = i.length - 1;
        n.initSideSegments(i[o - 1], i[0], e);
        for (var s = 1; s <= o; s++) {
            var a = 1 !== s;
            n.addNextSegment(i[s], a)
        }
        n.closeRing()
    }
    ,
    Fp.prototype.computeLineBufferCurve = function(t, e) {
        var n = this.simplifyTolerance(this._distance)
          , r = Pp.simplify(t, n)
          , i = r.length - 1;
        e.initSideSegments(r[0], r[1], Sh.LEFT);
        for (var o = 2; o <= i; o++)
            e.addNextSegment(r[o], !0);
        e.addLastSegment(),
        e.addLineEndCap(r[i - 1], r[i]);
        var s = Pp.simplify(t, -n)
          , a = s.length - 1;
        e.initSideSegments(s[a], s[a - 1], Sh.LEFT);
        for (var u = a - 2; u >= 0; u--)
            e.addNextSegment(s[u], !0);
        e.addLastSegment(),
        e.addLineEndCap(s[1], s[0]),
        e.closeRing()
    }
    ,
    Fp.prototype.computePointCurve = function(t, e) {
        switch (this._bufParams.getEndCapStyle()) {
        case Sp.CAP_ROUND:
            e.createCircle(t);
            break;
        case Sp.CAP_SQUARE:
            e.createSquare(t)
        }
    }
    ,
    Fp.prototype.getLineCurve = function(t, e) {
        if (this._distance = e,
        e < 0 && !this._bufParams.isSingleSided())
            return null;
        if (0 === e)
            return null;
        var n = Math.abs(e)
          , r = this.getSegGen(n);
        if (t.length <= 1)
            this.computePointCurve(t[0], r);
        else if (this._bufParams.isSingleSided()) {
            var i = e < 0;
            this.computeSingleSidedBufferCurve(t, i, r)
        } else
            this.computeLineBufferCurve(t, r);
        return r.getCoordinates()
    }
    ,
    Fp.prototype.getBufferParameters = function() {
        return this._bufParams
    }
    ,
    Fp.prototype.simplifyTolerance = function(t) {
        return t * this._bufParams.getSimplifyFactor()
    }
    ,
    Fp.prototype.getRingCurve = function(t, e, n) {
        if (this._distance = n,
        t.length <= 2)
            return this.getLineCurve(t, n);
        if (0 === n)
            return Fp.copyCoordinates(t);
        var r = this.getSegGen(n);
        return this.computeRingBufferCurve(t, e, r),
        r.getCoordinates()
    }
    ,
    Fp.prototype.computeOffsetCurve = function(t, e, n) {
        var r = this.simplifyTolerance(this._distance);
        if (e) {
            var i = Pp.simplify(t, -r)
              , o = i.length - 1;
            n.initSideSegments(i[o], i[o - 1], Sh.LEFT),
            n.addFirstSegment();
            for (var s = o - 2; s >= 0; s--)
                n.addNextSegment(i[s], !0)
        } else {
            var a = Pp.simplify(t, r)
              , u = a.length - 1;
            n.initSideSegments(a[0], a[1], Sh.LEFT),
            n.addFirstSegment();
            for (var l = 2; l <= u; l++)
                n.addNextSegment(a[l], !0)
        }
        n.addLastSegment()
    }
    ,
    Fp.prototype.getSegGen = function(t) {
        return new Ap(this._precisionModel,this._bufParams,t)
    }
    ,
    Fp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Fp.prototype.getClass = function() {
        return Fp
    }
    ,
    Fp.copyCoordinates = function(t) {
        for (var e = new Array(t.length).fill(null), n = 0; n < e.length; n++)
            e[n] = new ul(t[n]);
        return e
    }
    ;
    var kp = function() {
        this._subgraphs = null,
        this._seg = new vp,
        this._cga = new Xl;
        var t = arguments[0];
        this._subgraphs = t
    }
      , Gp = {
        DepthSegment: {
            configurable: !0
        }
    };
    kp.prototype.findStabbedSegments = function() {
        var t = this;
        if (1 === arguments.length) {
            for (var e = arguments[0], n = new lc, r = this._subgraphs.iterator(); r.hasNext(); ) {
                var i = r.next()
                  , o = i.getEnvelope();
                e.y < o.getMinY() || e.y > o.getMaxY() || t.findStabbedSegments(e, i.getDirectedEdges(), n)
            }
            return n
        }
        if (3 === arguments.length)
            if (gl(arguments[2], ac) && arguments[0]instanceof ul && arguments[1]instanceof Xh)
                for (var s = arguments[0], a = arguments[1], u = arguments[2], l = a.getEdge().getCoordinates(), c = 0; c < l.length - 1; c++) {
                    t._seg.p0 = l[c],
                    t._seg.p1 = l[c + 1],
                    t._seg.p0.y > t._seg.p1.y && t._seg.reverse();
                    var h = Math.max(t._seg.p0.x, t._seg.p1.x);
                    if (!(h < s.x) && !(t._seg.isHorizontal() || s.y < t._seg.p0.y || s.y > t._seg.p1.y || Xl.computeOrientation(t._seg.p0, t._seg.p1, s) === Xl.RIGHT)) {
                        var p = a.getDepth(Sh.LEFT);
                        t._seg.p0.equals(l[c]) || (p = a.getDepth(Sh.RIGHT));
                        var f = new qp(t._seg,p);
                        u.add(f)
                    }
                }
            else if (gl(arguments[2], ac) && arguments[0]instanceof ul && gl(arguments[1], ac))
                for (var g = arguments[0], d = arguments[1], y = arguments[2], v = d.iterator(); v.hasNext(); ) {
                    var _ = v.next();
                    _.isForward() && t.findStabbedSegments(g, _, y)
                }
    }
    ,
    kp.prototype.getDepth = function(t) {
        var e = this.findStabbedSegments(t);
        return 0 === e.size() ? 0 : np.min(e)._leftDepth
    }
    ,
    kp.prototype.interfaces_ = function() {
        return []
    }
    ,
    kp.prototype.getClass = function() {
        return kp
    }
    ,
    Gp.DepthSegment.get = function() {
        return qp
    }
    ,
    Object.defineProperties(kp, Gp);
    var qp = function() {
        this._upwardSeg = null,
        this._leftDepth = null;
        var t = arguments[0]
          , e = arguments[1];
        this._upwardSeg = new vp(t),
        this._leftDepth = e
    };
    qp.prototype.compareTo = function(t) {
        var e = t;
        if (this._upwardSeg.minX() >= e._upwardSeg.maxX())
            return 1;
        if (this._upwardSeg.maxX() <= e._upwardSeg.minX())
            return -1;
        var n = this._upwardSeg.orientationIndex(e._upwardSeg);
        return 0 !== n || 0 !== (n = -1 * e._upwardSeg.orientationIndex(this._upwardSeg)) ? n : this._upwardSeg.compareTo(e._upwardSeg)
    }
    ,
    qp.prototype.compareX = function(t, e) {
        var n = t.p0.compareTo(e.p0);
        return 0 !== n ? n : t.p1.compareTo(e.p1)
    }
    ,
    qp.prototype.toString = function() {
        return this._upwardSeg.toString()
    }
    ,
    qp.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    qp.prototype.getClass = function() {
        return qp
    }
    ;
    var Bp = function(t, e, n) {
        this.p0 = t || null,
        this.p1 = e || null,
        this.p2 = n || null
    };
    Bp.prototype.area = function() {
        return Bp.area(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.signedArea = function() {
        return Bp.signedArea(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.interpolateZ = function(t) {
        if (null === t)
            throw new el("Supplied point is null.");
        return Bp.interpolateZ(t, this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.longestSideLength = function() {
        return Bp.longestSideLength(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.isAcute = function() {
        return Bp.isAcute(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.circumcentre = function() {
        return Bp.circumcentre(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.area3D = function() {
        return Bp.area3D(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.centroid = function() {
        return Bp.centroid(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.inCentre = function() {
        return Bp.inCentre(this.p0, this.p1, this.p2)
    }
    ,
    Bp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Bp.prototype.getClass = function() {
        return Bp
    }
    ,
    Bp.area = function(t, e, n) {
        return Math.abs(((n.x - t.x) * (e.y - t.y) - (e.x - t.x) * (n.y - t.y)) / 2)
    }
    ,
    Bp.signedArea = function(t, e, n) {
        return ((n.x - t.x) * (e.y - t.y) - (e.x - t.x) * (n.y - t.y)) / 2
    }
    ,
    Bp.det = function(t, e, n, r) {
        return t * r - e * n
    }
    ,
    Bp.interpolateZ = function(t, e, n, r) {
        var i = e.x
          , o = e.y
          , s = n.x - i
          , a = r.x - i
          , u = n.y - o
          , l = r.y - o
          , c = s * l - a * u
          , h = t.x - i
          , p = t.y - o
          , f = (l * h - a * p) / c
          , g = (-u * h + s * p) / c;
        return e.z + f * (n.z - e.z) + g * (r.z - e.z)
    }
    ,
    Bp.longestSideLength = function(t, e, n) {
        var r = t.distance(e)
          , i = e.distance(n)
          , o = n.distance(t)
          , s = r;
        return i > s && (s = i),
        o > s && (s = o),
        s
    }
    ,
    Bp.isAcute = function(t, e, n) {
        return !!Rp.isAcute(t, e, n) && (!!Rp.isAcute(e, n, t) && !!Rp.isAcute(n, t, e))
    }
    ,
    Bp.circumcentre = function(t, e, n) {
        var r = n.x
          , i = n.y
          , o = t.x - r
          , s = t.y - i
          , a = e.x - r
          , u = e.y - i
          , l = 2 * Bp.det(o, s, a, u)
          , c = Bp.det(s, o * o + s * s, u, a * a + u * u)
          , h = Bp.det(o, o * o + s * s, a, a * a + u * u);
        return new ul(r - c / l,i + h / l)
    }
    ,
    Bp.perpendicularBisector = function(t, e) {
        var n = e.x - t.x
          , r = e.y - t.y
          , i = new Ml(t.x + n / 2,t.y + r / 2,1)
          , o = new Ml(t.x - r + n / 2,t.y + n + r / 2,1);
        return new Ml(i,o)
    }
    ,
    Bp.angleBisector = function(t, e, n) {
        var r = e.distance(t)
          , i = r / (r + e.distance(n))
          , o = n.x - t.x
          , s = n.y - t.y;
        return new ul(t.x + i * o,t.y + i * s)
    }
    ,
    Bp.area3D = function(t, e, n) {
        var r = e.x - t.x
          , i = e.y - t.y
          , o = e.z - t.z
          , s = n.x - t.x
          , a = n.y - t.y
          , u = n.z - t.z
          , l = i * u - o * a
          , c = o * s - r * u
          , h = r * a - i * s
          , p = l * l + c * c + h * h
          , f = Math.sqrt(p) / 2;
        return f
    }
    ,
    Bp.centroid = function(t, e, n) {
        var r = (t.x + e.x + n.x) / 3
          , i = (t.y + e.y + n.y) / 3;
        return new ul(r,i)
    }
    ,
    Bp.inCentre = function(t, e, n) {
        var r = e.distance(n)
          , i = t.distance(n)
          , o = t.distance(e)
          , s = r + i + o
          , a = (r * t.x + i * e.x + o * n.x) / s
          , u = (r * t.y + i * e.y + o * n.y) / s;
        return new ul(a,u)
    }
    ;
    var zp = function() {
        this._inputGeom = null,
        this._distance = null,
        this._curveBuilder = null,
        this._curveList = new lc;
        var t = arguments[0]
          , e = arguments[1]
          , n = arguments[2];
        this._inputGeom = t,
        this._distance = e,
        this._curveBuilder = n
    };
    zp.prototype.addPoint = function(t) {
        if (this._distance <= 0)
            return null;
        var e = t.getCoordinates()
          , n = this._curveBuilder.getLineCurve(e, this._distance);
        this.addCurve(n, pl.EXTERIOR, pl.INTERIOR)
    }
    ,
    zp.prototype.addPolygon = function(t) {
        var e = this
          , n = this._distance
          , r = Sh.LEFT;
        this._distance < 0 && (n = -this._distance,
        r = Sh.RIGHT);
        var i = t.getExteriorRing()
          , o = pc.removeRepeatedPoints(i.getCoordinates());
        if (this._distance < 0 && this.isErodedCompletely(i, this._distance))
            return null;
        if (this._distance <= 0 && o.length < 3)
            return null;
        this.addPolygonRing(o, n, r, pl.EXTERIOR, pl.INTERIOR);
        for (var s = 0; s < t.getNumInteriorRing(); s++) {
            var a = t.getInteriorRingN(s)
              , u = pc.removeRepeatedPoints(a.getCoordinates());
            e._distance > 0 && e.isErodedCompletely(a, -e._distance) || e.addPolygonRing(u, n, Sh.opposite(r), pl.INTERIOR, pl.EXTERIOR)
        }
    }
    ,
    zp.prototype.isTriangleErodedCompletely = function(t, e) {
        var n = new Bp(t[0],t[1],t[2])
          , r = n.inCentre();
        return Xl.distancePointLine(r, n.p0, n.p1) < Math.abs(e)
    }
    ,
    zp.prototype.addLineString = function(t) {
        if (this._distance <= 0 && !this._curveBuilder.getBufferParameters().isSingleSided())
            return null;
        var e = pc.removeRepeatedPoints(t.getCoordinates())
          , n = this._curveBuilder.getLineCurve(e, this._distance);
        this.addCurve(n, pl.EXTERIOR, pl.INTERIOR)
    }
    ,
    zp.prototype.addCurve = function(t, e, n) {
        if (null === t || t.length < 2)
            return null;
        var r = new yp(t,new Dh(0,pl.BOUNDARY,e,n));
        this._curveList.add(r)
    }
    ,
    zp.prototype.getCurves = function() {
        return this.add(this._inputGeom),
        this._curveList
    }
    ,
    zp.prototype.addPolygonRing = function(t, e, n, r, i) {
        if (0 === e && t.length < nh.MINIMUM_VALID_SIZE)
            return null;
        var o = r
          , s = i;
        t.length >= nh.MINIMUM_VALID_SIZE && Xl.isCCW(t) && (o = i,
        s = r,
        n = Sh.opposite(n));
        var a = this._curveBuilder.getRingCurve(t, n, e);
        this.addCurve(a, o, s)
    }
    ,
    zp.prototype.add = function(t) {
        if (t.isEmpty())
            return null;
        t instanceof th ? this.addPolygon(t) : t instanceof Zc ? this.addLineString(t) : t instanceof Qc ? this.addPoint(t) : (t instanceof eh || t instanceof Gc || t instanceof rh || t instanceof kc) && this.addCollection(t)
    }
    ,
    zp.prototype.isErodedCompletely = function(t, e) {
        var n = t.getCoordinates();
        if (n.length < 4)
            return e < 0;
        if (4 === n.length)
            return this.isTriangleErodedCompletely(n, e);
        var r = t.getEnvelopeInternal()
          , i = Math.min(r.getHeight(), r.getWidth());
        return e < 0 && 2 * Math.abs(e) > i
    }
    ,
    zp.prototype.addCollection = function(t) {
        for (var e = 0; e < t.getNumGeometries(); e++) {
            var n = t.getGeometryN(e);
            this.add(n)
        }
    }
    ,
    zp.prototype.interfaces_ = function() {
        return []
    }
    ,
    zp.prototype.getClass = function() {
        return zp
    }
    ;
    var jp = function() {};
    jp.prototype.locate = function(t) {}
    ,
    jp.prototype.interfaces_ = function() {
        return []
    }
    ,
    jp.prototype.getClass = function() {
        return jp
    }
    ;
    var Up = function() {
        this._parent = null,
        this._atStart = null,
        this._max = null,
        this._index = null,
        this._subcollectionIterator = null;
        var t = arguments[0];
        this._parent = t,
        this._atStart = !0,
        this._index = 0,
        this._max = t.getNumGeometries()
    };
    Up.prototype.next = function() {
        if (this._atStart)
            return this._atStart = !1,
            Up.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 uc;
        var t = this._parent.getGeometryN(this._index++);
        return t instanceof kc ? (this._subcollectionIterator = new Up(t),
        this._subcollectionIterator.next()) : t
    }
    ,
    Up.prototype.remove = function() {
        throw new Error(this.getClass().getName())
    }
    ,
    Up.prototype.hasNext = function() {
        if (this._atStart)
            return !0;
        if (null !== this._subcollectionIterator) {
            if (this._subcollectionIterator.hasNext())
                return !0;
            this._subcollectionIterator = null
        }
        return !(this._index >= this._max)
    }
    ,
    Up.prototype.interfaces_ = function() {
        return [sc]
    }
    ,
    Up.prototype.getClass = function() {
        return Up
    }
    ,
    Up.isAtomic = function(t) {
        return !(t instanceof kc)
    }
    ;
    var Vp = function() {
        this._geom = null;
        var t = arguments[0];
        this._geom = t
    };
    Vp.prototype.locate = function(t) {
        return Vp.locate(t, this._geom)
    }
    ,
    Vp.prototype.interfaces_ = function() {
        return [jp]
    }
    ,
    Vp.prototype.getClass = function() {
        return Vp
    }
    ,
    Vp.isPointInRing = function(t, e) {
        return !!e.getEnvelopeInternal().intersects(t) && Xl.isPointInRing(t, e.getCoordinates())
    }
    ,
    Vp.containsPointInPolygon = function(t, e) {
        if (e.isEmpty())
            return !1;
        var n = e.getExteriorRing();
        if (!Vp.isPointInRing(t, n))
            return !1;
        for (var r = 0; r < e.getNumInteriorRing(); r++) {
            var i = e.getInteriorRingN(r);
            if (Vp.isPointInRing(t, i))
                return !1
        }
        return !0
    }
    ,
    Vp.containsPoint = function(t, e) {
        if (e instanceof th)
            return Vp.containsPointInPolygon(t, e);
        if (e instanceof kc)
            for (var n = new Up(e); n.hasNext(); ) {
                var r = n.next();
                if (r !== e && Vp.containsPoint(t, r))
                    return !0
            }
        return !1
    }
    ,
    Vp.locate = function(t, e) {
        return e.isEmpty() ? pl.EXTERIOR : Vp.containsPoint(t, e) ? pl.INTERIOR : pl.EXTERIOR
    }
    ;
    var Xp = function() {
        this._edgeMap = new Cc,
        this._edgeList = null,
        this._ptInAreaLocation = [pl.NONE, pl.NONE]
    };
    Xp.prototype.getNextCW = function(t) {
        this.getEdges();
        var e = this._edgeList.indexOf(t)
          , n = e - 1;
        return 0 === e && (n = this._edgeList.size() - 1),
        this._edgeList.get(n)
    }
    ,
    Xp.prototype.propagateSideLabels = function(t) {
        for (var e = pl.NONE, n = this.iterator(); n.hasNext(); ) {
            var r = n.next().getLabel();
            r.isArea(t) && r.getLocation(t, Sh.LEFT) !== pl.NONE && (e = r.getLocation(t, Sh.LEFT))
        }
        if (e === pl.NONE)
            return null;
        for (var i = e, o = this.iterator(); o.hasNext(); ) {
            var s = o.next()
              , a = s.getLabel();
            if (a.getLocation(t, Sh.ON) === pl.NONE && a.setLocation(t, Sh.ON, i),
            a.isArea(t)) {
                var u = a.getLocation(t, Sh.LEFT)
                  , l = a.getLocation(t, Sh.RIGHT);
                if (l !== pl.NONE) {
                    if (l !== i)
                        throw new Oh("side location conflict",s.getCoordinate());
                    u === pl.NONE && ql.shouldNeverReachHere("found single null side (at " + s.getCoordinate() + ")"),
                    i = u
                } else
                    ql.isTrue(a.getLocation(t, Sh.LEFT) === pl.NONE, "found single null side"),
                    a.setLocation(t, Sh.RIGHT, i),
                    a.setLocation(t, Sh.LEFT, i)
            }
        }
    }
    ,
    Xp.prototype.getCoordinate = function() {
        var t = this.iterator();
        return t.hasNext() ? t.next().getCoordinate() : null
    }
    ,
    Xp.prototype.print = function(t) {
        Pl.out.println("EdgeEndStar:   " + this.getCoordinate());
        for (var e = this.iterator(); e.hasNext(); ) {
            e.next().print(t)
        }
    }
    ,
    Xp.prototype.isAreaLabelsConsistent = function(t) {
        return this.computeEdgeEndLabels(t.getBoundaryNodeRule()),
        this.checkAreaLabelsConsistent(0)
    }
    ,
    Xp.prototype.checkAreaLabelsConsistent = function(t) {
        var e = this.getEdges();
        if (e.size() <= 0)
            return !0;
        var n = e.size() - 1
          , r = e.get(n).getLabel().getLocation(t, Sh.LEFT);
        ql.isTrue(r !== pl.NONE, "Found unlabelled area edge");
        for (var i = r, o = this.iterator(); o.hasNext(); ) {
            var s = o.next().getLabel();
            ql.isTrue(s.isArea(t), "Found non-area edge");
            var a = s.getLocation(t, Sh.LEFT)
              , u = s.getLocation(t, Sh.RIGHT);
            if (a === u)
                return !1;
            if (u !== i)
                return !1;
            i = a
        }
        return !0
    }
    ,
    Xp.prototype.findIndex = function(t) {
        this.iterator();
        for (var e = 0; e < this._edgeList.size(); e++) {
            if (this._edgeList.get(e) === t)
                return e
        }
        return -1
    }
    ,
    Xp.prototype.iterator = function() {
        return this.getEdges().iterator()
    }
    ,
    Xp.prototype.getEdges = function() {
        return null === this._edgeList && (this._edgeList = new lc(this._edgeMap.values())),
        this._edgeList
    }
    ,
    Xp.prototype.getLocation = function(t, e, n) {
        return this._ptInAreaLocation[t] === pl.NONE && (this._ptInAreaLocation[t] = Vp.locate(e, n[t].getGeometry())),
        this._ptInAreaLocation[t]
    }
    ,
    Xp.prototype.toString = function() {
        var t = new vl;
        t.append("EdgeEndStar:   " + this.getCoordinate()),
        t.append("\n");
        for (var e = this.iterator(); e.hasNext(); ) {
            var n = e.next();
            t.append(n),
            t.append("\n")
        }
        return t.toString()
    }
    ,
    Xp.prototype.computeEdgeEndLabels = function(t) {
        for (var e = this.iterator(); e.hasNext(); ) {
            e.next().computeLabel(t)
        }
    }
    ,
    Xp.prototype.computeLabelling = function(t) {
        this.computeEdgeEndLabels(t[0].getBoundaryNodeRule()),
        this.propagateSideLabels(0),
        this.propagateSideLabels(1);
        for (var e = [!1, !1], n = this.iterator(); n.hasNext(); )
            for (var r = n.next().getLabel(), i = 0; i < 2; i++)
                r.isLine(i) && r.getLocation(i) === pl.BOUNDARY && (e[i] = !0);
        for (var o = this.iterator(); o.hasNext(); )
            for (var s = o.next(), a = s.getLabel(), u = 0; u < 2; u++)
                if (a.isAnyNull(u)) {
                    var l = pl.NONE;
                    if (e[u])
                        l = pl.EXTERIOR;
                    else {
                        var c = s.getCoordinate();
                        l = this.getLocation(u, c, t)
                    }
                    a.setAllLocationsIfNull(u, l)
                }
    }
    ,
    Xp.prototype.getDegree = function() {
        return this._edgeMap.size()
    }
    ,
    Xp.prototype.insertEdgeEnd = function(t, e) {
        this._edgeMap.put(t, e),
        this._edgeList = null
    }
    ,
    Xp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Xp.prototype.getClass = function() {
        return Xp
    }
    ;
    var Yp = function(t) {
        function e() {
            t.call(this),
            this._resultAreaEdgeList = null,
            this._label = null,
            this._SCANNING_FOR_INCOMING = 1,
            this._LINKING_TO_OUTGOING = 2
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.linkResultDirectedEdges = function() {
            var t = this;
            this.getResultAreaEdges();
            for (var e = null, n = null, r = this._SCANNING_FOR_INCOMING, i = 0; i < this._resultAreaEdgeList.size(); i++) {
                var o = t._resultAreaEdgeList.get(i)
                  , s = o.getSym();
                if (o.getLabel().isArea())
                    switch (null === e && o.isInResult() && (e = o),
                    r) {
                    case t._SCANNING_FOR_INCOMING:
                        if (!s.isInResult())
                            continue;
                        n = s,
                        r = t._LINKING_TO_OUTGOING;
                        break;
                    case t._LINKING_TO_OUTGOING:
                        if (!o.isInResult())
                            continue;
                        n.setNext(o),
                        r = t._SCANNING_FOR_INCOMING
                    }
            }
            if (r === this._LINKING_TO_OUTGOING) {
                if (null === e)
                    throw new Oh("no outgoing dirEdge found",this.getCoordinate());
                ql.isTrue(e.isInResult(), "unable to link last incoming dirEdge"),
                n.setNext(e)
            }
        }
        ,
        e.prototype.insert = function(t) {
            var e = t;
            this.insertEdgeEnd(e, e)
        }
        ,
        e.prototype.getRightmostEdge = function() {
            var t = this.getEdges()
              , e = t.size();
            if (e < 1)
                return null;
            var n = t.get(0);
            if (1 === e)
                return n;
            var r = t.get(e - 1)
              , i = n.getQuadrant()
              , o = r.getQuadrant();
            return jh.isNorthern(i) && jh.isNorthern(o) ? n : jh.isNorthern(i) || jh.isNorthern(o) ? 0 !== n.getDy() ? n : 0 !== r.getDy() ? r : (ql.shouldNeverReachHere("found two horizontal edges incident on node"),
            null) : r
        }
        ,
        e.prototype.print = function(t) {
            Pl.out.println("DirectedEdgeStar: " + this.getCoordinate());
            for (var e = this.iterator(); e.hasNext(); ) {
                var n = e.next();
                t.print("out "),
                n.print(t),
                t.println(),
                t.print("in "),
                n.getSym().print(t),
                t.println()
            }
        }
        ,
        e.prototype.getResultAreaEdges = function() {
            if (null !== this._resultAreaEdgeList)
                return this._resultAreaEdgeList;
            this._resultAreaEdgeList = new lc;
            for (var t = this.iterator(); t.hasNext(); ) {
                var e = t.next();
                (e.isInResult() || e.getSym().isInResult()) && this._resultAreaEdgeList.add(e)
            }
            return this._resultAreaEdgeList
        }
        ,
        e.prototype.updateLabelling = function(t) {
            for (var e = this.iterator(); e.hasNext(); ) {
                var n = e.next().getLabel();
                n.setAllLocationsIfNull(0, t.getLocation(0)),
                n.setAllLocationsIfNull(1, t.getLocation(1))
            }
        }
        ,
        e.prototype.linkAllDirectedEdges = function() {
            this.getEdges();
            for (var t = null, e = null, n = this._edgeList.size() - 1; n >= 0; n--) {
                var r = this._edgeList.get(n)
                  , i = r.getSym();
                null === e && (e = i),
                null !== t && i.setNext(t),
                t = r
            }
            e.setNext(t)
        }
        ,
        e.prototype.computeDepths = function() {
            var t = this;
            if (1 === arguments.length) {
                var e = arguments[0]
                  , n = this.findIndex(e)
                  , r = e.getDepth(Sh.LEFT)
                  , i = e.getDepth(Sh.RIGHT)
                  , o = this.computeDepths(n + 1, this._edgeList.size(), r)
                  , s = this.computeDepths(0, n, o);
                if (s !== i)
                    throw new Oh("depth mismatch at " + e.getCoordinate())
            } else if (3 === arguments.length) {
                for (var a = arguments[0], u = arguments[1], l = arguments[2], c = l, h = a; h < u; h++) {
                    var p = t._edgeList.get(h);
                    p.setEdgeDepths(Sh.RIGHT, c),
                    c = p.getDepth(Sh.LEFT)
                }
                return c
            }
        }
        ,
        e.prototype.mergeSymLabels = function() {
            for (var t = this.iterator(); t.hasNext(); ) {
                var e = t.next();
                e.getLabel().merge(e.getSym().getLabel())
            }
        }
        ,
        e.prototype.linkMinimalDirectedEdges = function(t) {
            for (var e = this, n = null, r = null, i = this._SCANNING_FOR_INCOMING, o = this._resultAreaEdgeList.size() - 1; o >= 0; o--) {
                var s = e._resultAreaEdgeList.get(o)
                  , a = s.getSym();
                switch (null === n && s.getEdgeRing() === t && (n = s),
                i) {
                case e._SCANNING_FOR_INCOMING:
                    if (a.getEdgeRing() !== t)
                        continue;
                    r = a,
                    i = e._LINKING_TO_OUTGOING;
                    break;
                case e._LINKING_TO_OUTGOING:
                    if (s.getEdgeRing() !== t)
                        continue;
                    r.setNextMin(s),
                    i = e._SCANNING_FOR_INCOMING
                }
            }
            i === this._LINKING_TO_OUTGOING && (ql.isTrue(null !== n, "found null for first outgoing dirEdge"),
            ql.isTrue(n.getEdgeRing() === t, "unable to link last incoming dirEdge"),
            r.setNextMin(n))
        }
        ,
        e.prototype.getOutgoingDegree = function() {
            if (0 === arguments.length) {
                for (var t = 0, e = this.iterator(); e.hasNext(); ) {
                    var n = e.next();
                    n.isInResult() && t++
                }
                return t
            }
            if (1 === arguments.length) {
                for (var r = arguments[0], i = 0, o = this.iterator(); o.hasNext(); ) {
                    var s = o.next();
                    s.getEdgeRing() === r && i++
                }
                return i
            }
        }
        ,
        e.prototype.getLabel = function() {
            return this._label
        }
        ,
        e.prototype.findCoveredLineEdges = function() {
            for (var t = pl.NONE, e = this.iterator(); e.hasNext(); ) {
                var n = e.next()
                  , r = n.getSym();
                if (!n.isLineEdge()) {
                    if (n.isInResult()) {
                        t = pl.INTERIOR;
                        break
                    }
                    if (r.isInResult()) {
                        t = pl.EXTERIOR;
                        break
                    }
                }
            }
            if (t === pl.NONE)
                return null;
            for (var i = t, o = this.iterator(); o.hasNext(); ) {
                var s = o.next()
                  , a = s.getSym();
                s.isLineEdge() ? s.getEdge().setCovered(i === pl.INTERIOR) : (s.isInResult() && (i = pl.EXTERIOR),
                a.isInResult() && (i = pl.INTERIOR))
            }
        }
        ,
        e.prototype.computeLabelling = function(e) {
            t.prototype.computeLabelling.call(this, e),
            this._label = new Dh(pl.NONE);
            for (var n = this.iterator(); n.hasNext(); )
                for (var r = n.next().getEdge().getLabel(), i = 0; i < 2; i++) {
                    var o = r.getLocation(i);
                    o !== pl.INTERIOR && o !== pl.BOUNDARY || this._label.setLocation(i, pl.INTERIOR)
                }
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(Xp)
      , Hp = function(t) {
        function e() {
            t.apply(this, arguments)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.createNode = function(t) {
            return new Bh(t,new Yp)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(Yh)
      , Wp = function t() {
        this._pts = null,
        this._orientation = null;
        var e = arguments[0];
        this._pts = e,
        this._orientation = t.orientation(e)
    };
    Wp.prototype.compareTo = function(t) {
        var e = t;
        return Wp.compareOriented(this._pts, this._orientation, e._pts, e._orientation)
    }
    ,
    Wp.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    Wp.prototype.getClass = function() {
        return Wp
    }
    ,
    Wp.orientation = function(t) {
        return 1 === pc.increasingDirection(t)
    }
    ,
    Wp.compareOriented = function(t, e, n, r) {
        for (var i = e ? 1 : -1, o = r ? 1 : -1, s = e ? t.length : -1, a = r ? n.length : -1, u = e ? 0 : t.length - 1, l = r ? 0 : n.length - 1; ; ) {
            var c = t[u].compareTo(n[l]);
            if (0 !== c)
                return c;
            var h = (u += i) === s
              , p = (l += o) === a;
            if (h && !p)
                return -1;
            if (!h && p)
                return 1;
            if (h && p)
                return 0
        }
    }
    ;
    var Jp = function() {
        this._edges = new lc,
        this._ocaMap = new Cc
    };
    Jp.prototype.print = function(t) {
        t.print("MULTILINESTRING ( ");
        for (var e = 0; e < this._edges.size(); e++) {
            var n = this._edges.get(e);
            e > 0 && t.print(","),
            t.print("(");
            for (var r = n.getCoordinates(), i = 0; i < r.length; i++)
                i > 0 && t.print(","),
                t.print(r[i].x + " " + r[i].y);
            t.println(")")
        }
        t.print(")  ")
    }
    ,
    Jp.prototype.addAll = function(t) {
        for (var e = t.iterator(); e.hasNext(); )
            this.add(e.next())
    }
    ,
    Jp.prototype.findEdgeIndex = function(t) {
        for (var e = 0; e < this._edges.size(); e++)
            if (this._edges.get(e).equals(t))
                return e;
        return -1
    }
    ,
    Jp.prototype.iterator = function() {
        return this._edges.iterator()
    }
    ,
    Jp.prototype.getEdges = function() {
        return this._edges
    }
    ,
    Jp.prototype.get = function(t) {
        return this._edges.get(t)
    }
    ,
    Jp.prototype.findEqualEdge = function(t) {
        var e = new Wp(t.getCoordinates());
        return this._ocaMap.get(e)
    }
    ,
    Jp.prototype.add = function(t) {
        this._edges.add(t);
        var e = new Wp(t.getCoordinates());
        this._ocaMap.put(e, t)
    }
    ,
    Jp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Jp.prototype.getClass = function() {
        return Jp
    }
    ;
    var Zp = function() {};
    Zp.prototype.processIntersections = function(t, e, n, r) {}
    ,
    Zp.prototype.isDone = function() {}
    ,
    Zp.prototype.interfaces_ = function() {
        return []
    }
    ,
    Zp.prototype.getClass = function() {
        return Zp
    }
    ;
    var Kp = function() {
        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;
        var t = arguments[0];
        this._li = t
    };
    Kp.prototype.isTrivialIntersection = function(t, e, n, r) {
        if (t === n && 1 === this._li.getIntersectionNum()) {
            if (Kp.isAdjacentSegments(e, r))
                return !0;
            if (t.isClosed()) {
                var i = t.size() - 1;
                if (0 === e && r === i || 0 === r && e === i)
                    return !0
            }
        }
        return !1
    }
    ,
    Kp.prototype.getProperIntersectionPoint = function() {
        return this._properIntersectionPoint
    }
    ,
    Kp.prototype.hasProperInteriorIntersection = function() {
        return this._hasProperInterior
    }
    ,
    Kp.prototype.getLineIntersector = function() {
        return this._li
    }
    ,
    Kp.prototype.hasProperIntersection = function() {
        return this._hasProper
    }
    ,
    Kp.prototype.processIntersections = function(t, e, n, r) {
        if (t === n && e === r)
            return null;
        this.numTests++;
        var i = t.getCoordinates()[e]
          , o = t.getCoordinates()[e + 1]
          , s = n.getCoordinates()[r]
          , a = n.getCoordinates()[r + 1];
        this._li.computeIntersection(i, o, s, a),
        this._li.hasIntersection() && (this.numIntersections++,
        this._li.isInteriorIntersection() && (this.numInteriorIntersections++,
        this._hasInterior = !0),
        this.isTrivialIntersection(t, e, n, r) || (this._hasIntersection = !0,
        t.addIntersections(this._li, e, 0),
        n.addIntersections(this._li, r, 1),
        this._li.isProper() && (this.numProperIntersections++,
        this._hasProper = !0,
        this._hasProperInterior = !0)))
    }
    ,
    Kp.prototype.hasIntersection = function() {
        return this._hasIntersection
    }
    ,
    Kp.prototype.isDone = function() {
        return !1
    }
    ,
    Kp.prototype.hasInteriorIntersection = function() {
        return this._hasInterior
    }
    ,
    Kp.prototype.interfaces_ = function() {
        return [Zp]
    }
    ,
    Kp.prototype.getClass = function() {
        return Kp
    }
    ,
    Kp.isAdjacentSegments = function(t, e) {
        return 1 === Math.abs(t - e)
    }
    ;
    var Qp = function() {
        this.coord = null,
        this.segmentIndex = null,
        this.dist = null;
        var t = arguments[0]
          , e = arguments[1]
          , n = arguments[2];
        this.coord = new ul(t),
        this.segmentIndex = e,
        this.dist = n
    };
    Qp.prototype.getSegmentIndex = function() {
        return this.segmentIndex
    }
    ,
    Qp.prototype.getCoordinate = function() {
        return this.coord
    }
    ,
    Qp.prototype.print = function(t) {
        t.print(this.coord),
        t.print(" seg # = " + this.segmentIndex),
        t.println(" dist = " + this.dist)
    }
    ,
    Qp.prototype.compareTo = function(t) {
        var e = t;
        return this.compare(e.segmentIndex, e.dist)
    }
    ,
    Qp.prototype.isEndPoint = function(t) {
        return 0 === this.segmentIndex && 0 === this.dist || this.segmentIndex === t
    }
    ,
    Qp.prototype.toString = function() {
        return this.coord + " seg # = " + this.segmentIndex + " dist = " + this.dist
    }
    ,
    Qp.prototype.getDistance = function() {
        return this.dist
    }
    ,
    Qp.prototype.compare = function(t, e) {
        return this.segmentIndex < t ? -1 : this.segmentIndex > t ? 1 : this.dist < e ? -1 : this.dist > e ? 1 : 0
    }
    ,
    Qp.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    Qp.prototype.getClass = function() {
        return Qp
    }
    ;
    var $p = function() {
        this._nodeMap = new Cc,
        this.edge = null;
        var t = arguments[0];
        this.edge = t
    };
    $p.prototype.print = function(t) {
        t.println("Intersections:");
        for (var e = this.iterator(); e.hasNext(); ) {
            e.next().print(t)
        }
    }
    ,
    $p.prototype.iterator = function() {
        return this._nodeMap.values().iterator()
    }
    ,
    $p.prototype.addSplitEdges = function(t) {
        this.addEndpoints();
        for (var e = this.iterator(), n = e.next(); e.hasNext(); ) {
            var r = e.next()
              , i = this.createSplitEdge(n, r);
            t.add(i),
            n = r
        }
    }
    ,
    $p.prototype.addEndpoints = function() {
        var t = this.edge.pts.length - 1;
        this.add(this.edge.pts[0], 0, 0),
        this.add(this.edge.pts[t], t, 0)
    }
    ,
    $p.prototype.createSplitEdge = function(t, e) {
        var n = e.segmentIndex - t.segmentIndex + 2
          , r = this.edge.pts[e.segmentIndex]
          , i = e.dist > 0 || !e.coord.equals2D(r);
        i || n--;
        var o = new Array(n).fill(null)
          , s = 0;
        o[s++] = new ul(t.coord);
        for (var a = t.segmentIndex + 1; a <= e.segmentIndex; a++)
            o[s++] = this.edge.pts[a];
        return i && (o[s] = e.coord),
        new of(o,new Dh(this.edge._label))
    }
    ,
    $p.prototype.add = function(t, e, n) {
        var r = new Qp(t,e,n)
          , i = this._nodeMap.get(r);
        return null !== i ? i : (this._nodeMap.put(r, r),
        r)
    }
    ,
    $p.prototype.isIntersection = function(t) {
        for (var e = this.iterator(); e.hasNext(); ) {
            if (e.next().coord.equals(t))
                return !0
        }
        return !1
    }
    ,
    $p.prototype.interfaces_ = function() {
        return []
    }
    ,
    $p.prototype.getClass = function() {
        return $p
    }
    ;
    var tf = function() {};
    tf.prototype.getChainStartIndices = function(t) {
        var e = 0
          , n = new lc;
        n.add(new _l(e));
        do {
            var r = this.findChainEnd(t, e);
            n.add(new _l(r)),
            e = r
        } while (e < t.length - 1);
        return tf.toIntArray(n)
    }
    ,
    tf.prototype.findChainEnd = function(t, e) {
        for (var n = jh.quadrant(t[e], t[e + 1]), r = e + 1; r < t.length; ) {
            if (jh.quadrant(t[r - 1], t[r]) !== n)
                break;
            r++
        }
        return r - 1
    }
    ,
    tf.prototype.interfaces_ = function() {
        return []
    }
    ,
    tf.prototype.getClass = function() {
        return tf
    }
    ,
    tf.toIntArray = function(t) {
        for (var e = new Array(t.size()).fill(null), n = 0; n < e.length; n++)
            e[n] = t.get(n).intValue();
        return e
    }
    ;
    var ef = function() {
        this.e = null,
        this.pts = null,
        this.startIndex = null,
        this.env1 = new Ll,
        this.env2 = new Ll;
        var t = arguments[0];
        this.e = t,
        this.pts = t.getCoordinates();
        var e = new tf;
        this.startIndex = e.getChainStartIndices(this.pts)
    };
    ef.prototype.getCoordinates = function() {
        return this.pts
    }
    ,
    ef.prototype.getMaxX = function(t) {
        var e = this.pts[this.startIndex[t]].x
          , n = this.pts[this.startIndex[t + 1]].x;
        return e > n ? e : n
    }
    ,
    ef.prototype.getMinX = function(t) {
        var e = this.pts[this.startIndex[t]].x
          , n = this.pts[this.startIndex[t + 1]].x;
        return e < n ? e : n
    }
    ,
    ef.prototype.computeIntersectsForChain = function() {
        if (4 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = arguments[2]
              , r = arguments[3];
            this.computeIntersectsForChain(this.startIndex[t], this.startIndex[t + 1], e, e.startIndex[n], e.startIndex[n + 1], r)
        } else if (6 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1]
              , s = arguments[2]
              , a = arguments[3]
              , u = arguments[4]
              , l = arguments[5]
              , c = this.pts[i]
              , h = this.pts[o]
              , p = s.pts[a]
              , f = s.pts[u];
            if (o - i == 1 && u - a == 1)
                return l.addIntersections(this.e, i, s.e, a),
                null;
            if (this.env1.init(c, h),
            this.env2.init(p, f),
            !this.env1.intersects(this.env2))
                return null;
            var g = Math.trunc((i + o) / 2)
              , d = Math.trunc((a + u) / 2);
            i < g && (a < d && this.computeIntersectsForChain(i, g, s, a, d, l),
            d < u && this.computeIntersectsForChain(i, g, s, d, u, l)),
            g < o && (a < d && this.computeIntersectsForChain(g, o, s, a, d, l),
            d < u && this.computeIntersectsForChain(g, o, s, d, u, l))
        }
    }
    ,
    ef.prototype.getStartIndexes = function() {
        return this.startIndex
    }
    ,
    ef.prototype.computeIntersects = function(t, e) {
        for (var n = 0; n < this.startIndex.length - 1; n++)
            for (var r = 0; r < t.startIndex.length - 1; r++)
                this.computeIntersectsForChain(n, t, r, e)
    }
    ,
    ef.prototype.interfaces_ = function() {
        return []
    }
    ,
    ef.prototype.getClass = function() {
        return ef
    }
    ;
    var nf = function t() {
        this._depth = Array(2).fill().map((function() {
            return Array(3)
        }
        ));
        for (var e = 0; e < 2; e++)
            for (var n = 0; n < 3; n++)
                this._depth[e][n] = t.NULL_VALUE
    }
      , rf = {
        NULL_VALUE: {
            configurable: !0
        }
    };
    nf.prototype.getDepth = function(t, e) {
        return this._depth[t][e]
    }
    ,
    nf.prototype.setDepth = function(t, e, n) {
        this._depth[t][e] = n
    }
    ,
    nf.prototype.isNull = function() {
        var t = this;
        if (0 === arguments.length) {
            for (var e = 0; e < 2; e++)
                for (var n = 0; n < 3; n++)
                    if (t._depth[e][n] !== nf.NULL_VALUE)
                        return !1;
            return !0
        }
        if (1 === arguments.length) {
            var r = arguments[0];
            return this._depth[r][1] === nf.NULL_VALUE
        }
        if (2 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1];
            return this._depth[i][o] === nf.NULL_VALUE
        }
    }
    ,
    nf.prototype.normalize = function() {
        for (var t = this, e = 0; e < 2; e++)
            if (!t.isNull(e)) {
                var n = t._depth[e][1];
                t._depth[e][2] < n && (n = t._depth[e][2]),
                n < 0 && (n = 0);
                for (var r = 1; r < 3; r++) {
                    var i = 0;
                    t._depth[e][r] > n && (i = 1),
                    t._depth[e][r] = i
                }
            }
    }
    ,
    nf.prototype.getDelta = function(t) {
        return this._depth[t][Sh.RIGHT] - this._depth[t][Sh.LEFT]
    }
    ,
    nf.prototype.getLocation = function(t, e) {
        return this._depth[t][e] <= 0 ? pl.EXTERIOR : pl.INTERIOR
    }
    ,
    nf.prototype.toString = function() {
        return "A: " + this._depth[0][1] + "," + this._depth[0][2] + " B: " + this._depth[1][1] + "," + this._depth[1][2]
    }
    ,
    nf.prototype.add = function() {
        var t = this;
        if (1 === arguments.length)
            for (var e = arguments[0], n = 0; n < 2; n++)
                for (var r = 1; r < 3; r++) {
                    var i = e.getLocation(n, r);
                    i !== pl.EXTERIOR && i !== pl.INTERIOR || (t.isNull(n, r) ? t._depth[n][r] = nf.depthAtLocation(i) : t._depth[n][r] += nf.depthAtLocation(i))
                }
        else if (3 === arguments.length) {
            var o = arguments[0]
              , s = arguments[1]
              , a = arguments[2];
            a === pl.INTERIOR && this._depth[o][s]++
        }
    }
    ,
    nf.prototype.interfaces_ = function() {
        return []
    }
    ,
    nf.prototype.getClass = function() {
        return nf
    }
    ,
    nf.depthAtLocation = function(t) {
        return t === pl.EXTERIOR ? 0 : t === pl.INTERIOR ? 1 : nf.NULL_VALUE
    }
    ,
    rf.NULL_VALUE.get = function() {
        return -1
    }
    ,
    Object.defineProperties(nf, rf);
    var of = function(t) {
        function e() {
            if (t.call(this),
            this.pts = null,
            this._env = null,
            this.eiList = new $p(this),
            this._name = null,
            this._mce = null,
            this._isIsolated = !0,
            this._depth = new nf,
            this._depthDelta = 0,
            1 === arguments.length) {
                var n = arguments[0];
                e.call(this, n, null)
            } else if (2 === arguments.length) {
                var r = arguments[0]
                  , i = arguments[1];
                this.pts = r,
                this._label = i
            }
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.getDepth = function() {
            return this._depth
        }
        ,
        e.prototype.getCollapsedEdge = function() {
            var t = new Array(2).fill(null);
            return t[0] = this.pts[0],
            t[1] = this.pts[1],
            new e(t,Dh.toLineLabel(this._label))
        }
        ,
        e.prototype.isIsolated = function() {
            return this._isIsolated
        }
        ,
        e.prototype.getCoordinates = function() {
            return this.pts
        }
        ,
        e.prototype.setIsolated = function(t) {
            this._isIsolated = t
        }
        ,
        e.prototype.setName = function(t) {
            this._name = t
        }
        ,
        e.prototype.equals = function(t) {
            if (!(t instanceof e))
                return !1;
            var n = t;
            if (this.pts.length !== n.pts.length)
                return !1;
            for (var r = !0, i = !0, o = this.pts.length, s = 0; s < this.pts.length; s++)
                if (this.pts[s].equals2D(n.pts[s]) || (r = !1),
                this.pts[s].equals2D(n.pts[--o]) || (i = !1),
                !r && !i)
                    return !1;
            return !0
        }
        ,
        e.prototype.getCoordinate = function() {
            if (0 === arguments.length)
                return this.pts.length > 0 ? this.pts[0] : null;
            if (1 === arguments.length) {
                var t = arguments[0];
                return this.pts[t]
            }
        }
        ,
        e.prototype.print = function(t) {
            t.print("edge " + this._name + ": "),
            t.print("LINESTRING (");
            for (var 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)
        }
        ,
        e.prototype.computeIM = function(t) {
            e.updateIM(this._label, t)
        }
        ,
        e.prototype.isCollapsed = function() {
            return !!this._label.isArea() && (3 === this.pts.length && !!this.pts[0].equals(this.pts[2]))
        }
        ,
        e.prototype.isClosed = function() {
            return this.pts[0].equals(this.pts[this.pts.length - 1])
        }
        ,
        e.prototype.getMaximumSegmentIndex = function() {
            return this.pts.length - 1
        }
        ,
        e.prototype.getDepthDelta = function() {
            return this._depthDelta
        }
        ,
        e.prototype.getNumPoints = function() {
            return this.pts.length
        }
        ,
        e.prototype.printReverse = function(t) {
            t.print("edge " + this._name + ": ");
            for (var e = this.pts.length - 1; e >= 0; e--)
                t.print(this.pts[e] + " ");
            t.println("")
        }
        ,
        e.prototype.getMonotoneChainEdge = function() {
            return null === this._mce && (this._mce = new ef(this)),
            this._mce
        }
        ,
        e.prototype.getEnvelope = function() {
            if (null === this._env) {
                this._env = new Ll;
                for (var t = 0; t < this.pts.length; t++)
                    this._env.expandToInclude(this.pts[t])
            }
            return this._env
        }
        ,
        e.prototype.addIntersection = function(t, e, n, r) {
            var i = new ul(t.getIntersection(r))
              , o = e
              , s = t.getEdgeDistance(n, r)
              , a = o + 1;
            if (a < this.pts.length) {
                var u = this.pts[a];
                i.equals2D(u) && (o = a,
                s = 0)
            }
            this.eiList.add(i, o, s)
        }
        ,
        e.prototype.toString = function() {
            var t = new vl;
            t.append("edge " + this._name + ": "),
            t.append("LINESTRING (");
            for (var 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()
        }
        ,
        e.prototype.isPointwiseEqual = function(t) {
            if (this.pts.length !== t.pts.length)
                return !1;
            for (var e = 0; e < this.pts.length; e++)
                if (!this.pts[e].equals2D(t.pts[e]))
                    return !1;
            return !0
        }
        ,
        e.prototype.setDepthDelta = function(t) {
            this._depthDelta = t
        }
        ,
        e.prototype.getEdgeIntersectionList = function() {
            return this.eiList
        }
        ,
        e.prototype.addIntersections = function(t, e, n) {
            for (var r = 0; r < t.getIntersectionNum(); r++)
                this.addIntersection(t, e, n, r)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e.updateIM = function() {
            if (2 !== arguments.length)
                return t.prototype.updateIM.apply(this, arguments);
            var e = arguments[0]
              , n = arguments[1];
            n.setAtLeastIfValid(e.getLocation(0, Sh.ON), e.getLocation(1, Sh.ON), 1),
            e.isArea() && (n.setAtLeastIfValid(e.getLocation(0, Sh.LEFT), e.getLocation(1, Sh.LEFT), 2),
            n.setAtLeastIfValid(e.getLocation(0, Sh.RIGHT), e.getLocation(1, Sh.RIGHT), 2))
        }
        ,
        e
    }(qh)
      , sf = function(t) {
        this._workingPrecisionModel = null,
        this._workingNoder = null,
        this._geomFact = null,
        this._graph = null,
        this._edgeList = new Jp,
        this._bufParams = t || null
    };
    sf.prototype.setWorkingPrecisionModel = function(t) {
        this._workingPrecisionModel = t
    }
    ,
    sf.prototype.insertUniqueEdge = function(t) {
        var e = this._edgeList.findEqualEdge(t);
        if (null !== e) {
            var n = e.getLabel()
              , r = t.getLabel();
            e.isPointwiseEqual(t) || (r = new Dh(t.getLabel())).flip(),
            n.merge(r);
            var i = sf.depthDelta(r)
              , o = e.getDepthDelta() + i;
            e.setDepthDelta(o)
        } else
            this._edgeList.add(t),
            t.setDepthDelta(sf.depthDelta(t.getLabel()))
    }
    ,
    sf.prototype.buildSubgraphs = function(t, e) {
        for (var n = new lc, r = t.iterator(); r.hasNext(); ) {
            var i = r.next()
              , o = i.getRightmostCoordinate()
              , s = new kp(n).getDepth(o);
            i.computeDepth(s),
            i.findResultEdges(),
            n.add(i),
            e.add(i.getDirectedEdges(), i.getNodes())
        }
    }
    ,
    sf.prototype.createSubgraphs = function(t) {
        for (var e = new lc, n = t.getNodes().iterator(); n.hasNext(); ) {
            var r = n.next();
            if (!r.isVisited()) {
                var i = new Th;
                i.create(r),
                e.add(i)
            }
        }
        return np.sort(e, np.reverseOrder()),
        e
    }
    ,
    sf.prototype.createEmptyResultGeometry = function() {
        return this._geomFact.createPolygon()
    }
    ,
    sf.prototype.getNoder = function(t) {
        if (null !== this._workingNoder)
            return this._workingNoder;
        var e = new Ip
          , n = new jl;
        return n.setPrecisionModel(t),
        e.setSegmentIntersector(new Kp(n)),
        e
    }
    ,
    sf.prototype.buffer = function(t, e) {
        var n = this._workingPrecisionModel;
        null === n && (n = t.getPrecisionModel()),
        this._geomFact = t.getFactory();
        var r = new Fp(n,this._bufParams)
          , i = new zp(t,e,r).getCurves();
        if (i.size() <= 0)
            return this.createEmptyResultGeometry();
        this.computeNodedEdges(i, n),
        this._graph = new Hh(new Hp),
        this._graph.addEdges(this._edgeList.getEdges());
        var o = this.createSubgraphs(this._graph)
          , s = new Wh(this._geomFact);
        this.buildSubgraphs(o, s);
        var a = s.getPolygons();
        return a.size() <= 0 ? this.createEmptyResultGeometry() : this._geomFact.buildGeometry(a)
    }
    ,
    sf.prototype.computeNodedEdges = function(t, e) {
        var n = this.getNoder(e);
        n.computeNodes(t);
        for (var r = n.getNodedSubstrings().iterator(); r.hasNext(); ) {
            var i = r.next()
              , o = i.getCoordinates();
            if (2 !== o.length || !o[0].equals2D(o[1])) {
                var s = i.getData()
                  , a = new of(i.getCoordinates(),new Dh(s));
                this.insertUniqueEdge(a)
            }
        }
    }
    ,
    sf.prototype.setNoder = function(t) {
        this._workingNoder = t
    }
    ,
    sf.prototype.interfaces_ = function() {
        return []
    }
    ,
    sf.prototype.getClass = function() {
        return sf
    }
    ,
    sf.depthDelta = function(t) {
        var e = t.getLocation(0, Sh.LEFT)
          , n = t.getLocation(0, Sh.RIGHT);
        return e === pl.INTERIOR && n === pl.EXTERIOR ? 1 : e === pl.EXTERIOR && n === pl.INTERIOR ? -1 : 0
    }
    ,
    sf.convertSegStrings = function(t) {
        for (var e = new _h, n = new lc; t.hasNext(); ) {
            var r = t.next()
              , i = e.createLineString(r.getCoordinates());
            n.add(i)
        }
        return e.buildGeometry(n)
    }
    ;
    var af = function() {
        if (this._noder = null,
        this._scaleFactor = null,
        this._offsetX = null,
        this._offsetY = null,
        this._isScaled = !1,
        2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1];
            this._noder = t,
            this._scaleFactor = e,
            this._offsetX = 0,
            this._offsetY = 0,
            this._isScaled = !this.isIntegerPrecision()
        } else if (4 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = arguments[2]
              , o = arguments[3];
            this._noder = n,
            this._scaleFactor = r,
            this._offsetX = i,
            this._offsetY = o,
            this._isScaled = !this.isIntegerPrecision()
        }
    };
    af.prototype.rescale = function() {
        var t = this;
        if (gl(arguments[0], ic))
            for (var e = arguments[0], n = e.iterator(); n.hasNext(); ) {
                var r = n.next();
                t.rescale(r.getCoordinates())
            }
        else if (arguments[0]instanceof Array) {
            for (var i = arguments[0], o = 0; o < i.length; o++)
                i[o].x = i[o].x / t._scaleFactor + t._offsetX,
                i[o].y = i[o].y / t._scaleFactor + t._offsetY;
            2 === i.length && i[0].equals2D(i[1]) && Pl.out.println(i)
        }
    }
    ,
    af.prototype.scale = function() {
        var t = this;
        if (gl(arguments[0], ic)) {
            for (var e = arguments[0], n = new lc, r = e.iterator(); r.hasNext(); ) {
                var i = r.next();
                n.add(new yp(t.scale(i.getCoordinates()),i.getData()))
            }
            return n
        }
        if (arguments[0]instanceof Array) {
            for (var o = arguments[0], s = new Array(o.length).fill(null), a = 0; a < o.length; a++)
                s[a] = new ul(Math.round((o[a].x - t._offsetX) * t._scaleFactor),Math.round((o[a].y - t._offsetY) * t._scaleFactor),o[a].z);
            var u = pc.removeRepeatedPoints(s);
            return u
        }
    }
    ,
    af.prototype.isIntegerPrecision = function() {
        return 1 === this._scaleFactor
    }
    ,
    af.prototype.getNodedSubstrings = function() {
        var t = this._noder.getNodedSubstrings();
        return this._isScaled && this.rescale(t),
        t
    }
    ,
    af.prototype.computeNodes = function(t) {
        var e = t;
        this._isScaled && (e = this.scale(t)),
        this._noder.computeNodes(e)
    }
    ,
    af.prototype.interfaces_ = function() {
        return [bp]
    }
    ,
    af.prototype.getClass = function() {
        return af
    }
    ;
    var uf = function() {
        this._li = new jl,
        this._segStrings = null;
        var t = arguments[0];
        this._segStrings = t
    }
      , lf = {
        fact: {
            configurable: !0
        }
    };
    uf.prototype.checkEndPtVertexIntersections = function() {
        var t = this;
        if (0 === arguments.length)
            for (var e = this._segStrings.iterator(); e.hasNext(); ) {
                var n = e.next()
                  , r = n.getCoordinates();
                t.checkEndPtVertexIntersections(r[0], t._segStrings),
                t.checkEndPtVertexIntersections(r[r.length - 1], t._segStrings)
            }
        else if (2 === arguments.length)
            for (var i = arguments[0], o = arguments[1], s = o.iterator(); s.hasNext(); )
                for (var a = s.next(), u = a.getCoordinates(), l = 1; l < u.length - 1; l++)
                    if (u[l].equals(i))
                        throw new kl("found endpt/interior pt intersection at index " + l + " :pt " + i)
    }
    ,
    uf.prototype.checkInteriorIntersections = function() {
        var t = this;
        if (0 === arguments.length)
            for (var e = this._segStrings.iterator(); e.hasNext(); )
                for (var n = e.next(), r = this._segStrings.iterator(); r.hasNext(); ) {
                    var i = r.next();
                    t.checkInteriorIntersections(n, i)
                }
        else if (2 === arguments.length)
            for (var o = arguments[0], s = arguments[1], a = o.getCoordinates(), u = s.getCoordinates(), l = 0; l < a.length - 1; l++)
                for (var c = 0; c < u.length - 1; c++)
                    t.checkInteriorIntersections(o, l, s, c);
        else if (4 === arguments.length) {
            var h = arguments[0]
              , p = arguments[1]
              , f = arguments[2]
              , g = arguments[3];
            if (h === f && p === g)
                return null;
            var d = h.getCoordinates()[p]
              , y = h.getCoordinates()[p + 1]
              , v = f.getCoordinates()[g]
              , _ = f.getCoordinates()[g + 1];
            if (this._li.computeIntersection(d, y, v, _),
            this._li.hasIntersection() && (this._li.isProper() || this.hasInteriorIntersection(this._li, d, y) || this.hasInteriorIntersection(this._li, v, _)))
                throw new kl("found non-noded intersection at " + d + "-" + y + " and " + v + "-" + _)
        }
    }
    ,
    uf.prototype.checkValid = function() {
        this.checkEndPtVertexIntersections(),
        this.checkInteriorIntersections(),
        this.checkCollapses()
    }
    ,
    uf.prototype.checkCollapses = function() {
        var t = this;
        if (0 === arguments.length)
            for (var e = this._segStrings.iterator(); e.hasNext(); ) {
                var n = e.next();
                t.checkCollapses(n)
            }
        else if (1 === arguments.length)
            for (var r = arguments[0], i = r.getCoordinates(), o = 0; o < i.length - 2; o++)
                t.checkCollapse(i[o], i[o + 1], i[o + 2])
    }
    ,
    uf.prototype.hasInteriorIntersection = function(t, e, n) {
        for (var r = 0; r < t.getIntersectionNum(); r++) {
            var i = t.getIntersection(r);
            if (!i.equals(e) && !i.equals(n))
                return !0
        }
        return !1
    }
    ,
    uf.prototype.checkCollapse = function(t, e, n) {
        if (t.equals(n))
            throw new kl("found non-noded collapse at " + uf.fact.createLineString([t, e, n]))
    }
    ,
    uf.prototype.interfaces_ = function() {
        return []
    }
    ,
    uf.prototype.getClass = function() {
        return uf
    }
    ,
    lf.fact.get = function() {
        return new _h
    }
    ,
    Object.defineProperties(uf, lf);
    var cf = function() {
        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;
        var 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 el("Scale factor must be non-zero");
        1 !== e && (this._pt = new ul(this.scale(t.x),this.scale(t.y)),
        this._p0Scaled = new ul,
        this._p1Scaled = new ul),
        this.initCorners(this._pt)
    }
      , hf = {
        SAFE_ENV_EXPANSION_FACTOR: {
            configurable: !0
        }
    };
    cf.prototype.intersectsScaled = function(t, e) {
        var n = Math.min(t.x, e.x)
          , r = Math.max(t.x, e.x)
          , i = Math.min(t.y, e.y)
          , o = Math.max(t.y, e.y)
          , s = this._maxx < n || this._minx > r || this._maxy < i || this._miny > o;
        if (s)
            return !1;
        var a = this.intersectsToleranceSquare(t, e);
        return ql.isTrue(!(s && a), "Found bad envelope test"),
        a
    }
    ,
    cf.prototype.initCorners = function(t) {
        var 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 ul(this._maxx,this._maxy),
        this._corner[1] = new ul(this._minx,this._maxy),
        this._corner[2] = new ul(this._minx,this._miny),
        this._corner[3] = new ul(this._maxx,this._miny)
    }
    ,
    cf.prototype.intersects = function(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))
    }
    ,
    cf.prototype.scale = function(t) {
        return Math.round(t * this._scaleFactor)
    }
    ,
    cf.prototype.getCoordinate = function() {
        return this._originalPt
    }
    ,
    cf.prototype.copyScaled = function(t, e) {
        e.x = this.scale(t.x),
        e.y = this.scale(t.y)
    }
    ,
    cf.prototype.getSafeEnvelope = function() {
        if (null === this._safeEnv) {
            var t = cf.SAFE_ENV_EXPANSION_FACTOR / this._scaleFactor;
            this._safeEnv = new Ll(this._originalPt.x - t,this._originalPt.x + t,this._originalPt.y - t,this._originalPt.y + t)
        }
        return this._safeEnv
    }
    ,
    cf.prototype.intersectsPixelClosure = function(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())))
    }
    ,
    cf.prototype.intersectsToleranceSquare = function(t, e) {
        var n = !1
          , r = !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() && (n = !0),
        this._li.computeIntersection(t, e, this._corner[2], this._corner[3]),
        !!this._li.isProper() || (this._li.hasIntersection() && (r = !0),
        this._li.computeIntersection(t, e, this._corner[3], this._corner[0]),
        !!this._li.isProper() || (!(!n || !r) || (!!t.equals(this._pt) || !!e.equals(this._pt))))))
    }
    ,
    cf.prototype.addSnappedNode = function(t, e) {
        var n = t.getCoordinate(e)
          , r = t.getCoordinate(e + 1);
        return !!this.intersects(n, r) && (t.addIntersection(this.getCoordinate(), e),
        !0)
    }
    ,
    cf.prototype.interfaces_ = function() {
        return []
    }
    ,
    cf.prototype.getClass = function() {
        return cf
    }
    ,
    hf.SAFE_ENV_EXPANSION_FACTOR.get = function() {
        return .75
    }
    ,
    Object.defineProperties(cf, hf);
    var pf = function() {
        this.tempEnv1 = new Ll,
        this.selectedSegment = new vp
    };
    pf.prototype.select = function() {
        if (1 === arguments.length)
            ;
        else if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1];
            t.getLineSegment(e, this.selectedSegment),
            this.select(this.selectedSegment)
        }
    }
    ,
    pf.prototype.interfaces_ = function() {
        return []
    }
    ,
    pf.prototype.getClass = function() {
        return pf
    }
    ;
    var ff = function() {
        this._index = null;
        var t = arguments[0];
        this._index = t
    }
      , gf = {
        HotPixelSnapAction: {
            configurable: !0
        }
    };
    ff.prototype.snap = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return this.snap(t, null, -1)
        }
        if (3 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2]
              , i = e.getSafeEnvelope()
              , o = new df(e,n,r);
            return this._index.query(i, {
                interfaces_: function() {
                    return [Qh]
                },
                visitItem: function(t) {
                    t.select(i, o)
                }
            }),
            o.isNodeAdded()
        }
    }
    ,
    ff.prototype.interfaces_ = function() {
        return []
    }
    ,
    ff.prototype.getClass = function() {
        return ff
    }
    ,
    gf.HotPixelSnapAction.get = function() {
        return df
    }
    ,
    Object.defineProperties(ff, gf);
    var df = function(t) {
        function e() {
            t.call(this),
            this._hotPixel = null,
            this._parentEdge = null,
            this._hotPixelVertexIndex = null,
            this._isNodeAdded = !1;
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2];
            this._hotPixel = e,
            this._parentEdge = n,
            this._hotPixelVertexIndex = r
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.isNodeAdded = function() {
            return this._isNodeAdded
        }
        ,
        e.prototype.select = function() {
            if (2 !== arguments.length)
                return t.prototype.select.apply(this, arguments);
            var e = arguments[0]
              , n = arguments[1]
              , r = e.getContext();
            if (null !== this._parentEdge && r === this._parentEdge && n === this._hotPixelVertexIndex)
                return null;
            this._isNodeAdded = this._hotPixel.addSnappedNode(r, n)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(pf)
      , yf = function() {
        this._li = null,
        this._interiorIntersections = null;
        var t = arguments[0];
        this._li = t,
        this._interiorIntersections = new lc
    };
    yf.prototype.processIntersections = function(t, e, n, r) {
        if (t === n && e === r)
            return null;
        var i = t.getCoordinates()[e]
          , o = t.getCoordinates()[e + 1]
          , s = n.getCoordinates()[r]
          , a = n.getCoordinates()[r + 1];
        if (this._li.computeIntersection(i, o, s, a),
        this._li.hasIntersection() && this._li.isInteriorIntersection()) {
            for (var u = 0; u < this._li.getIntersectionNum(); u++)
                this._interiorIntersections.add(this._li.getIntersection(u));
            t.addIntersections(this._li, e, 0),
            n.addIntersections(this._li, r, 1)
        }
    }
    ,
    yf.prototype.isDone = function() {
        return !1
    }
    ,
    yf.prototype.getInteriorIntersections = function() {
        return this._interiorIntersections
    }
    ,
    yf.prototype.interfaces_ = function() {
        return [Zp]
    }
    ,
    yf.prototype.getClass = function() {
        return yf
    }
    ;
    var vf = function() {
        this._pm = null,
        this._li = null,
        this._scaleFactor = null,
        this._noder = null,
        this._pointSnapper = null,
        this._nodedSegStrings = null;
        var t = arguments[0];
        this._pm = t,
        this._li = new jl,
        this._li.setPrecisionModel(t),
        this._scaleFactor = t.getScale()
    };
    vf.prototype.checkCorrectness = function(t) {
        var e = yp.getNodedSubstrings(t)
          , n = new uf(e);
        try {
            n.checkValid()
        } catch (t) {
            if (!(t instanceof Sl))
                throw t;
            t.printStackTrace()
        }
    }
    ,
    vf.prototype.getNodedSubstrings = function() {
        return yp.getNodedSubstrings(this._nodedSegStrings)
    }
    ,
    vf.prototype.snapRound = function(t, e) {
        var n = this.findInteriorIntersections(t, e);
        this.computeIntersectionSnaps(n),
        this.computeVertexSnaps(t)
    }
    ,
    vf.prototype.findInteriorIntersections = function(t, e) {
        var n = new yf(e);
        return this._noder.setSegmentIntersector(n),
        this._noder.computeNodes(t),
        n.getInteriorIntersections()
    }
    ,
    vf.prototype.computeVertexSnaps = function() {
        var t = this;
        if (gl(arguments[0], ic))
            for (var e = arguments[0], n = e.iterator(); n.hasNext(); ) {
                var r = n.next();
                t.computeVertexSnaps(r)
            }
        else if (arguments[0]instanceof yp)
            for (var i = arguments[0], o = i.getCoordinates(), s = 0; s < o.length; s++) {
                var a = new cf(o[s],t._scaleFactor,t._li)
                  , u = t._pointSnapper.snap(a, i, s);
                u && i.addIntersection(o[s], s)
            }
    }
    ,
    vf.prototype.computeNodes = function(t) {
        this._nodedSegStrings = t,
        this._noder = new Ip,
        this._pointSnapper = new ff(this._noder.getIndex()),
        this.snapRound(t, this._li)
    }
    ,
    vf.prototype.computeIntersectionSnaps = function(t) {
        for (var e = this, n = t.iterator(); n.hasNext(); ) {
            var r = n.next()
              , i = new cf(r,e._scaleFactor,e._li);
            e._pointSnapper.snap(i)
        }
    }
    ,
    vf.prototype.interfaces_ = function() {
        return [bp]
    }
    ,
    vf.prototype.getClass = function() {
        return vf
    }
    ;
    var _f = function() {
        if (this._argGeom = null,
        this._distance = null,
        this._bufParams = new Sp,
        this._resultGeometry = null,
        this._saveException = null,
        1 === arguments.length) {
            var t = arguments[0];
            this._argGeom = t
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            this._argGeom = e,
            this._bufParams = n
        }
    }
      , mf = {
        CAP_ROUND: {
            configurable: !0
        },
        CAP_BUTT: {
            configurable: !0
        },
        CAP_FLAT: {
            configurable: !0
        },
        CAP_SQUARE: {
            configurable: !0
        },
        MAX_PRECISION_DIGITS: {
            configurable: !0
        }
    };
    _f.prototype.bufferFixedPrecision = function(t) {
        var e = new af(new vf(new gh(1)),t.getScale())
          , n = new sf(this._bufParams);
        n.setWorkingPrecisionModel(t),
        n.setNoder(e),
        this._resultGeometry = n.buffer(this._argGeom, this._distance)
    }
    ,
    _f.prototype.bufferReducedPrecision = function() {
        var t = this;
        if (0 === arguments.length) {
            for (var e = _f.MAX_PRECISION_DIGITS; e >= 0; e--) {
                try {
                    t.bufferReducedPrecision(e)
                } catch (e) {
                    if (!(e instanceof Oh))
                        throw e;
                    t._saveException = e
                }
                if (null !== t._resultGeometry)
                    return null
            }
            throw this._saveException
        }
        if (1 === arguments.length) {
            var n = arguments[0]
              , r = _f.precisionScaleFactor(this._argGeom, this._distance, n)
              , i = new gh(r);
            this.bufferFixedPrecision(i)
        }
    }
    ,
    _f.prototype.computeGeometry = function() {
        if (this.bufferOriginalPrecision(),
        null !== this._resultGeometry)
            return null;
        var t = this._argGeom.getFactory().getPrecisionModel();
        t.getType() === gh.FIXED ? this.bufferFixedPrecision(t) : this.bufferReducedPrecision()
    }
    ,
    _f.prototype.setQuadrantSegments = function(t) {
        this._bufParams.setQuadrantSegments(t)
    }
    ,
    _f.prototype.bufferOriginalPrecision = function() {
        try {
            var t = new sf(this._bufParams);
            this._resultGeometry = t.buffer(this._argGeom, this._distance)
        } catch (t) {
            if (!(t instanceof kl))
                throw t;
            this._saveException = t
        }
    }
    ,
    _f.prototype.getResultGeometry = function(t) {
        return this._distance = t,
        this.computeGeometry(),
        this._resultGeometry
    }
    ,
    _f.prototype.setEndCapStyle = function(t) {
        this._bufParams.setEndCapStyle(t)
    }
    ,
    _f.prototype.interfaces_ = function() {
        return []
    }
    ,
    _f.prototype.getClass = function() {
        return _f
    }
    ,
    _f.bufferOp = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = new _f(t)
              , r = n.getResultGeometry(e);
            return r
        }
        if (3 === arguments.length) {
            if (Number.isInteger(arguments[2]) && arguments[0]instanceof Wl && "number" == typeof arguments[1]) {
                var i = arguments[0]
                  , o = arguments[1]
                  , s = arguments[2]
                  , a = new _f(i);
                a.setQuadrantSegments(s);
                var u = a.getResultGeometry(o);
                return u
            }
            if (arguments[2]instanceof Sp && arguments[0]instanceof Wl && "number" == typeof arguments[1]) {
                var l = arguments[0]
                  , c = arguments[1]
                  , h = arguments[2]
                  , p = new _f(l,h)
                  , f = p.getResultGeometry(c);
                return f
            }
        } else if (4 === arguments.length) {
            var g = arguments[0]
              , d = arguments[1]
              , y = arguments[2]
              , v = arguments[3]
              , _ = new _f(g);
            _.setQuadrantSegments(y),
            _.setEndCapStyle(v);
            var m = _.getResultGeometry(d);
            return m
        }
    }
    ,
    _f.precisionScaleFactor = function(t, e, n) {
        var r = t.getEnvelopeInternal()
          , i = dl.max(Math.abs(r.getMaxX()), Math.abs(r.getMaxY()), Math.abs(r.getMinX()), Math.abs(r.getMinY())) + 2 * (e > 0 ? e : 0)
          , o = n - Math.trunc(Math.log(i) / Math.log(10) + 1);
        return Math.pow(10, o)
    }
    ,
    mf.CAP_ROUND.get = function() {
        return Sp.CAP_ROUND
    }
    ,
    mf.CAP_BUTT.get = function() {
        return Sp.CAP_FLAT
    }
    ,
    mf.CAP_FLAT.get = function() {
        return Sp.CAP_FLAT
    }
    ,
    mf.CAP_SQUARE.get = function() {
        return Sp.CAP_SQUARE
    }
    ,
    mf.MAX_PRECISION_DIGITS.get = function() {
        return 12
    }
    ,
    Object.defineProperties(_f, mf);
    var xf = function() {
        this._pt = [new ul, new ul],
        this._distance = nl.NaN,
        this._isNull = !0
    };
    xf.prototype.getCoordinates = function() {
        return this._pt
    }
    ,
    xf.prototype.getCoordinate = function(t) {
        return this._pt[t]
    }
    ,
    xf.prototype.setMinimum = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.setMinimum(t._pt[0], t._pt[1])
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            if (this._isNull)
                return this.initialize(e, n),
                null;
            var r = e.distance(n);
            r < this._distance && this.initialize(e, n, r)
        }
    }
    ,
    xf.prototype.initialize = function() {
        if (0 === arguments.length)
            this._isNull = !0;
        else if (2 === arguments.length) {
            var 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) {
            var n = arguments[0]
              , r = arguments[1]
              , i = arguments[2];
            this._pt[0].setCoordinate(n),
            this._pt[1].setCoordinate(r),
            this._distance = i,
            this._isNull = !1
        }
    }
    ,
    xf.prototype.getDistance = function() {
        return this._distance
    }
    ,
    xf.prototype.setMaximum = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.setMaximum(t._pt[0], t._pt[1])
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            if (this._isNull)
                return this.initialize(e, n),
                null;
            var r = e.distance(n);
            r > this._distance && this.initialize(e, n, r)
        }
    }
    ,
    xf.prototype.interfaces_ = function() {
        return []
    }
    ,
    xf.prototype.getClass = function() {
        return xf
    }
    ;
    var Ef = function() {};
    Ef.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ef.prototype.getClass = function() {
        return Ef
    }
    ,
    Ef.computeDistance = function() {
        if (arguments[2]instanceof xf && arguments[0]instanceof Zc && arguments[1]instanceof ul)
            for (var t = arguments[0], e = arguments[1], n = arguments[2], r = t.getCoordinates(), i = new vp, o = 0; o < r.length - 1; o++) {
                i.setCoordinates(r[o], r[o + 1]);
                var s = i.closestPoint(e);
                n.setMinimum(s, e)
            }
        else if (arguments[2]instanceof xf && arguments[0]instanceof th && arguments[1]instanceof ul) {
            var a = arguments[0]
              , u = arguments[1]
              , l = arguments[2];
            Ef.computeDistance(a.getExteriorRing(), u, l);
            for (var c = 0; c < a.getNumInteriorRing(); c++)
                Ef.computeDistance(a.getInteriorRingN(c), u, l)
        } else if (arguments[2]instanceof xf && arguments[0]instanceof Wl && arguments[1]instanceof ul) {
            var h = arguments[0]
              , p = arguments[1]
              , f = arguments[2];
            if (h instanceof Zc)
                Ef.computeDistance(h, p, f);
            else if (h instanceof th)
                Ef.computeDistance(h, p, f);
            else if (h instanceof kc)
                for (var g = h, d = 0; d < g.getNumGeometries(); d++) {
                    var y = g.getGeometryN(d);
                    Ef.computeDistance(y, p, f)
                }
            else
                f.setMinimum(h.getCoordinate(), p)
        } else if (arguments[2]instanceof xf && arguments[0]instanceof vp && arguments[1]instanceof ul) {
            var v = arguments[0]
              , _ = arguments[1]
              , m = arguments[2]
              , x = v.closestPoint(_);
            m.setMinimum(x, _)
        }
    }
    ;
    var bf = function(t) {
        this._maxPtDist = new xf,
        this._inputGeom = t || null
    }
      , wf = {
        MaxPointDistanceFilter: {
            configurable: !0
        },
        MaxMidpointDistanceFilter: {
            configurable: !0
        }
    };
    bf.prototype.computeMaxMidpointDistance = function(t) {
        var e = new Nf(this._inputGeom);
        t.apply(e),
        this._maxPtDist.setMaximum(e.getMaxPointDistance())
    }
    ,
    bf.prototype.computeMaxVertexDistance = function(t) {
        var e = new If(this._inputGeom);
        t.apply(e),
        this._maxPtDist.setMaximum(e.getMaxPointDistance())
    }
    ,
    bf.prototype.findDistance = function(t) {
        return this.computeMaxVertexDistance(t),
        this.computeMaxMidpointDistance(t),
        this._maxPtDist.getDistance()
    }
    ,
    bf.prototype.getDistancePoints = function() {
        return this._maxPtDist
    }
    ,
    bf.prototype.interfaces_ = function() {
        return []
    }
    ,
    bf.prototype.getClass = function() {
        return bf
    }
    ,
    wf.MaxPointDistanceFilter.get = function() {
        return If
    }
    ,
    wf.MaxMidpointDistanceFilter.get = function() {
        return Nf
    }
    ,
    Object.defineProperties(bf, wf);
    var If = function(t) {
        this._maxPtDist = new xf,
        this._minPtDist = new xf,
        this._geom = t || null
    };
    If.prototype.filter = function(t) {
        this._minPtDist.initialize(),
        Ef.computeDistance(this._geom, t, this._minPtDist),
        this._maxPtDist.setMaximum(this._minPtDist)
    }
    ,
    If.prototype.getMaxPointDistance = function() {
        return this._maxPtDist
    }
    ,
    If.prototype.interfaces_ = function() {
        return [Kl]
    }
    ,
    If.prototype.getClass = function() {
        return If
    }
    ;
    var Nf = function(t) {
        this._maxPtDist = new xf,
        this._minPtDist = new xf,
        this._geom = t || null
    };
    Nf.prototype.filter = function(t, e) {
        if (0 === e)
            return null;
        var n = t.getCoordinate(e - 1)
          , r = t.getCoordinate(e)
          , i = new ul((n.x + r.x) / 2,(n.y + r.y) / 2);
        this._minPtDist.initialize(),
        Ef.computeDistance(this._geom, i, this._minPtDist),
        this._maxPtDist.setMaximum(this._minPtDist)
    }
    ,
    Nf.prototype.isDone = function() {
        return !1
    }
    ,
    Nf.prototype.isGeometryChanged = function() {
        return !1
    }
    ,
    Nf.prototype.getMaxPointDistance = function() {
        return this._maxPtDist
    }
    ,
    Nf.prototype.interfaces_ = function() {
        return [Fc]
    }
    ,
    Nf.prototype.getClass = function() {
        return Nf
    }
    ;
    var Sf = function(t) {
        this._comps = t || null
    };
    Sf.prototype.filter = function(t) {
        t instanceof th && this._comps.add(t)
    }
    ,
    Sf.prototype.interfaces_ = function() {
        return [Dc]
    }
    ,
    Sf.prototype.getClass = function() {
        return Sf
    }
    ,
    Sf.getPolygons = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return Sf.getPolygons(t, new lc)
        }
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            return e instanceof th ? n.add(e) : e instanceof kc && e.apply(new Sf(n)),
            n
        }
    }
    ;
    var Cf = function() {
        if (this._lines = null,
        this._isForcedToLineString = !1,
        1 === arguments.length) {
            var t = arguments[0];
            this._lines = t
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            this._lines = e,
            this._isForcedToLineString = n
        }
    };
    Cf.prototype.filter = function(t) {
        if (this._isForcedToLineString && t instanceof nh) {
            var e = t.getFactory().createLineString(t.getCoordinateSequence());
            return this._lines.add(e),
            null
        }
        t instanceof Zc && this._lines.add(t)
    }
    ,
    Cf.prototype.setForceToLineString = function(t) {
        this._isForcedToLineString = t
    }
    ,
    Cf.prototype.interfaces_ = function() {
        return [Hl]
    }
    ,
    Cf.prototype.getClass = function() {
        return Cf
    }
    ,
    Cf.getGeometry = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return t.getFactory().buildGeometry(Cf.getLines(t))
        }
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            return e.getFactory().buildGeometry(Cf.getLines(e, n))
        }
    }
    ,
    Cf.getLines = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return Cf.getLines(t, !1)
        }
        if (2 === arguments.length) {
            if (gl(arguments[0], ic) && gl(arguments[1], ic)) {
                for (var e = arguments[0], n = arguments[1], r = e.iterator(); r.hasNext(); ) {
                    var i = r.next();
                    Cf.getLines(i, n)
                }
                return n
            }
            if (arguments[0]instanceof Wl && "boolean" == typeof arguments[1]) {
                var o = arguments[0]
                  , s = arguments[1]
                  , a = new lc;
                return o.apply(new Cf(a,s)),
                a
            }
            if (arguments[0]instanceof Wl && gl(arguments[1], ic)) {
                var u = arguments[0]
                  , l = arguments[1];
                return u instanceof Zc ? l.add(u) : u.apply(new Cf(l)),
                l
            }
        } else if (3 === arguments.length) {
            if ("boolean" == typeof arguments[2] && gl(arguments[0], ic) && gl(arguments[1], ic)) {
                for (var c = arguments[0], h = arguments[1], p = arguments[2], f = c.iterator(); f.hasNext(); ) {
                    var g = f.next();
                    Cf.getLines(g, h, p)
                }
                return h
            }
            if ("boolean" == typeof arguments[2] && arguments[0]instanceof Wl && gl(arguments[1], ic)) {
                var d = arguments[0]
                  , y = arguments[1]
                  , v = arguments[2];
                return d.apply(new Cf(y,v)),
                y
            }
        }
    }
    ;
    var Pf = function() {
        if (this._boundaryRule = Ql.OGC_SFS_BOUNDARY_RULE,
        this._isIn = null,
        this._numBoundaries = null,
        0 === arguments.length)
            ;
        else if (1 === arguments.length) {
            var t = arguments[0];
            if (null === t)
                throw new el("Rule must be non-null");
            this._boundaryRule = t
        }
    };
    Pf.prototype.locateInternal = function() {
        var t = this;
        if (arguments[0]instanceof ul && arguments[1]instanceof th) {
            var e = arguments[0]
              , n = arguments[1];
            if (n.isEmpty())
                return pl.EXTERIOR;
            var r = n.getExteriorRing()
              , i = this.locateInPolygonRing(e, r);
            if (i === pl.EXTERIOR)
                return pl.EXTERIOR;
            if (i === pl.BOUNDARY)
                return pl.BOUNDARY;
            for (var o = 0; o < n.getNumInteriorRing(); o++) {
                var s = n.getInteriorRingN(o)
                  , a = t.locateInPolygonRing(e, s);
                if (a === pl.INTERIOR)
                    return pl.EXTERIOR;
                if (a === pl.BOUNDARY)
                    return pl.BOUNDARY
            }
            return pl.INTERIOR
        }
        if (arguments[0]instanceof ul && arguments[1]instanceof Zc) {
            var u = arguments[0]
              , l = arguments[1];
            if (!l.getEnvelopeInternal().intersects(u))
                return pl.EXTERIOR;
            var c = l.getCoordinates();
            return l.isClosed() || !u.equals(c[0]) && !u.equals(c[c.length - 1]) ? Xl.isOnLine(u, c) ? pl.INTERIOR : pl.EXTERIOR : pl.BOUNDARY
        }
        if (arguments[0]instanceof ul && arguments[1]instanceof Qc) {
            var h = arguments[0]
              , p = arguments[1]
              , f = p.getCoordinate();
            return f.equals2D(h) ? pl.INTERIOR : pl.EXTERIOR
        }
    }
    ,
    Pf.prototype.locateInPolygonRing = function(t, e) {
        return e.getEnvelopeInternal().intersects(t) ? Xl.locatePointInRing(t, e.getCoordinates()) : pl.EXTERIOR
    }
    ,
    Pf.prototype.intersects = function(t, e) {
        return this.locate(t, e) !== pl.EXTERIOR
    }
    ,
    Pf.prototype.updateLocationInfo = function(t) {
        t === pl.INTERIOR && (this._isIn = !0),
        t === pl.BOUNDARY && this._numBoundaries++
    }
    ,
    Pf.prototype.computeLocation = function(t, e) {
        var n = this;
        if (e instanceof Qc && this.updateLocationInfo(this.locateInternal(t, e)),
        e instanceof Zc)
            this.updateLocationInfo(this.locateInternal(t, e));
        else if (e instanceof th)
            this.updateLocationInfo(this.locateInternal(t, e));
        else if (e instanceof Gc)
            for (var r = e, i = 0; i < r.getNumGeometries(); i++) {
                var o = r.getGeometryN(i);
                n.updateLocationInfo(n.locateInternal(t, o))
            }
        else if (e instanceof rh)
            for (var s = e, a = 0; a < s.getNumGeometries(); a++) {
                var u = s.getGeometryN(a);
                n.updateLocationInfo(n.locateInternal(t, u))
            }
        else if (e instanceof kc)
            for (var l = new Up(e); l.hasNext(); ) {
                var c = l.next();
                c !== e && n.computeLocation(t, c)
            }
    }
    ,
    Pf.prototype.locate = function(t, e) {
        return e.isEmpty() ? pl.EXTERIOR : e instanceof Zc || e instanceof th ? this.locateInternal(t, e) : (this._isIn = !1,
        this._numBoundaries = 0,
        this.computeLocation(t, e),
        this._boundaryRule.isInBoundary(this._numBoundaries) ? pl.BOUNDARY : this._numBoundaries > 0 || this._isIn ? pl.INTERIOR : pl.EXTERIOR)
    }
    ,
    Pf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Pf.prototype.getClass = function() {
        return Pf
    }
    ;
    var Mf = function t() {
        if (this._component = null,
        this._segIndex = null,
        this._pt = null,
        2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            t.call(this, e, t.INSIDE_AREA, n)
        } else if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2];
            this._component = r,
            this._segIndex = i,
            this._pt = o
        }
    }
      , Lf = {
        INSIDE_AREA: {
            configurable: !0
        }
    };
    Mf.prototype.isInsideArea = function() {
        return this._segIndex === Mf.INSIDE_AREA
    }
    ,
    Mf.prototype.getCoordinate = function() {
        return this._pt
    }
    ,
    Mf.prototype.getGeometryComponent = function() {
        return this._component
    }
    ,
    Mf.prototype.getSegmentIndex = function() {
        return this._segIndex
    }
    ,
    Mf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Mf.prototype.getClass = function() {
        return Mf
    }
    ,
    Lf.INSIDE_AREA.get = function() {
        return -1
    }
    ,
    Object.defineProperties(Mf, Lf);
    var Of = function(t) {
        this._pts = t || null
    };
    Of.prototype.filter = function(t) {
        t instanceof Qc && this._pts.add(t)
    }
    ,
    Of.prototype.interfaces_ = function() {
        return [Dc]
    }
    ,
    Of.prototype.getClass = function() {
        return Of
    }
    ,
    Of.getPoints = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return t instanceof Qc ? np.singletonList(t) : Of.getPoints(t, new lc)
        }
        if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            return e instanceof Qc ? n.add(e) : e instanceof kc && e.apply(new Of(n)),
            n
        }
    }
    ;
    var Rf = function() {
        this._locations = null;
        var t = arguments[0];
        this._locations = t
    };
    Rf.prototype.filter = function(t) {
        (t instanceof Qc || t instanceof Zc || t instanceof th) && this._locations.add(new Mf(t,0,t.getCoordinate()))
    }
    ,
    Rf.prototype.interfaces_ = function() {
        return [Dc]
    }
    ,
    Rf.prototype.getClass = function() {
        return Rf
    }
    ,
    Rf.getLocations = function(t) {
        var e = new lc;
        return t.apply(new Rf(e)),
        e
    }
    ;
    var Tf = function() {
        if (this._geom = null,
        this._terminateDistance = 0,
        this._ptLocator = new Pf,
        this._minDistanceLocation = null,
        this._minDistance = nl.MAX_VALUE,
        2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1];
            this._geom = [t, e],
            this._terminateDistance = 0
        } else if (3 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = arguments[2];
            this._geom = new Array(2).fill(null),
            this._geom[0] = n,
            this._geom[1] = r,
            this._terminateDistance = i
        }
    };
    Tf.prototype.computeContainmentDistance = function() {
        var t = this;
        if (0 === arguments.length) {
            var e = new Array(2).fill(null);
            if (this.computeContainmentDistance(0, e),
            this._minDistance <= this._terminateDistance)
                return null;
            this.computeContainmentDistance(1, e)
        } else if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = 1 - n
              , o = Sf.getPolygons(this._geom[n]);
            if (o.size() > 0) {
                var s = Rf.getLocations(this._geom[i]);
                if (this.computeContainmentDistance(s, o, r),
                this._minDistance <= this._terminateDistance)
                    return this._minDistanceLocation[i] = r[0],
                    this._minDistanceLocation[n] = r[1],
                    null
            }
        } else if (3 === arguments.length)
            if (arguments[2]instanceof Array && gl(arguments[0], ac) && gl(arguments[1], ac)) {
                for (var a = arguments[0], u = arguments[1], l = arguments[2], c = 0; c < a.size(); c++)
                    for (var h = a.get(c), p = 0; p < u.size(); p++)
                        if (t.computeContainmentDistance(h, u.get(p), l),
                        t._minDistance <= t._terminateDistance)
                            return null
            } else if (arguments[2]instanceof Array && arguments[0]instanceof Mf && arguments[1]instanceof th) {
                var f = arguments[0]
                  , g = arguments[1]
                  , d = arguments[2]
                  , y = f.getCoordinate();
                if (pl.EXTERIOR !== this._ptLocator.locate(y, g))
                    return this._minDistance = 0,
                    d[0] = f,
                    d[1] = new Mf(g,y),
                    null
            }
    }
    ,
    Tf.prototype.computeMinDistanceLinesPoints = function(t, e, n) {
        for (var r = this, i = 0; i < t.size(); i++)
            for (var o = t.get(i), s = 0; s < e.size(); s++) {
                var a = e.get(s);
                if (r.computeMinDistance(o, a, n),
                r._minDistance <= r._terminateDistance)
                    return null
            }
    }
    ,
    Tf.prototype.computeFacetDistance = function() {
        var t = new Array(2).fill(null)
          , e = Cf.getLines(this._geom[0])
          , n = Cf.getLines(this._geom[1])
          , r = Of.getPoints(this._geom[0])
          , i = Of.getPoints(this._geom[1]);
        return this.computeMinDistanceLines(e, n, 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(n, r, t),
        this.updateMinDistance(t, !0),
        this._minDistance <= this._terminateDistance ? null : (t[0] = null,
        t[1] = null,
        this.computeMinDistancePoints(r, i, t),
        void this.updateMinDistance(t, !1))))
    }
    ,
    Tf.prototype.nearestLocations = function() {
        return this.computeMinDistance(),
        this._minDistanceLocation
    }
    ,
    Tf.prototype.updateMinDistance = function(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])
    }
    ,
    Tf.prototype.nearestPoints = function() {
        return this.computeMinDistance(),
        [this._minDistanceLocation[0].getCoordinate(), this._minDistanceLocation[1].getCoordinate()]
    }
    ,
    Tf.prototype.computeMinDistance = function() {
        var t = this;
        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 Zc && arguments[1]instanceof Qc) {
                var e = arguments[0]
                  , n = arguments[1]
                  , r = arguments[2];
                if (e.getEnvelopeInternal().distance(n.getEnvelopeInternal()) > this._minDistance)
                    return null;
                for (var i = e.getCoordinates(), o = n.getCoordinate(), s = 0; s < i.length - 1; s++) {
                    var a = Xl.distancePointLine(o, i[s], i[s + 1]);
                    if (a < t._minDistance) {
                        t._minDistance = a;
                        var u = new vp(i[s],i[s + 1])
                          , l = u.closestPoint(o);
                        r[0] = new Mf(e,s,l),
                        r[1] = new Mf(n,0,o)
                    }
                    if (t._minDistance <= t._terminateDistance)
                        return null
                }
            } else if (arguments[2]instanceof Array && arguments[0]instanceof Zc && arguments[1]instanceof Zc) {
                var c = arguments[0]
                  , h = arguments[1]
                  , p = arguments[2];
                if (c.getEnvelopeInternal().distance(h.getEnvelopeInternal()) > this._minDistance)
                    return null;
                for (var f = c.getCoordinates(), g = h.getCoordinates(), d = 0; d < f.length - 1; d++)
                    for (var y = 0; y < g.length - 1; y++) {
                        var v = Xl.distanceLineLine(f[d], f[d + 1], g[y], g[y + 1]);
                        if (v < t._minDistance) {
                            t._minDistance = v;
                            var _ = new vp(f[d],f[d + 1])
                              , m = new vp(g[y],g[y + 1])
                              , x = _.closestPoints(m);
                            p[0] = new Mf(c,d,x[0]),
                            p[1] = new Mf(h,y,x[1])
                        }
                        if (t._minDistance <= t._terminateDistance)
                            return null
                    }
            }
    }
    ,
    Tf.prototype.computeMinDistancePoints = function(t, e, n) {
        for (var r = this, i = 0; i < t.size(); i++)
            for (var o = t.get(i), s = 0; s < e.size(); s++) {
                var a = e.get(s)
                  , u = o.getCoordinate().distance(a.getCoordinate());
                if (u < r._minDistance && (r._minDistance = u,
                n[0] = new Mf(o,0,o.getCoordinate()),
                n[1] = new Mf(a,0,a.getCoordinate())),
                r._minDistance <= r._terminateDistance)
                    return null
            }
    }
    ,
    Tf.prototype.distance = function() {
        if (null === this._geom[0] || null === this._geom[1])
            throw new el("null geometries are not supported");
        return this._geom[0].isEmpty() || this._geom[1].isEmpty() ? 0 : (this.computeMinDistance(),
        this._minDistance)
    }
    ,
    Tf.prototype.computeMinDistanceLines = function(t, e, n) {
        for (var r = this, i = 0; i < t.size(); i++)
            for (var o = t.get(i), s = 0; s < e.size(); s++) {
                var a = e.get(s);
                if (r.computeMinDistance(o, a, n),
                r._minDistance <= r._terminateDistance)
                    return null
            }
    }
    ,
    Tf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Tf.prototype.getClass = function() {
        return Tf
    }
    ,
    Tf.distance = function(t, e) {
        return new Tf(t,e).distance()
    }
    ,
    Tf.isWithinDistance = function(t, e, n) {
        return new Tf(t,e,n).distance() <= n
    }
    ,
    Tf.nearestPoints = function(t, e) {
        return new Tf(t,e).nearestPoints()
    }
    ;
    var Af = function() {
        this._pt = [new ul, new ul],
        this._distance = nl.NaN,
        this._isNull = !0
    };
    Af.prototype.getCoordinates = function() {
        return this._pt
    }
    ,
    Af.prototype.getCoordinate = function(t) {
        return this._pt[t]
    }
    ,
    Af.prototype.setMinimum = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.setMinimum(t._pt[0], t._pt[1])
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            if (this._isNull)
                return this.initialize(e, n),
                null;
            var r = e.distance(n);
            r < this._distance && this.initialize(e, n, r)
        }
    }
    ,
    Af.prototype.initialize = function() {
        if (0 === arguments.length)
            this._isNull = !0;
        else if (2 === arguments.length) {
            var 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) {
            var n = arguments[0]
              , r = arguments[1]
              , i = arguments[2];
            this._pt[0].setCoordinate(n),
            this._pt[1].setCoordinate(r),
            this._distance = i,
            this._isNull = !1
        }
    }
    ,
    Af.prototype.toString = function() {
        return Fl.toLineString(this._pt[0], this._pt[1])
    }
    ,
    Af.prototype.getDistance = function() {
        return this._distance
    }
    ,
    Af.prototype.setMaximum = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            this.setMaximum(t._pt[0], t._pt[1])
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            if (this._isNull)
                return this.initialize(e, n),
                null;
            var r = e.distance(n);
            r > this._distance && this.initialize(e, n, r)
        }
    }
    ,
    Af.prototype.interfaces_ = function() {
        return []
    }
    ,
    Af.prototype.getClass = function() {
        return Af
    }
    ;
    var Df = function() {};
    Df.prototype.interfaces_ = function() {
        return []
    }
    ,
    Df.prototype.getClass = function() {
        return Df
    }
    ,
    Df.computeDistance = function() {
        if (arguments[2]instanceof Af && arguments[0]instanceof Zc && arguments[1]instanceof ul)
            for (var t = arguments[0], e = arguments[1], n = arguments[2], r = new vp, i = t.getCoordinates(), o = 0; o < i.length - 1; o++) {
                r.setCoordinates(i[o], i[o + 1]);
                var s = r.closestPoint(e);
                n.setMinimum(s, e)
            }
        else if (arguments[2]instanceof Af && arguments[0]instanceof th && arguments[1]instanceof ul) {
            var a = arguments[0]
              , u = arguments[1]
              , l = arguments[2];
            Df.computeDistance(a.getExteriorRing(), u, l);
            for (var c = 0; c < a.getNumInteriorRing(); c++)
                Df.computeDistance(a.getInteriorRingN(c), u, l)
        } else if (arguments[2]instanceof Af && arguments[0]instanceof Wl && arguments[1]instanceof ul) {
            var h = arguments[0]
              , p = arguments[1]
              , f = arguments[2];
            if (h instanceof Zc)
                Df.computeDistance(h, p, f);
            else if (h instanceof th)
                Df.computeDistance(h, p, f);
            else if (h instanceof kc)
                for (var g = h, d = 0; d < g.getNumGeometries(); d++) {
                    var y = g.getGeometryN(d);
                    Df.computeDistance(y, p, f)
                }
            else
                f.setMinimum(h.getCoordinate(), p)
        } else if (arguments[2]instanceof Af && arguments[0]instanceof vp && arguments[1]instanceof ul) {
            var v = arguments[0]
              , _ = arguments[1]
              , m = arguments[2]
              , x = v.closestPoint(_);
            m.setMinimum(x, _)
        }
    }
    ;
    var Ff = function() {
        this._g0 = null,
        this._g1 = null,
        this._ptDist = new Af,
        this._densifyFrac = 0;
        var t = arguments[0]
          , e = arguments[1];
        this._g0 = t,
        this._g1 = e
    }
      , kf = {
        MaxPointDistanceFilter: {
            configurable: !0
        },
        MaxDensifiedByFractionDistanceFilter: {
            configurable: !0
        }
    };
    Ff.prototype.getCoordinates = function() {
        return this._ptDist.getCoordinates()
    }
    ,
    Ff.prototype.setDensifyFraction = function(t) {
        if (t > 1 || t <= 0)
            throw new el("Fraction is not in range (0.0 - 1.0]");
        this._densifyFrac = t
    }
    ,
    Ff.prototype.compute = function(t, e) {
        this.computeOrientedDistance(t, e, this._ptDist),
        this.computeOrientedDistance(e, t, this._ptDist)
    }
    ,
    Ff.prototype.distance = function() {
        return this.compute(this._g0, this._g1),
        this._ptDist.getDistance()
    }
    ,
    Ff.prototype.computeOrientedDistance = function(t, e, n) {
        var r = new Gf(e);
        if (t.apply(r),
        n.setMaximum(r.getMaxPointDistance()),
        this._densifyFrac > 0) {
            var i = new qf(e,this._densifyFrac);
            t.apply(i),
            n.setMaximum(i.getMaxPointDistance())
        }
    }
    ,
    Ff.prototype.orientedDistance = function() {
        return this.computeOrientedDistance(this._g0, this._g1, this._ptDist),
        this._ptDist.getDistance()
    }
    ,
    Ff.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ff.prototype.getClass = function() {
        return Ff
    }
    ,
    Ff.distance = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = new Ff(t,e);
            return n.distance()
        }
        if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2]
              , s = new Ff(r,i);
            return s.setDensifyFraction(o),
            s.distance()
        }
    }
    ,
    kf.MaxPointDistanceFilter.get = function() {
        return Gf
    }
    ,
    kf.MaxDensifiedByFractionDistanceFilter.get = function() {
        return qf
    }
    ,
    Object.defineProperties(Ff, kf);
    var Gf = function() {
        this._maxPtDist = new Af,
        this._minPtDist = new Af,
        this._euclideanDist = new Df,
        this._geom = null;
        var t = arguments[0];
        this._geom = t
    };
    Gf.prototype.filter = function(t) {
        this._minPtDist.initialize(),
        Df.computeDistance(this._geom, t, this._minPtDist),
        this._maxPtDist.setMaximum(this._minPtDist)
    }
    ,
    Gf.prototype.getMaxPointDistance = function() {
        return this._maxPtDist
    }
    ,
    Gf.prototype.interfaces_ = function() {
        return [Kl]
    }
    ,
    Gf.prototype.getClass = function() {
        return Gf
    }
    ;
    var qf = function() {
        this._maxPtDist = new Af,
        this._minPtDist = new Af,
        this._geom = null,
        this._numSubSegs = 0;
        var t = arguments[0]
          , e = arguments[1];
        this._geom = t,
        this._numSubSegs = Math.trunc(Math.round(1 / e))
    };
    qf.prototype.filter = function(t, e) {
        var n = this;
        if (0 === e)
            return null;
        for (var r = t.getCoordinate(e - 1), i = t.getCoordinate(e), o = (i.x - r.x) / this._numSubSegs, s = (i.y - r.y) / this._numSubSegs, a = 0; a < this._numSubSegs; a++) {
            var u = r.x + a * o
              , l = r.y + a * s
              , c = new ul(u,l);
            n._minPtDist.initialize(),
            Df.computeDistance(n._geom, c, n._minPtDist),
            n._maxPtDist.setMaximum(n._minPtDist)
        }
    }
    ,
    qf.prototype.isDone = function() {
        return !1
    }
    ,
    qf.prototype.isGeometryChanged = function() {
        return !1
    }
    ,
    qf.prototype.getMaxPointDistance = function() {
        return this._maxPtDist
    }
    ,
    qf.prototype.interfaces_ = function() {
        return [Fc]
    }
    ,
    qf.prototype.getClass = function() {
        return qf
    }
    ;
    var Bf = function(t, e, n) {
        this._minValidDistance = null,
        this._maxValidDistance = null,
        this._minDistanceFound = null,
        this._maxDistanceFound = null,
        this._isValid = !0,
        this._errMsg = null,
        this._errorLocation = null,
        this._errorIndicator = null,
        this._input = t || null,
        this._bufDistance = e || null,
        this._result = n || null
    }
      , zf = {
        VERBOSE: {
            configurable: !0
        },
        MAX_DISTANCE_DIFF_FRAC: {
            configurable: !0
        }
    };
    Bf.prototype.checkMaximumDistance = function(t, e, n) {
        var r = new Ff(e,t);
        if (r.setDensifyFraction(.25),
        this._maxDistanceFound = r.orientedDistance(),
        this._maxDistanceFound > n) {
            this._isValid = !1;
            var i = r.getCoordinates();
            this._errorLocation = i[1],
            this._errorIndicator = t.getFactory().createLineString(i),
            this._errMsg = "Distance between buffer curve and input is too large (" + this._maxDistanceFound + " at " + Fl.toLineString(i[0], i[1]) + ")"
        }
    }
    ,
    Bf.prototype.isValid = function() {
        var t = Math.abs(this._bufDistance)
          , e = Bf.MAX_DISTANCE_DIFF_FRAC * t;
        return this._minValidDistance = t - e,
        this._maxValidDistance = t + e,
        !(!this._input.isEmpty() && !this._result.isEmpty()) || (this._bufDistance > 0 ? this.checkPositiveValid() : this.checkNegativeValid(),
        Bf.VERBOSE && Pl.out.println("Min Dist= " + this._minDistanceFound + "  err= " + (1 - this._minDistanceFound / this._bufDistance) + "  Max Dist= " + this._maxDistanceFound + "  err= " + (this._maxDistanceFound / this._bufDistance - 1)),
        this._isValid)
    }
    ,
    Bf.prototype.checkNegativeValid = function() {
        if (!(this._input instanceof th || this._input instanceof rh || this._input instanceof kc))
            return null;
        var t = this.getPolygonLines(this._input);
        if (this.checkMinimumDistance(t, this._result, this._minValidDistance),
        !this._isValid)
            return null;
        this.checkMaximumDistance(t, this._result, this._maxValidDistance)
    }
    ,
    Bf.prototype.getErrorIndicator = function() {
        return this._errorIndicator
    }
    ,
    Bf.prototype.checkMinimumDistance = function(t, e, n) {
        var r = new Tf(t,e,n);
        if (this._minDistanceFound = r.distance(),
        this._minDistanceFound < n) {
            this._isValid = !1;
            var i = r.nearestPoints();
            this._errorLocation = r.nearestPoints()[1],
            this._errorIndicator = t.getFactory().createLineString(i),
            this._errMsg = "Distance between buffer curve and input is too small (" + this._minDistanceFound + " at " + Fl.toLineString(i[0], i[1]) + " )"
        }
    }
    ,
    Bf.prototype.checkPositiveValid = function() {
        var t = this._result.getBoundary();
        if (this.checkMinimumDistance(this._input, t, this._minValidDistance),
        !this._isValid)
            return null;
        this.checkMaximumDistance(this._input, t, this._maxValidDistance)
    }
    ,
    Bf.prototype.getErrorLocation = function() {
        return this._errorLocation
    }
    ,
    Bf.prototype.getPolygonLines = function(t) {
        for (var e = new lc, n = new Cf(e), r = Sf.getPolygons(t).iterator(); r.hasNext(); ) {
            r.next().apply(n)
        }
        return t.getFactory().buildGeometry(e)
    }
    ,
    Bf.prototype.getErrorMessage = function() {
        return this._errMsg
    }
    ,
    Bf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Bf.prototype.getClass = function() {
        return Bf
    }
    ,
    zf.VERBOSE.get = function() {
        return !1
    }
    ,
    zf.MAX_DISTANCE_DIFF_FRAC.get = function() {
        return .012
    }
    ,
    Object.defineProperties(Bf, zf);
    var jf = function(t, e, n) {
        this._isValid = !0,
        this._errorMsg = null,
        this._errorLocation = null,
        this._errorIndicator = null,
        this._input = t || null,
        this._distance = e || null,
        this._result = n || null
    }
      , Uf = {
        VERBOSE: {
            configurable: !0
        },
        MAX_ENV_DIFF_FRAC: {
            configurable: !0
        }
    };
    jf.prototype.isValid = function() {
        return this.checkPolygonal(),
        this._isValid ? (this.checkExpectedEmpty(),
        this._isValid ? (this.checkEnvelope(),
        this._isValid ? (this.checkArea(),
        this._isValid ? (this.checkDistance(),
        this._isValid) : this._isValid) : this._isValid) : this._isValid) : this._isValid
    }
    ,
    jf.prototype.checkEnvelope = function() {
        if (this._distance < 0)
            return null;
        var t = this._distance * jf.MAX_ENV_DIFF_FRAC;
        0 === t && (t = .001);
        var e = new Ll(this._input.getEnvelopeInternal());
        e.expandBy(this._distance);
        var n = new Ll(this._result.getEnvelopeInternal());
        n.expandBy(t),
        n.contains(e) || (this._isValid = !1,
        this._errorMsg = "Buffer envelope is incorrect",
        this._errorIndicator = this._input.getFactory().toGeometry(n)),
        this.report("Envelope")
    }
    ,
    jf.prototype.checkDistance = function() {
        var t = new Bf(this._input,this._distance,this._result);
        t.isValid() || (this._isValid = !1,
        this._errorMsg = t.getErrorMessage(),
        this._errorLocation = t.getErrorLocation(),
        this._errorIndicator = t.getErrorIndicator()),
        this.report("Distance")
    }
    ,
    jf.prototype.checkArea = function() {
        var t = this._input.getArea()
          , e = this._result.getArea();
        this._distance > 0 && t > e && (this._isValid = !1,
        this._errorMsg = "Area of positive buffer is smaller than input",
        this._errorIndicator = this._result),
        this._distance < 0 && t < e && (this._isValid = !1,
        this._errorMsg = "Area of negative buffer is larger than input",
        this._errorIndicator = this._result),
        this.report("Area")
    }
    ,
    jf.prototype.checkPolygonal = function() {
        this._result instanceof th || this._result instanceof rh || (this._isValid = !1),
        this._errorMsg = "Result is not polygonal",
        this._errorIndicator = this._result,
        this.report("Polygonal")
    }
    ,
    jf.prototype.getErrorIndicator = function() {
        return this._errorIndicator
    }
    ,
    jf.prototype.getErrorLocation = function() {
        return this._errorLocation
    }
    ,
    jf.prototype.checkExpectedEmpty = function() {
        return this._input.getDimension() >= 2 || this._distance > 0 ? null : (this._result.isEmpty() || (this._isValid = !1,
        this._errorMsg = "Result is non-empty",
        this._errorIndicator = this._result),
        void this.report("ExpectedEmpty"))
    }
    ,
    jf.prototype.report = function(t) {
        if (!jf.VERBOSE)
            return null;
        Pl.out.println("Check " + t + ": " + (this._isValid ? "passed" : "FAILED"))
    }
    ,
    jf.prototype.getErrorMessage = function() {
        return this._errorMsg
    }
    ,
    jf.prototype.interfaces_ = function() {
        return []
    }
    ,
    jf.prototype.getClass = function() {
        return jf
    }
    ,
    jf.isValidMsg = function(t, e, n) {
        var r = new jf(t,e,n);
        return r.isValid() ? null : r.getErrorMessage()
    }
    ,
    jf.isValid = function(t, e, n) {
        return !!new jf(t,e,n).isValid()
    }
    ,
    Uf.VERBOSE.get = function() {
        return !1
    }
    ,
    Uf.MAX_ENV_DIFF_FRAC.get = function() {
        return .012
    }
    ,
    Object.defineProperties(jf, Uf);
    var Vf = function() {
        this._pts = null,
        this._data = null;
        var t = arguments[0]
          , e = arguments[1];
        this._pts = t,
        this._data = e
    };
    Vf.prototype.getCoordinates = function() {
        return this._pts
    }
    ,
    Vf.prototype.size = function() {
        return this._pts.length
    }
    ,
    Vf.prototype.getCoordinate = function(t) {
        return this._pts[t]
    }
    ,
    Vf.prototype.isClosed = function() {
        return this._pts[0].equals(this._pts[this._pts.length - 1])
    }
    ,
    Vf.prototype.getSegmentOctant = function(t) {
        return t === this._pts.length - 1 ? -1 : fp.octant(this.getCoordinate(t), this.getCoordinate(t + 1))
    }
    ,
    Vf.prototype.setData = function(t) {
        this._data = t
    }
    ,
    Vf.prototype.getData = function() {
        return this._data
    }
    ,
    Vf.prototype.toString = function() {
        return Fl.toLineString(new lh(this._pts))
    }
    ,
    Vf.prototype.interfaces_ = function() {
        return [gp]
    }
    ,
    Vf.prototype.getClass = function() {
        return Vf
    }
    ;
    var Xf = function() {
        this._findAllIntersections = !1,
        this._isCheckEndSegmentsOnly = !1,
        this._li = null,
        this._interiorIntersection = null,
        this._intSegments = null,
        this._intersections = new lc,
        this._intersectionCount = 0,
        this._keepIntersections = !0;
        var t = arguments[0];
        this._li = t,
        this._interiorIntersection = null
    };
    Xf.prototype.getInteriorIntersection = function() {
        return this._interiorIntersection
    }
    ,
    Xf.prototype.setCheckEndSegmentsOnly = function(t) {
        this._isCheckEndSegmentsOnly = t
    }
    ,
    Xf.prototype.getIntersectionSegments = function() {
        return this._intSegments
    }
    ,
    Xf.prototype.count = function() {
        return this._intersectionCount
    }
    ,
    Xf.prototype.getIntersections = function() {
        return this._intersections
    }
    ,
    Xf.prototype.setFindAllIntersections = function(t) {
        this._findAllIntersections = t
    }
    ,
    Xf.prototype.setKeepIntersections = function(t) {
        this._keepIntersections = t
    }
    ,
    Xf.prototype.processIntersections = function(t, e, n, r) {
        if (!this._findAllIntersections && this.hasIntersection())
            return null;
        if (t === n && e === r)
            return null;
        if (this._isCheckEndSegmentsOnly && !(this.isEndSegment(t, e) || this.isEndSegment(n, r)))
            return null;
        var i = t.getCoordinates()[e]
          , o = t.getCoordinates()[e + 1]
          , s = n.getCoordinates()[r]
          , a = n.getCoordinates()[r + 1];
        this._li.computeIntersection(i, o, s, a),
        this._li.hasIntersection() && this._li.isInteriorIntersection() && (this._intSegments = new Array(4).fill(null),
        this._intSegments[0] = i,
        this._intSegments[1] = o,
        this._intSegments[2] = s,
        this._intSegments[3] = a,
        this._interiorIntersection = this._li.getIntersection(0),
        this._keepIntersections && this._intersections.add(this._interiorIntersection),
        this._intersectionCount++)
    }
    ,
    Xf.prototype.isEndSegment = function(t, e) {
        return 0 === e || e >= t.size() - 2
    }
    ,
    Xf.prototype.hasIntersection = function() {
        return null !== this._interiorIntersection
    }
    ,
    Xf.prototype.isDone = function() {
        return !this._findAllIntersections && null !== this._interiorIntersection
    }
    ,
    Xf.prototype.interfaces_ = function() {
        return [Zp]
    }
    ,
    Xf.prototype.getClass = function() {
        return Xf
    }
    ,
    Xf.createAllIntersectionsFinder = function(t) {
        var e = new Xf(t);
        return e.setFindAllIntersections(!0),
        e
    }
    ,
    Xf.createAnyIntersectionFinder = function(t) {
        return new Xf(t)
    }
    ,
    Xf.createIntersectionCounter = function(t) {
        var e = new Xf(t);
        return e.setFindAllIntersections(!0),
        e.setKeepIntersections(!1),
        e
    }
    ;
    var Yf = function() {
        this._li = new jl,
        this._segStrings = null,
        this._findAllIntersections = !1,
        this._segInt = null,
        this._isValid = !0;
        var t = arguments[0];
        this._segStrings = t
    };
    Yf.prototype.execute = function() {
        if (null !== this._segInt)
            return null;
        this.checkInteriorIntersections()
    }
    ,
    Yf.prototype.getIntersections = function() {
        return this._segInt.getIntersections()
    }
    ,
    Yf.prototype.isValid = function() {
        return this.execute(),
        this._isValid
    }
    ,
    Yf.prototype.setFindAllIntersections = function(t) {
        this._findAllIntersections = t
    }
    ,
    Yf.prototype.checkInteriorIntersections = function() {
        this._isValid = !0,
        this._segInt = new Xf(this._li),
        this._segInt.setFindAllIntersections(this._findAllIntersections);
        var t = new Ip;
        if (t.setSegmentIntersector(this._segInt),
        t.computeNodes(this._segStrings),
        this._segInt.hasIntersection())
            return this._isValid = !1,
            null
    }
    ,
    Yf.prototype.checkValid = function() {
        if (this.execute(),
        !this._isValid)
            throw new Oh(this.getErrorMessage(),this._segInt.getInteriorIntersection())
    }
    ,
    Yf.prototype.getErrorMessage = function() {
        if (this._isValid)
            return "no intersections found";
        var t = this._segInt.getIntersectionSegments();
        return "found non-noded intersection between " + Fl.toLineString(t[0], t[1]) + " and " + Fl.toLineString(t[2], t[3])
    }
    ,
    Yf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Yf.prototype.getClass = function() {
        return Yf
    }
    ,
    Yf.computeIntersections = function(t) {
        var e = new Yf(t);
        return e.setFindAllIntersections(!0),
        e.isValid(),
        e.getIntersections()
    }
    ;
    var Hf = function t() {
        this._nv = null;
        var e = arguments[0];
        this._nv = new Yf(t.toSegmentStrings(e))
    };
    Hf.prototype.checkValid = function() {
        this._nv.checkValid()
    }
    ,
    Hf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Hf.prototype.getClass = function() {
        return Hf
    }
    ,
    Hf.toSegmentStrings = function(t) {
        for (var e = new lc, n = t.iterator(); n.hasNext(); ) {
            var r = n.next();
            e.add(new Vf(r.getCoordinates(),r))
        }
        return e
    }
    ,
    Hf.checkValid = function(t) {
        new Hf(t).checkValid()
    }
    ;
    var Wf = function(t) {
        this._mapOp = t
    };
    Wf.prototype.map = function(t) {
        for (var e = new lc, n = 0; n < t.getNumGeometries(); n++) {
            var r = this._mapOp.map(t.getGeometryN(n));
            r.isEmpty() || e.add(r)
        }
        return t.getFactory().createGeometryCollection(_h.toGeometryArray(e))
    }
    ,
    Wf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Wf.prototype.getClass = function() {
        return Wf
    }
    ,
    Wf.map = function(t, e) {
        return new Wf(e).map(t)
    }
    ;
    var Jf = function() {
        this._op = null,
        this._geometryFactory = null,
        this._ptLocator = null,
        this._lineEdgesList = new lc,
        this._resultLineList = new lc;
        var t = arguments[0]
          , e = arguments[1]
          , n = arguments[2];
        this._op = t,
        this._geometryFactory = e,
        this._ptLocator = n
    };
    Jf.prototype.collectLines = function(t) {
        for (var e = this, n = this._op.getGraph().getEdgeEnds().iterator(); n.hasNext(); ) {
            var r = n.next();
            e.collectLineEdge(r, t, e._lineEdgesList),
            e.collectBoundaryTouchEdge(r, t, e._lineEdgesList)
        }
    }
    ,
    Jf.prototype.labelIsolatedLine = function(t, e) {
        var n = this._ptLocator.locate(t.getCoordinate(), this._op.getArgGeometry(e));
        t.getLabel().setLocation(e, n)
    }
    ,
    Jf.prototype.build = function(t) {
        return this.findCoveredLineEdges(),
        this.collectLines(t),
        this.buildLines(t),
        this._resultLineList
    }
    ,
    Jf.prototype.collectLineEdge = function(t, e, n) {
        var r = t.getLabel()
          , i = t.getEdge();
        t.isLineEdge() && (t.isVisited() || !Mg.isResultOfOp(r, e) || i.isCovered() || (n.add(i),
        t.setVisitedEdge(!0)))
    }
    ,
    Jf.prototype.findCoveredLineEdges = function() {
        for (var t = this._op.getGraph().getNodes().iterator(); t.hasNext(); ) {
            t.next().getEdges().findCoveredLineEdges()
        }
        for (var e = this._op.getGraph().getEdgeEnds().iterator(); e.hasNext(); ) {
            var n = e.next()
              , r = n.getEdge();
            if (n.isLineEdge() && !r.isCoveredSet()) {
                var i = this._op.isCoveredByA(n.getCoordinate());
                r.setCovered(i)
            }
        }
    }
    ,
    Jf.prototype.labelIsolatedLines = function(t) {
        for (var e = t.iterator(); e.hasNext(); ) {
            var n = e.next()
              , r = n.getLabel();
            n.isIsolated() && (r.isNull(0) ? this.labelIsolatedLine(n, 0) : this.labelIsolatedLine(n, 1))
        }
    }
    ,
    Jf.prototype.buildLines = function(t) {
        for (var e = this._lineEdgesList.iterator(); e.hasNext(); ) {
            var n = e.next()
              , r = this._geometryFactory.createLineString(n.getCoordinates());
            this._resultLineList.add(r),
            n.setInResult(!0)
        }
    }
    ,
    Jf.prototype.collectBoundaryTouchEdge = function(t, e, n) {
        var r = t.getLabel();
        return t.isLineEdge() || t.isVisited() || t.isInteriorAreaEdge() || t.getEdge().isInResult() ? null : (ql.isTrue(!(t.isInResult() || t.getSym().isInResult()) || !t.getEdge().isInResult()),
        void (Mg.isResultOfOp(r, e) && e === Mg.INTERSECTION && (n.add(t.getEdge()),
        t.setVisitedEdge(!0))))
    }
    ,
    Jf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Jf.prototype.getClass = function() {
        return Jf
    }
    ;
    var Zf = function() {
        this._op = null,
        this._geometryFactory = null,
        this._resultPointList = new lc;
        var t = arguments[0]
          , e = arguments[1];
        this._op = t,
        this._geometryFactory = e
    };
    Zf.prototype.filterCoveredNodeToPoint = function(t) {
        var e = t.getCoordinate();
        if (!this._op.isCoveredByLA(e)) {
            var n = this._geometryFactory.createPoint(e);
            this._resultPointList.add(n)
        }
    }
    ,
    Zf.prototype.extractNonCoveredResultNodes = function(t) {
        for (var e = this._op.getGraph().getNodes().iterator(); e.hasNext(); ) {
            var n = e.next();
            if (!n.isInResult() && (!n.isIncidentEdgeInResult() && (0 === n.getEdges().getDegree() || t === Mg.INTERSECTION))) {
                var r = n.getLabel();
                Mg.isResultOfOp(r, t) && this.filterCoveredNodeToPoint(n)
            }
        }
    }
    ,
    Zf.prototype.build = function(t) {
        return this.extractNonCoveredResultNodes(t),
        this._resultPointList
    }
    ,
    Zf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Zf.prototype.getClass = function() {
        return Zf
    }
    ;
    var Kf = function() {
        this._inputGeom = null,
        this._factory = null,
        this._pruneEmptyGeometry = !0,
        this._preserveGeometryCollectionType = !0,
        this._preserveCollections = !1,
        this._preserveType = !1
    };
    Kf.prototype.transformPoint = function(t, e) {
        return this._factory.createPoint(this.transformCoordinates(t.getCoordinateSequence(), t))
    }
    ,
    Kf.prototype.transformPolygon = function(t, e) {
        var n = !0
          , r = this.transformLinearRing(t.getExteriorRing(), t);
        null !== r && r instanceof nh && !r.isEmpty() || (n = !1);
        for (var i = new lc, o = 0; o < t.getNumInteriorRing(); o++) {
            var s = this.transformLinearRing(t.getInteriorRingN(o), t);
            null === s || s.isEmpty() || (s instanceof nh || (n = !1),
            i.add(s))
        }
        if (n)
            return this._factory.createPolygon(r, i.toArray([]));
        var a = new lc;
        return null !== r && a.add(r),
        a.addAll(i),
        this._factory.buildGeometry(a)
    }
    ,
    Kf.prototype.createCoordinateSequence = function(t) {
        return this._factory.getCoordinateSequenceFactory().create(t)
    }
    ,
    Kf.prototype.getInputGeometry = function() {
        return this._inputGeom
    }
    ,
    Kf.prototype.transformMultiLineString = function(t, e) {
        for (var n = new lc, r = 0; r < t.getNumGeometries(); r++) {
            var i = this.transformLineString(t.getGeometryN(r), t);
            null !== i && (i.isEmpty() || n.add(i))
        }
        return this._factory.buildGeometry(n)
    }
    ,
    Kf.prototype.transformCoordinates = function(t, e) {
        return this.copy(t)
    }
    ,
    Kf.prototype.transformLineString = function(t, e) {
        return this._factory.createLineString(this.transformCoordinates(t.getCoordinateSequence(), t))
    }
    ,
    Kf.prototype.transformMultiPoint = function(t, e) {
        for (var n = new lc, r = 0; r < t.getNumGeometries(); r++) {
            var i = this.transformPoint(t.getGeometryN(r), t);
            null !== i && (i.isEmpty() || n.add(i))
        }
        return this._factory.buildGeometry(n)
    }
    ,
    Kf.prototype.transformMultiPolygon = function(t, e) {
        for (var n = new lc, r = 0; r < t.getNumGeometries(); r++) {
            var i = this.transformPolygon(t.getGeometryN(r), t);
            null !== i && (i.isEmpty() || n.add(i))
        }
        return this._factory.buildGeometry(n)
    }
    ,
    Kf.prototype.copy = function(t) {
        return t.copy()
    }
    ,
    Kf.prototype.transformGeometryCollection = function(t, e) {
        for (var n = new lc, r = 0; r < t.getNumGeometries(); r++) {
            var i = this.transform(t.getGeometryN(r));
            null !== i && (this._pruneEmptyGeometry && i.isEmpty() || n.add(i))
        }
        return this._preserveGeometryCollectionType ? this._factory.createGeometryCollection(_h.toGeometryArray(n)) : this._factory.buildGeometry(n)
    }
    ,
    Kf.prototype.transform = function(t) {
        if (this._inputGeom = t,
        this._factory = t.getFactory(),
        t instanceof Qc)
            return this.transformPoint(t, null);
        if (t instanceof eh)
            return this.transformMultiPoint(t, null);
        if (t instanceof nh)
            return this.transformLinearRing(t, null);
        if (t instanceof Zc)
            return this.transformLineString(t, null);
        if (t instanceof Gc)
            return this.transformMultiLineString(t, null);
        if (t instanceof th)
            return this.transformPolygon(t, null);
        if (t instanceof rh)
            return this.transformMultiPolygon(t, null);
        if (t instanceof kc)
            return this.transformGeometryCollection(t, null);
        throw new el("Unknown Geometry subtype: " + t.getClass().getName())
    }
    ,
    Kf.prototype.transformLinearRing = function(t, e) {
        var n = this.transformCoordinates(t.getCoordinateSequence(), t);
        if (null === n)
            return this._factory.createLinearRing(null);
        var r = n.size();
        return r > 0 && r < 4 && !this._preserveType ? this._factory.createLineString(n) : this._factory.createLinearRing(n)
    }
    ,
    Kf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Kf.prototype.getClass = function() {
        return Kf
    }
    ;
    var Qf = function t() {
        if (this._snapTolerance = 0,
        this._srcPts = null,
        this._seg = new vp,
        this._allowSnappingToSourceVertices = !1,
        this._isClosed = !1,
        arguments[0]instanceof Zc && "number" == typeof arguments[1]) {
            var e = arguments[0]
              , n = arguments[1];
            t.call(this, e.getCoordinates(), n)
        } else if (arguments[0]instanceof Array && "number" == typeof arguments[1]) {
            var r = arguments[0]
              , i = arguments[1];
            this._srcPts = r,
            this._isClosed = t.isClosed(r),
            this._snapTolerance = i
        }
    };
    Qf.prototype.snapVertices = function(t, e) {
        for (var n = this._isClosed ? t.size() - 1 : t.size(), r = 0; r < n; r++) {
            var i = t.get(r)
              , o = this.findSnapForVertex(i, e);
            null !== o && (t.set(r, new ul(o)),
            0 === r && this._isClosed && t.set(t.size() - 1, new ul(o)))
        }
    }
    ,
    Qf.prototype.findSnapForVertex = function(t, e) {
        for (var n = 0; n < e.length; n++) {
            if (t.equals2D(e[n]))
                return null;
            if (t.distance(e[n]) < this._snapTolerance)
                return e[n]
        }
        return null
    }
    ,
    Qf.prototype.snapTo = function(t) {
        var e = new hc(this._srcPts);
        return this.snapVertices(e, t),
        this.snapSegments(e, t),
        e.toCoordinateArray()
    }
    ,
    Qf.prototype.snapSegments = function(t, e) {
        if (0 === e.length)
            return null;
        var n = e.length;
        e[0].equals2D(e[e.length - 1]) && (n = e.length - 1);
        for (var r = 0; r < n; r++) {
            var i = e[r]
              , o = this.findSegmentIndexToSnap(i, t);
            o >= 0 && t.add(o + 1, new ul(i), !1)
        }
    }
    ,
    Qf.prototype.findSegmentIndexToSnap = function(t, e) {
        for (var n = this, r = nl.MAX_VALUE, i = -1, o = 0; o < e.size() - 1; o++) {
            if (n._seg.p0 = e.get(o),
            n._seg.p1 = e.get(o + 1),
            n._seg.p0.equals2D(t) || n._seg.p1.equals2D(t)) {
                if (n._allowSnappingToSourceVertices)
                    continue;
                return -1
            }
            var s = n._seg.distance(t);
            s < n._snapTolerance && s < r && (r = s,
            i = o)
        }
        return i
    }
    ,
    Qf.prototype.setAllowSnappingToSourceVertices = function(t) {
        this._allowSnappingToSourceVertices = t
    }
    ,
    Qf.prototype.interfaces_ = function() {
        return []
    }
    ,
    Qf.prototype.getClass = function() {
        return Qf
    }
    ,
    Qf.isClosed = function(t) {
        return !(t.length <= 1) && t[0].equals2D(t[t.length - 1])
    }
    ;
    var $f = function(t) {
        this._srcGeom = t || null
    }
      , tg = {
        SNAP_PRECISION_FACTOR: {
            configurable: !0
        }
    };
    $f.prototype.snapTo = function(t, e) {
        var n = this.extractTargetCoordinates(t);
        return new eg(e,n).transform(this._srcGeom)
    }
    ,
    $f.prototype.snapToSelf = function(t, e) {
        var n = this.extractTargetCoordinates(this._srcGeom)
          , r = new eg(t,n,!0).transform(this._srcGeom)
          , i = r;
        return e && gl(i, $c) && (i = r.buffer(0)),
        i
    }
    ,
    $f.prototype.computeSnapTolerance = function(t) {
        return this.computeMinimumSegmentLength(t) / 10
    }
    ,
    $f.prototype.extractTargetCoordinates = function(t) {
        for (var e = new Lc, n = t.getCoordinates(), r = 0; r < n.length; r++)
            e.add(n[r]);
        return e.toArray(new Array(0).fill(null))
    }
    ,
    $f.prototype.computeMinimumSegmentLength = function(t) {
        for (var e = nl.MAX_VALUE, n = 0; n < t.length - 1; n++) {
            var r = t[n].distance(t[n + 1]);
            r < e && (e = r)
        }
        return e
    }
    ,
    $f.prototype.interfaces_ = function() {
        return []
    }
    ,
    $f.prototype.getClass = function() {
        return $f
    }
    ,
    $f.snap = function(t, e, n) {
        var r = new Array(2).fill(null)
          , i = new $f(t);
        r[0] = i.snapTo(e, n);
        var o = new $f(e);
        return r[1] = o.snapTo(r[0], n),
        r
    }
    ,
    $f.computeOverlaySnapTolerance = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = $f.computeSizeBasedSnapTolerance(t)
              , n = t.getPrecisionModel();
            if (n.getType() === gh.FIXED) {
                var r = 1 / n.getScale() * 2 / 1.415;
                r > e && (e = r)
            }
            return e
        }
        if (2 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1];
            return Math.min($f.computeOverlaySnapTolerance(i), $f.computeOverlaySnapTolerance(o))
        }
    }
    ,
    $f.computeSizeBasedSnapTolerance = function(t) {
        var e = t.getEnvelopeInternal();
        return Math.min(e.getHeight(), e.getWidth()) * $f.SNAP_PRECISION_FACTOR
    }
    ,
    $f.snapToSelf = function(t, e, n) {
        return new $f(t).snapToSelf(e, n)
    }
    ,
    tg.SNAP_PRECISION_FACTOR.get = function() {
        return 1e-9
    }
    ,
    Object.defineProperties($f, tg);
    var eg = function(t) {
        function e(e, n, r) {
            t.call(this),
            this._snapTolerance = e || null,
            this._snapPts = n || null,
            this._isSelfSnap = void 0 !== r && r
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.snapLine = function(t, e) {
            var n = new Qf(t,this._snapTolerance);
            return n.setAllowSnappingToSourceVertices(this._isSelfSnap),
            n.snapTo(e)
        }
        ,
        e.prototype.transformCoordinates = function(t, e) {
            var n = t.toCoordinateArray()
              , r = this.snapLine(n, this._snapPts);
            return this._factory.getCoordinateSequenceFactory().create(r)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(Kf)
      , ng = function() {
        this._isFirst = !0,
        this._commonMantissaBitsCount = 53,
        this._commonBits = 0,
        this._commonSignExp = null
    };
    ng.prototype.getCommon = function() {
        return nl.longBitsToDouble(this._commonBits)
    }
    ,
    ng.prototype.add = function(t) {
        var e = nl.doubleToLongBits(t);
        return this._isFirst ? (this._commonBits = e,
        this._commonSignExp = ng.signExpBits(this._commonBits),
        this._isFirst = !1,
        null) : ng.signExpBits(e) !== this._commonSignExp ? (this._commonBits = 0,
        null) : (this._commonMantissaBitsCount = ng.numCommonMostSigMantissaBits(this._commonBits, e),
        void (this._commonBits = ng.zeroLowerBits(this._commonBits, 64 - (12 + this._commonMantissaBitsCount))))
    }
    ,
    ng.prototype.toString = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = nl.longBitsToDouble(t)
              , n = nl.toBinaryString(t)
              , r = "0000000000000000000000000000000000000000000000000000000000000000" + n
              , i = r.substring(r.length - 64)
              , o = i.substring(0, 1) + "  " + i.substring(1, 12) + "(exp) " + i.substring(12) + " [ " + e + " ]";
            return o
        }
    }
    ,
    ng.prototype.interfaces_ = function() {
        return []
    }
    ,
    ng.prototype.getClass = function() {
        return ng
    }
    ,
    ng.getBit = function(t, e) {
        return 0 != (t & 1 << e) ? 1 : 0
    }
    ,
    ng.signExpBits = function(t) {
        return t >> 52
    }
    ,
    ng.zeroLowerBits = function(t, e) {
        return t & ~((1 << e) - 1)
    }
    ,
    ng.numCommonMostSigMantissaBits = function(t, e) {
        for (var n = 0, r = 52; r >= 0; r--) {
            if (ng.getBit(t, r) !== ng.getBit(e, r))
                return n;
            n++
        }
        return 52
    }
    ;
    var rg = function() {
        this._commonCoord = null,
        this._ccFilter = new og
    }
      , ig = {
        CommonCoordinateFilter: {
            configurable: !0
        },
        Translater: {
            configurable: !0
        }
    };
    rg.prototype.addCommonBits = function(t) {
        var e = new sg(this._commonCoord);
        t.apply(e),
        t.geometryChanged()
    }
    ,
    rg.prototype.removeCommonBits = function(t) {
        if (0 === this._commonCoord.x && 0 === this._commonCoord.y)
            return t;
        var e = new ul(this._commonCoord);
        e.x = -e.x,
        e.y = -e.y;
        var n = new sg(e);
        return t.apply(n),
        t.geometryChanged(),
        t
    }
    ,
    rg.prototype.getCommonCoordinate = function() {
        return this._commonCoord
    }
    ,
    rg.prototype.add = function(t) {
        t.apply(this._ccFilter),
        this._commonCoord = this._ccFilter.getCommonCoordinate()
    }
    ,
    rg.prototype.interfaces_ = function() {
        return []
    }
    ,
    rg.prototype.getClass = function() {
        return rg
    }
    ,
    ig.CommonCoordinateFilter.get = function() {
        return og
    }
    ,
    ig.Translater.get = function() {
        return sg
    }
    ,
    Object.defineProperties(rg, ig);
    var og = function() {
        this._commonBitsX = new ng,
        this._commonBitsY = new ng
    };
    og.prototype.filter = function(t) {
        this._commonBitsX.add(t.x),
        this._commonBitsY.add(t.y)
    }
    ,
    og.prototype.getCommonCoordinate = function() {
        return new ul(this._commonBitsX.getCommon(),this._commonBitsY.getCommon())
    }
    ,
    og.prototype.interfaces_ = function() {
        return [Kl]
    }
    ,
    og.prototype.getClass = function() {
        return og
    }
    ;
    var sg = function() {
        this.trans = null;
        var t = arguments[0];
        this.trans = t
    };
    sg.prototype.filter = function(t, e) {
        var n = t.getOrdinate(e, 0) + this.trans.x
          , r = t.getOrdinate(e, 1) + this.trans.y;
        t.setOrdinate(e, 0, n),
        t.setOrdinate(e, 1, r)
    }
    ,
    sg.prototype.isDone = function() {
        return !1
    }
    ,
    sg.prototype.isGeometryChanged = function() {
        return !0
    }
    ,
    sg.prototype.interfaces_ = function() {
        return [Fc]
    }
    ,
    sg.prototype.getClass = function() {
        return sg
    }
    ;
    var ag = function(t, e) {
        this._geom = new Array(2).fill(null),
        this._snapTolerance = null,
        this._cbr = null,
        this._geom[0] = t,
        this._geom[1] = e,
        this.computeSnapTolerance()
    };
    ag.prototype.selfSnap = function(t) {
        return new $f(t).snapTo(t, this._snapTolerance)
    }
    ,
    ag.prototype.removeCommonBits = function(t) {
        this._cbr = new rg,
        this._cbr.add(t[0]),
        this._cbr.add(t[1]);
        var e = new Array(2).fill(null);
        return e[0] = this._cbr.removeCommonBits(t[0].copy()),
        e[1] = this._cbr.removeCommonBits(t[1].copy()),
        e
    }
    ,
    ag.prototype.prepareResult = function(t) {
        return this._cbr.addCommonBits(t),
        t
    }
    ,
    ag.prototype.getResultGeometry = function(t) {
        var e = this.snap(this._geom)
          , n = Mg.overlayOp(e[0], e[1], t);
        return this.prepareResult(n)
    }
    ,
    ag.prototype.checkValid = function(t) {
        t.isValid() || Pl.out.println("Snapped geometry is invalid")
    }
    ,
    ag.prototype.computeSnapTolerance = function() {
        this._snapTolerance = $f.computeOverlaySnapTolerance(this._geom[0], this._geom[1])
    }
    ,
    ag.prototype.snap = function(t) {
        var e = this.removeCommonBits(t);
        return $f.snap(e[0], e[1], this._snapTolerance)
    }
    ,
    ag.prototype.interfaces_ = function() {
        return []
    }
    ,
    ag.prototype.getClass = function() {
        return ag
    }
    ,
    ag.overlayOp = function(t, e, n) {
        return new ag(t,e).getResultGeometry(n)
    }
    ,
    ag.union = function(t, e) {
        return ag.overlayOp(t, e, Mg.UNION)
    }
    ,
    ag.intersection = function(t, e) {
        return ag.overlayOp(t, e, Mg.INTERSECTION)
    }
    ,
    ag.symDifference = function(t, e) {
        return ag.overlayOp(t, e, Mg.SYMDIFFERENCE)
    }
    ,
    ag.difference = function(t, e) {
        return ag.overlayOp(t, e, Mg.DIFFERENCE)
    }
    ;
    var ug = function(t, e) {
        this._geom = new Array(2).fill(null),
        this._geom[0] = t,
        this._geom[1] = e
    };
    ug.prototype.getResultGeometry = function(t) {
        var e = null
          , n = !1
          , r = null;
        try {
            e = Mg.overlayOp(this._geom[0], this._geom[1], t);
            n = !0
        } catch (t) {
            if (!(t instanceof kl))
                throw t;
            r = t
        }
        if (!n)
            try {
                e = ag.overlayOp(this._geom[0], this._geom[1], t)
            } catch (t) {
                throw t instanceof kl ? r : t
            }
        return e
    }
    ,
    ug.prototype.interfaces_ = function() {
        return []
    }
    ,
    ug.prototype.getClass = function() {
        return ug
    }
    ,
    ug.overlayOp = function(t, e, n) {
        return new ug(t,e).getResultGeometry(n)
    }
    ,
    ug.union = function(t, e) {
        return ug.overlayOp(t, e, Mg.UNION)
    }
    ,
    ug.intersection = function(t, e) {
        return ug.overlayOp(t, e, Mg.INTERSECTION)
    }
    ,
    ug.symDifference = function(t, e) {
        return ug.overlayOp(t, e, Mg.SYMDIFFERENCE)
    }
    ,
    ug.difference = function(t, e) {
        return ug.overlayOp(t, e, Mg.DIFFERENCE)
    }
    ;
    var lg = function() {
        this.mce = null,
        this.chainIndex = null;
        var t = arguments[0]
          , e = arguments[1];
        this.mce = t,
        this.chainIndex = e
    };
    lg.prototype.computeIntersections = function(t, e) {
        this.mce.computeIntersectsForChain(this.chainIndex, t.mce, t.chainIndex, e)
    }
    ,
    lg.prototype.interfaces_ = function() {
        return []
    }
    ,
    lg.prototype.getClass = function() {
        return lg
    }
    ;
    var cg = function t() {
        if (this._label = null,
        this._xValue = null,
        this._eventType = null,
        this._insertEvent = null,
        this._deleteEventIndex = null,
        this._obj = null,
        2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1];
            this._eventType = t.DELETE,
            this._xValue = e,
            this._insertEvent = n
        } else if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2];
            this._eventType = t.INSERT,
            this._label = r,
            this._xValue = i,
            this._obj = o
        }
    }
      , hg = {
        INSERT: {
            configurable: !0
        },
        DELETE: {
            configurable: !0
        }
    };
    cg.prototype.isDelete = function() {
        return this._eventType === cg.DELETE
    }
    ,
    cg.prototype.setDeleteEventIndex = function(t) {
        this._deleteEventIndex = t
    }
    ,
    cg.prototype.getObject = function() {
        return this._obj
    }
    ,
    cg.prototype.compareTo = function(t) {
        var e = t;
        return this._xValue < e._xValue ? -1 : this._xValue > e._xValue ? 1 : this._eventType < e._eventType ? -1 : this._eventType > e._eventType ? 1 : 0
    }
    ,
    cg.prototype.getInsertEvent = function() {
        return this._insertEvent
    }
    ,
    cg.prototype.isInsert = function() {
        return this._eventType === cg.INSERT
    }
    ,
    cg.prototype.isSameLabel = function(t) {
        return null !== this._label && this._label === t._label
    }
    ,
    cg.prototype.getDeleteEventIndex = function() {
        return this._deleteEventIndex
    }
    ,
    cg.prototype.interfaces_ = function() {
        return [il]
    }
    ,
    cg.prototype.getClass = function() {
        return cg
    }
    ,
    hg.INSERT.get = function() {
        return 1
    }
    ,
    hg.DELETE.get = function() {
        return 2
    }
    ,
    Object.defineProperties(cg, hg);
    var pg = function() {};
    pg.prototype.interfaces_ = function() {
        return []
    }
    ,
    pg.prototype.getClass = function() {
        return pg
    }
    ;
    var fg = function() {
        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;
        var t = arguments[0]
          , e = arguments[1]
          , n = arguments[2];
        this._li = t,
        this._includeProper = e,
        this._recordIsolated = n
    };
    fg.prototype.isTrivialIntersection = function(t, e, n, r) {
        if (t === n && 1 === this._li.getIntersectionNum()) {
            if (fg.isAdjacentSegments(e, r))
                return !0;
            if (t.isClosed()) {
                var i = t.getNumPoints() - 1;
                if (0 === e && r === i || 0 === r && e === i)
                    return !0
            }
        }
        return !1
    }
    ,
    fg.prototype.getProperIntersectionPoint = function() {
        return this._properIntersectionPoint
    }
    ,
    fg.prototype.setIsDoneIfProperInt = function(t) {
        this._isDoneWhenProperInt = t
    }
    ,
    fg.prototype.hasProperInteriorIntersection = function() {
        return this._hasProperInterior
    }
    ,
    fg.prototype.isBoundaryPointInternal = function(t, e) {
        for (var n = e.iterator(); n.hasNext(); ) {
            var r = n.next().getCoordinate();
            if (t.isIntersection(r))
                return !0
        }
        return !1
    }
    ,
    fg.prototype.hasProperIntersection = function() {
        return this._hasProper
    }
    ,
    fg.prototype.hasIntersection = function() {
        return this._hasIntersection
    }
    ,
    fg.prototype.isDone = function() {
        return this._isDone
    }
    ,
    fg.prototype.isBoundaryPoint = function(t, e) {
        return null !== e && (!!this.isBoundaryPointInternal(t, e[0]) || !!this.isBoundaryPointInternal(t, e[1]))
    }
    ,
    fg.prototype.setBoundaryNodes = function(t, e) {
        this._bdyNodes = new Array(2).fill(null),
        this._bdyNodes[0] = t,
        this._bdyNodes[1] = e
    }
    ,
    fg.prototype.addIntersections = function(t, e, n, r) {
        if (t === n && e === r)
            return null;
        this.numTests++;
        var i = t.getCoordinates()[e]
          , o = t.getCoordinates()[e + 1]
          , s = n.getCoordinates()[r]
          , a = n.getCoordinates()[r + 1];
        this._li.computeIntersection(i, o, s, a),
        this._li.hasIntersection() && (this._recordIsolated && (t.setIsolated(!1),
        n.setIsolated(!1)),
        this._numIntersections++,
        this.isTrivialIntersection(t, e, n, r) || (this._hasIntersection = !0,
        !this._includeProper && this._li.isProper() || (t.addIntersections(this._li, e, 0),
        n.addIntersections(this._li, r, 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))))
    }
    ,
    fg.prototype.interfaces_ = function() {
        return []
    }
    ,
    fg.prototype.getClass = function() {
        return fg
    }
    ,
    fg.isAdjacentSegments = function(t, e) {
        return 1 === Math.abs(t - e)
    }
    ;
    var gg = function(t) {
        function e() {
            t.call(this),
            this.events = new lc,
            this.nOverlaps = null
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.prepareEvents = function() {
            np.sort(this.events);
            for (var t = 0; t < this.events.size(); t++) {
                var e = this.events.get(t);
                e.isDelete() && e.getInsertEvent().setDeleteEventIndex(t)
            }
        }
        ,
        e.prototype.computeIntersections = function() {
            var t = this;
            if (1 === arguments.length) {
                var e = arguments[0];
                this.nOverlaps = 0,
                this.prepareEvents();
                for (var n = 0; n < this.events.size(); n++) {
                    var r = t.events.get(n);
                    if (r.isInsert() && t.processOverlaps(n, r.getDeleteEventIndex(), r, e),
                    e.isDone())
                        break
                }
            } else if (3 === arguments.length)
                if (arguments[2]instanceof fg && gl(arguments[0], ac) && gl(arguments[1], ac)) {
                    var i = arguments[0]
                      , o = arguments[1]
                      , s = arguments[2];
                    this.addEdges(i, i),
                    this.addEdges(o, o),
                    this.computeIntersections(s)
                } else if ("boolean" == typeof arguments[2] && gl(arguments[0], ac) && arguments[1]instanceof fg) {
                    var a = arguments[0]
                      , u = arguments[1]
                      , l = arguments[2];
                    l ? this.addEdges(a, null) : this.addEdges(a),
                    this.computeIntersections(u)
                }
        }
        ,
        e.prototype.addEdge = function(t, e) {
            for (var n = t.getMonotoneChainEdge(), r = n.getStartIndexes(), i = 0; i < r.length - 1; i++) {
                var o = new lg(n,i)
                  , s = new cg(e,n.getMinX(i),o);
                this.events.add(s),
                this.events.add(new cg(n.getMaxX(i),s))
            }
        }
        ,
        e.prototype.processOverlaps = function(t, e, n, r) {
            for (var i = n.getObject(), o = t; o < e; o++) {
                var s = this.events.get(o);
                if (s.isInsert()) {
                    var a = s.getObject();
                    n.isSameLabel(s) || (i.computeIntersections(a, r),
                    this.nOverlaps++)
                }
            }
        }
        ,
        e.prototype.addEdges = function() {
            var t = this;
            if (1 === arguments.length)
                for (var e = arguments[0], n = e.iterator(); n.hasNext(); ) {
                    var r = n.next();
                    t.addEdge(r, r)
                }
            else if (2 === arguments.length)
                for (var i = arguments[0], o = arguments[1], s = i.iterator(); s.hasNext(); ) {
                    var a = s.next();
                    t.addEdge(a, o)
                }
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(pg)
      , dg = function() {
        this._min = nl.POSITIVE_INFINITY,
        this._max = nl.NEGATIVE_INFINITY
    }
      , yg = {
        NodeComparator: {
            configurable: !0
        }
    };
    dg.prototype.getMin = function() {
        return this._min
    }
    ,
    dg.prototype.intersects = function(t, e) {
        return !(this._min > e || this._max < t)
    }
    ,
    dg.prototype.getMax = function() {
        return this._max
    }
    ,
    dg.prototype.toString = function() {
        return Fl.toLineString(new ul(this._min,0), new ul(this._max,0))
    }
    ,
    dg.prototype.interfaces_ = function() {
        return []
    }
    ,
    dg.prototype.getClass = function() {
        return dg
    }
    ,
    yg.NodeComparator.get = function() {
        return vg
    }
    ,
    Object.defineProperties(dg, yg);
    var vg = function() {};
    vg.prototype.compare = function(t, e) {
        var n = t
          , r = e
          , i = (n._min + n._max) / 2
          , o = (r._min + r._max) / 2;
        return i < o ? -1 : i > o ? 1 : 0
    }
    ,
    vg.prototype.interfaces_ = function() {
        return [sl]
    }
    ,
    vg.prototype.getClass = function() {
        return vg
    }
    ;
    var _g = function(t) {
        function e() {
            t.call(this),
            this._item = null;
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2];
            this._min = e,
            this._max = n,
            this._item = r
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.query = function(t, e, n) {
            if (!this.intersects(t, e))
                return null;
            n.visitItem(this._item)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(dg)
      , mg = function(t) {
        function e() {
            t.call(this),
            this._node1 = null,
            this._node2 = null;
            var e = arguments[0]
              , n = arguments[1];
            this._node1 = e,
            this._node2 = n,
            this.buildExtent(this._node1, this._node2)
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.buildExtent = function(t, e) {
            this._min = Math.min(t._min, e._min),
            this._max = Math.max(t._max, e._max)
        }
        ,
        e.prototype.query = function(t, e, n) {
            if (!this.intersects(t, e))
                return null;
            null !== this._node1 && this._node1.query(t, e, n),
            null !== this._node2 && this._node2.query(t, e, n)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(dg)
      , xg = function() {
        this._leaves = new lc,
        this._root = null,
        this._level = 0
    };
    xg.prototype.buildTree = function() {
        np.sort(this._leaves, new dg.NodeComparator);
        for (var t = this._leaves, e = null, n = new lc; ; ) {
            if (this.buildLevel(t, n),
            1 === n.size())
                return n.get(0);
            e = t,
            t = n,
            n = e
        }
    }
    ,
    xg.prototype.insert = function(t, e, n) {
        if (null !== this._root)
            throw new Error("Index cannot be added to once it has been queried");
        this._leaves.add(new _g(t,e,n))
    }
    ,
    xg.prototype.query = function(t, e, n) {
        this.init(),
        this._root.query(t, e, n)
    }
    ,
    xg.prototype.buildRoot = function() {
        if (null !== this._root)
            return null;
        this._root = this.buildTree()
    }
    ,
    xg.prototype.printNode = function(t) {
        Pl.out.println(Fl.toLineString(new ul(t._min,this._level), new ul(t._max,this._level)))
    }
    ,
    xg.prototype.init = function() {
        if (null !== this._root)
            return null;
        this.buildRoot()
    }
    ,
    xg.prototype.buildLevel = function(t, e) {
        this._level++,
        e.clear();
        for (var n = 0; n < t.size(); n += 2) {
            var r = t.get(n);
            if (null === (n + 1 < t.size() ? t.get(n) : null))
                e.add(r);
            else {
                var i = new mg(t.get(n),t.get(n + 1));
                e.add(i)
            }
        }
    }
    ,
    xg.prototype.interfaces_ = function() {
        return []
    }
    ,
    xg.prototype.getClass = function() {
        return xg
    }
    ;
    var Eg = function() {
        this._items = new lc
    };
    Eg.prototype.visitItem = function(t) {
        this._items.add(t)
    }
    ,
    Eg.prototype.getItems = function() {
        return this._items
    }
    ,
    Eg.prototype.interfaces_ = function() {
        return [Qh]
    }
    ,
    Eg.prototype.getClass = function() {
        return Eg
    }
    ;
    var bg = function() {
        this._index = null;
        var t = arguments[0];
        if (!gl(t, $c))
            throw new el("Argument must be Polygonal");
        this._index = new Ng(t)
    }
      , wg = {
        SegmentVisitor: {
            configurable: !0
        },
        IntervalIndexedGeometry: {
            configurable: !0
        }
    };
    bg.prototype.locate = function(t) {
        var e = new Vl(t)
          , n = new Ig(e);
        return this._index.query(t.y, t.y, n),
        e.getLocation()
    }
    ,
    bg.prototype.interfaces_ = function() {
        return [jp]
    }
    ,
    bg.prototype.getClass = function() {
        return bg
    }
    ,
    wg.SegmentVisitor.get = function() {
        return Ig
    }
    ,
    wg.IntervalIndexedGeometry.get = function() {
        return Ng
    }
    ,
    Object.defineProperties(bg, wg);
    var Ig = function() {
        this._counter = null;
        var t = arguments[0];
        this._counter = t
    };
    Ig.prototype.visitItem = function(t) {
        var e = t;
        this._counter.countSegment(e.getCoordinate(0), e.getCoordinate(1))
    }
    ,
    Ig.prototype.interfaces_ = function() {
        return [Qh]
    }
    ,
    Ig.prototype.getClass = function() {
        return Ig
    }
    ;
    var Ng = function() {
        this._index = new xg;
        var t = arguments[0];
        this.init(t)
    };
    Ng.prototype.init = function(t) {
        for (var e = Cf.getLines(t).iterator(); e.hasNext(); ) {
            var n = e.next().getCoordinates();
            this.addLine(n)
        }
    }
    ,
    Ng.prototype.addLine = function(t) {
        for (var e = 1; e < t.length; e++) {
            var n = new vp(t[e - 1],t[e])
              , r = Math.min(n.p0.y, n.p1.y)
              , i = Math.max(n.p0.y, n.p1.y);
            this._index.insert(r, i, n)
        }
    }
    ,
    Ng.prototype.query = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = new Eg;
            return this._index.query(t, e, n),
            n.getItems()
        }
        if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2];
            this._index.query(r, i, o)
        }
    }
    ,
    Ng.prototype.interfaces_ = function() {
        return []
    }
    ,
    Ng.prototype.getClass = function() {
        return Ng
    }
    ;
    var Sg = function(t) {
        function e() {
            if (t.call(this),
            this._parentGeom = null,
            this._lineEdgeMap = new fh,
            this._boundaryNodeRule = null,
            this._useBoundaryDeterminationRule = !0,
            this._argIndex = null,
            this._boundaryNodes = null,
            this._hasTooFewPoints = !1,
            this._invalidPoint = null,
            this._areaPtLocator = null,
            this._ptLocator = new Pf,
            2 === arguments.length) {
                var e = arguments[0]
                  , n = arguments[1]
                  , r = Ql.OGC_SFS_BOUNDARY_RULE;
                this._argIndex = e,
                this._parentGeom = n,
                this._boundaryNodeRule = r,
                null !== n && this.add(n)
            } else if (3 === arguments.length) {
                var i = arguments[0]
                  , o = arguments[1]
                  , s = arguments[2];
                this._argIndex = i,
                this._parentGeom = o,
                this._boundaryNodeRule = s,
                null !== o && this.add(o)
            }
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.insertBoundaryPoint = function(t, n) {
            var r = this._nodes.addNode(n).getLabel()
              , i = 1;
            r.getLocation(t, Sh.ON) === pl.BOUNDARY && i++;
            var o = e.determineBoundary(this._boundaryNodeRule, i);
            r.setLocation(t, o)
        }
        ,
        e.prototype.computeSelfNodes = function() {
            if (2 === arguments.length) {
                var t = arguments[0]
                  , e = arguments[1];
                return this.computeSelfNodes(t, e, !1)
            }
            if (3 === arguments.length) {
                var n = arguments[0]
                  , r = arguments[1]
                  , i = arguments[2]
                  , o = new fg(n,!0,!1);
                o.setIsDoneIfProperInt(i);
                var s = this.createEdgeSetIntersector()
                  , a = this._parentGeom instanceof nh || this._parentGeom instanceof th || this._parentGeom instanceof rh
                  , u = r || !a;
                return s.computeIntersections(this._edges, o, u),
                this.addSelfIntersectionNodes(this._argIndex),
                o
            }
        }
        ,
        e.prototype.computeSplitEdges = function(t) {
            for (var e = this._edges.iterator(); e.hasNext(); ) {
                e.next().eiList.addSplitEdges(t)
            }
        }
        ,
        e.prototype.computeEdgeIntersections = function(t, e, n) {
            var r = new fg(e,n,!0);
            return r.setBoundaryNodes(this.getBoundaryNodes(), t.getBoundaryNodes()),
            this.createEdgeSetIntersector().computeIntersections(this._edges, t._edges, r),
            r
        }
        ,
        e.prototype.getGeometry = function() {
            return this._parentGeom
        }
        ,
        e.prototype.getBoundaryNodeRule = function() {
            return this._boundaryNodeRule
        }
        ,
        e.prototype.hasTooFewPoints = function() {
            return this._hasTooFewPoints
        }
        ,
        e.prototype.addPoint = function() {
            if (arguments[0]instanceof Qc) {
                var t = arguments[0]
                  , e = t.getCoordinate();
                this.insertPoint(this._argIndex, e, pl.INTERIOR)
            } else if (arguments[0]instanceof ul) {
                var n = arguments[0];
                this.insertPoint(this._argIndex, n, pl.INTERIOR)
            }
        }
        ,
        e.prototype.addPolygon = function(t) {
            this.addPolygonRing(t.getExteriorRing(), pl.EXTERIOR, pl.INTERIOR);
            for (var e = 0; e < t.getNumInteriorRing(); e++) {
                var n = t.getInteriorRingN(e);
                this.addPolygonRing(n, pl.INTERIOR, pl.EXTERIOR)
            }
        }
        ,
        e.prototype.addEdge = function(t) {
            this.insertEdge(t);
            var e = t.getCoordinates();
            this.insertPoint(this._argIndex, e[0], pl.BOUNDARY),
            this.insertPoint(this._argIndex, e[e.length - 1], pl.BOUNDARY)
        }
        ,
        e.prototype.addLineString = function(t) {
            var e = pc.removeRepeatedPoints(t.getCoordinates());
            if (e.length < 2)
                return this._hasTooFewPoints = !0,
                this._invalidPoint = e[0],
                null;
            var n = new of(e,new Dh(this._argIndex,pl.INTERIOR));
            this._lineEdgeMap.put(t, n),
            this.insertEdge(n),
            ql.isTrue(e.length >= 2, "found LineString with single point"),
            this.insertBoundaryPoint(this._argIndex, e[0]),
            this.insertBoundaryPoint(this._argIndex, e[e.length - 1])
        }
        ,
        e.prototype.getInvalidPoint = function() {
            return this._invalidPoint
        }
        ,
        e.prototype.getBoundaryPoints = function() {
            for (var t = this.getBoundaryNodes(), e = new Array(t.size()).fill(null), n = 0, r = t.iterator(); r.hasNext(); ) {
                var i = r.next();
                e[n++] = i.getCoordinate().copy()
            }
            return e
        }
        ,
        e.prototype.getBoundaryNodes = function() {
            return null === this._boundaryNodes && (this._boundaryNodes = this._nodes.getBoundaryNodes(this._argIndex)),
            this._boundaryNodes
        }
        ,
        e.prototype.addSelfIntersectionNode = function(t, e, n) {
            if (this.isBoundaryNode(t, e))
                return null;
            n === pl.BOUNDARY && this._useBoundaryDeterminationRule ? this.insertBoundaryPoint(t, e) : this.insertPoint(t, e, n)
        }
        ,
        e.prototype.addPolygonRing = function(t, e, n) {
            if (t.isEmpty())
                return null;
            var r = pc.removeRepeatedPoints(t.getCoordinates());
            if (r.length < 4)
                return this._hasTooFewPoints = !0,
                this._invalidPoint = r[0],
                null;
            var i = e
              , o = n;
            Xl.isCCW(r) && (i = n,
            o = e);
            var s = new of(r,new Dh(this._argIndex,pl.BOUNDARY,i,o));
            this._lineEdgeMap.put(t, s),
            this.insertEdge(s),
            this.insertPoint(this._argIndex, r[0], pl.BOUNDARY)
        }
        ,
        e.prototype.insertPoint = function(t, e, n) {
            var r = this._nodes.addNode(e)
              , i = r.getLabel();
            null === i ? r._label = new Dh(t,n) : i.setLocation(t, n)
        }
        ,
        e.prototype.createEdgeSetIntersector = function() {
            return new gg
        }
        ,
        e.prototype.addSelfIntersectionNodes = function(t) {
            for (var e = this._edges.iterator(); e.hasNext(); )
                for (var n = e.next(), r = n.getLabel().getLocation(t), i = n.eiList.iterator(); i.hasNext(); ) {
                    var o = i.next();
                    this.addSelfIntersectionNode(t, o.coord, r)
                }
        }
        ,
        e.prototype.add = function() {
            if (1 !== arguments.length)
                return t.prototype.add.apply(this, arguments);
            var e = arguments[0];
            if (e.isEmpty())
                return null;
            if (e instanceof rh && (this._useBoundaryDeterminationRule = !1),
            e instanceof th)
                this.addPolygon(e);
            else if (e instanceof Zc)
                this.addLineString(e);
            else if (e instanceof Qc)
                this.addPoint(e);
            else if (e instanceof eh)
                this.addCollection(e);
            else if (e instanceof Gc)
                this.addCollection(e);
            else if (e instanceof rh)
                this.addCollection(e);
            else {
                if (!(e instanceof kc))
                    throw new Error(e.getClass().getName());
                this.addCollection(e)
            }
        }
        ,
        e.prototype.addCollection = function(t) {
            for (var e = 0; e < t.getNumGeometries(); e++) {
                var n = t.getGeometryN(e);
                this.add(n)
            }
        }
        ,
        e.prototype.locate = function(t) {
            return gl(this._parentGeom, $c) && this._parentGeom.getNumGeometries() > 50 ? (null === this._areaPtLocator && (this._areaPtLocator = new bg(this._parentGeom)),
            this._areaPtLocator.locate(t)) : this._ptLocator.locate(t, this._parentGeom)
        }
        ,
        e.prototype.findEdge = function() {
            if (1 === arguments.length) {
                var e = arguments[0];
                return this._lineEdgeMap.get(e)
            }
            return t.prototype.findEdge.apply(this, arguments)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e.determineBoundary = function(t, e) {
            return t.isInBoundary(e) ? pl.BOUNDARY : pl.INTERIOR
        }
        ,
        e
    }(Hh)
      , Cg = function() {
        if (this._li = new jl,
        this._resultPrecisionModel = null,
        this._arg = null,
        1 === arguments.length) {
            var t = arguments[0];
            this.setComputationPrecision(t.getPrecisionModel()),
            this._arg = new Array(1).fill(null),
            this._arg[0] = new Sg(0,t)
        } else if (2 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1]
              , r = Ql.OGC_SFS_BOUNDARY_RULE;
            e.getPrecisionModel().compareTo(n.getPrecisionModel()) >= 0 ? this.setComputationPrecision(e.getPrecisionModel()) : this.setComputationPrecision(n.getPrecisionModel()),
            this._arg = new Array(2).fill(null),
            this._arg[0] = new Sg(0,e,r),
            this._arg[1] = new Sg(1,n,r)
        } else if (3 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1]
              , s = arguments[2];
            i.getPrecisionModel().compareTo(o.getPrecisionModel()) >= 0 ? this.setComputationPrecision(i.getPrecisionModel()) : this.setComputationPrecision(o.getPrecisionModel()),
            this._arg = new Array(2).fill(null),
            this._arg[0] = new Sg(0,i,s),
            this._arg[1] = new Sg(1,o,s)
        }
    };
    Cg.prototype.getArgGeometry = function(t) {
        return this._arg[t].getGeometry()
    }
    ,
    Cg.prototype.setComputationPrecision = function(t) {
        this._resultPrecisionModel = t,
        this._li.setPrecisionModel(this._resultPrecisionModel)
    }
    ,
    Cg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Cg.prototype.getClass = function() {
        return Cg
    }
    ;
    var Pg = function() {};
    Pg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Pg.prototype.getClass = function() {
        return Pg
    }
    ,
    Pg.map = function() {
        if (arguments[0]instanceof Wl && gl(arguments[1], Pg.MapOp)) {
            for (var t = arguments[0], e = arguments[1], n = new lc, r = 0; r < t.getNumGeometries(); r++) {
                var i = e.map(t.getGeometryN(r));
                null !== i && n.add(i)
            }
            return t.getFactory().buildGeometry(n)
        }
        if (gl(arguments[0], ic) && gl(arguments[1], Pg.MapOp)) {
            for (var o = arguments[0], s = arguments[1], a = new lc, u = o.iterator(); u.hasNext(); ) {
                var l = u.next()
                  , c = s.map(l);
                null !== c && a.add(c)
            }
            return a
        }
    }
    ,
    Pg.MapOp = function() {}
    ;
    var Mg = function(t) {
        function e() {
            var e = arguments[0]
              , n = arguments[1];
            t.call(this, e, n),
            this._ptLocator = new Pf,
            this._geomFact = null,
            this._resultGeom = null,
            this._graph = null,
            this._edgeList = new Jp,
            this._resultPolyList = new lc,
            this._resultLineList = new lc,
            this._resultPointList = new lc,
            this._graph = new Hh(new Hp),
            this._geomFact = e.getFactory()
        }
        return t && (e.__proto__ = t),
        e.prototype = Object.create(t && t.prototype),
        e.prototype.constructor = e,
        e.prototype.insertUniqueEdge = function(t) {
            var e = this._edgeList.findEqualEdge(t);
            if (null !== e) {
                var n = e.getLabel()
                  , r = t.getLabel();
                e.isPointwiseEqual(t) || (r = new Dh(t.getLabel())).flip();
                var i = e.getDepth();
                i.isNull() && i.add(n),
                i.add(r),
                n.merge(r)
            } else
                this._edgeList.add(t)
        }
        ,
        e.prototype.getGraph = function() {
            return this._graph
        }
        ,
        e.prototype.cancelDuplicateResultEdges = function() {
            for (var t = this._graph.getEdgeEnds().iterator(); t.hasNext(); ) {
                var e = t.next()
                  , n = e.getSym();
                e.isInResult() && n.isInResult() && (e.setInResult(!1),
                n.setInResult(!1))
            }
        }
        ,
        e.prototype.isCoveredByLA = function(t) {
            return !!this.isCovered(t, this._resultLineList) || !!this.isCovered(t, this._resultPolyList)
        }
        ,
        e.prototype.computeGeometry = function(t, n, r, i) {
            var o = new lc;
            return o.addAll(t),
            o.addAll(n),
            o.addAll(r),
            o.isEmpty() ? e.createEmptyResult(i, this._arg[0].getGeometry(), this._arg[1].getGeometry(), this._geomFact) : this._geomFact.buildGeometry(o)
        }
        ,
        e.prototype.mergeSymLabels = function() {
            for (var t = this._graph.getNodes().iterator(); t.hasNext(); ) {
                t.next().getEdges().mergeSymLabels()
            }
        }
        ,
        e.prototype.isCovered = function(t, e) {
            for (var n = e.iterator(); n.hasNext(); ) {
                var r = n.next();
                if (this._ptLocator.locate(t, r) !== pl.EXTERIOR)
                    return !0
            }
            return !1
        }
        ,
        e.prototype.replaceCollapsedEdges = function() {
            for (var t = new lc, e = this._edgeList.iterator(); e.hasNext(); ) {
                var n = e.next();
                n.isCollapsed() && (e.remove(),
                t.add(n.getCollapsedEdge()))
            }
            this._edgeList.addAll(t)
        }
        ,
        e.prototype.updateNodeLabelling = function() {
            for (var t = this._graph.getNodes().iterator(); t.hasNext(); ) {
                var e = t.next()
                  , n = e.getEdges().getLabel();
                e.getLabel().merge(n)
            }
        }
        ,
        e.prototype.getResultGeometry = function(t) {
            return this.computeOverlay(t),
            this._resultGeom
        }
        ,
        e.prototype.insertUniqueEdges = function(t) {
            for (var e = t.iterator(); e.hasNext(); ) {
                var n = e.next();
                this.insertUniqueEdge(n)
            }
        }
        ,
        e.prototype.computeOverlay = function(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);
            var e = new lc;
            this._arg[0].computeSplitEdges(e),
            this._arg[1].computeSplitEdges(e),
            this.insertUniqueEdges(e),
            this.computeLabelsFromDepths(),
            this.replaceCollapsedEdges(),
            Hf.checkValid(this._edgeList.getEdges()),
            this._graph.addEdges(this._edgeList.getEdges()),
            this.computeLabelling(),
            this.labelIncompleteNodes(),
            this.findResultAreaEdges(t),
            this.cancelDuplicateResultEdges();
            var n = new Wh(this._geomFact);
            n.add(this._graph),
            this._resultPolyList = n.getPolygons();
            var r = new Jf(this,this._geomFact,this._ptLocator);
            this._resultLineList = r.build(t);
            var i = new Zf(this,this._geomFact,this._ptLocator);
            this._resultPointList = i.build(t),
            this._resultGeom = this.computeGeometry(this._resultPointList, this._resultLineList, this._resultPolyList, t)
        }
        ,
        e.prototype.labelIncompleteNode = function(t, e) {
            var n = this._ptLocator.locate(t.getCoordinate(), this._arg[e].getGeometry());
            t.getLabel().setLocation(e, n)
        }
        ,
        e.prototype.copyPoints = function(t) {
            for (var e = this._arg[t].getNodeIterator(); e.hasNext(); ) {
                var n = e.next();
                this._graph.addNode(n.getCoordinate()).setLabel(t, n.getLabel().getLocation(t))
            }
        }
        ,
        e.prototype.findResultAreaEdges = function(t) {
            for (var n = this._graph.getEdgeEnds().iterator(); n.hasNext(); ) {
                var r = n.next()
                  , i = r.getLabel();
                i.isArea() && !r.isInteriorAreaEdge() && e.isResultOfOp(i.getLocation(0, Sh.RIGHT), i.getLocation(1, Sh.RIGHT), t) && r.setInResult(!0)
            }
        }
        ,
        e.prototype.computeLabelsFromDepths = function() {
            for (var t = this._edgeList.iterator(); t.hasNext(); ) {
                var e = t.next()
                  , n = e.getLabel()
                  , r = e.getDepth();
                if (!r.isNull()) {
                    r.normalize();
                    for (var i = 0; i < 2; i++)
                        n.isNull(i) || !n.isArea() || r.isNull(i) || (0 === r.getDelta(i) ? n.toLine(i) : (ql.isTrue(!r.isNull(i, Sh.LEFT), "depth of LEFT side has not been initialized"),
                        n.setLocation(i, Sh.LEFT, r.getLocation(i, Sh.LEFT)),
                        ql.isTrue(!r.isNull(i, Sh.RIGHT), "depth of RIGHT side has not been initialized"),
                        n.setLocation(i, Sh.RIGHT, r.getLocation(i, Sh.RIGHT))))
                }
            }
        }
        ,
        e.prototype.computeLabelling = function() {
            for (var t = this._graph.getNodes().iterator(); t.hasNext(); ) {
                t.next().getEdges().computeLabelling(this._arg)
            }
            this.mergeSymLabels(),
            this.updateNodeLabelling()
        }
        ,
        e.prototype.labelIncompleteNodes = function() {
            for (var t = this._graph.getNodes().iterator(); t.hasNext(); ) {
                var e = t.next()
                  , n = e.getLabel();
                e.isIsolated() && (n.isNull(0) ? this.labelIncompleteNode(e, 0) : this.labelIncompleteNode(e, 1)),
                e.getEdges().updateLabelling(n)
            }
        }
        ,
        e.prototype.isCoveredByA = function(t) {
            return !!this.isCovered(t, this._resultPolyList)
        }
        ,
        e.prototype.interfaces_ = function() {
            return []
        }
        ,
        e.prototype.getClass = function() {
            return e
        }
        ,
        e
    }(Cg);
    Mg.overlayOp = function(t, e, n) {
        return new Mg(t,e).getResultGeometry(n)
    }
    ,
    Mg.intersection = function(t, e) {
        if (t.isEmpty() || e.isEmpty())
            return Mg.createEmptyResult(Mg.INTERSECTION, t, e, t.getFactory());
        if (t.isGeometryCollection()) {
            var n = e;
            return Wf.map(t, {
                interfaces_: function() {
                    return [Pg.MapOp]
                },
                map: function(t) {
                    return t.intersection(n)
                }
            })
        }
        return t.checkNotGeometryCollection(t),
        t.checkNotGeometryCollection(e),
        ug.overlayOp(t, e, Mg.INTERSECTION)
    }
    ,
    Mg.symDifference = function(t, e) {
        if (t.isEmpty() || e.isEmpty()) {
            if (t.isEmpty() && e.isEmpty())
                return Mg.createEmptyResult(Mg.SYMDIFFERENCE, t, e, t.getFactory());
            if (t.isEmpty())
                return e.copy();
            if (e.isEmpty())
                return t.copy()
        }
        return t.checkNotGeometryCollection(t),
        t.checkNotGeometryCollection(e),
        ug.overlayOp(t, e, Mg.SYMDIFFERENCE)
    }
    ,
    Mg.resultDimension = function(t, e, n) {
        var r = e.getDimension()
          , i = n.getDimension()
          , o = -1;
        switch (t) {
        case Mg.INTERSECTION:
            o = Math.min(r, i);
            break;
        case Mg.UNION:
            o = Math.max(r, i);
            break;
        case Mg.DIFFERENCE:
            o = r;
            break;
        case Mg.SYMDIFFERENCE:
            o = Math.max(r, i)
        }
        return o
    }
    ,
    Mg.createEmptyResult = function(t, e, n, r) {
        var i = null;
        switch (Mg.resultDimension(t, e, n)) {
        case -1:
            i = r.createGeometryCollection(new Array(0).fill(null));
            break;
        case 0:
            i = r.createPoint();
            break;
        case 1:
            i = r.createLineString();
            break;
        case 2:
            i = r.createPolygon()
        }
        return i
    }
    ,
    Mg.difference = function(t, e) {
        return t.isEmpty() ? Mg.createEmptyResult(Mg.DIFFERENCE, t, e, t.getFactory()) : e.isEmpty() ? t.copy() : (t.checkNotGeometryCollection(t),
        t.checkNotGeometryCollection(e),
        ug.overlayOp(t, e, Mg.DIFFERENCE))
    }
    ,
    Mg.isResultOfOp = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = t.getLocation(0)
              , r = t.getLocation(1);
            return Mg.isResultOfOp(n, r, e)
        }
        if (3 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1]
              , s = arguments[2];
            switch (i === pl.BOUNDARY && (i = pl.INTERIOR),
            o === pl.BOUNDARY && (o = pl.INTERIOR),
            s) {
            case Mg.INTERSECTION:
                return i === pl.INTERIOR && o === pl.INTERIOR;
            case Mg.UNION:
                return i === pl.INTERIOR || o === pl.INTERIOR;
            case Mg.DIFFERENCE:
                return i === pl.INTERIOR && o !== pl.INTERIOR;
            case Mg.SYMDIFFERENCE:
                return i === pl.INTERIOR && o !== pl.INTERIOR || i !== pl.INTERIOR && o === pl.INTERIOR
            }
            return !1
        }
    }
    ,
    Mg.INTERSECTION = 1,
    Mg.UNION = 2,
    Mg.DIFFERENCE = 3,
    Mg.SYMDIFFERENCE = 4;
    var Lg = function() {
        this._g = null,
        this._boundaryDistanceTolerance = null,
        this._linework = null,
        this._ptLocator = new Pf,
        this._seg = new vp;
        var t = arguments[0]
          , e = arguments[1];
        this._g = t,
        this._boundaryDistanceTolerance = e,
        this._linework = this.extractLinework(t)
    };
    Lg.prototype.isWithinToleranceOfBoundary = function(t) {
        for (var e = this, n = 0; n < this._linework.getNumGeometries(); n++)
            for (var r = e._linework.getGeometryN(n).getCoordinateSequence(), i = 0; i < r.size() - 1; i++) {
                if (r.getCoordinate(i, e._seg.p0),
                r.getCoordinate(i + 1, e._seg.p1),
                e._seg.distance(t) <= e._boundaryDistanceTolerance)
                    return !0
            }
        return !1
    }
    ,
    Lg.prototype.getLocation = function(t) {
        return this.isWithinToleranceOfBoundary(t) ? pl.BOUNDARY : this._ptLocator.locate(t, this._g)
    }
    ,
    Lg.prototype.extractLinework = function(t) {
        var e = new Og;
        t.apply(e);
        var n = e.getLinework()
          , r = _h.toLineStringArray(n);
        return t.getFactory().createMultiLineString(r)
    }
    ,
    Lg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Lg.prototype.getClass = function() {
        return Lg
    }
    ;
    var Og = function() {
        this._linework = null,
        this._linework = new lc
    };
    Og.prototype.getLinework = function() {
        return this._linework
    }
    ,
    Og.prototype.filter = function(t) {
        if (t instanceof th) {
            var e = t;
            this._linework.add(e.getExteriorRing());
            for (var n = 0; n < e.getNumInteriorRing(); n++)
                this._linework.add(e.getInteriorRingN(n))
        }
    }
    ,
    Og.prototype.interfaces_ = function() {
        return [Dc]
    }
    ,
    Og.prototype.getClass = function() {
        return Og
    }
    ;
    var Rg = function() {
        this._g = null,
        this._doLeft = !0,
        this._doRight = !0;
        var t = arguments[0];
        this._g = t
    };
    Rg.prototype.extractPoints = function(t, e, n) {
        for (var r = t.getCoordinates(), i = 0; i < r.length - 1; i++)
            this.computeOffsetPoints(r[i], r[i + 1], e, n)
    }
    ,
    Rg.prototype.setSidesToGenerate = function(t, e) {
        this._doLeft = t,
        this._doRight = e
    }
    ,
    Rg.prototype.getPoints = function(t) {
        for (var e = new lc, n = Cf.getLines(this._g).iterator(); n.hasNext(); ) {
            var r = n.next();
            this.extractPoints(r, t, e)
        }
        return e
    }
    ,
    Rg.prototype.computeOffsetPoints = function(t, e, n, r) {
        var i = e.x - t.x
          , o = e.y - t.y
          , s = Math.sqrt(i * i + o * o)
          , a = n * i / s
          , u = n * o / s
          , l = (e.x + t.x) / 2
          , c = (e.y + t.y) / 2;
        if (this._doLeft) {
            var h = new ul(l - u,c + a);
            r.add(h)
        }
        if (this._doRight) {
            var p = new ul(l + u,c - a);
            r.add(p)
        }
    }
    ,
    Rg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Rg.prototype.getClass = function() {
        return Rg
    }
    ;
    var Tg = function t() {
        this._geom = null,
        this._locFinder = null,
        this._location = new Array(3).fill(null),
        this._invalidLocation = null,
        this._boundaryDistanceTolerance = t.TOLERANCE,
        this._testCoords = new lc;
        var e = arguments[0]
          , n = arguments[1]
          , r = arguments[2];
        this._boundaryDistanceTolerance = t.computeBoundaryDistanceTolerance(e, n),
        this._geom = [e, n, r],
        this._locFinder = [new Lg(this._geom[0],this._boundaryDistanceTolerance), new Lg(this._geom[1],this._boundaryDistanceTolerance), new Lg(this._geom[2],this._boundaryDistanceTolerance)]
    }
      , Ag = {
        TOLERANCE: {
            configurable: !0
        }
    };
    Tg.prototype.reportResult = function(t, e, n) {
        Pl.out.println("Overlay result invalid - A:" + pl.toLocationSymbol(e[0]) + " B:" + pl.toLocationSymbol(e[1]) + " expected:" + (n ? "i" : "e") + " actual:" + pl.toLocationSymbol(e[2]))
    }
    ,
    Tg.prototype.isValid = function(t) {
        this.addTestPts(this._geom[0]),
        this.addTestPts(this._geom[1]);
        var e = this.checkValid(t);
        return e
    }
    ,
    Tg.prototype.checkValid = function() {
        var t = this;
        if (1 === arguments.length) {
            for (var e = arguments[0], n = 0; n < this._testCoords.size(); n++) {
                var r = t._testCoords.get(n);
                if (!t.checkValid(e, r))
                    return t._invalidLocation = r,
                    !1
            }
            return !0
        }
        if (2 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1];
            return this._location[0] = this._locFinder[0].getLocation(o),
            this._location[1] = this._locFinder[1].getLocation(o),
            this._location[2] = this._locFinder[2].getLocation(o),
            !!Tg.hasLocation(this._location, pl.BOUNDARY) || this.isValidResult(i, this._location)
        }
    }
    ,
    Tg.prototype.addTestPts = function(t) {
        var e = new Rg(t);
        this._testCoords.addAll(e.getPoints(5 * this._boundaryDistanceTolerance))
    }
    ,
    Tg.prototype.isValidResult = function(t, e) {
        var n = Mg.isResultOfOp(e[0], e[1], t)
          , r = !(n ^ e[2] === pl.INTERIOR);
        return r || this.reportResult(t, e, n),
        r
    }
    ,
    Tg.prototype.getInvalidLocation = function() {
        return this._invalidLocation
    }
    ,
    Tg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Tg.prototype.getClass = function() {
        return Tg
    }
    ,
    Tg.hasLocation = function(t, e) {
        for (var n = 0; n < 3; n++)
            if (t[n] === e)
                return !0;
        return !1
    }
    ,
    Tg.computeBoundaryDistanceTolerance = function(t, e) {
        return Math.min($f.computeSizeBasedSnapTolerance(t), $f.computeSizeBasedSnapTolerance(e))
    }
    ,
    Tg.isValid = function(t, e, n, r) {
        return new Tg(t,e,r).isValid(n)
    }
    ,
    Ag.TOLERANCE.get = function() {
        return 1e-6
    }
    ,
    Object.defineProperties(Tg, Ag);
    var Dg = function t(e) {
        this._geomFactory = null,
        this._skipEmpty = !1,
        this._inputGeoms = null,
        this._geomFactory = t.extractFactory(e),
        this._inputGeoms = e
    };
    Dg.prototype.extractElements = function(t, e) {
        if (null === t)
            return null;
        for (var n = 0; n < t.getNumGeometries(); n++) {
            var r = t.getGeometryN(n);
            this._skipEmpty && r.isEmpty() || e.add(r)
        }
    }
    ,
    Dg.prototype.combine = function() {
        for (var t = new lc, e = this._inputGeoms.iterator(); e.hasNext(); ) {
            var n = e.next();
            this.extractElements(n, t)
        }
        return 0 === t.size() ? null !== this._geomFactory ? this._geomFactory.createGeometryCollection(null) : null : this._geomFactory.buildGeometry(t)
    }
    ,
    Dg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Dg.prototype.getClass = function() {
        return Dg
    }
    ,
    Dg.combine = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = new Dg(t);
            return e.combine()
        }
        if (2 === arguments.length) {
            var n = arguments[0]
              , r = arguments[1]
              , i = new Dg(Dg.createList(n, r));
            return i.combine()
        }
        if (3 === arguments.length) {
            var o = arguments[0]
              , s = arguments[1]
              , a = arguments[2]
              , u = new Dg(Dg.createList(o, s, a));
            return u.combine()
        }
    }
    ,
    Dg.extractFactory = function(t) {
        return t.isEmpty() ? null : t.iterator().next().getFactory()
    }
    ,
    Dg.createList = function() {
        if (2 === arguments.length) {
            var t = arguments[0]
              , e = arguments[1]
              , n = new lc;
            return n.add(t),
            n.add(e),
            n
        }
        if (3 === arguments.length) {
            var r = arguments[0]
              , i = arguments[1]
              , o = arguments[2]
              , s = new lc;
            return s.add(r),
            s.add(i),
            s.add(o),
            s
        }
    }
    ;
    var Fg = function() {
        this._inputPolys = null,
        this._geomFactory = null;
        var t = arguments[0];
        this._inputPolys = t,
        null === this._inputPolys && (this._inputPolys = new lc)
    }
      , kg = {
        STRTREE_NODE_CAPACITY: {
            configurable: !0
        }
    };
    Fg.prototype.reduceToGeometries = function(t) {
        for (var e = new lc, n = t.iterator(); n.hasNext(); ) {
            var r = n.next()
              , i = null;
            gl(r, ac) ? i = this.unionTree(r) : r instanceof Wl && (i = r),
            e.add(i)
        }
        return e
    }
    ,
    Fg.prototype.extractByEnvelope = function(t, e, n) {
        for (var r = new lc, i = 0; i < e.getNumGeometries(); i++) {
            var o = e.getGeometryN(i);
            o.getEnvelopeInternal().intersects(t) ? r.add(o) : n.add(o)
        }
        return this._geomFactory.buildGeometry(r)
    }
    ,
    Fg.prototype.unionOptimized = function(t, e) {
        var n = t.getEnvelopeInternal()
          , r = e.getEnvelopeInternal();
        if (!n.intersects(r))
            return Dg.combine(t, e);
        if (t.getNumGeometries() <= 1 && e.getNumGeometries() <= 1)
            return this.unionActual(t, e);
        var i = n.intersection(r);
        return this.unionUsingEnvelopeIntersection(t, e, i)
    }
    ,
    Fg.prototype.union = function() {
        if (null === this._inputPolys)
            throw new Error("union() method cannot be called twice");
        if (this._inputPolys.isEmpty())
            return null;
        this._geomFactory = this._inputPolys.iterator().next().getFactory();
        for (var t = new up(Fg.STRTREE_NODE_CAPACITY), e = this._inputPolys.iterator(); e.hasNext(); ) {
            var n = e.next();
            t.insert(n.getEnvelopeInternal(), n)
        }
        this._inputPolys = null;
        var r = t.itemsTree();
        return this.unionTree(r)
    }
    ,
    Fg.prototype.binaryUnion = function() {
        if (1 === arguments.length) {
            var t = arguments[0];
            return this.binaryUnion(t, 0, t.size())
        }
        if (3 === arguments.length) {
            var e = arguments[0]
              , n = arguments[1]
              , r = arguments[2];
            if (r - n <= 1) {
                var i = Fg.getGeometry(e, n);
                return this.unionSafe(i, null)
            }
            if (r - n == 2)
                return this.unionSafe(Fg.getGeometry(e, n), Fg.getGeometry(e, n + 1));
            var o = Math.trunc((r + n) / 2)
              , s = this.binaryUnion(e, n, o)
              , a = this.binaryUnion(e, o, r);
            return this.unionSafe(s, a)
        }
    }
    ,
    Fg.prototype.repeatedUnion = function(t) {
        for (var e = null, n = t.iterator(); n.hasNext(); ) {
            var r = n.next();
            e = null === e ? r.copy() : e.union(r)
        }
        return e
    }
    ,
    Fg.prototype.unionSafe = function(t, e) {
        return null === t && null === e ? null : null === t ? e.copy() : null === e ? t.copy() : this.unionOptimized(t, e)
    }
    ,
    Fg.prototype.unionActual = function(t, e) {
        return Fg.restrictToPolygons(t.union(e))
    }
    ,
    Fg.prototype.unionTree = function(t) {
        var e = this.reduceToGeometries(t);
        return this.binaryUnion(e)
    }
    ,
    Fg.prototype.unionUsingEnvelopeIntersection = function(t, e, n) {
        var r = new lc
          , i = this.extractByEnvelope(n, t, r)
          , o = this.extractByEnvelope(n, e, r)
          , s = this.unionActual(i, o);
        return r.add(s),
        Dg.combine(r)
    }
    ,
    Fg.prototype.bufferUnion = function() {
        if (1 === arguments.length) {
            var t = arguments[0]
              , e = t.get(0).getFactory()
              , n = e.buildGeometry(t)
              , r = n.buffer(0);
            return r
        }
        if (2 === arguments.length) {
            var i = arguments[0]
              , o = arguments[1]
              , s = i.getFactory()
              , a = s.createGeometryCollection([i, o])
              , u = a.buffer(0);
            return u
        }
    }
    ,
    Fg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Fg.prototype.getClass = function() {
        return Fg
    }
    ,
    Fg.restrictToPolygons = function(t) {
        if (gl(t, $c))
            return t;
        var e = Sf.getPolygons(t);
        return 1 === e.size() ? e.get(0) : t.getFactory().createMultiPolygon(_h.toPolygonArray(e))
    }
    ,
    Fg.getGeometry = function(t, e) {
        return e >= t.size() ? null : t.get(e)
    }
    ,
    Fg.union = function(t) {
        return new Fg(t).union()
    }
    ,
    kg.STRTREE_NODE_CAPACITY.get = function() {
        return 4
    }
    ,
    Object.defineProperties(Fg, kg);
    var Gg = function() {};
    function qg() {
        return new Bg
    }
    function Bg() {
        this.reset()
    }
    Gg.prototype.interfaces_ = function() {
        return []
    }
    ,
    Gg.prototype.getClass = function() {
        return Gg
    }
    ,
    Gg.union = function(t, e) {
        if (t.isEmpty() || e.isEmpty()) {
            if (t.isEmpty() && e.isEmpty())
                return Mg.createEmptyResult(Mg.UNION, t, e, t.getFactory());
            if (t.isEmpty())
                return e.copy();
            if (e.isEmpty())
                return t.copy()
        }
        return t.checkNotGeometryCollection(t),
        t.checkNotGeometryCollection(e),
        ug.overlayOp(t, e, Mg.UNION)
    }
    ,
    Bg.prototype = {
        constructor: Bg,
        reset: function() {
            this.s = this.t = 0
        },
        add: function(t) {
            jg(zg, t, this.t),
            jg(this, zg.s, this.s),
            this.s ? this.t += zg.t : this.s = zg.t
        },
        valueOf: function() {
            return this.s
        }
    };
    var zg = new Bg;
    function jg(t, e, n) {
        var r = t.s = e + n
          , i = r - e
          , o = r - i;
        t.t = e - o + (n - i)
    }
    var Ug = 1e-6
      , Vg = Math.PI
      , Xg = Vg / 2
      , Yg = Vg / 4
      , Hg = 2 * Vg
      , Wg = 180 / Vg
      , Jg = Vg / 180
      , Zg = Math.abs
      , Kg = Math.atan
      , Qg = Math.atan2
      , $g = Math.cos
      , td = Math.sin
      , ed = Math.sqrt;
    function nd(t) {
        return t > 1 ? 0 : t < -1 ? Vg : Math.acos(t)
    }
    function rd(t) {
        return t > 1 ? Xg : t < -1 ? -Xg : Math.asin(t)
    }
    function id() {}
    function od(t, e) {
        t && ad.hasOwnProperty(t.type) && ad[t.type](t, e)
    }
    var sd = {
        Feature: function(t, e) {
            od(t.geometry, e)
        },
        FeatureCollection: function(t, e) {
            for (var n = t.features, r = -1, i = n.length; ++r < i; )
                od(n[r].geometry, e)
        }
    }
      , ad = {
        Sphere: function(t, e) {
            e.sphere()
        },
        Point: function(t, e) {
            t = t.coordinates,
            e.point(t[0], t[1], t[2])
        },
        MultiPoint: function(t, e) {
            for (var n = t.coordinates, r = -1, i = n.length; ++r < i; )
                t = n[r],
                e.point(t[0], t[1], t[2])
        },
        LineString: function(t, e) {
            ud(t.coordinates, e, 0)
        },
        MultiLineString: function(t, e) {
            for (var n = t.coordinates, r = -1, i = n.length; ++r < i; )
                ud(n[r], e, 0)
        },
        Polygon: function(t, e) {
            ld(t.coordinates, e)
        },
        MultiPolygon: function(t, e) {
            for (var n = t.coordinates, r = -1, i = n.length; ++r < i; )
                ld(n[r], e)
        },
        GeometryCollection: function(t, e) {
            for (var n = t.geometries, r = -1, i = n.length; ++r < i; )
                od(n[r], e)
        }
    };
    function ud(t, e, n) {
        var r, i = -1, o = t.length - n;
        for (e.lineStart(); ++i < o; )
            r = t[i],
            e.point(r[0], r[1], r[2]);
        e.lineEnd()
    }
    function ld(t, e) {
        var n = -1
          , r = t.length;
        for (e.polygonStart(); ++n < r; )
            ud(t[n], e, 1);
        e.polygonEnd()
    }
    qg(),
    qg();
    function cd(t) {
        return [Qg(t[1], t[0]), rd(t[2])]
    }
    function hd(t) {
        var e = t[0]
          , n = t[1]
          , r = $g(n);
        return [r * $g(e), r * td(e), td(n)]
    }
    function pd(t, e) {
        return t[0] * e[0] + t[1] * e[1] + t[2] * e[2]
    }
    function fd(t, e) {
        return [t[1] * e[2] - t[2] * e[1], t[2] * e[0] - t[0] * e[2], t[0] * e[1] - t[1] * e[0]]
    }
    function gd(t, e) {
        t[0] += e[0],
        t[1] += e[1],
        t[2] += e[2]
    }
    function dd(t, e) {
        return [t[0] * e, t[1] * e, t[2] * e]
    }
    function yd(t) {
        var e = ed(t[0] * t[0] + t[1] * t[1] + t[2] * t[2]);
        t[0] /= e,
        t[1] /= e,
        t[2] /= e
    }
    qg();
    function vd(t, e) {
        function n(n, r) {
            return n = t(n, r),
            e(n[0], n[1])
        }
        return t.invert && e.invert && (n.invert = function(n, r) {
            return (n = e.invert(n, r)) && t.invert(n[0], n[1])
        }
        ),
        n
    }
    function _d(t, e) {
        return [t > Vg ? t - Hg : t < -Vg ? t + Hg : t, e]
    }
    function md(t) {
        return function(e, n) {
            return [(e += t) > Vg ? e - Hg : e < -Vg ? e + Hg : e, n]
        }
    }
    function xd(t) {
        var e = md(t);
        return e.invert = md(-t),
        e
    }
    function Ed(t, e) {
        var n = $g(t)
          , r = td(t)
          , i = $g(e)
          , o = td(e);
        function s(t, e) {
            var s = $g(e)
              , a = $g(t) * s
              , u = td(t) * s
              , l = td(e)
              , c = l * n + a * r;
            return [Qg(u * i - c * o, a * n - l * r), rd(c * i + u * o)]
        }
        return s.invert = function(t, e) {
            var s = $g(e)
              , a = $g(t) * s
              , u = td(t) * s
              , l = td(e)
              , c = l * i - u * o;
            return [Qg(u * i + l * o, a * n + c * r), rd(c * n - a * r)]
        }
        ,
        s
    }
    function bd(t, e) {
        (e = hd(e))[0] -= t,
        yd(e);
        var n = nd(-e[1]);
        return ((-e[2] < 0 ? -n : n) + Hg - Ug) % Hg
    }
    function wd() {
        var t, e = [];
        return {
            point: function(e, n) {
                t.push([e, n])
            },
            lineStart: function() {
                e.push(t = [])
            },
            lineEnd: id,
            rejoin: function() {
                e.length > 1 && e.push(e.pop().concat(e.shift()))
            },
            result: function() {
                var n = e;
                return e = [],
                t = null,
                n
            }
        }
    }
    function Id(t, e) {
        return Zg(t[0] - e[0]) < Ug && Zg(t[1] - e[1]) < Ug
    }
    function Nd(t, e, n, r) {
        this.x = t,
        this.z = e,
        this.o = n,
        this.e = r,
        this.v = !1,
        this.n = this.p = null
    }
    function Sd(t, e, n, r, i) {
        var o, s, a = [], u = [];
        if (t.forEach((function(t) {
            if (!((e = t.length - 1) <= 0)) {
                var e, n, r = t[0], s = t[e];
                if (Id(r, s)) {
                    for (i.lineStart(),
                    o = 0; o < e; ++o)
                        i.point((r = t[o])[0], r[1]);
                    i.lineEnd()
                } else
                    a.push(n = new Nd(r,t,null,!0)),
                    u.push(n.o = new Nd(r,null,n,!1)),
                    a.push(n = new Nd(s,t,null,!1)),
                    u.push(n.o = new Nd(s,null,n,!0))
            }
        }
        )),
        a.length) {
            for (u.sort(e),
            Cd(a),
            Cd(u),
            o = 0,
            s = u.length; o < s; ++o)
                u[o].e = n = !n;
            for (var l, c, h = a[0]; ; ) {
                for (var p = h, f = !0; p.v; )
                    if ((p = p.n) === h)
                        return;
                l = p.z,
                i.lineStart();
                do {
                    if (p.v = p.o.v = !0,
                    p.e) {
                        if (f)
                            for (o = 0,
                            s = l.length; o < s; ++o)
                                i.point((c = l[o])[0], c[1]);
                        else
                            r(p.x, p.n.x, 1, i);
                        p = p.n
                    } else {
                        if (f)
                            for (l = p.p.z,
                            o = l.length - 1; o >= 0; --o)
                                i.point((c = l[o])[0], c[1]);
                        else
                            r(p.x, p.p.x, -1, i);
                        p = p.p
                    }
                    l = (p = p.o).z,
                    f = !f
                } while (!p.v);
                i.lineEnd()
            }
        }
    }
    function Cd(t) {
        if (e = t.length) {
            for (var e, n, r = 0, i = t[0]; ++r < e; )
                i.n = n = t[r],
                n.p = i,
                i = n;
            i.n = n = t[0],
            n.p = i
        }
    }
    function Pd(t, e) {
        return t < e ? -1 : t > e ? 1 : t >= e ? 0 : NaN
    }
    _d.invert = _d;
    var Md, Ld;
    1 === (Md = Pd).length && (Ld = Md,
    Md = function(t, e) {
        return Pd(Ld(t), e)
    }
    );
    function Od(t) {
        for (var e, n, r, i = t.length, o = -1, s = 0; ++o < i; )
            s += t[o].length;
        for (n = new Array(s); --i >= 0; )
            for (e = (r = t[i]).length; --e >= 0; )
                n[--s] = r[e];
        return n
    }
    var Rd = 1e9
      , Td = -Rd;
    function Ad(t, e, n, r) {
        function i(i, o) {
            return t <= i && i <= n && e <= o && o <= r
        }
        function o(i, o, a, l) {
            var c = 0
              , h = 0;
            if (null == i || (c = s(i, a)) !== (h = s(o, a)) || u(i, o) < 0 ^ a > 0)
                do {
                    l.point(0 === c || 3 === c ? t : n, c > 1 ? r : e)
                } while ((c = (c + a + 4) % 4) !== h);
            else
                l.point(o[0], o[1])
        }
        function s(r, i) {
            return Zg(r[0] - t) < Ug ? i > 0 ? 0 : 3 : Zg(r[0] - n) < Ug ? i > 0 ? 2 : 1 : Zg(r[1] - e) < Ug ? i > 0 ? 1 : 0 : i > 0 ? 3 : 2
        }
        function a(t, e) {
            return u(t.x, e.x)
        }
        function u(t, e) {
            var n = s(t, 1)
              , r = s(e, 1);
            return n !== r ? n - r : 0 === n ? e[1] - t[1] : 1 === n ? t[0] - e[0] : 2 === n ? t[1] - e[1] : e[0] - t[0]
        }
        return function(s) {
            var u, l, c, h, p, f, g, d, y, v, _, m = s, x = wd(), E = {
                point: b,
                lineStart: function() {
                    E.point = w,
                    l && l.push(c = []);
                    v = !0,
                    y = !1,
                    g = d = NaN
                },
                lineEnd: function() {
                    u && (w(h, p),
                    f && y && x.rejoin(),
                    u.push(x.result()));
                    E.point = b,
                    y && m.lineEnd()
                },
                polygonStart: function() {
                    m = x,
                    u = [],
                    l = [],
                    _ = !0
                },
                polygonEnd: function() {
                    var e = function() {
                        for (var e = 0, n = 0, i = l.length; n < i; ++n)
                            for (var o, s, a = l[n], u = 1, c = a.length, h = a[0], p = h[0], f = h[1]; u < c; ++u)
                                o = p,
                                s = f,
                                p = (h = a[u])[0],
                                f = h[1],
                                s <= r ? f > r && (p - o) * (r - s) > (f - s) * (t - o) && ++e : f <= r && (p - o) * (r - s) < (f - s) * (t - o) && --e;
                        return e
                    }()
                      , n = _ && e
                      , i = (u = Od(u)).length;
                    (n || i) && (s.polygonStart(),
                    n && (s.lineStart(),
                    o(null, null, 1, s),
                    s.lineEnd()),
                    i && Sd(u, a, e, o, s),
                    s.polygonEnd());
                    m = s,
                    u = l = c = null
                }
            };
            function b(t, e) {
                i(t, e) && m.point(t, e)
            }
            function w(o, s) {
                var a = i(o, s);
                if (l && c.push([o, s]),
                v)
                    h = o,
                    p = s,
                    f = a,
                    v = !1,
                    a && (m.lineStart(),
                    m.point(o, s));
                else if (a && y)
                    m.point(o, s);
                else {
                    var u = [g = Math.max(Td, Math.min(Rd, g)), d = Math.max(Td, Math.min(Rd, d))]
                      , x = [o = Math.max(Td, Math.min(Rd, o)), s = Math.max(Td, Math.min(Rd, s))];
                    !function(t, e, n, r, i, o) {
                        var s, a = t[0], u = t[1], l = 0, c = 1, h = e[0] - a, p = e[1] - u;
                        if (s = n - a,
                        h || !(s > 0)) {
                            if (s /= h,
                            h < 0) {
                                if (s < l)
                                    return;
                                s < c && (c = s)
                            } else if (h > 0) {
                                if (s > c)
                                    return;
                                s > l && (l = s)
                            }
                            if (s = i - a,
                            h || !(s < 0)) {
                                if (s /= h,
                                h < 0) {
                                    if (s > c)
                                        return;
                                    s > l && (l = s)
                                } else if (h > 0) {
                                    if (s < l)
                                        return;
                                    s < c && (c = s)
                                }
                                if (s = r - u,
                                p || !(s > 0)) {
                                    if (s /= p,
                                    p < 0) {
                                        if (s < l)
                                            return;
                                        s < c && (c = s)
                                    } else if (p > 0) {
                                        if (s > c)
                                            return;
                                        s > l && (l = s)
                                    }
                                    if (s = o - u,
                                    p || !(s < 0)) {
                                        if (s /= p,
                                        p < 0) {
                                            if (s > c)
                                                return;
                                            s > l && (l = s)
                                        } else if (p > 0) {
                                            if (s < l)
                                                return;
                                            s < c && (c = s)
                                        }
                                        return l > 0 && (t[0] = a + l * h,
                                        t[1] = u + l * p),
                                        c < 1 && (e[0] = a + c * h,
                                        e[1] = u + c * p),
                                        !0
                                    }
                                }
                            }
                        }
                    }(u, x, t, e, n, r) ? a && (m.lineStart(),
                    m.point(o, s),
                    _ = !1) : (y || (m.lineStart(),
                    m.point(u[0], u[1])),
                    m.point(x[0], x[1]),
                    a || m.lineEnd(),
                    _ = !1)
                }
                g = o,
                d = s,
                y = a
            }
            return E
        }
    }
    var Dd = qg();
    qg();
    function Fd(t) {
        return t
    }
    qg(),
    qg();
    var kd = 1 / 0
      , Gd = kd
      , qd = -kd
      , Bd = qd
      , zd = {
        point: function(t, e) {
            t < kd && (kd = t);
            t > qd && (qd = t);
            e < Gd && (Gd = e);
            e > Bd && (Bd = e)
        },
        lineStart: id,
        lineEnd: id,
        polygonStart: id,
        polygonEnd: id,
        result: function() {
            var t = [[kd, Gd], [qd, Bd]];
            return qd = Bd = -(Gd = kd = 1 / 0),
            t
        }
    };
    qg();
    function jd(t, e, n, r) {
        return function(i, o) {
            var s, a, u, l = e(o), c = i.invert(r[0], r[1]), h = wd(), p = e(h), f = !1, g = {
                point: d,
                lineStart: v,
                lineEnd: _,
                polygonStart: function() {
                    g.point = m,
                    g.lineStart = x,
                    g.lineEnd = E,
                    a = [],
                    s = []
                },
                polygonEnd: function() {
                    g.point = d,
                    g.lineStart = v,
                    g.lineEnd = _,
                    a = Od(a);
                    var t = function(t, e) {
                        var n = e[0]
                          , r = e[1]
                          , i = [td(n), -$g(n), 0]
                          , o = 0
                          , s = 0;
                        Dd.reset();
                        for (var a = 0, u = t.length; a < u; ++a)
                            if (c = (l = t[a]).length)
                                for (var l, c, h = l[c - 1], p = h[0], f = h[1] / 2 + Yg, g = td(f), d = $g(f), y = 0; y < c; ++y,
                                p = _,
                                g = x,
                                d = E,
                                h = v) {
                                    var v = l[y]
                                      , _ = v[0]
                                      , m = v[1] / 2 + Yg
                                      , x = td(m)
                                      , E = $g(m)
                                      , b = _ - p
                                      , w = b >= 0 ? 1 : -1
                                      , I = w * b
                                      , N = I > Vg
                                      , S = g * x;
                                    if (Dd.add(Qg(S * w * td(I), d * E + S * $g(I))),
                                    o += N ? b + w * Hg : b,
                                    N ^ p >= n ^ _ >= n) {
                                        var C = fd(hd(h), hd(v));
                                        yd(C);
                                        var P = fd(i, C);
                                        yd(P);
                                        var M = (N ^ b >= 0 ? -1 : 1) * rd(P[2]);
                                        (r > M || r === M && (C[0] || C[1])) && (s += N ^ b >= 0 ? 1 : -1)
                                    }
                                }
                        return (o < -1e-6 || o < Ug && Dd < -1e-6) ^ 1 & s
                    }(s, c);
                    a.length ? (f || (o.polygonStart(),
                    f = !0),
                    Sd(a, Vd, t, n, o)) : t && (f || (o.polygonStart(),
                    f = !0),
                    o.lineStart(),
                    n(null, null, 1, o),
                    o.lineEnd()),
                    f && (o.polygonEnd(),
                    f = !1),
                    a = s = null
                },
                sphere: function() {
                    o.polygonStart(),
                    o.lineStart(),
                    n(null, null, 1, o),
                    o.lineEnd(),
                    o.polygonEnd()
                }
            };
            function d(e, n) {
                var r = i(e, n);
                t(e = r[0], n = r[1]) && o.point(e, n)
            }
            function y(t, e) {
                var n = i(t, e);
                l.point(n[0], n[1])
            }
            function v() {
                g.point = y,
                l.lineStart()
            }
            function _() {
                g.point = d,
                l.lineEnd()
            }
            function m(t, e) {
                u.push([t, e]);
                var n = i(t, e);
                p.point(n[0], n[1])
            }
            function x() {
                p.lineStart(),
                u = []
            }
            function E() {
                m(u[0][0], u[0][1]),
                p.lineEnd();
                var t, e, n, r, i = p.clean(), l = h.result(), c = l.length;
                if (u.pop(),
                s.push(u),
                u = null,
                c)
                    if (1 & i) {
                        if ((e = (n = l[0]).length - 1) > 0) {
                            for (f || (o.polygonStart(),
                            f = !0),
                            o.lineStart(),
                            t = 0; t < e; ++t)
                                o.point((r = n[t])[0], r[1]);
                            o.lineEnd()
                        }
                    } else
                        c > 1 && 2 & i && l.push(l.pop().concat(l.shift())),
                        a.push(l.filter(Ud))
            }
            return g
        }
    }
    function Ud(t) {
        return t.length > 1
    }
    function Vd(t, e) {
        return ((t = t.x)[0] < 0 ? t[1] - Xg - Ug : Xg - t[1]) - ((e = e.x)[0] < 0 ? e[1] - Xg - Ug : Xg - e[1])
    }
    var Xd = jd((function() {
        return !0
    }
    ), (function(t) {
        var e, n = NaN, r = NaN, i = NaN;
        return {
            lineStart: function() {
                t.lineStart(),
                e = 1
            },
            point: function(o, s) {
                var a = o > 0 ? Vg : -Vg
                  , u = Zg(o - n);
                Zg(u - Vg) < Ug ? (t.point(n, r = (r + s) / 2 > 0 ? Xg : -Xg),
                t.point(i, r),
                t.lineEnd(),
                t.lineStart(),
                t.point(a, r),
                t.point(o, r),
                e = 0) : i !== a && u >= Vg && (Zg(n - i) < Ug && (n -= i * Ug),
                Zg(o - a) < Ug && (o -= a * Ug),
                r = function(t, e, n, r) {
                    var i, o, s = td(t - n);
                    return Zg(s) > Ug ? Kg((td(e) * (o = $g(r)) * td(n) - td(r) * (i = $g(e)) * td(t)) / (i * o * s)) : (e + r) / 2
                }(n, r, o, s),
                t.point(i, r),
                t.lineEnd(),
                t.lineStart(),
                t.point(a, r),
                e = 0),
                t.point(n = o, r = s),
                i = a
            },
            lineEnd: function() {
                t.lineEnd(),
                n = r = NaN
            },
            clean: function() {
                return 2 - e
            }
        }
    }
    ), (function(t, e, n, r) {
        var i;
        if (null == t)
            i = n * Xg,
            r.point(-Vg, i),
            r.point(0, i),
            r.point(Vg, i),
            r.point(Vg, 0),
            r.point(Vg, -i),
            r.point(0, -i),
            r.point(-Vg, -i),
            r.point(-Vg, 0),
            r.point(-Vg, i);
        else if (Zg(t[0] - e[0]) > Ug) {
            var o = t[0] < e[0] ? Vg : -Vg;
            i = n * o / 2,
            r.point(-o, i),
            r.point(0, i),
            r.point(o, i)
        } else
            r.point(e[0], e[1])
    }
    ), [-Vg, -Xg]);
    function Yd(t, e) {
        var n = $g(t)
          , r = n > 0
          , i = Zg(n) > Ug;
        function o(t, e) {
            return $g(t) * $g(e) > n
        }
        function s(t, e, r) {
            var i = [1, 0, 0]
              , o = fd(hd(t), hd(e))
              , s = pd(o, o)
              , a = o[0]
              , u = s - a * a;
            if (!u)
                return !r && t;
            var l = n * s / u
              , c = -n * a / u
              , h = fd(i, o)
              , p = dd(i, l);
            gd(p, dd(o, c));
            var f = h
              , g = pd(p, f)
              , d = pd(f, f)
              , y = g * g - d * (pd(p, p) - 1);
            if (!(y < 0)) {
                var v = ed(y)
                  , _ = dd(f, (-g - v) / d);
                if (gd(_, p),
                _ = cd(_),
                !r)
                    return _;
                var m, x = t[0], E = e[0], b = t[1], w = e[1];
                E < x && (m = x,
                x = E,
                E = m);
                var I = E - x
                  , N = Zg(I - Vg) < Ug;
                if (!N && w < b && (m = b,
                b = w,
                w = m),
                N || I < Ug ? N ? b + w > 0 ^ _[1] < (Zg(_[0] - x) < Ug ? b : w) : b <= _[1] && _[1] <= w : I > Vg ^ (x <= _[0] && _[0] <= E)) {
                    var S = dd(f, (-g + v) / d);
                    return gd(S, p),
                    [_, cd(S)]
                }
            }
        }
        function a(e, n) {
            var i = r ? t : Vg - t
              , o = 0;
            return e < -i ? o |= 1 : e > i && (o |= 2),
            n < -i ? o |= 4 : n > i && (o |= 8),
            o
        }
        return jd(o, (function(t) {
            var e, n, u, l, c;
            return {
                lineStart: function() {
                    l = u = !1,
                    c = 1
                },
                point: function(h, p) {
                    var f, g = [h, p], d = o(h, p), y = r ? d ? 0 : a(h, p) : d ? a(h + (h < 0 ? Vg : -Vg), p) : 0;
                    if (!e && (l = u = d) && t.lineStart(),
                    d !== u && (!(f = s(e, g)) || Id(e, f) || Id(g, f)) && (g[0] += Ug,
                    g[1] += Ug,
                    d = o(g[0], g[1])),
                    d !== u)
                        c = 0,
                        d ? (t.lineStart(),
                        f = s(g, e),
                        t.point(f[0], f[1])) : (f = s(e, g),
                        t.point(f[0], f[1]),
                        t.lineEnd()),
                        e = f;
                    else if (i && e && r ^ d) {
                        var v;
                        y & n || !(v = s(g, e, !0)) || (c = 0,
                        r ? (t.lineStart(),
                        t.point(v[0][0], v[0][1]),
                        t.point(v[1][0], v[1][1]),
                        t.lineEnd()) : (t.point(v[1][0], v[1][1]),
                        t.lineEnd(),
                        t.lineStart(),
                        t.point(v[0][0], v[0][1])))
                    }
                    !d || e && Id(e, g) || t.point(g[0], g[1]),
                    e = g,
                    u = d,
                    n = y
                },
                lineEnd: function() {
                    u && t.lineEnd(),
                    e = null
                },
                clean: function() {
                    return c | (l && u) << 1
                }
            }
        }
        ), (function(n, r, i, o) {
            !function(t, e, n, r, i, o) {
                if (n) {
                    var s = $g(e)
                      , a = td(e)
                      , u = r * n;
                    null == i ? (i = e + r * Hg,
                    o = e - u / 2) : (i = bd(s, i),
                    o = bd(s, o),
                    (r > 0 ? i < o : i > o) && (i += r * Hg));
                    for (var l, c = i; r > 0 ? c > o : c < o; c -= u)
                        l = cd([s, -a * $g(c), -a * td(c)]),
                        t.point(l[0], l[1])
                }
            }(o, t, e, i, n, r)
        }
        ), r ? [0, -t] : [-Vg, t - Vg])
    }
    function Hd(t) {
        return function(e) {
            var n = new Wd;
            for (var r in t)
                n[r] = t[r];
            return n.stream = e,
            n
        }
    }
    function Wd() {}
    function Jd(t, e, n) {
        var r = e[1][0] - e[0][0]
          , i = e[1][1] - e[0][1]
          , o = t.clipExtent && t.clipExtent();
        t.scale(150).translate([0, 0]),
        null != o && t.clipExtent(null),
        function(t, e) {
            t && sd.hasOwnProperty(t.type) ? sd[t.type](t, e) : od(t, e)
        }(n, t.stream(zd));
        var s = zd.result()
          , a = Math.min(r / (s[1][0] - s[0][0]), i / (s[1][1] - s[0][1]))
          , u = +e[0][0] + (r - a * (s[1][0] + s[0][0])) / 2
          , l = +e[0][1] + (i - a * (s[1][1] + s[0][1])) / 2;
        return null != o && t.clipExtent(o),
        t.scale(150 * a).translate([u, l])
    }
    Wd.prototype = {
        constructor: Wd,
        point: function(t, e) {
            this.stream.point(t, e)
        },
        sphere: function() {
            this.stream.sphere()
        },
        lineStart: function() {
            this.stream.lineStart()
        },
        lineEnd: function() {
            this.stream.lineEnd()
        },
        polygonStart: function() {
            this.stream.polygonStart()
        },
        polygonEnd: function() {
            this.stream.polygonEnd()
        }
    };
    var Zd = $g(30 * Jg);
    function Kd(t, e) {
        return +e ? function(t, e) {
            function n(r, i, o, s, a, u, l, c, h, p, f, g, d, y) {
                var v = l - r
                  , _ = c - i
                  , m = v * v + _ * _;
                if (m > 4 * e && d--) {
                    var x = s + p
                      , E = a + f
                      , b = u + g
                      , w = ed(x * x + E * E + b * b)
                      , I = rd(b /= w)
                      , N = Zg(Zg(b) - 1) < Ug || Zg(o - h) < Ug ? (o + h) / 2 : Qg(E, x)
                      , S = t(N, I)
                      , C = S[0]
                      , P = S[1]
                      , M = C - r
                      , L = P - i
                      , O = _ * M - v * L;
                    (O * O / m > e || Zg((v * M + _ * L) / m - .5) > .3 || s * p + a * f + u * g < Zd) && (n(r, i, o, s, a, u, C, P, N, x /= w, E /= w, b, d, y),
                    y.point(C, P),
                    n(C, P, N, x, E, b, l, c, h, p, f, g, d, y))
                }
            }
            return function(e) {
                var r, i, o, s, a, u, l, c, h, p, f, g, d = {
                    point: y,
                    lineStart: v,
                    lineEnd: m,
                    polygonStart: function() {
                        e.polygonStart(),
                        d.lineStart = x
                    },
                    polygonEnd: function() {
                        e.polygonEnd(),
                        d.lineStart = v
                    }
                };
                function y(n, r) {
                    n = t(n, r),
                    e.point(n[0], n[1])
                }
                function v() {
                    c = NaN,
                    d.point = _,
                    e.lineStart()
                }
                function _(r, i) {
                    var o = hd([r, i])
                      , s = t(r, i);
                    n(c, h, l, p, f, g, c = s[0], h = s[1], l = r, p = o[0], f = o[1], g = o[2], 16, e),
                    e.point(c, h)
                }
                function m() {
                    d.point = y,
                    e.lineEnd()
                }
                function x() {
                    v(),
                    d.point = E,
                    d.lineEnd = b
                }
                function E(t, e) {
                    _(r = t, e),
                    i = c,
                    o = h,
                    s = p,
                    a = f,
                    u = g,
                    d.point = _
                }
                function b() {
                    n(c, h, l, p, f, g, i, o, r, s, a, u, 16, e),
                    d.lineEnd = m,
                    m()
                }
                return d
            }
        }(t, e) : function(t) {
            return Hd({
                point: function(e, n) {
                    e = t(e, n),
                    this.stream.point(e[0], e[1])
                }
            })
        }(t)
    }
    var Qd = Hd({
        point: function(t, e) {
            this.stream.point(t * Jg, e * Jg)
        }
    });
    function $d(t) {
        return function(t) {
            var e, n, r, i, o, s, a, u, l, c, h = 150, p = 480, f = 250, g = 0, d = 0, y = 0, v = 0, _ = 0, m = null, x = Xd, E = null, b = Fd, w = .5, I = Kd(C, w);
            function N(t) {
                return [(t = o(t[0] * Jg, t[1] * Jg))[0] * h + n, r - t[1] * h]
            }
            function S(t) {
                return (t = o.invert((t[0] - n) / h, (r - t[1]) / h)) && [t[0] * Wg, t[1] * Wg]
            }
            function C(t, i) {
                return [(t = e(t, i))[0] * h + n, r - t[1] * h]
            }
            function P() {
                o = vd(i = function(t, e, n) {
                    return (t %= Hg) ? e || n ? vd(xd(t), Ed(e, n)) : xd(t) : e || n ? Ed(e, n) : _d
                }(y, v, _), e);
                var t = e(g, d);
                return n = p - t[0] * h,
                r = f + t[1] * h,
                M()
            }
            function M() {
                return l = c = null,
                N
            }
            return N.stream = function(t) {
                return l && c === t ? l : l = Qd(x(i, I(b(c = t))))
            }
            ,
            N.clipAngle = function(t) {
                return arguments.length ? (x = +t ? Yd(m = t * Jg, 6 * Jg) : (m = null,
                Xd),
                M()) : m * Wg
            }
            ,
            N.clipExtent = function(t) {
                return arguments.length ? (b = null == t ? (E = s = a = u = null,
                Fd) : Ad(E = +t[0][0], s = +t[0][1], a = +t[1][0], u = +t[1][1]),
                M()) : null == E ? null : [[E, s], [a, u]]
            }
            ,
            N.scale = function(t) {
                return arguments.length ? (h = +t,
                P()) : h
            }
            ,
            N.translate = function(t) {
                return arguments.length ? (p = +t[0],
                f = +t[1],
                P()) : [p, f]
            }
            ,
            N.center = function(t) {
                return arguments.length ? (g = t[0] % 360 * Jg,
                d = t[1] % 360 * Jg,
                P()) : [g * Wg, d * Wg]
            }
            ,
            N.rotate = function(t) {
                return arguments.length ? (y = t[0] % 360 * Jg,
                v = t[1] % 360 * Jg,
                _ = t.length > 2 ? t[2] % 360 * Jg : 0,
                P()) : [y * Wg, v * Wg, _ * Wg]
            }
            ,
            N.precision = function(t) {
                return arguments.length ? (I = Kd(C, w = t * t),
                M()) : ed(w)
            }
            ,
            N.fitExtent = function(t, e) {
                return Jd(N, t, e)
            }
            ,
            N.fitSize = function(t, e) {
                return function(t, e, n) {
                    return Jd(t, [[0, 0], e], n)
                }(N, t, e)
            }
            ,
            function() {
                return e = t.apply(this, arguments),
                N.invert = e.invert && S,
                P()
            }
        }((function() {
            return t
        }
        ))()
    }
    var ty = function(t) {
        return function(e, n) {
            var r = $g(e)
              , i = $g(n)
              , o = t(r * i);
            return [o * i * td(e), o * td(n)]
        }
    }((function(t) {
        return (t = nd(t)) && t / td(t)
    }
    ));
    function ey() {
        return $d(ty).scale(79.4188).clipAngle(179.999)
    }
    function ny(t, n, r, i) {
        var s = t.properties || {}
          , a = "Feature" === t.type ? t.geometry : t;
        if ("GeometryCollection" === a.type) {
            var u = [];
            return q(t, (function(t) {
                var e = ny(t, n, r, i);
                e && u.push(e)
            }
            )),
            f(u)
        }
        var l = function(t) {
            var n = xn(t).geometry.coordinates
              , r = [-n[0], -n[1]];
            return ey().rotate(r).scale(e)
        }(a)
          , c = {
            type: a.type,
            coordinates: iy(a.coordinates, l)
        }
          , h = (new Ih).read(c)
          , p = m(x(n, r), "meters")
          , g = _f.bufferOp(h, p, i);
        if (!ry((g = (new Nh).write(g)).coordinates))
            return o({
                type: g.type,
                coordinates: oy(g.coordinates, l)
            }, s)
    }
    function ry(t) {
        return Array.isArray(t[0]) ? ry(t[0]) : isNaN(t[0])
    }
    function iy(t, e) {
        return "object" != typeof t[0] ? e(t) : t.map((function(t) {
            return iy(t, e)
        }
        ))
    }
    function oy(t, e) {
        return "object" != typeof t[0] ? e.invert(t) : t.map((function(t) {
            return oy(t, e)
        }
        ))
    }
    function sy(t, e, n) {
        void 0 === n && (n = {});
        var r = rt(t)
          , i = rt(e)
          , o = $u.intersection(r.coordinates, i.coordinates);
        return 0 === o.length ? null : 1 === o.length ? l(o[0], n.properties) : y(o, n.properties)
    }
    function ay(t, e, n) {
        void 0 === n && (n = {});
        var r = JSON.stringify(n.properties || {})
          , i = t[0]
          , o = t[1]
          , s = t[2]
          , a = t[3]
          , u = (o + a) / 2
          , l = (i + s) / 2
          , c = 2 * e / me([i, u], [s, u], n) * (s - i)
          , h = 2 * e / me([l, o], [l, a], n) * (a - o)
          , p = c / 2
          , g = 2 * p
          , d = Math.sqrt(3) / 2 * h
          , y = s - i
          , v = a - o
          , _ = 3 / 4 * g
          , m = d
          , x = (y - g) / (g - p / 2)
          , E = Math.floor(x)
          , b = (E * _ - p / 2 - y) / 2 - p / 2 + _ / 2
          , w = Math.floor((v - d) / d)
          , I = (v - w * d) / 2
          , N = w * d - v > d / 2;
        N && (I -= d / 4);
        for (var S = [], C = [], P = 0; P < 6; P++) {
            var M = 2 * Math.PI / 6 * P;
            S.push(Math.cos(M)),
            C.push(Math.sin(M))
        }
        for (var L = [], O = 0; O <= E; O++)
            for (var R = 0; R <= w; R++) {
                var T = O % 2 == 1;
                if ((0 !== R || !T) && (0 !== R || !N)) {
                    var A = O * _ + i - b
                      , D = R * m + o + I;
                    if (T && (D -= d / 2),
                    !0 === n.triangles)
                        ly([A, D], c / 2, h / 2, JSON.parse(r), S, C).forEach((function(t) {
                            n.mask ? sy(n.mask, t) && L.push(t) : L.push(t)
                        }
                        ));
                    else {
                        var F = uy([A, D], c / 2, h / 2, JSON.parse(r), S, C);
                        n.mask ? sy(n.mask, F) && L.push(F) : L.push(F)
                    }
                }
            }
        return f(L)
    }
    function uy(t, e, n, r, i, o) {
        for (var s = [], a = 0; a < 6; a++) {
            var u = t[0] + e * i[a]
              , c = t[1] + n * o[a];
            s.push([u, c])
        }
        return s.push(s[0].slice()),
        l([s], r)
    }
    function ly(t, e, n, r, i, o) {
        for (var s = [], a = 0; a < 6; a++) {
            var u = [];
            u.push(t),
            u.push([t[0] + e * i[a], t[1] + n * o[a]]),
            u.push([t[0] + e * i[(a + 1) % 6], t[1] + n * o[(a + 1) % 6]]),
            u.push(t),
            s.push(l([u], r))
        }
        return s
    }
    function cy(t) {
        return y(t)
    }
    function hy(t) {
        return l(t && t.geometry.coordinates || [[[180, 90], [-180, 90], [-180, -90], [180, -90], [180, 90]]])
    }
    function py(t, e, n) {
        return void 0 === n && (n = {}),
        function(t, e, n, r) {
            void 0 === r && (r = {});
            for (var i = [], o = t[0], s = t[1], a = t[2], u = t[3], c = e / me([o, s], [a, s], r) * (a - o), h = n / me([o, s], [o, u], r) * (u - s), p = a - o, g = u - s, d = Math.floor(p / c), y = Math.floor(g / h), v = (g - y * h) / 2, _ = o + (p - d * c) / 2, m = 0; m < d; m++) {
                for (var x = s + v, E = 0; E < y; E++) {
                    var b = l([[[_, x], [_, x + h], [_ + c, x + h], [_ + c, x], [_, x]]], r.properties);
                    r.mask ? Ps(r.mask, b) && i.push(b) : i.push(b),
                    x += h
                }
                _ += c
            }
            return f(i)
        }(t, e, e, n)
    }
    function fy(t, e, n) {
        void 0 === n && (n = {});
        for (var r = [], i = e / me([t[0], t[1]], [t[2], t[1]], n) * (t[2] - t[0]), o = e / me([t[0], t[1]], [t[0], t[3]], n) * (t[3] - t[1]), s = 0, a = t[0]; a <= t[2]; ) {
            for (var u = 0, c = t[1]; c <= t[3]; ) {
                var h = null
                  , p = null;
                s % 2 == 0 && u % 2 == 0 ? (h = l([[[a, c], [a, c + o], [a + i, c], [a, c]]], n.properties),
                p = l([[[a, c + o], [a + i, c + o], [a + i, c], [a, c + o]]], n.properties)) : s % 2 == 0 && u % 2 == 1 ? (h = l([[[a, c], [a + i, c + o], [a + i, c], [a, c]]], n.properties),
                p = l([[[a, c], [a, c + o], [a + i, c + o], [a, c]]], n.properties)) : u % 2 == 0 && s % 2 == 1 ? (h = l([[[a, c], [a, c + o], [a + i, c + o], [a, c]]], n.properties),
                p = l([[[a, c], [a + i, c + o], [a + i, c], [a, c]]], n.properties)) : u % 2 == 1 && s % 2 == 1 && (h = l([[[a, c], [a, c + o], [a + i, c], [a, c]]], n.properties),
                p = l([[[a, c + o], [a + i, c + o], [a + i, c], [a, c + o]]], n.properties)),
                n.mask ? (sy(n.mask, h) && r.push(h),
                sy(n.mask, p) && r.push(p)) : (r.push(h),
                r.push(p)),
                c += o,
                u++
            }
            s++,
            a += i
        }
        return f(r)
    }
    ty.invert = function(t) {
        return function(e, n) {
            var r = ed(e * e + n * n)
              , i = t(r)
              , o = td(i)
              , s = $g(i);
            return [Qg(e * o, r * s), rd(r && n * o / r)]
        }
    }((function(t) {
        return t
    }
    )),
    t.along = function(t, e, n) {
        void 0 === n && (n = {});
        for (var r = rt(t).coordinates, i = 0, o = 0; o < r.length && !(e >= i && o === r.length - 1); o++) {
            if (i >= e) {
                var s = e - i;
                if (s) {
                    var u = mn(r[o], r[o - 1]) - 180;
                    return vn(r[o], s, u, n)
                }
                return a(r[o])
            }
            i += me(r[o], r[o + 1], n)
        }
        return a(r[r.length - 1])
    }
    ,
    t.angle = function(t, e, n, r) {
        if (void 0 === r && (r = {}),
        !P(r))
            throw new Error("options is invalid");
        if (!t)
            throw new Error("startPoint is required");
        if (!e)
            throw new Error("midPoint is required");
        if (!n)
            throw new Error("endPoint is required");
        var i = t
          , o = e
          , s = n
          , a = b(!0 !== r.mercator ? mn(i, o) : Bi(i, o))
          , u = b(!0 !== r.mercator ? mn(s, o) : Bi(s, o))
          , l = Math.abs(a - u);
        return !0 === r.explementary ? 360 - l : l
    }
    ,
    t.applyFilter = uu,
    t.area = jr,
    t.areaFactors = i,
    t.bbox = Z,
    t.bboxClip = function(t, e) {
        var n = rt(t)
          , r = n.type
          , i = "Feature" === t.type ? t.properties : {}
          , o = n.coordinates;
        switch (r) {
        case "LineString":
        case "MultiLineString":
            var s = [];
            return "LineString" === r && (o = [o]),
            o.forEach((function(t) {
                !function(t, e, n) {
                    var r, i, o, s, a, u = t.length, l = Ri(t[0], e), c = [];
                    for (n || (n = []),
                    r = 1; r < u; r++) {
                        for (s = t[r - 1],
                        i = o = Ri(a = t[r], e); ; ) {
                            if (!(l | i)) {
                                c.push(s),
                                i !== o ? (c.push(a),
                                r < u - 1 && (n.push(c),
                                c = [])) : r === u - 1 && c.push(a);
                                break
                            }
                            if (l & i)
                                break;
                            l ? l = Ri(s = Oi(s, a, l, e), e) : i = Ri(a = Oi(s, a, i, e), e)
                        }
                        l = o
                    }
                    c.length && n.push(c)
                }(t, e, s)
            }
            )),
            1 === s.length ? h(s[0], i) : g(s, i);
        case "Polygon":
            return l(Ti(o, e), i);
        case "MultiPolygon":
            return y(o.map((function(t) {
                return Ti(t, e)
            }
            )), i);
        default:
            throw new Error("geometry " + r + " not supported")
        }
    }
    ,
    t.bboxPolygon = gn,
    t.bearing = mn,
    t.bearingToAngle = b,
    t.bearingToAzimuth = b,
    t.bezier = fn,
    t.bezierSpline = fn,
    t.booleanClockwise = Yi,
    t.booleanContains = function(t, e) {
        var n = rt(t)
          , r = rt(e)
          , i = n.type
          , o = r.type
          , s = n.coordinates
          , a = r.coordinates;
        switch (i) {
        case "Point":
            switch (o) {
            case "Point":
                return vs(s, a);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "MultiPoint":
            switch (o) {
            case "Point":
                return function(t, e) {
                    var n, r = !1;
                    for (n = 0; n < t.coordinates.length; n++)
                        if (vs(t.coordinates[n], e.coordinates)) {
                            r = !0;
                            break
                        }
                    return r
                }(n, r);
            case "MultiPoint":
                return function(t, e) {
                    for (var n = 0, r = e.coordinates; n < r.length; n++) {
                        for (var i = r[n], o = !1, s = 0, a = t.coordinates; s < a.length; s++) {
                            if (vs(i, a[s])) {
                                o = !0;
                                break
                            }
                        }
                        if (!o)
                            return !1
                    }
                    return !0
                }(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "LineString":
            switch (o) {
            case "Point":
                return Wr(r, n, {
                    ignoreEndVertices: !0
                });
            case "LineString":
                return function(t, e) {
                    for (var n = !1, r = 0, i = e.coordinates; r < i.length; r++) {
                        var o = i[r];
                        if (Wr({
                            type: "Point",
                            coordinates: o
                        }, t, {
                            ignoreEndVertices: !0
                        }) && (n = !0),
                        !Wr({
                            type: "Point",
                            coordinates: o
                        }, t, {
                            ignoreEndVertices: !1
                        }))
                            return !1
                    }
                    return n
                }(n, r);
            case "MultiPoint":
                return function(t, e) {
                    for (var n = !1, r = 0, i = e.coordinates; r < i.length; r++) {
                        var o = i[r];
                        if (Wr(o, t, {
                            ignoreEndVertices: !0
                        }) && (n = !0),
                        !Wr(o, t))
                            return !1
                    }
                    if (n)
                        return !0;
                    return !1
                }(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "Polygon":
            switch (o) {
            case "Point":
                return ye(r, n, {
                    ignoreBoundary: !0
                });
            case "LineString":
                return function(t, e) {
                    var n = !1
                      , r = 0
                      , i = Z(t)
                      , o = Z(e);
                    if (!ys(i, o))
                        return !1;
                    for (; r < e.coordinates.length - 1; r++) {
                        if (ye({
                            type: "Point",
                            coordinates: _s(e.coordinates[r], e.coordinates[r + 1])
                        }, t, {
                            ignoreBoundary: !0
                        })) {
                            n = !0;
                            break
                        }
                    }
                    return n
                }(n, r);
            case "Polygon":
                return function(t, e) {
                    if ("Feature" === t.type && null === t.geometry)
                        return !1;
                    if ("Feature" === e.type && null === e.geometry)
                        return !1;
                    var n = Z(t)
                      , r = Z(e);
                    if (!ys(n, r))
                        return !1;
                    for (var i = rt(e).coordinates, o = 0, s = i; o < s.length; o++)
                        for (var a = 0, u = s[o]; a < u.length; a++) {
                            if (!ye(u[a], t))
                                return !1
                        }
                    return !0
                }(n, r);
            case "MultiPoint":
                return function(t, e) {
                    for (var n = 0, r = e.coordinates; n < r.length; n++) {
                        if (!ye(r[n], t, {
                            ignoreBoundary: !0
                        }))
                            return !1
                    }
                    return !0
                }(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        default:
            throw new Error("feature1 " + i + " geometry not supported")
        }
    }
    ,
    t.booleanCrosses = function(t, e) {
        var n = rt(t)
          , r = rt(e)
          , i = n.type
          , o = r.type;
        switch (i) {
        case "MultiPoint":
            switch (o) {
            case "LineString":
                return ms(n, r);
            case "Polygon":
                return Es(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "LineString":
            switch (o) {
            case "MultiPoint":
                return ms(r, n);
            case "LineString":
                return function(t, e) {
                    if (Or(t, e).features.length > 0)
                        for (var n = 0; n < t.coordinates.length - 1; n++)
                            for (var r = 0; r < e.coordinates.length - 1; r++) {
                                var i = !0;
                                if (0 !== r && r !== e.coordinates.length - 2 || (i = !1),
                                bs(t.coordinates[n], t.coordinates[n + 1], e.coordinates[r], i))
                                    return !0
                            }
                    return !1
                }(n, r);
            case "Polygon":
                return xs(n, r);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        case "Polygon":
            switch (o) {
            case "MultiPoint":
                return Es(r, n);
            case "LineString":
                return xs(r, n);
            default:
                throw new Error("feature2 " + o + " geometry not supported")
            }
        default:
            throw new Error("feature1 " + i + " geometry not supported")
        }
    }
    ,
    t.booleanDisjoint = ps,
    t.booleanEqual = function(t, e) {
        return rt(t).type === rt(e).type && new Cs({
            precision: 6
        }).compare(tn(t), tn(e))
    }
    ,
    t.booleanIntersects = Ps,
    t.booleanOverlap = function(t, e) {
        var n = rt(t)
          , r = rt(e)
          , i = n.type
          , o = r.type;
        if ("MultiPoint" === i && "MultiPoint" !== o || ("LineString" === i || "MultiLineString" === i) && "LineString" !== o && "MultiLineString" !== o || ("Polygon" === i || "MultiPolygon" === i) && "Polygon" !== o && "MultiPolygon" !== o)
            throw new Error("features must be of the same type");
        if ("Point" === i)
            throw new Error("Point geometry not supported");
        if (new Cs({
            precision: 6
        }).compare(t, e))
            return !1;
        var s = 0;
        switch (i) {
        case "MultiPoint":
            for (var a = 0; a < n.coordinates.length; a++)
                for (var u = 0; u < r.coordinates.length; u++) {
                    var l = n.coordinates[a]
                      , c = r.coordinates[u];
                    if (l[0] === c[0] && l[1] === c[1])
                        return !0
                }
            return !1;
        case "LineString":
        case "MultiLineString":
            U(t, (function(t) {
                U(e, (function(e) {
                    ki(t, e).features.length && s++
                }
                ))
            }
            ));
            break;
        case "Polygon":
        case "MultiPolygon":
            U(t, (function(t) {
                U(e, (function(e) {
                    Or(t, e).features.length && s++
                }
                ))
            }
            ))
        }
        return s > 0
    }
    ,
    t.booleanParallel = function(t, e) {
        if (!t)
            throw new Error("line1 is required");
        if (!e)
            throw new Error("line2 is required");
        if ("LineString" !== Us(t, "line1"))
            throw new Error("line1 must be a LineString");
        if ("LineString" !== Us(e, "line2"))
            throw new Error("line2 must be a LineString");
        for (var n = Zn(tn(t)).features, r = Zn(tn(e)).features, i = 0; i < n.length; i++) {
            var o = n[i].geometry.coordinates;
            if (!r[i])
                break;
            if (!js(o, r[i].geometry.coordinates))
                return !1
        }
        return !0
    }
    ,
    t.booleanPointInPolygon = ye,
    t.booleanPointOnLine = Wr,
    t.booleanWithin = Zr,
    t.buffer = function(t, e, n) {
        var r = (n = n || {}).units || "kilometers"
          , i = n.steps || 8;
        if (!t)
            throw new Error("geojson is required");
        if ("object" != typeof n)
            throw new Error("options must be an object");
        if ("number" != typeof i)
            throw new Error("steps must be an number");
        if (void 0 === e)
            throw new Error("radius is required");
        if (i <= 0)
            throw new Error("steps must be greater than 0");
        var o = [];
        switch (t.type) {
        case "GeometryCollection":
            return q(t, (function(t) {
                var n = ny(t, e, r, i);
                n && o.push(n)
            }
            )),
            f(o);
        case "FeatureCollection":
            return F(t, (function(t) {
                var n = ny(t, e, r, i);
                n && F(n, (function(t) {
                    t && o.push(t)
                }
                ))
            }
            )),
            f(o)
        }
        return ny(t, e, r, i)
    }
    ,
    t.center = xn,
    t.centerMean = Fa,
    t.centerMedian = function(t, e) {
        if (void 0 === e && (e = {}),
        !P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.counter || 10;
        if (!C(n))
            throw new Error("counter must be a number");
        var r = e.weight
          , i = Fa(t, {
            weight: e.weight
        })
          , o = f([]);
        F(t, (function(t) {
            var e;
            o.features.push(En(t, {
                properties: {
                    weight: null === (e = t.properties) || void 0 === e ? void 0 : e[r]
                }
            }))
        }
        ));
        var s = {
            tolerance: e.tolerance,
            medianCandidates: []
        };
        return ka(i.geometry.coordinates, [0, 0], o, s, n)
    }
    ,
    t.centerOfMass = function t(e, n) {
        switch (void 0 === n && (n = {}),
        it(e)) {
        case "Point":
            return a(K(e), n.properties);
        case "Polygon":
            var r = [];
            R(e, (function(t) {
                r.push(t)
            }
            ));
            var i, o, s, u, l, c, h, p, f = En(e, {
                properties: n.properties
            }), g = f.geometry.coordinates, d = 0, y = 0, v = 0, _ = r.map((function(t) {
                return [t[0] - g[0], t[1] - g[1]]
            }
            ));
            for (i = 0; i < r.length - 1; i++)
                u = (o = _[i])[0],
                c = o[1],
                l = (s = _[i + 1])[0],
                v += p = u * (h = s[1]) - l * c,
                d += (u + l) * p,
                y += (c + h) * p;
            if (0 === v)
                return f;
            var m = 1 / (6 * (.5 * v));
            return a([g[0] + m * d, g[1] + m * y], n.properties);
        default:
            var x = de(e);
            return x ? t(x, {
                properties: n.properties
            }) : En(e, {
                properties: n.properties
            })
        }
    }
    ,
    t.centroid = En,
    t.circle = _n,
    t.cleanCoords = tn,
    t.clone = Ie,
    t.clusterEach = ou,
    t.clusterReduce = su,
    t.clusters = hu,
    t.clustersDbscan = function(t, e, n) {
        void 0 === n && (n = {}),
        !0 !== n.mutate && (t = Ie(t)),
        n.minPoints = n.minPoints || 3;
        var r = new Ts.DBSCAN
          , i = r.run(G(t), N(e, n.units), n.minPoints, me)
          , o = -1;
        return i.forEach((function(e) {
            o++,
            e.forEach((function(e) {
                var n = t.features[e];
                n.properties || (n.properties = {}),
                n.properties.cluster = o,
                n.properties.dbscan = "core"
            }
            ))
        }
        )),
        r.noise.forEach((function(e) {
            var n = t.features[e];
            n.properties || (n.properties = {}),
            n.properties.cluster ? n.properties.dbscan = "edge" : n.properties.dbscan = "noise"
        }
        )),
        t
    }
    ,
    t.clustersKmeans = function(t, e) {
        void 0 === e && (e = {});
        var n = t.features.length;
        e.numberOfClusters = e.numberOfClusters || Math.round(Math.sqrt(n / 2)),
        e.numberOfClusters > n && (e.numberOfClusters = n),
        !0 !== e.mutate && (t = Ie(t));
        var r = G(t)
          , i = r.slice(0, e.numberOfClusters)
          , o = zs(r, e.numberOfClusters, i)
          , s = {};
        return o.centroids.forEach((function(t, e) {
            s[e] = t
        }
        )),
        F(t, (function(t, e) {
            var n = o.idxs[e];
            t.properties.cluster = n,
            t.properties.centroid = s[n]
        }
        )),
        t
    }
    ,
    t.collect = function(t, e, n, r) {
        var i = Nt(6)
          , o = e.features.map((function(t) {
            var e;
            return {
                minX: t.geometry.coordinates[0],
                minY: t.geometry.coordinates[1],
                maxX: t.geometry.coordinates[0],
                maxY: t.geometry.coordinates[1],
                property: null === (e = t.properties) || void 0 === e ? void 0 : e[n]
            }
        }
        ));
        return i.load(o),
        t.features.forEach((function(t) {
            t.properties || (t.properties = {});
            var e = Z(t)
              , n = i.search({
                minX: e[0],
                minY: e[1],
                maxX: e[2],
                maxY: e[3]
            })
              , o = [];
            n.forEach((function(e) {
                ye([e.minX, e.minY], t) && o.push(e.property)
            }
            )),
            t.properties[r] = o
        }
        )),
        t
    }
    ,
    t.collectionOf = nt,
    t.combine = function(t) {
        var e = {
            MultiPoint: {
                coordinates: [],
                properties: []
            },
            MultiLineString: {
                coordinates: [],
                properties: []
            },
            MultiPolygon: {
                coordinates: [],
                properties: []
            }
        };
        return F(t, (function(t) {
            var n, r, i, o;
            switch (null === (o = t.geometry) || void 0 === o ? void 0 : o.type) {
            case "Point":
                e.MultiPoint.coordinates.push(t.geometry.coordinates),
                e.MultiPoint.properties.push(t.properties);
                break;
            case "MultiPoint":
                (n = e.MultiPoint.coordinates).push.apply(n, t.geometry.coordinates),
                e.MultiPoint.properties.push(t.properties);
                break;
            case "LineString":
                e.MultiLineString.coordinates.push(t.geometry.coordinates),
                e.MultiLineString.properties.push(t.properties);
                break;
            case "MultiLineString":
                (r = e.MultiLineString.coordinates).push.apply(r, t.geometry.coordinates),
                e.MultiLineString.properties.push(t.properties);
                break;
            case "Polygon":
                e.MultiPolygon.coordinates.push(t.geometry.coordinates),
                e.MultiPolygon.properties.push(t.properties);
                break;
            case "MultiPolygon":
                (i = e.MultiPolygon.coordinates).push.apply(i, t.geometry.coordinates),
                e.MultiPolygon.properties.push(t.properties)
            }
        }
        )),
        f(Object.keys(e).filter((function(t) {
            return e[t].coordinates.length
        }
        )).sort().map((function(t) {
            return o({
                type: t,
                coordinates: e[t].coordinates
            }, {
                collectedProperties: e[t].properties
            })
        }
        )))
    }
    ,
    t.concave = function(t, e) {
        void 0 === e && (e = {});
        var n = e.maxEdge || 1 / 0
          , r = xe(function(t) {
            var e = []
              , n = {};
            return F(t, (function(t) {
                if (t.geometry) {
                    var r = t.geometry.coordinates.join("-");
                    Object.prototype.hasOwnProperty.call(n, r) || (e.push(t),
                    n[r] = !0)
                }
            }
            )),
            f(e)
        }(t));
        if (r.features = r.features.filter((function(t) {
            var r = t.geometry.coordinates[0][0]
              , i = t.geometry.coordinates[0][1]
              , o = t.geometry.coordinates[0][2]
              , s = me(r, i, e)
              , a = me(i, o, e)
              , u = me(r, o, e);
            return s <= n && a <= n && u <= n
        }
        )),
        r.features.length < 1)
            return null;
        var i = $e(r);
        return 1 === i.coordinates.length && (i.coordinates = i.coordinates[0],
        i.type = "Polygon"),
        o(i)
    }
    ,
    t.containsNumber = $,
    t.convertArea = S,
    t.convertDistance = N,
    t.convertLength = N,
    t.convex = de,
    t.coordAll = G,
    t.coordEach = R,
    t.coordReduce = T,
    t.createBins = au,
    t.degrees2radians = I,
    t.degreesToRadians = I,
    t.destination = vn,
    t.difference = function(t, e) {
        var n = rt(t)
          , r = rt(e)
          , i = t.properties || {}
          , o = $u.difference(n.coordinates, r.coordinates);
        return 0 === o.length ? null : 1 === o.length ? l(o[0], i) : y(o, i)
    }
    ,
    t.dissolve = function(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.propertyName;
        nt(t, "Polygon", "dissolve");
        var r = [];
        if (!e.propertyName)
            return ni(y($u.union.apply(null, t.features.map((function(t) {
                return t.geometry.coordinates
            }
            )))));
        var i = {};
        F(t, (function(t) {
            Object.prototype.hasOwnProperty.call(i, t.properties[n]) || (i[t.properties[n]] = []),
            i[t.properties[n]].push(t)
        }
        ));
        for (var o = Object.keys(i), s = 0; s < o.length; s++) {
            var a = y($u.union.apply(null, i[o[s]].map((function(t) {
                return t.geometry.coordinates
            }
            ))));
            a.properties[n] = o[s],
            r.push(a)
        }
        return ni(f(r))
    }
    ,
    t.distance = me,
    t.distanceToDegrees = E,
    t.distanceToRadians = x,
    t.distanceWeight = ja,
    t.earthRadius = e,
    t.ellipse = Aa,
    t.envelope = dn,
    t.explode = bn,
    t.factors = n,
    t.feature = o,
    t.featureCollection = f,
    t.featureEach = F,
    t.featureOf = et,
    t.featureReduce = k,
    t.filterProperties = cu,
    t.findPoint = W,
    t.findSegment = H,
    t.flatten = ni,
    t.flattenEach = z,
    t.flattenReduce = j,
    t.flip = function(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.mutate;
        if (!t)
            throw new Error("geojson is required");
        return !1 !== n && void 0 !== n || (t = Ie(t)),
        R(t, (function(t) {
            var e = t[0]
              , n = t[1];
            t[0] = n,
            t[1] = e
        }
        )),
        t
    }
    ,
    t.geojsonType = tt,
    t.geomEach = q,
    t.geomReduce = B,
    t.geometry = s,
    t.geometryCollection = v,
    t.getCluster = iu,
    t.getCoord = K,
    t.getCoords = Q,
    t.getGeom = rt,
    t.getType = it,
    t.greatCircle = function(t, e, n) {
        if ("object" != typeof (n = n || {}))
            throw new Error("options is invalid");
        var r = n.properties
          , i = n.npoints
          , o = n.offset;
        return t = K(t),
        e = K(e),
        r = r || {},
        i = i || 100,
        o = o || 10,
        new vi({
            x: t[0],
            y: t[1]
        },{
            x: e[0],
            y: e[1]
        },r).Arc(i, {
            offset: o
        }).json()
    }
    ,
    t.helpers = O,
    t.hexGrid = ay,
    t.inside = ye,
    t.interpolate = function(t, e, n) {
        if ("object" != typeof (n = n || {}))
            throw new Error("options is invalid");
        var r = n.gridType
          , i = n.property
          , o = n.weight;
        if (!t)
            throw new Error("points is required");
        if (nt(t, "Point", "input must contain Points"),
        !e)
            throw new Error("cellSize is required");
        if (void 0 !== o && "number" != typeof o)
            throw new Error("weight must be a number");
        i = i || "elevation",
        r = r || "square",
        o = o || 1;
        var s, a = Z(t);
        switch (r) {
        case "point":
        case "points":
            s = ti(a, e, n);
            break;
        case "square":
        case "squares":
            s = py(a, e, n);
            break;
        case "hex":
        case "hexes":
            s = ay(a, e, n);
            break;
        case "triangle":
        case "triangles":
            s = fy(a, e, n);
            break;
        default:
            throw new Error("invalid gridType")
        }
        var u = [];
        return F(s, (function(e) {
            var s = 0
              , a = 0;
            F(t, (function(t) {
                var u, l = me("point" === r ? e : En(e), t, n);
                if (void 0 !== i && (u = t.properties[i]),
                void 0 === u && (u = t.geometry.coordinates[2]),
                void 0 === u)
                    throw new Error("zValue is missing");
                0 === l && (s = u);
                var c = 1 / Math.pow(l, o);
                a += c,
                s += c * u
            }
            ));
            var l = Ie(e);
            l.properties[i] = s / a,
            u.push(l)
        }
        )),
        f(u)
    }
    ,
    t.intersect = sy,
    t.invariant = ot,
    t.isNumber = C,
    t.isObject = P,
    t.isobands = function(t, e, n) {
        if (!P(n = n || {}))
            throw new Error("options is invalid");
        var r = n.zProperty || "elevation"
          , i = n.commonProperties || {}
          , o = n.breaksProperties || [];
        if (nt(t, "Point", "Input must contain Points"),
        !e)
            throw new Error("breaks is required");
        if (!Array.isArray(e))
            throw new Error("breaks is not an Array");
        if (!P(i))
            throw new Error("commonProperties is not an Object");
        if (!Array.isArray(o))
            throw new Error("breaksProperties is not an Array");
        var s = Zi(t, {
            zProperty: r,
            flip: !0
        })
          , a = function(t, e, n) {
            for (var r = [], i = 1; i < e.length; i++) {
                var o = +e[i - 1]
                  , s = +e[i]
                  , a = Zo(Jo($i(t, o, s - o)))
                  , u = {};
                u.groupedRings = a,
                u[n] = o + "-" + s,
                r.push(u)
            }
            return r
        }(s, e, r);
        return f((a = function(t, e, n) {
            var r = Z(n)
              , i = r[2] - r[0]
              , o = r[3] - r[1]
              , s = r[0]
              , a = r[1]
              , u = e[0].length - 1
              , l = e.length - 1
              , c = i / u
              , h = o / l
              , p = function(t) {
                t[0] = t[0] * c + s,
                t[1] = t[1] * h + a
            };
            return t.forEach((function(t) {
                t.groupedRings.forEach((function(t) {
                    t.forEach((function(t) {
                        t.forEach(p)
                    }
                    ))
                }
                ))
            }
            )),
            t
        }(a, s, t)).map((function(t, e) {
            if (o[e] && !P(o[e]))
                throw new Error("Each mappedProperty is required to be an Object");
            var n = ct({}, i, o[e]);
            return n[r] = t[r],
            y(t.groupedRings, n)
        }
        )))
    }
    ,
    t.isolines = function(t, e, n) {
        if (!P(n = n || {}))
            throw new Error("options is invalid");
        var r = n.zProperty || "elevation"
          , i = n.commonProperties || {}
          , o = n.breaksProperties || [];
        if (nt(t, "Point", "Input must contain Points"),
        !e)
            throw new Error("breaks is required");
        if (!Array.isArray(e))
            throw new Error("breaks must be an Array");
        if (!P(i))
            throw new Error("commonProperties must be an Object");
        if (!Array.isArray(o))
            throw new Error("breaksProperties must be an Array");
        var s = _t(t, {
            zProperty: r,
            flip: !0
        });
        return f(function(t, e, n) {
            var r = Z(n)
              , i = r[2] - r[0]
              , o = r[3] - r[1]
              , s = r[0]
              , a = r[1]
              , u = e[0].length - 1
              , l = e.length - 1
              , c = i / u
              , h = o / l
              , p = function(t) {
                t[0] = t[0] * c + s,
                t[1] = t[1] * h + a
            };
            return t.forEach((function(t) {
                R(t, p)
            }
            )),
            t
        }(function(t, e, n, r, i) {
            for (var o = [], s = 1; s < e.length; s++) {
                var a = +e[s]
                  , u = ct({}, r, i[s]);
                u[n] = a;
                var l = g(ft(t, a), u);
                o.push(l)
            }
            return o
        }(s, e, r, i, o), s, t))
    }
    ,
    t.kinks = function(t) {
        var e, n, r = {
            type: "FeatureCollection",
            features: []
        };
        if ("LineString" === (n = "Feature" === t.type ? t.geometry : t).type)
            e = [n.coordinates];
        else if ("MultiLineString" === n.type)
            e = n.coordinates;
        else if ("MultiPolygon" === n.type)
            e = [].concat.apply([], n.coordinates);
        else {
            if ("Polygon" !== n.type)
                throw new Error("Input must be a LineString, MultiLineString, Polygon, or MultiPolygon Feature or Geometry");
            e = n.coordinates
        }
        return e.forEach((function(t) {
            e.forEach((function(e) {
                for (var n = 0; n < t.length - 1; n++)
                    for (var i = n; i < e.length - 1; i++) {
                        if (t === e) {
                            if (1 === Math.abs(n - i))
                                continue;
                            if (0 === n && i === t.length - 2 && t[n][0] === t[t.length - 1][0] && t[n][1] === t[t.length - 1][1])
                                continue
                        }
                        var o = Gr(t[n][0], t[n][1], t[n + 1][0], t[n + 1][1], e[i][0], e[i][1], e[i + 1][0], e[i + 1][1]);
                        o && r.features.push(a([o[0], o[1]]))
                    }
            }
            ))
        }
        )),
        r
    }
    ,
    t.length = Yr,
    t.lengthToDegrees = E,
    t.lengthToRadians = x,
    t.lineArc = bi,
    t.lineChunk = function(t, e, n) {
        if (!P(n = n || {}))
            throw new Error("options is invalid");
        var r = n.units
          , i = n.reverse;
        if (!t)
            throw new Error("geojson is required");
        if (e <= 0)
            throw new Error("segmentLength must be greater than 0");
        var o = [];
        return z(t, (function(t) {
            i && (t.geometry.coordinates = t.geometry.coordinates.reverse()),
            function(t, e, n, r) {
                var i = Yr(t, {
                    units: n
                });
                if (i <= e)
                    return r(t);
                var o = i / e;
                Number.isInteger(o) || (o = Math.floor(o) + 1);
                for (var s = 0; s < o; s++) {
                    r(Hr(t, e * s, e * (s + 1), {
                        units: n
                    }), s)
                }
            }(t, e, r, (function(t) {
                o.push(t)
            }
            ))
        }
        )),
        f(o)
    }
    ,
    t.lineDistance = Yr,
    t.lineEach = X,
    t.lineIntersect = Or,
    t.lineOffset = function(t, e, n) {
        if (!P(n = n || {}))
            throw new Error("options is invalid");
        var r = n.units;
        if (!t)
            throw new Error("geojson is required");
        if (null == e || isNaN(e))
            throw new Error("distance is required");
        var i = it(t)
          , o = t.properties;
        switch (i) {
        case "LineString":
            return os(t, e, r);
        case "MultiLineString":
            var s = [];
            return z(t, (function(t) {
                s.push(os(t, e, r).geometry.coordinates)
            }
            )),
            g(s, o);
        default:
            throw new Error("geometry " + i + " is not supported")
        }
    }
    ,
    t.lineOverlap = ki,
    t.lineReduce = Y,
    t.lineSegment = Zn,
    t.lineSlice = function(t, e, n) {
        var r = Q(n);
        if ("LineString" !== it(n))
            throw new Error("line must be a LineString");
        for (var i, o = Tr(n, t), s = Tr(n, e), a = [(i = o.properties.index <= s.properties.index ? [o, s] : [s, o])[0].geometry.coordinates], u = i[0].properties.index + 1; u < i[1].properties.index + 1; u++)
            a.push(r[u]);
        return a.push(i[1].geometry.coordinates),
        h(a, n.properties)
    }
    ,
    t.lineSliceAlong = Hr,
    t.lineSplit = function(t, e) {
        if (!t)
            throw new Error("line is required");
        if (!e)
            throw new Error("splitter is required");
        var n = it(t)
          , r = it(e);
        if ("LineString" !== n)
            throw new Error("line must be LineString");
        if ("FeatureCollection" === r)
            throw new Error("splitter cannot be a FeatureCollection");
        if ("GeometryCollection" === r)
            throw new Error("splitter cannot be a GeometryCollection");
        var i = ei(e, {
            precision: 7
        });
        switch (r) {
        case "Point":
            return mi(t, i);
        case "MultiPoint":
            return _i(t, i);
        case "LineString":
        case "MultiLineString":
        case "Polygon":
        case "MultiPolygon":
            return _i(t, Or(t, i))
        }
    }
    ,
    t.lineString = h,
    t.lineStringToPolygon = Ci,
    t.lineStrings = p,
    t.lineToPolygon = Ci,
    t.mask = function(t, e) {
        var n, r = hy(e), i = null;
        return "FeatureCollection" === t.type ? i = cy(2 === (n = t).features.length ? $u.union(n.features[0].geometry.coordinates, n.features[1].geometry.coordinates) : $u.union.apply($u, n.features.map((function(t) {
            return t.geometry.coordinates
        }
        )))) : i = cy($u.union(t.geometry.coordinates)),
        i.geometry.coordinates.forEach((function(t) {
            r.geometry.coordinates.push(t[0])
        }
        )),
        r
    }
    ,
    t.meta = J,
    t.midpoint = function(t, e) {
        return vn(t, me(t, e) / 2, mn(t, e))
    }
    ,
    t.moranIndex = function(t, e) {
        var n = e.inputField
          , r = e.threshold || 1e5
          , i = e.p || 2
          , o = e.binary || !1
          , s = ja(t, {
            alpha: e.alpha || -1,
            binary: o,
            p: i,
            standardization: e.standardization || !0,
            threshold: r
        })
          , a = [];
        F(t, (function(t) {
            var e = t.properties || {};
            a.push(e[n])
        }
        ));
        for (var u = Ua(a), l = function(t) {
            for (var e = Ua(t), n = 0, r = 0, i = t; r < i.length; r++) {
                var o = i[r];
                n += Math.pow(o - e, 2)
            }
            return n / t.length
        }(a), c = 0, h = 0, p = 0, f = 0, g = s.length, d = 0; d < g; d++) {
            for (var y = 0, v = 0; v < g; v++)
                c += s[d][v] * (a[d] - u) * (a[v] - u),
                h += s[d][v],
                p += Math.pow(s[d][v] + s[v][d], 2),
                y += s[d][v] + s[v][d];
            f += Math.pow(y, 2)
        }
        var _ = c / h / l
          , m = -1 / (g - 1)
          , x = (g * g * (p *= .5) - g * f + h * h * 3) / ((g - 1) * (g + 1) * (h * h)) - m * m
          , E = Math.sqrt(x);
        return {
            expectedMoranIndex: m,
            moranIndex: _,
            stdNorm: E,
            zNorm: (_ - m) / E
        }
    }
    ,
    t.multiLineString = g,
    t.multiPoint = d,
    t.multiPolygon = y,
    t.nearest = Jn,
    t.nearestPoint = Jn,
    t.nearestPointOnLine = Tr,
    t.nearestPointToLine = function(t, e, n) {
        void 0 === n && (n = {});
        var r = n.units
          , i = n.properties || {}
          , o = function(t) {
            var e = [];
            switch (t.geometry ? t.geometry.type : t.type) {
            case "GeometryCollection":
                return q(t, (function(t) {
                    "Point" === t.type && e.push({
                        type: "Feature",
                        properties: {},
                        geometry: t
                    })
                }
                )),
                {
                    type: "FeatureCollection",
                    features: e
                };
            case "FeatureCollection":
                return t.features = t.features.filter((function(t) {
                    return "Point" === t.geometry.type
                }
                )),
                t;
            default:
                throw new Error("points must be a Point Collection")
            }
        }(t);
        if (!o.features.length)
            throw new Error("points must contain features");
        if (!e)
            throw new Error("line is required");
        if ("LineString" !== it(e))
            throw new Error("line must be a LineString");
        var s = 1 / 0
          , a = null;
        return F(o, (function(t) {
            var n = Dr(t, e, {
                units: r
            });
            n < s && (s = n,
            a = t)
        }
        )),
        a && (a.properties = ct({
            dist: s
        }, a.properties, i)),
        a
    }
    ,
    t.planepoint = function(t, e) {
        var n = K(t)
          , r = rt(e).coordinates[0];
        if (r.length < 4)
            throw new Error("OuterRing of a Polygon must have 4 or more Positions.");
        var i = e.properties || {}
          , o = i.a
          , s = i.b
          , a = i.c
          , u = n[0]
          , l = n[1]
          , c = r[0][0]
          , h = r[0][1]
          , p = void 0 !== o ? o : r[0][2]
          , f = r[1][0]
          , g = r[1][1]
          , d = void 0 !== s ? s : r[1][2]
          , y = r[2][0]
          , v = r[2][1]
          , _ = void 0 !== a ? a : r[2][2];
        return (_ * (u - c) * (l - g) + p * (u - f) * (l - v) + d * (u - y) * (l - h) - d * (u - c) * (l - v) - _ * (u - f) * (l - h) - p * (u - y) * (l - g)) / ((u - c) * (l - g) + (u - f) * (l - v) + (u - y) * (l - h) - (u - c) * (l - v) - (u - f) * (l - h) - (u - y) * (l - g))
    }
    ,
    t.point = a,
    t.pointGrid = ti,
    t.pointOnFeature = qr,
    t.pointOnLine = Tr,
    t.pointOnSurface = qr,
    t.pointToLineDistance = Dr,
    t.points = u,
    t.pointsWithinPolygon = _e,
    t.polygon = l,
    t.polygonSmooth = function(t, e) {
        var n = []
          , r = e.iterations || 1;
        if (!t)
            throw new Error("inputPolys is required");
        return q(t, (function(t, e, i) {
            var o, s, a;
            switch (t.type) {
            case "Polygon":
                o = [[]];
                for (var u = 0; u < r; u++)
                    a = [[]],
                    s = t,
                    u > 0 && (s = l(o).geometry),
                    qa(s, a),
                    o = a.slice(0);
                n.push(l(o, i));
                break;
            case "MultiPolygon":
                o = [[[]]];
                for (var c = 0; c < r; c++)
                    a = [[[]]],
                    s = t,
                    c > 0 && (s = y(o).geometry),
                    Ba(s, a),
                    o = a.slice(0);
                n.push(y(o, i));
                break;
            default:
                throw new Error("geometry is invalid, must be Polygon or MultiPolygon")
            }
        }
        )),
        f(n)
    }
    ,
    t.polygonTangents = function(t, e) {
        var n, r, i, o, s = Q(t), u = Q(e), l = Z(e), c = 0, h = null;
        switch (s[0] > l[0] && s[0] < l[2] && s[1] > l[1] && s[1] < l[3] && (c = (h = Jn(t, bn(e))).properties.featureIndex),
        it(e)) {
        case "Polygon":
            n = u[0][c],
            r = u[0][0],
            null !== h && h.geometry.coordinates[1] < s[1] && (r = u[0][c]),
            o = Xi(u[0][0], u[0][u[0].length - 1], s);
            var p = Ui(u[0], s, o, i, n, r);
            n = p[0],
            r = p[1];
            break;
        case "MultiPolygon":
            for (var g = 0, d = 0, y = 0, v = 0; v < u[0].length; v++) {
                g = v;
                for (var _ = !1, m = 0; m < u[0][v].length; m++) {
                    if (d = m,
                    y === c) {
                        _ = !0;
                        break
                    }
                    y++
                }
                if (_)
                    break
            }
            n = u[0][g][d],
            r = u[0][g][d],
            o = Xi(u[0][0][0], u[0][0][u[0][0].length - 1], s),
            u.forEach((function(t) {
                var e = Ui(t[0], s, o, i, n, r);
                n = e[0],
                r = e[1]
            }
            ))
        }
        return f([a(n), a(r)])
    }
    ,
    t.polygonToLine = Ii,
    t.polygonToLineString = Ii,
    t.polygonize = function(t) {
        var e = hs.fromGeoJson(t);
        e.deleteDangles(),
        e.deleteCutEdges();
        var n = []
          , r = [];
        return e.getEdgeRings().filter((function(t) {
            return t.isValid()
        }
        )).forEach((function(t) {
            t.isHole() ? n.push(t) : r.push(t)
        }
        )),
        n.forEach((function(t) {
            cs.findEdgeRingContaining(t, r) && r.push(t)
        }
        )),
        f(r.map((function(t) {
            return t.toPolygon()
        }
        )))
    }
    ,
    t.polygons = c,
    t.projection = Ja,
    t.propEach = A,
    t.propReduce = D,
    t.propertiesContainsFilter = lu,
    t.radians2degrees = w,
    t.radiansToDegrees = w,
    t.radiansToDistance = m,
    t.radiansToLength = m,
    t.random = ru,
    t.randomLineString = tu,
    t.randomPoint = Qa,
    t.randomPolygon = $a,
    t.randomPosition = Ka,
    t.rewind = function(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.reverse || !1
          , r = e.mutate || !1;
        if (!t)
            throw new Error("<geojson> is required");
        if ("boolean" != typeof n)
            throw new Error("<reverse> must be a boolean");
        if ("boolean" != typeof r)
            throw new Error("<mutate> must be a boolean");
        !1 === r && (t = Ie(t));
        var i = [];
        switch (t.type) {
        case "GeometryCollection":
            return q(t, (function(t) {
                Hi(t, n)
            }
            )),
            t;
        case "FeatureCollection":
            return F(t, (function(t) {
                F(Hi(t, n), (function(t) {
                    i.push(t)
                }
                ))
            }
            )),
            f(i)
        }
        return Hi(t, n)
    }
    ,
    t.rhumbBearing = Bi,
    t.rhumbDestination = ji,
    t.rhumbDistance = Ar,
    t.round = _,
    t.sample = function(t, e) {
        if (!t)
            throw new Error("featurecollection is required");
        if (null == e)
            throw new Error("num is required");
        if ("number" != typeof e)
            throw new Error("num must be a number");
        return f(function(t, e) {
            var n, r, i = t.slice(0), o = t.length, s = o - e;
            for (; o-- > s; )
                n = i[r = Math.floor((o + 1) * Math.random())],
                i[r] = i[o],
                i[o] = n;
            return i.slice(s)
        }(t.features, e))
    }
    ,
    t.sector = function(t, e, n, r, i) {
        if (!P(i = i || {}))
            throw new Error("options is invalid");
        var o = i.properties;
        if (!t)
            throw new Error("center is required");
        if (null == n)
            throw new Error("bearing1 is required");
        if (null == r)
            throw new Error("bearing2 is required");
        if (!e)
            throw new Error("radius is required");
        if ("object" != typeof i)
            throw new Error("options must be an object");
        if (qi(n) === qi(r))
            return _n(t, e, i);
        var s = Q(t)
          , a = bi(t, e, n, r, i)
          , u = [[s]];
        return R(a, (function(t) {
            u[0].push(t)
        }
        )),
        u[0].push(s),
        l(u, o)
    }
    ,
    t.segmentEach = U,
    t.segmentReduce = V,
    t.shortestPath = function(t, e, n) {
        if (!P(n = n || {}))
            throw new Error("options is invalid");
        var r = n.resolution
          , i = n.minDistance
          , s = n.obstacles || f([]);
        if (!t)
            throw new Error("start is required");
        if (!e)
            throw new Error("end is required");
        if (r && !C(r) || r <= 0)
            throw new Error("options.resolution must be a number, greater than 0");
        if (i)
            throw new Error("options.minDistance is not yet implemented");
        var u = K(t)
          , l = K(e);
        switch (t = a(u),
        e = a(l),
        it(s)) {
        case "FeatureCollection":
            if (0 === s.features.length)
                return h([u, l]);
            break;
        case "Polygon":
            s = f([o(rt(s))]);
            break;
        default:
            throw new Error("invalid obstacles")
        }
        var c = s;
        c.features.push(t),
        c.features.push(e);
        var p = Z(ts(gn(Z(c)), 1.15));
        r || (r = me([p[0], p[1]], [p[2], p[1]], n) / 100),
        c.features.pop(),
        c.features.pop();
        for (var g = p[0], d = p[1], y = p[2], v = p[3], _ = r / me([g, d], [y, d], n) * (y - g), m = r / me([g, d], [g, v], n) * (v - d), x = y - g, E = v - d, b = Math.floor(x / _), w = Math.floor(E / m), I = (x - b * _) / 2, N = [], S = [], M = [], L = [], O = 1 / 0, R = 1 / 0, T = v - (E - w * m) / 2, A = 0; T >= d; ) {
            for (var D = [], F = [], k = g + I, G = 0; k <= y; ) {
                var q = a([k, T])
                  , B = Js(q, s);
                D.push(B ? 0 : 1),
                F.push(k + "|" + T);
                var z = me(q, t);
                !B && z < O && (O = z,
                M = {
                    x: G,
                    y: A
                });
                var j = me(q, e);
                !B && j < R && (R = j,
                L = {
                    x: G,
                    y: A
                }),
                k += _,
                G++
            }
            S.push(D),
            N.push(F),
            T -= m,
            A++
        }
        var U = new Ys(S,{
            diagonal: !0
        })
          , V = U.grid[M.y][M.x]
          , X = U.grid[L.y][L.x]
          , Y = Xs.search(U, V, X)
          , H = [u];
        return Y.forEach((function(t) {
            var e = N[t.x][t.y].split("|");
            H.push([+e[0], +e[1]])
        }
        )),
        H.push(l),
        tn(h(H))
    }
    ,
    t.simplify = function(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = void 0 !== e.tolerance ? e.tolerance : 1
          , r = e.highQuality || !1
          , i = e.mutate || !1;
        if (!t)
            throw new Error("geojson is required");
        if (n && n < 0)
            throw new Error("invalid tolerance");
        return !0 !== i && (t = Ie(t)),
        q(t, (function(t) {
            !function(t, e, n) {
                var r = t.type;
                if ("Point" === r || "MultiPoint" === r)
                    return t;
                tn(t, !0);
                var i = t.coordinates;
                switch (r) {
                case "LineString":
                    t.coordinates = ln(i, e, n);
                    break;
                case "MultiLineString":
                    t.coordinates = i.map((function(t) {
                        return ln(t, e, n)
                    }
                    ));
                    break;
                case "Polygon":
                    t.coordinates = cn(i, e, n);
                    break;
                case "MultiPolygon":
                    t.coordinates = i.map((function(t) {
                        return cn(t, e, n)
                    }
                    ))
                }
            }(t, n, r)
        }
        )),
        t
    }
    ,
    t.square = yn,
    t.squareGrid = py,
    t.standardDeviationalEllipse = function(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.steps || 64
          , r = e.weight
          , i = e.properties || {};
        if (!C(n))
            throw new Error("steps must be a number");
        if (!P(i))
            throw new Error("properties must be a number");
        var o = G(t).length
          , s = Fa(t, {
            weight: r
        })
          , a = 0
          , u = 0
          , l = 0;
        F(t, (function(t) {
            var e = t.properties[r] || 1
              , n = Ga(Q(t), Q(s));
            a += Math.pow(n.x, 2) * e,
            u += Math.pow(n.y, 2) * e,
            l += n.x * n.y * e
        }
        ));
        var c = a - u
          , h = Math.sqrt(Math.pow(c, 2) + 4 * Math.pow(l, 2))
          , p = 2 * l
          , g = Math.atan((c + h) / p)
          , d = 180 * g / Math.PI
          , y = 0
          , v = 0
          , _ = 0;
        F(t, (function(t) {
            var e = t.properties[r] || 1
              , n = Ga(Q(t), Q(s));
            y += Math.pow(n.x * Math.cos(g) - n.y * Math.sin(g), 2) * e,
            v += Math.pow(n.x * Math.sin(g) + n.y * Math.cos(g), 2) * e,
            _ += e
        }
        ));
        var m = Math.sqrt(2 * y / _)
          , x = Math.sqrt(2 * v / _)
          , E = Aa(s, m, x, {
            units: "degrees",
            angle: d,
            steps: n,
            properties: i
        })
          , b = _e(t, f([E]))
          , w = {
            meanCenterCoordinates: Q(s),
            semiMajorAxis: m,
            semiMinorAxis: x,
            numberOfFeatures: o,
            angle: d,
            percentageWithinEllipse: 100 * G(b).length / o
        };
        return E.properties.standardDeviationalEllipse = w,
        E
    }
    ,
    t.tag = function(t, e, n, r) {
        return t = Ie(t),
        e = Ie(e),
        F(t, (function(t) {
            t.properties || (t.properties = {}),
            F(e, (function(e) {
                void 0 === t.properties[r] && ye(t, e) && (t.properties[r] = e.properties[n])
            }
            ))
        }
        )),
        t
    }
    ,
    t.tesselate = function(t) {
        if (!t.geometry || "Polygon" !== t.geometry.type && "MultiPolygon" !== t.geometry.type)
            throw new Error("input must be a Polygon or MultiPolygon");
        var e = {
            type: "FeatureCollection",
            features: []
        };
        return "Polygon" === t.geometry.type ? e.features = Wn(t.geometry.coordinates) : t.geometry.coordinates.forEach((function(t) {
            e.features = e.features.concat(Wn(t))
        }
        )),
        e
    }
    ,
    t.tin = xe,
    t.toMercator = Va,
    t.toWgs84 = Xa,
    t.transformRotate = $o,
    t.transformScale = ts,
    t.transformTranslate = function(t, e, n, r) {
        if (!P(r = r || {}))
            throw new Error("options is invalid");
        var i = r.units
          , o = r.zTranslation
          , s = r.mutate;
        if (!t)
            throw new Error("geojson is required");
        if (null == e || isNaN(e))
            throw new Error("distance is required");
        if (o && "number" != typeof o && isNaN(o))
            throw new Error("zTranslation is not a number");
        if (o = void 0 !== o ? o : 0,
        0 === e && 0 === o)
            return t;
        if (null == n || isNaN(n))
            throw new Error("direction is required");
        return e < 0 && (e = -e,
        n += 180),
        !1 !== s && void 0 !== s || (t = Ie(t)),
        R(t, (function(t) {
            var r = Q(ji(t, e, n, {
                units: i
            }));
            t[0] = r[0],
            t[1] = r[1],
            o && 3 === t.length && (t[2] += o)
        }
        )),
        t
    }
    ,
    t.triangleGrid = fy,
    t.truncate = ei,
    t.union = function(t, e, n) {
        void 0 === n && (n = {});
        var r = rt(t)
          , i = rt(e)
          , o = $u.union(r.coordinates, i.coordinates);
        return 0 === o.length ? null : 1 === o.length ? l(o[0], n.properties) : y(o, n.properties)
    }
    ,
    t.unitsFactors = r,
    t.unkinkPolygon = function(t) {
        var e = [];
        return z(t, (function(t) {
            "Polygon" === t.geometry.type && F(oi(t), (function(n) {
                e.push(l(n.geometry.coordinates, t.properties))
            }
            ))
        }
        )),
        f(e)
    }
    ,
    t.validateBBox = M,
    t.validateId = L,
    t.voronoi = function(t, e) {
        if (!P(e = e || {}))
            throw new Error("options is invalid");
        var n = e.bbox || [-180, -85, 180, 85];
        if (!t)
            throw new Error("points is required");
        if (!Array.isArray(n))
            throw new Error("bbox is invalid");
        return nt(t, "Point", "points"),
        f(function() {
            var t = Ks
              , e = Qs
              , n = null;
            function r(r) {
                return new Ra(r.map((function(n, i) {
                    var o = [Math.round(t(n, i, r) / Ma) * Ma, Math.round(e(n, i, r) / Ma) * Ma];
                    return o.index = i,
                    o.data = n,
                    o
                }
                )),n)
            }
            return r.polygons = function(t) {
                return r(t).polygons()
            }
            ,
            r.links = function(t) {
                return r(t).links()
            }
            ,
            r.triangles = function(t) {
                return r(t).triangles()
            }
            ,
            r.x = function(e) {
                return arguments.length ? (t = "function" == typeof e ? e : Zs(+e),
                r) : t
            }
            ,
            r.y = function(t) {
                return arguments.length ? (e = "function" == typeof t ? t : Zs(+t),
                r) : e
            }
            ,
            r.extent = function(t) {
                return arguments.length ? (n = null == t ? null : [[+t[0][0], +t[0][1]], [+t[1][0], +t[1][1]]],
                r) : n && [[n[0][0], n[0][1]], [n[1][0], n[1][1]]]
            }
            ,
            r.size = function(t) {
                return arguments.length ? (n = null == t ? null : [[0, 0], [+t[0], +t[1]]],
                r) : n && [n[1][0] - n[0][0], n[1][1] - n[0][1]]
            }
            ,
            r
        }().x((function(t) {
            return t.geometry.coordinates[0]
        }
        )).y((function(t) {
            return t.geometry.coordinates[1]
        }
        )).extent([[n[0], n[1]], [n[2], n[3]]]).polygons(t.features).map(Ta))
    }
    ,
    t.within = _e,
    Object.defineProperty(t, "__esModule", {
        value: !0
    })
}
));