]> git.openstreetmap.org Git - rails.git/blobdiff - vendor/assets/iD/iD/mapillary-js/mapillary.js
Merge remote-tracking branch 'upstream/pull/4735'
[rails.git] / vendor / assets / iD / iD / mapillary-js / mapillary.js
index 1ee35a82af46ffd47575d5dd9602c55cd7a14dbb..8359d54f7a200fd0b8c5baa84cec5145c436aec3 100644 (file)
-(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Mapillary = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
-'use strict';
-
-var Queue = require('tinyqueue');
-
-module.exports = polylabel;
-module.exports.default = polylabel;
-
-function polylabel(polygon, precision, debug) {
-    precision = precision || 1.0;
-
-    // find the bounding box of the outer ring
-    var minX, minY, maxX, maxY;
-    for (var i = 0; i < polygon[0].length; i++) {
-        var p = polygon[0][i];
-        if (!i || p[0] < minX) minX = p[0];
-        if (!i || p[1] < minY) minY = p[1];
-        if (!i || p[0] > maxX) maxX = p[0];
-        if (!i || p[1] > maxY) maxY = p[1];
-    }
-
-    var width = maxX - minX;
-    var height = maxY - minY;
-    var cellSize = Math.min(width, height);
-    var h = cellSize / 2;
-
-    // a priority queue of cells in order of their "potential" (max distance to polygon)
-    var cellQueue = new Queue(null, compareMax);
-
-    if (cellSize === 0) return [minX, minY];
-
-    // cover polygon with initial cells
-    for (var x = minX; x < maxX; x += cellSize) {
-        for (var y = minY; y < maxY; y += cellSize) {
-            cellQueue.push(new Cell(x + h, y + h, h, polygon));
-        }
-    }
-
-    // take centroid as the first best guess
-    var bestCell = getCentroidCell(polygon);
-
-    // special case for rectangular polygons
-    var bboxCell = new Cell(minX + width / 2, minY + height / 2, 0, polygon);
-    if (bboxCell.d > bestCell.d) bestCell = bboxCell;
-
-    var numProbes = cellQueue.length;
-
-    while (cellQueue.length) {
-        // pick the most promising cell from the queue
-        var cell = cellQueue.pop();
-
-        // update the best cell if we found a better one
-        if (cell.d > bestCell.d) {
-            bestCell = cell;
-            if (debug) console.log('found best %d after %d probes', Math.round(1e4 * cell.d) / 1e4, numProbes);
-        }
-
-        // do not drill down further if there's no chance of a better solution
-        if (cell.max - bestCell.d <= precision) continue;
-
-        // split the cell into four cells
-        h = cell.h / 2;
-        cellQueue.push(new Cell(cell.x - h, cell.y - h, h, polygon));
-        cellQueue.push(new Cell(cell.x + h, cell.y - h, h, polygon));
-        cellQueue.push(new Cell(cell.x - h, cell.y + h, h, polygon));
-        cellQueue.push(new Cell(cell.x + h, cell.y + h, h, polygon));
-        numProbes += 4;
-    }
-
-    if (debug) {
-        console.log('num probes: ' + numProbes);
-        console.log('best distance: ' + bestCell.d);
-    }
-
-    return [bestCell.x, bestCell.y];
-}
-
-function compareMax(a, b) {
-    return b.max - a.max;
-}
-
-function Cell(x, y, h, polygon) {
-    this.x = x; // cell center x
-    this.y = y; // cell center y
-    this.h = h; // half the cell size
-    this.d = pointToPolygonDist(x, y, polygon); // distance from cell center to polygon
-    this.max = this.d + this.h * Math.SQRT2; // max distance to polygon within a cell
-}
-
-// signed distance from point to polygon outline (negative if point is outside)
-function pointToPolygonDist(x, y, polygon) {
-    var inside = false;
-    var minDistSq = Infinity;
-
-    for (var k = 0; k < polygon.length; k++) {
-        var ring = polygon[k];
-
-        for (var i = 0, len = ring.length, j = len - 1; i < len; j = i++) {
-            var a = ring[i];
-            var b = ring[j];
-
-            if ((a[1] > y !== b[1] > y) &&
-                (x < (b[0] - a[0]) * (y - a[1]) / (b[1] - a[1]) + a[0])) inside = !inside;
-
-            minDistSq = Math.min(minDistSq, getSegDistSq(x, y, a, b));
-        }
-    }
-
-    return (inside ? 1 : -1) * Math.sqrt(minDistSq);
-}
-
-// get polygon centroid
-function getCentroidCell(polygon) {
-    var area = 0;
-    var x = 0;
-    var y = 0;
-    var points = polygon[0];
-
-    for (var i = 0, len = points.length, j = len - 1; i < len; j = i++) {
-        var a = points[i];
-        var b = points[j];
-        var f = a[0] * b[1] - b[0] * a[1];
-        x += (a[0] + b[0]) * f;
-        y += (a[1] + b[1]) * f;
-        area += f * 3;
-    }
-    if (area === 0) return new Cell(points[0][0], points[0][1], 0, polygon);
-    return new Cell(x / area, y / area, 0, polygon);
-}
-
-// get squared distance from a point to a segment
-function getSegDistSq(px, py, a, b) {
-
-    var x = a[0];
-    var y = a[1];
-    var dx = b[0] - x;
-    var dy = b[1] - y;
-
-    if (dx !== 0 || dy !== 0) {
-
-        var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);
-
-        if (t > 1) {
-            x = b[0];
-            y = b[1];
-
-        } else if (t > 0) {
-            x += dx * t;
-            y += dy * t;
-        }
-    }
-
-    dx = px - x;
-    dy = py - y;
-
-    return dx * dx + dy * dy;
-}
-
-},{"tinyqueue":227}],2:[function(require,module,exports){
-/*
- * Copyright (C) 2008 Apple Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Ported from Webkit
- * http://svn.webkit.org/repository/webkit/trunk/Source/WebCore/platform/graphics/UnitBezier.h
- */
-
-module.exports = UnitBezier;
-
-function UnitBezier(p1x, p1y, p2x, p2y) {
-    // Calculate the polynomial coefficients, implicit first and last control points are (0,0) and (1,1).
-    this.cx = 3.0 * p1x;
-    this.bx = 3.0 * (p2x - p1x) - this.cx;
-    this.ax = 1.0 - this.cx - this.bx;
-
-    this.cy = 3.0 * p1y;
-    this.by = 3.0 * (p2y - p1y) - this.cy;
-    this.ay = 1.0 - this.cy - this.by;
-
-    this.p1x = p1x;
-    this.p1y = p2y;
-    this.p2x = p2x;
-    this.p2y = p2y;
-}
-
-UnitBezier.prototype.sampleCurveX = function(t) {
-    // `ax t^3 + bx t^2 + cx t' expanded using Horner's rule.
-    return ((this.ax * t + this.bx) * t + this.cx) * t;
-};
-
-UnitBezier.prototype.sampleCurveY = function(t) {
-    return ((this.ay * t + this.by) * t + this.cy) * t;
-};
-
-UnitBezier.prototype.sampleCurveDerivativeX = function(t) {
-    return (3.0 * this.ax * t + 2.0 * this.bx) * t + this.cx;
-};
-
-UnitBezier.prototype.solveCurveX = function(x, epsilon) {
-    if (typeof epsilon === 'undefined') epsilon = 1e-6;
-
-    var t0, t1, t2, x2, i;
-
-    // First try a few iterations of Newton's method -- normally very fast.
-    for (t2 = x, i = 0; i < 8; i++) {
-
-        x2 = this.sampleCurveX(t2) - x;
-        if (Math.abs(x2) < epsilon) return t2;
-
-        var d2 = this.sampleCurveDerivativeX(t2);
-        if (Math.abs(d2) < 1e-6) break;
-
-        t2 = t2 - x2 / d2;
-    }
-
-    // Fall back to the bisection method for reliability.
-    t0 = 0.0;
-    t1 = 1.0;
-    t2 = x;
-
-    if (t2 < t0) return t0;
-    if (t2 > t1) return t1;
-
-    while (t0 < t1) {
-
-        x2 = this.sampleCurveX(t2);
-        if (Math.abs(x2 - x) < epsilon) return t2;
-
-        if (x > x2) {
-            t0 = t2;
-        } else {
-            t1 = t2;
-        }
-
-        t2 = (t1 - t0) * 0.5 + t0;
-    }
-
-    // Failure.
-    return t2;
-};
-
-UnitBezier.prototype.solve = function(x, epsilon) {
-    return this.sampleCurveY(this.solveCurveX(x, epsilon));
-};
-
-},{}],3:[function(require,module,exports){
-'use strict'
-
-exports.byteLength = byteLength
-exports.toByteArray = toByteArray
-exports.fromByteArray = fromByteArray
-
-var lookup = []
-var revLookup = []
-var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array
-
-var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
-for (var i = 0, len = code.length; i < len; ++i) {
-  lookup[i] = code[i]
-  revLookup[code.charCodeAt(i)] = i
-}
-
-revLookup['-'.charCodeAt(0)] = 62
-revLookup['_'.charCodeAt(0)] = 63
-
-function placeHoldersCount (b64) {
-  var len = b64.length
-  if (len % 4 > 0) {
-    throw new Error('Invalid string. Length must be a multiple of 4')
-  }
-
-  // the number of equal signs (place holders)
-  // if there are two placeholders, than the two characters before it
-  // represent one byte
-  // if there is only one, then the three characters before it represent 2 bytes
-  // this is just a cheap hack to not do indexOf twice
-  return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0
-}
-
-function byteLength (b64) {
-  // base64 is 4/3 + up to two characters of the original data
-  return (b64.length * 3 / 4) - placeHoldersCount(b64)
-}
-
-function toByteArray (b64) {
-  var i, l, tmp, placeHolders, arr
-  var len = b64.length
-  placeHolders = placeHoldersCount(b64)
-
-  arr = new Arr((len * 3 / 4) - placeHolders)
-
-  // if there are placeholders, only get up to the last complete 4 chars
-  l = placeHolders > 0 ? len - 4 : len
-
-  var L = 0
-
-  for (i = 0; i < l; i += 4) {
-    tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)]
-    arr[L++] = (tmp >> 16) & 0xFF
-    arr[L++] = (tmp >> 8) & 0xFF
-    arr[L++] = tmp & 0xFF
-  }
-
-  if (placeHolders === 2) {
-    tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4)
-    arr[L++] = tmp & 0xFF
-  } else if (placeHolders === 1) {
-    tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2)
-    arr[L++] = (tmp >> 8) & 0xFF
-    arr[L++] = tmp & 0xFF
-  }
-
-  return arr
-}
-
-function tripletToBase64 (num) {
-  return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
-}
-
-function encodeChunk (uint8, start, end) {
-  var tmp
-  var output = []
-  for (var i = start; i < end; i += 3) {
-    tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2])
-    output.push(tripletToBase64(tmp))
-  }
-  return output.join('')
-}
-
-function fromByteArray (uint8) {
-  var tmp
-  var len = uint8.length
-  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes
-  var output = ''
-  var parts = []
-  var maxChunkLength = 16383 // must be multiple of 3
-
-  // go through the array every three bytes, we'll deal with trailing stuff later
-  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
-    parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)))
-  }
-
-  // pad the end with zeros, but make sure to not forget the extra bytes
-  if (extraBytes === 1) {
-    tmp = uint8[len - 1]
-    output += lookup[tmp >> 2]
-    output += lookup[(tmp << 4) & 0x3F]
-    output += '=='
-  } else if (extraBytes === 2) {
-    tmp = (uint8[len - 2] << 8) + (uint8[len - 1])
-    output += lookup[tmp >> 10]
-    output += lookup[(tmp >> 4) & 0x3F]
-    output += lookup[(tmp << 2) & 0x3F]
-    output += '='
-  }
-
-  parts.push(output)
-
-  return parts.join('')
-}
-
-},{}],4:[function(require,module,exports){
-
-},{}],5:[function(require,module,exports){
-/*!
- * Cross-Browser Split 1.1.1
- * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
- * Available under the MIT License
- * ECMAScript compliant, uniform cross-browser split method
- */
-
-/**
- * Splits a string into an array of strings using a regex or string separator. Matches of the
- * separator are not included in the result array. However, if `separator` is a regex that contains
- * capturing groups, backreferences are spliced into the result each time `separator` is matched.
- * Fixes browser bugs compared to the native `String.prototype.split` and can be used reliably
- * cross-browser.
- * @param {String} str String to split.
- * @param {RegExp|String} separator Regex or string to use for separating the string.
- * @param {Number} [limit] Maximum number of items to include in the result array.
- * @returns {Array} Array of substrings.
- * @example
- *
- * // Basic use
- * split('a b c d', ' ');
- * // -> ['a', 'b', 'c', 'd']
- *
- * // With limit
- * split('a b c d', ' ', 2);
- * // -> ['a', 'b']
- *
- * // Backreferences in result array
- * split('..word1 word2..', /([a-z]+)(\d+)/i);
- * // -> ['..', 'word', '1', ' ', 'word', '2', '..']
- */
-module.exports = (function split(undef) {
-
-  var nativeSplit = String.prototype.split,
-    compliantExecNpcg = /()??/.exec("")[1] === undef,
-    // NPCG: nonparticipating capturing group
-    self;
-
-  self = function(str, separator, limit) {
-    // If `separator` is not a regex, use `nativeSplit`
-    if (Object.prototype.toString.call(separator) !== "[object RegExp]") {
-      return nativeSplit.call(str, separator, limit);
-    }
-    var output = [],
-      flags = (separator.ignoreCase ? "i" : "") + (separator.multiline ? "m" : "") + (separator.extended ? "x" : "") + // Proposed for ES6
-      (separator.sticky ? "y" : ""),
-      // Firefox 3+
-      lastLastIndex = 0,
-      // Make `global` and avoid `lastIndex` issues by working with a copy
-      separator = new RegExp(separator.source, flags + "g"),
-      separator2, match, lastIndex, lastLength;
-    str += ""; // Type-convert
-    if (!compliantExecNpcg) {
-      // Doesn't need flags gy, but they don't hurt
-      separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags);
-    }
-    /* Values for `limit`, per the spec:
-     * If undefined: 4294967295 // Math.pow(2, 32) - 1
-     * If 0, Infinity, or NaN: 0
-     * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;
-     * If negative number: 4294967296 - Math.floor(Math.abs(limit))
-     * If other: Type-convert, then use the above rules
-     */
-    limit = limit === undef ? -1 >>> 0 : // Math.pow(2, 32) - 1
-    limit >>> 0; // ToUint32(limit)
-    while (match = separator.exec(str)) {
-      // `separator.lastIndex` is not reliable cross-browser
-      lastIndex = match.index + match[0].length;
-      if (lastIndex > lastLastIndex) {
-        output.push(str.slice(lastLastIndex, match.index));
-        // Fix browsers whose `exec` methods don't consistently return `undefined` for
-        // nonparticipating capturing groups
-        if (!compliantExecNpcg && match.length > 1) {
-          match[0].replace(separator2, function() {
-            for (var i = 1; i < arguments.length - 2; i++) {
-              if (arguments[i] === undef) {
-                match[i] = undef;
-              }
-            }
-          });
-        }
-        if (match.length > 1 && match.index < str.length) {
-          Array.prototype.push.apply(output, match.slice(1));
-        }
-        lastLength = match[0].length;
-        lastLastIndex = lastIndex;
-        if (output.length >= limit) {
-          break;
-        }
-      }
-      if (separator.lastIndex === match.index) {
-        separator.lastIndex++; // Avoid an infinite loop
-      }
-    }
-    if (lastLastIndex === str.length) {
-      if (lastLength || !separator.test("")) {
-        output.push("");
-      }
-    } else {
-      output.push(str.slice(lastLastIndex));
-    }
-    return output.length > limit ? output.slice(0, limit) : output;
-  };
-
-  return self;
-})();
-
-},{}],6:[function(require,module,exports){
-// shim for using process in browser
-var process = module.exports = {};
-
-// cached from whatever global is present so that test runners that stub it
-// don't break things.  But we need to wrap it in a try catch in case it is
-// wrapped in strict mode code which doesn't define any globals.  It's inside a
-// function because try/catches deoptimize in certain engines.
-
-var cachedSetTimeout;
-var cachedClearTimeout;
-
-function defaultSetTimout() {
-    throw new Error('setTimeout has not been defined');
-}
-function defaultClearTimeout () {
-    throw new Error('clearTimeout has not been defined');
-}
-(function () {
-    try {
-        if (typeof setTimeout === 'function') {
-            cachedSetTimeout = setTimeout;
-        } else {
-            cachedSetTimeout = defaultSetTimout;
-        }
-    } catch (e) {
-        cachedSetTimeout = defaultSetTimout;
-    }
-    try {
-        if (typeof clearTimeout === 'function') {
-            cachedClearTimeout = clearTimeout;
-        } else {
-            cachedClearTimeout = defaultClearTimeout;
-        }
-    } catch (e) {
-        cachedClearTimeout = defaultClearTimeout;
-    }
-} ())
-function runTimeout(fun) {
-    if (cachedSetTimeout === setTimeout) {
-        //normal enviroments in sane situations
-        return setTimeout(fun, 0);
-    }
-    // if setTimeout wasn't available but was latter defined
-    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
-        cachedSetTimeout = setTimeout;
-        return setTimeout(fun, 0);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedSetTimeout(fun, 0);
-    } catch(e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
-            return cachedSetTimeout.call(null, fun, 0);
-        } catch(e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
-            return cachedSetTimeout.call(this, fun, 0);
-        }
-    }
-
-
-}
-function runClearTimeout(marker) {
-    if (cachedClearTimeout === clearTimeout) {
-        //normal enviroments in sane situations
-        return clearTimeout(marker);
-    }
-    // if clearTimeout wasn't available but was latter defined
-    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
-        cachedClearTimeout = clearTimeout;
-        return clearTimeout(marker);
-    }
-    try {
-        // when when somebody has screwed with setTimeout but no I.E. maddness
-        return cachedClearTimeout(marker);
-    } catch (e){
-        try {
-            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
-            return cachedClearTimeout.call(null, marker);
-        } catch (e){
-            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
-            // Some versions of I.E. have different rules for clearTimeout vs setTimeout
-            return cachedClearTimeout.call(this, marker);
-        }
-    }
-
-
-
-}
-var queue = [];
-var draining = false;
-var currentQueue;
-var queueIndex = -1;
-
-function cleanUpNextTick() {
-    if (!draining || !currentQueue) {
-        return;
-    }
-    draining = false;
-    if (currentQueue.length) {
-        queue = currentQueue.concat(queue);
-    } else {
-        queueIndex = -1;
-    }
-    if (queue.length) {
-        drainQueue();
-    }
-}
-
-function drainQueue() {
-    if (draining) {
-        return;
-    }
-    var timeout = runTimeout(cleanUpNextTick);
-    draining = true;
-
-    var len = queue.length;
-    while(len) {
-        currentQueue = queue;
-        queue = [];
-        while (++queueIndex < len) {
-            if (currentQueue) {
-                currentQueue[queueIndex].run();
-            }
-        }
-        queueIndex = -1;
-        len = queue.length;
-    }
-    currentQueue = null;
-    draining = false;
-    runClearTimeout(timeout);
-}
-
-process.nextTick = function (fun) {
-    var args = new Array(arguments.length - 1);
-    if (arguments.length > 1) {
-        for (var i = 1; i < arguments.length; i++) {
-            args[i - 1] = arguments[i];
-        }
-    }
-    queue.push(new Item(fun, args));
-    if (queue.length === 1 && !draining) {
-        runTimeout(drainQueue);
-    }
-};
-
-// v8 likes predictible objects
-function Item(fun, array) {
-    this.fun = fun;
-    this.array = array;
-}
-Item.prototype.run = function () {
-    this.fun.apply(null, this.array);
-};
-process.title = 'browser';
-process.browser = true;
-process.env = {};
-process.argv = [];
-process.version = ''; // empty string to avoid regexp issues
-process.versions = {};
-
-function noop() {}
-
-process.on = noop;
-process.addListener = noop;
-process.once = noop;
-process.off = noop;
-process.removeListener = noop;
-process.removeAllListeners = noop;
-process.emit = noop;
-process.prependListener = noop;
-process.prependOnceListener = noop;
-
-process.listeners = function (name) { return [] }
-
-process.binding = function (name) {
-    throw new Error('process.binding is not supported');
-};
-
-process.cwd = function () { return '/' };
-process.chdir = function (dir) {
-    throw new Error('process.chdir is not supported');
-};
-process.umask = function() { return 0; };
-
-},{}],7:[function(require,module,exports){
-/*!
- * The buffer module from node.js, for the browser.
- *
- * @author   Feross Aboukhadijeh <https://feross.org>
- * @license  MIT
- */
-/* eslint-disable no-proto */
-
-'use strict'
-
-var base64 = require('base64-js')
-var ieee754 = require('ieee754')
-
-exports.Buffer = Buffer
-exports.SlowBuffer = SlowBuffer
-exports.INSPECT_MAX_BYTES = 50
-
-var K_MAX_LENGTH = 0x7fffffff
-exports.kMaxLength = K_MAX_LENGTH
-
-/**
- * If `Buffer.TYPED_ARRAY_SUPPORT`:
- *   === true    Use Uint8Array implementation (fastest)
- *   === false   Print warning and recommend using `buffer` v4.x which has an Object
- *               implementation (most compatible, even IE6)
- *
- * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
- * Opera 11.6+, iOS 4.2+.
- *
- * We report that the browser does not support typed arrays if the are not subclassable
- * using __proto__. Firefox 4-29 lacks support for adding new properties to `Uint8Array`
- * (See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438). IE 10 lacks support
- * for __proto__ and has a buggy typed array implementation.
- */
-Buffer.TYPED_ARRAY_SUPPORT = typedArraySupport()
-
-if (!Buffer.TYPED_ARRAY_SUPPORT && typeof console !== 'undefined' &&
-    typeof console.error === 'function') {
-  console.error(
-    'This browser lacks typed array (Uint8Array) support which is required by ' +
-    '`buffer` v5.x. Use `buffer` v4.x if you require old browser support.'
-  )
-}
-
-function typedArraySupport () {
-  // Can typed array instances can be augmented?
-  try {
-    var arr = new Uint8Array(1)
-    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}
-    return arr.foo() === 42
-  } catch (e) {
-    return false
-  }
-}
-
-function createBuffer (length) {
-  if (length > K_MAX_LENGTH) {
-    throw new RangeError('Invalid typed array length')
-  }
-  // Return an augmented `Uint8Array` instance
-  var buf = new Uint8Array(length)
-  buf.__proto__ = Buffer.prototype
-  return buf
-}
-
-/**
- * The Buffer constructor returns instances of `Uint8Array` that have their
- * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
- * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
- * and the `Uint8Array` methods. Square bracket notation works as expected -- it
- * returns a single octet.
- *
- * The `Uint8Array` prototype remains unmodified.
- */
-
-function Buffer (arg, encodingOrOffset, length) {
-  // Common case.
-  if (typeof arg === 'number') {
-    if (typeof encodingOrOffset === 'string') {
-      throw new Error(
-        'If encoding is specified then the first argument must be a string'
-      )
-    }
-    return allocUnsafe(arg)
-  }
-  return from(arg, encodingOrOffset, length)
-}
-
-// Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97
-if (typeof Symbol !== 'undefined' && Symbol.species &&
-    Buffer[Symbol.species] === Buffer) {
-  Object.defineProperty(Buffer, Symbol.species, {
-    value: null,
-    configurable: true,
-    enumerable: false,
-    writable: false
-  })
-}
-
-Buffer.poolSize = 8192 // not used by this implementation
-
-function from (value, encodingOrOffset, length) {
-  if (typeof value === 'number') {
-    throw new TypeError('"value" argument must not be a number')
-  }
-
-  if (isArrayBuffer(value)) {
-    return fromArrayBuffer(value, encodingOrOffset, length)
-  }
-
-  if (typeof value === 'string') {
-    return fromString(value, encodingOrOffset)
-  }
-
-  return fromObject(value)
-}
-
-/**
- * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
- * if value is a number.
- * Buffer.from(str[, encoding])
- * Buffer.from(array)
- * Buffer.from(buffer)
- * Buffer.from(arrayBuffer[, byteOffset[, length]])
- **/
-Buffer.from = function (value, encodingOrOffset, length) {
-  return from(value, encodingOrOffset, length)
-}
-
-// Note: Change prototype *after* Buffer.from is defined to workaround Chrome bug:
-// https://github.com/feross/buffer/pull/148
-Buffer.prototype.__proto__ = Uint8Array.prototype
-Buffer.__proto__ = Uint8Array
-
-function assertSize (size) {
-  if (typeof size !== 'number') {
-    throw new TypeError('"size" argument must be a number')
-  } else if (size < 0) {
-    throw new RangeError('"size" argument must not be negative')
-  }
-}
-
-function alloc (size, fill, encoding) {
-  assertSize(size)
-  if (size <= 0) {
-    return createBuffer(size)
-  }
-  if (fill !== undefined) {
-    // Only pay attention to encoding if it's a string. This
-    // prevents accidentally sending in a number that would
-    // be interpretted as a start offset.
-    return typeof encoding === 'string'
-      ? createBuffer(size).fill(fill, encoding)
-      : createBuffer(size).fill(fill)
-  }
-  return createBuffer(size)
-}
-
-/**
- * Creates a new filled Buffer instance.
- * alloc(size[, fill[, encoding]])
- **/
-Buffer.alloc = function (size, fill, encoding) {
-  return alloc(size, fill, encoding)
-}
-
-function allocUnsafe (size) {
-  assertSize(size)
-  return createBuffer(size < 0 ? 0 : checked(size) | 0)
-}
-
-/**
- * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
- * */
-Buffer.allocUnsafe = function (size) {
-  return allocUnsafe(size)
-}
-/**
- * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
- */
-Buffer.allocUnsafeSlow = function (size) {
-  return allocUnsafe(size)
-}
-
-function fromString (string, encoding) {
-  if (typeof encoding !== 'string' || encoding === '') {
-    encoding = 'utf8'
-  }
-
-  if (!Buffer.isEncoding(encoding)) {
-    throw new TypeError('"encoding" must be a valid string encoding')
-  }
-
-  var length = byteLength(string, encoding) | 0
-  var buf = createBuffer(length)
-
-  var actual = buf.write(string, encoding)
-
-  if (actual !== length) {
-    // Writing a hex string, for example, that contains invalid characters will
-    // cause everything after the first invalid character to be ignored. (e.g.
-    // 'abxxcd' will be treated as 'ab')
-    buf = buf.slice(0, actual)
-  }
-
-  return buf
-}
-
-function fromArrayLike (array) {
-  var length = array.length < 0 ? 0 : checked(array.length) | 0
-  var buf = createBuffer(length)
-  for (var i = 0; i < length; i += 1) {
-    buf[i] = array[i] & 255
-  }
-  return buf
-}
-
-function fromArrayBuffer (array, byteOffset, length) {
-  if (byteOffset < 0 || array.byteLength < byteOffset) {
-    throw new RangeError('\'offset\' is out of bounds')
-  }
-
-  if (array.byteLength < byteOffset + (length || 0)) {
-    throw new RangeError('\'length\' is out of bounds')
-  }
-
-  var buf
-  if (byteOffset === undefined && length === undefined) {
-    buf = new Uint8Array(array)
-  } else if (length === undefined) {
-    buf = new Uint8Array(array, byteOffset)
-  } else {
-    buf = new Uint8Array(array, byteOffset, length)
-  }
-
-  // Return an augmented `Uint8Array` instance
-  buf.__proto__ = Buffer.prototype
-  return buf
-}
-
-function fromObject (obj) {
-  if (Buffer.isBuffer(obj)) {
-    var len = checked(obj.length) | 0
-    var buf = createBuffer(len)
-
-    if (buf.length === 0) {
-      return buf
-    }
-
-    obj.copy(buf, 0, 0, len)
-    return buf
-  }
-
-  if (obj) {
-    if (isArrayBufferView(obj) || 'length' in obj) {
-      if (typeof obj.length !== 'number' || numberIsNaN(obj.length)) {
-        return createBuffer(0)
-      }
-      return fromArrayLike(obj)
-    }
-
-    if (obj.type === 'Buffer' && Array.isArray(obj.data)) {
-      return fromArrayLike(obj.data)
-    }
-  }
-
-  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
-}
-
-function checked (length) {
-  // Note: cannot use `length < K_MAX_LENGTH` here because that fails when
-  // length is NaN (which is otherwise coerced to zero.)
-  if (length >= K_MAX_LENGTH) {
-    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
-                         'size: 0x' + K_MAX_LENGTH.toString(16) + ' bytes')
-  }
-  return length | 0
-}
-
-function SlowBuffer (length) {
-  if (+length != length) { // eslint-disable-line eqeqeq
-    length = 0
-  }
-  return Buffer.alloc(+length)
-}
-
-Buffer.isBuffer = function isBuffer (b) {
-  return b != null && b._isBuffer === true
-}
-
-Buffer.compare = function compare (a, b) {
-  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {
-    throw new TypeError('Arguments must be Buffers')
-  }
-
-  if (a === b) return 0
-
-  var x = a.length
-  var y = b.length
-
-  for (var i = 0, len = Math.min(x, y); i < len; ++i) {
-    if (a[i] !== b[i]) {
-      x = a[i]
-      y = b[i]
-      break
-    }
-  }
-
-  if (x < y) return -1
-  if (y < x) return 1
-  return 0
-}
-
-Buffer.isEncoding = function isEncoding (encoding) {
-  switch (String(encoding).toLowerCase()) {
-    case 'hex':
-    case 'utf8':
-    case 'utf-8':
-    case 'ascii':
-    case 'latin1':
-    case 'binary':
-    case 'base64':
-    case 'ucs2':
-    case 'ucs-2':
-    case 'utf16le':
-    case 'utf-16le':
-      return true
-    default:
-      return false
-  }
-}
-
-Buffer.concat = function concat (list, length) {
-  if (!Array.isArray(list)) {
-    throw new TypeError('"list" argument must be an Array of Buffers')
-  }
-
-  if (list.length === 0) {
-    return Buffer.alloc(0)
-  }
-
-  var i
-  if (length === undefined) {
-    length = 0
-    for (i = 0; i < list.length; ++i) {
-      length += list[i].length
-    }
-  }
-
-  var buffer = Buffer.allocUnsafe(length)
-  var pos = 0
-  for (i = 0; i < list.length; ++i) {
-    var buf = list[i]
-    if (!Buffer.isBuffer(buf)) {
-      throw new TypeError('"list" argument must be an Array of Buffers')
-    }
-    buf.copy(buffer, pos)
-    pos += buf.length
-  }
-  return buffer
-}
-
-function byteLength (string, encoding) {
-  if (Buffer.isBuffer(string)) {
-    return string.length
-  }
-  if (isArrayBufferView(string) || isArrayBuffer(string)) {
-    return string.byteLength
-  }
-  if (typeof string !== 'string') {
-    string = '' + string
-  }
-
-  var len = string.length
-  if (len === 0) return 0
-
-  // Use a for loop to avoid recursion
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'ascii':
-      case 'latin1':
-      case 'binary':
-        return len
-      case 'utf8':
-      case 'utf-8':
-      case undefined:
-        return utf8ToBytes(string).length
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return len * 2
-      case 'hex':
-        return len >>> 1
-      case 'base64':
-        return base64ToBytes(string).length
-      default:
-        if (loweredCase) return utf8ToBytes(string).length // assume utf8
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-Buffer.byteLength = byteLength
-
-function slowToString (encoding, start, end) {
-  var loweredCase = false
-
-  // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
-  // property of a typed array.
-
-  // This behaves neither like String nor Uint8Array in that we set start/end
-  // to their upper/lower bounds if the value passed is out of range.
-  // undefined is handled specially as per ECMA-262 6th Edition,
-  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
-  if (start === undefined || start < 0) {
-    start = 0
-  }
-  // Return early if start > this.length. Done here to prevent potential uint32
-  // coercion fail below.
-  if (start > this.length) {
-    return ''
-  }
-
-  if (end === undefined || end > this.length) {
-    end = this.length
-  }
-
-  if (end <= 0) {
-    return ''
-  }
-
-  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
-  end >>>= 0
-  start >>>= 0
-
-  if (end <= start) {
-    return ''
-  }
-
-  if (!encoding) encoding = 'utf8'
-
-  while (true) {
-    switch (encoding) {
-      case 'hex':
-        return hexSlice(this, start, end)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Slice(this, start, end)
-
-      case 'ascii':
-        return asciiSlice(this, start, end)
-
-      case 'latin1':
-      case 'binary':
-        return latin1Slice(this, start, end)
-
-      case 'base64':
-        return base64Slice(this, start, end)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return utf16leSlice(this, start, end)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = (encoding + '').toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-// This property is used by `Buffer.isBuffer` (and the `is-buffer` npm package)
-// to detect a Buffer instance. It's not possible to use `instanceof Buffer`
-// reliably in a browserify context because there could be multiple different
-// copies of the 'buffer' package in use. This method works even for Buffer
-// instances that were created from another copy of the `buffer` package.
-// See: https://github.com/feross/buffer/issues/154
-Buffer.prototype._isBuffer = true
-
-function swap (b, n, m) {
-  var i = b[n]
-  b[n] = b[m]
-  b[m] = i
-}
-
-Buffer.prototype.swap16 = function swap16 () {
-  var len = this.length
-  if (len % 2 !== 0) {
-    throw new RangeError('Buffer size must be a multiple of 16-bits')
-  }
-  for (var i = 0; i < len; i += 2) {
-    swap(this, i, i + 1)
-  }
-  return this
-}
-
-Buffer.prototype.swap32 = function swap32 () {
-  var len = this.length
-  if (len % 4 !== 0) {
-    throw new RangeError('Buffer size must be a multiple of 32-bits')
-  }
-  for (var i = 0; i < len; i += 4) {
-    swap(this, i, i + 3)
-    swap(this, i + 1, i + 2)
-  }
-  return this
-}
-
-Buffer.prototype.swap64 = function swap64 () {
-  var len = this.length
-  if (len % 8 !== 0) {
-    throw new RangeError('Buffer size must be a multiple of 64-bits')
-  }
-  for (var i = 0; i < len; i += 8) {
-    swap(this, i, i + 7)
-    swap(this, i + 1, i + 6)
-    swap(this, i + 2, i + 5)
-    swap(this, i + 3, i + 4)
-  }
-  return this
-}
-
-Buffer.prototype.toString = function toString () {
-  var length = this.length
-  if (length === 0) return ''
-  if (arguments.length === 0) return utf8Slice(this, 0, length)
-  return slowToString.apply(this, arguments)
-}
-
-Buffer.prototype.equals = function equals (b) {
-  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')
-  if (this === b) return true
-  return Buffer.compare(this, b) === 0
-}
-
-Buffer.prototype.inspect = function inspect () {
-  var str = ''
-  var max = exports.INSPECT_MAX_BYTES
-  if (this.length > 0) {
-    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')
-    if (this.length > max) str += ' ... '
-  }
-  return '<Buffer ' + str + '>'
-}
-
-Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
-  if (!Buffer.isBuffer(target)) {
-    throw new TypeError('Argument must be a Buffer')
-  }
-
-  if (start === undefined) {
-    start = 0
-  }
-  if (end === undefined) {
-    end = target ? target.length : 0
-  }
-  if (thisStart === undefined) {
-    thisStart = 0
-  }
-  if (thisEnd === undefined) {
-    thisEnd = this.length
-  }
-
-  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
-    throw new RangeError('out of range index')
-  }
-
-  if (thisStart >= thisEnd && start >= end) {
-    return 0
-  }
-  if (thisStart >= thisEnd) {
-    return -1
-  }
-  if (start >= end) {
-    return 1
-  }
-
-  start >>>= 0
-  end >>>= 0
-  thisStart >>>= 0
-  thisEnd >>>= 0
-
-  if (this === target) return 0
-
-  var x = thisEnd - thisStart
-  var y = end - start
-  var len = Math.min(x, y)
-
-  var thisCopy = this.slice(thisStart, thisEnd)
-  var targetCopy = target.slice(start, end)
-
-  for (var i = 0; i < len; ++i) {
-    if (thisCopy[i] !== targetCopy[i]) {
-      x = thisCopy[i]
-      y = targetCopy[i]
-      break
-    }
-  }
-
-  if (x < y) return -1
-  if (y < x) return 1
-  return 0
-}
-
-// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
-// OR the last index of `val` in `buffer` at offset <= `byteOffset`.
-//
-// Arguments:
-// - buffer - a Buffer to search
-// - val - a string, Buffer, or number
-// - byteOffset - an index into `buffer`; will be clamped to an int32
-// - encoding - an optional encoding, relevant is val is a string
-// - dir - true for indexOf, false for lastIndexOf
-function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
-  // Empty buffer means no match
-  if (buffer.length === 0) return -1
-
-  // Normalize byteOffset
-  if (typeof byteOffset === 'string') {
-    encoding = byteOffset
-    byteOffset = 0
-  } else if (byteOffset > 0x7fffffff) {
-    byteOffset = 0x7fffffff
-  } else if (byteOffset < -0x80000000) {
-    byteOffset = -0x80000000
-  }
-  byteOffset = +byteOffset  // Coerce to Number.
-  if (numberIsNaN(byteOffset)) {
-    // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
-    byteOffset = dir ? 0 : (buffer.length - 1)
-  }
-
-  // Normalize byteOffset: negative offsets start from the end of the buffer
-  if (byteOffset < 0) byteOffset = buffer.length + byteOffset
-  if (byteOffset >= buffer.length) {
-    if (dir) return -1
-    else byteOffset = buffer.length - 1
-  } else if (byteOffset < 0) {
-    if (dir) byteOffset = 0
-    else return -1
-  }
-
-  // Normalize val
-  if (typeof val === 'string') {
-    val = Buffer.from(val, encoding)
-  }
-
-  // Finally, search either indexOf (if dir is true) or lastIndexOf
-  if (Buffer.isBuffer(val)) {
-    // Special case: looking for empty string/buffer always fails
-    if (val.length === 0) {
-      return -1
-    }
-    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
-  } else if (typeof val === 'number') {
-    val = val & 0xFF // Search for a byte value [0-255]
-    if (typeof Uint8Array.prototype.indexOf === 'function') {
-      if (dir) {
-        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
-      } else {
-        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
-      }
-    }
-    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
-  }
-
-  throw new TypeError('val must be string, number or Buffer')
-}
-
-function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
-  var indexSize = 1
-  var arrLength = arr.length
-  var valLength = val.length
-
-  if (encoding !== undefined) {
-    encoding = String(encoding).toLowerCase()
-    if (encoding === 'ucs2' || encoding === 'ucs-2' ||
-        encoding === 'utf16le' || encoding === 'utf-16le') {
-      if (arr.length < 2 || val.length < 2) {
-        return -1
-      }
-      indexSize = 2
-      arrLength /= 2
-      valLength /= 2
-      byteOffset /= 2
-    }
-  }
-
-  function read (buf, i) {
-    if (indexSize === 1) {
-      return buf[i]
-    } else {
-      return buf.readUInt16BE(i * indexSize)
-    }
-  }
-
-  var i
-  if (dir) {
-    var foundIndex = -1
-    for (i = byteOffset; i < arrLength; i++) {
-      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
-        if (foundIndex === -1) foundIndex = i
-        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
-      } else {
-        if (foundIndex !== -1) i -= i - foundIndex
-        foundIndex = -1
-      }
-    }
-  } else {
-    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength
-    for (i = byteOffset; i >= 0; i--) {
-      var found = true
-      for (var j = 0; j < valLength; j++) {
-        if (read(arr, i + j) !== read(val, j)) {
-          found = false
-          break
-        }
-      }
-      if (found) return i
-    }
-  }
-
-  return -1
-}
-
-Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
-  return this.indexOf(val, byteOffset, encoding) !== -1
-}
-
-Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
-  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
-}
-
-Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
-  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
-}
-
-function hexWrite (buf, string, offset, length) {
-  offset = Number(offset) || 0
-  var remaining = buf.length - offset
-  if (!length) {
-    length = remaining
-  } else {
-    length = Number(length)
-    if (length > remaining) {
-      length = remaining
-    }
-  }
-
-  // must be an even number of digits
-  var strLen = string.length
-  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
-
-  if (length > strLen / 2) {
-    length = strLen / 2
-  }
-  for (var i = 0; i < length; ++i) {
-    var parsed = parseInt(string.substr(i * 2, 2), 16)
-    if (numberIsNaN(parsed)) return i
-    buf[offset + i] = parsed
-  }
-  return i
-}
-
-function utf8Write (buf, string, offset, length) {
-  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-function asciiWrite (buf, string, offset, length) {
-  return blitBuffer(asciiToBytes(string), buf, offset, length)
-}
-
-function latin1Write (buf, string, offset, length) {
-  return asciiWrite(buf, string, offset, length)
-}
-
-function base64Write (buf, string, offset, length) {
-  return blitBuffer(base64ToBytes(string), buf, offset, length)
-}
-
-function ucs2Write (buf, string, offset, length) {
-  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
-}
-
-Buffer.prototype.write = function write (string, offset, length, encoding) {
-  // Buffer#write(string)
-  if (offset === undefined) {
-    encoding = 'utf8'
-    length = this.length
-    offset = 0
-  // Buffer#write(string, encoding)
-  } else if (length === undefined && typeof offset === 'string') {
-    encoding = offset
-    length = this.length
-    offset = 0
-  // Buffer#write(string, offset[, length][, encoding])
-  } else if (isFinite(offset)) {
-    offset = offset >>> 0
-    if (isFinite(length)) {
-      length = length >>> 0
-      if (encoding === undefined) encoding = 'utf8'
-    } else {
-      encoding = length
-      length = undefined
-    }
-  } else {
-    throw new Error(
-      'Buffer.write(string, encoding, offset[, length]) is no longer supported'
-    )
-  }
-
-  var remaining = this.length - offset
-  if (length === undefined || length > remaining) length = remaining
-
-  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
-    throw new RangeError('Attempt to write outside buffer bounds')
-  }
-
-  if (!encoding) encoding = 'utf8'
-
-  var loweredCase = false
-  for (;;) {
-    switch (encoding) {
-      case 'hex':
-        return hexWrite(this, string, offset, length)
-
-      case 'utf8':
-      case 'utf-8':
-        return utf8Write(this, string, offset, length)
-
-      case 'ascii':
-        return asciiWrite(this, string, offset, length)
-
-      case 'latin1':
-      case 'binary':
-        return latin1Write(this, string, offset, length)
-
-      case 'base64':
-        // Warning: maxLength not taken into account in base64Write
-        return base64Write(this, string, offset, length)
-
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return ucs2Write(this, string, offset, length)
-
-      default:
-        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-        encoding = ('' + encoding).toLowerCase()
-        loweredCase = true
-    }
-  }
-}
-
-Buffer.prototype.toJSON = function toJSON () {
-  return {
-    type: 'Buffer',
-    data: Array.prototype.slice.call(this._arr || this, 0)
-  }
-}
-
-function base64Slice (buf, start, end) {
-  if (start === 0 && end === buf.length) {
-    return base64.fromByteArray(buf)
-  } else {
-    return base64.fromByteArray(buf.slice(start, end))
-  }
-}
-
-function utf8Slice (buf, start, end) {
-  end = Math.min(buf.length, end)
-  var res = []
-
-  var i = start
-  while (i < end) {
-    var firstByte = buf[i]
-    var codePoint = null
-    var bytesPerSequence = (firstByte > 0xEF) ? 4
-      : (firstByte > 0xDF) ? 3
-      : (firstByte > 0xBF) ? 2
-      : 1
-
-    if (i + bytesPerSequence <= end) {
-      var secondByte, thirdByte, fourthByte, tempCodePoint
-
-      switch (bytesPerSequence) {
-        case 1:
-          if (firstByte < 0x80) {
-            codePoint = firstByte
-          }
-          break
-        case 2:
-          secondByte = buf[i + 1]
-          if ((secondByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)
-            if (tempCodePoint > 0x7F) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 3:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)
-            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
-              codePoint = tempCodePoint
-            }
-          }
-          break
-        case 4:
-          secondByte = buf[i + 1]
-          thirdByte = buf[i + 2]
-          fourthByte = buf[i + 3]
-          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
-            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)
-            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
-              codePoint = tempCodePoint
-            }
-          }
-      }
-    }
-
-    if (codePoint === null) {
-      // we did not generate a valid codePoint so insert a
-      // replacement char (U+FFFD) and advance only 1 byte
-      codePoint = 0xFFFD
-      bytesPerSequence = 1
-    } else if (codePoint > 0xFFFF) {
-      // encode to utf16 (surrogate pair dance)
-      codePoint -= 0x10000
-      res.push(codePoint >>> 10 & 0x3FF | 0xD800)
-      codePoint = 0xDC00 | codePoint & 0x3FF
-    }
-
-    res.push(codePoint)
-    i += bytesPerSequence
-  }
-
-  return decodeCodePointsArray(res)
-}
-
-// Based on http://stackoverflow.com/a/22747272/680742, the browser with
-// the lowest limit is Chrome, with 0x10000 args.
-// We go 1 magnitude less, for safety
-var MAX_ARGUMENTS_LENGTH = 0x1000
-
-function decodeCodePointsArray (codePoints) {
-  var len = codePoints.length
-  if (len <= MAX_ARGUMENTS_LENGTH) {
-    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
-  }
-
-  // Decode in chunks to avoid "call stack size exceeded".
-  var res = ''
-  var i = 0
-  while (i < len) {
-    res += String.fromCharCode.apply(
-      String,
-      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
-    )
-  }
-  return res
-}
-
-function asciiSlice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; ++i) {
-    ret += String.fromCharCode(buf[i] & 0x7F)
-  }
-  return ret
-}
-
-function latin1Slice (buf, start, end) {
-  var ret = ''
-  end = Math.min(buf.length, end)
-
-  for (var i = start; i < end; ++i) {
-    ret += String.fromCharCode(buf[i])
-  }
-  return ret
-}
-
-function hexSlice (buf, start, end) {
-  var len = buf.length
-
-  if (!start || start < 0) start = 0
-  if (!end || end < 0 || end > len) end = len
-
-  var out = ''
-  for (var i = start; i < end; ++i) {
-    out += toHex(buf[i])
-  }
-  return out
-}
-
-function utf16leSlice (buf, start, end) {
-  var bytes = buf.slice(start, end)
-  var res = ''
-  for (var i = 0; i < bytes.length; i += 2) {
-    res += String.fromCharCode(bytes[i] + (bytes[i + 1] * 256))
-  }
-  return res
-}
-
-Buffer.prototype.slice = function slice (start, end) {
-  var len = this.length
-  start = ~~start
-  end = end === undefined ? len : ~~end
-
-  if (start < 0) {
-    start += len
-    if (start < 0) start = 0
-  } else if (start > len) {
-    start = len
-  }
-
-  if (end < 0) {
-    end += len
-    if (end < 0) end = 0
-  } else if (end > len) {
-    end = len
-  }
-
-  if (end < start) end = start
-
-  var newBuf = this.subarray(start, end)
-  // Return an augmented `Uint8Array` instance
-  newBuf.__proto__ = Buffer.prototype
-  return newBuf
-}
-
-/*
- * Need to make sure that buffer isn't trying to write out of bounds.
- */
-function checkOffset (offset, ext, length) {
-  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
-  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
-}
-
-Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) {
-    checkOffset(offset, byteLength, this.length)
-  }
-
-  var val = this[offset + --byteLength]
-  var mul = 1
-  while (byteLength > 0 && (mul *= 0x100)) {
-    val += this[offset + --byteLength] * mul
-  }
-
-  return val
-}
-
-Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  return this[offset]
-}
-
-Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return this[offset] | (this[offset + 1] << 8)
-}
-
-Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  return (this[offset] << 8) | this[offset + 1]
-}
-
-Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return ((this[offset]) |
-      (this[offset + 1] << 8) |
-      (this[offset + 2] << 16)) +
-      (this[offset + 3] * 0x1000000)
-}
-
-Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] * 0x1000000) +
-    ((this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    this[offset + 3])
-}
-
-Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var val = this[offset]
-  var mul = 1
-  var i = 0
-  while (++i < byteLength && (mul *= 0x100)) {
-    val += this[offset + i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) checkOffset(offset, byteLength, this.length)
-
-  var i = byteLength
-  var mul = 1
-  var val = this[offset + --i]
-  while (i > 0 && (mul *= 0x100)) {
-    val += this[offset + --i] * mul
-  }
-  mul *= 0x80
-
-  if (val >= mul) val -= Math.pow(2, 8 * byteLength)
-
-  return val
-}
-
-Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 1, this.length)
-  if (!(this[offset] & 0x80)) return (this[offset])
-  return ((0xff - this[offset] + 1) * -1)
-}
-
-Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset] | (this[offset + 1] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 2, this.length)
-  var val = this[offset + 1] | (this[offset] << 8)
-  return (val & 0x8000) ? val | 0xFFFF0000 : val
-}
-
-Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset]) |
-    (this[offset + 1] << 8) |
-    (this[offset + 2] << 16) |
-    (this[offset + 3] << 24)
-}
-
-Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-
-  return (this[offset] << 24) |
-    (this[offset + 1] << 16) |
-    (this[offset + 2] << 8) |
-    (this[offset + 3])
-}
-
-Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, true, 23, 4)
-}
-
-Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 4, this.length)
-  return ieee754.read(this, offset, false, 23, 4)
-}
-
-Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, true, 52, 8)
-}
-
-Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
-  offset = offset >>> 0
-  if (!noAssert) checkOffset(offset, 8, this.length)
-  return ieee754.read(this, offset, false, 52, 8)
-}
-
-function checkInt (buf, value, offset, ext, max, min) {
-  if (!Buffer.isBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
-  if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
-  if (offset + ext > buf.length) throw new RangeError('Index out of range')
-}
-
-Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) {
-    var maxBytes = Math.pow(2, 8 * byteLength) - 1
-    checkInt(this, value, offset, byteLength, maxBytes, 0)
-  }
-
-  var mul = 1
-  var i = 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  byteLength = byteLength >>> 0
-  if (!noAssert) {
-    var maxBytes = Math.pow(2, 8 * byteLength) - 1
-    checkInt(this, value, offset, byteLength, maxBytes, 0)
-  }
-
-  var i = byteLength - 1
-  var mul = 1
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    this[offset + i] = (value / mul) & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  this[offset] = (value & 0xff)
-  this[offset + 1] = (value >>> 8)
-  return offset + 2
-}
-
-Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)
-  this[offset] = (value >>> 8)
-  this[offset + 1] = (value & 0xff)
-  return offset + 2
-}
-
-Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  this[offset + 3] = (value >>> 24)
-  this[offset + 2] = (value >>> 16)
-  this[offset + 1] = (value >>> 8)
-  this[offset] = (value & 0xff)
-  return offset + 4
-}
-
-Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)
-  this[offset] = (value >>> 24)
-  this[offset + 1] = (value >>> 16)
-  this[offset + 2] = (value >>> 8)
-  this[offset + 3] = (value & 0xff)
-  return offset + 4
-}
-
-Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    var limit = Math.pow(2, (8 * byteLength) - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = 0
-  var mul = 1
-  var sub = 0
-  this[offset] = value & 0xFF
-  while (++i < byteLength && (mul *= 0x100)) {
-    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
-      sub = 1
-    }
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    var limit = Math.pow(2, (8 * byteLength) - 1)
-
-    checkInt(this, value, offset, byteLength, limit - 1, -limit)
-  }
-
-  var i = byteLength - 1
-  var mul = 1
-  var sub = 0
-  this[offset + i] = value & 0xFF
-  while (--i >= 0 && (mul *= 0x100)) {
-    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
-      sub = 1
-    }
-    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF
-  }
-
-  return offset + byteLength
-}
-
-Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)
-  if (value < 0) value = 0xff + value + 1
-  this[offset] = (value & 0xff)
-  return offset + 1
-}
-
-Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  this[offset] = (value & 0xff)
-  this[offset + 1] = (value >>> 8)
-  return offset + 2
-}
-
-Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)
-  this[offset] = (value >>> 8)
-  this[offset + 1] = (value & 0xff)
-  return offset + 2
-}
-
-Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  this[offset] = (value & 0xff)
-  this[offset + 1] = (value >>> 8)
-  this[offset + 2] = (value >>> 16)
-  this[offset + 3] = (value >>> 24)
-  return offset + 4
-}
-
-Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)
-  if (value < 0) value = 0xffffffff + value + 1
-  this[offset] = (value >>> 24)
-  this[offset + 1] = (value >>> 16)
-  this[offset + 2] = (value >>> 8)
-  this[offset + 3] = (value & 0xff)
-  return offset + 4
-}
-
-function checkIEEE754 (buf, value, offset, ext, max, min) {
-  if (offset + ext > buf.length) throw new RangeError('Index out of range')
-  if (offset < 0) throw new RangeError('Index out of range')
-}
-
-function writeFloat (buf, value, offset, littleEndian, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 23, 4)
-  return offset + 4
-}
-
-Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
-  return writeFloat(this, value, offset, false, noAssert)
-}
-
-function writeDouble (buf, value, offset, littleEndian, noAssert) {
-  value = +value
-  offset = offset >>> 0
-  if (!noAssert) {
-    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)
-  }
-  ieee754.write(buf, value, offset, littleEndian, 52, 8)
-  return offset + 8
-}
-
-Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, true, noAssert)
-}
-
-Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
-  return writeDouble(this, value, offset, false, noAssert)
-}
-
-// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
-Buffer.prototype.copy = function copy (target, targetStart, start, end) {
-  if (!start) start = 0
-  if (!end && end !== 0) end = this.length
-  if (targetStart >= target.length) targetStart = target.length
-  if (!targetStart) targetStart = 0
-  if (end > 0 && end < start) end = start
-
-  // Copy 0 bytes; we're done
-  if (end === start) return 0
-  if (target.length === 0 || this.length === 0) return 0
-
-  // Fatal error conditions
-  if (targetStart < 0) {
-    throw new RangeError('targetStart out of bounds')
-  }
-  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
-  if (end < 0) throw new RangeError('sourceEnd out of bounds')
-
-  // Are we oob?
-  if (end > this.length) end = this.length
-  if (target.length - targetStart < end - start) {
-    end = target.length - targetStart + start
-  }
-
-  var len = end - start
-  var i
-
-  if (this === target && start < targetStart && targetStart < end) {
-    // descending copy from end
-    for (i = len - 1; i >= 0; --i) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else if (len < 1000) {
-    // ascending copy from start
-    for (i = 0; i < len; ++i) {
-      target[i + targetStart] = this[i + start]
-    }
-  } else {
-    Uint8Array.prototype.set.call(
-      target,
-      this.subarray(start, start + len),
-      targetStart
-    )
-  }
-
-  return len
-}
-
-// Usage:
-//    buffer.fill(number[, offset[, end]])
-//    buffer.fill(buffer[, offset[, end]])
-//    buffer.fill(string[, offset[, end]][, encoding])
-Buffer.prototype.fill = function fill (val, start, end, encoding) {
-  // Handle string cases:
-  if (typeof val === 'string') {
-    if (typeof start === 'string') {
-      encoding = start
-      start = 0
-      end = this.length
-    } else if (typeof end === 'string') {
-      encoding = end
-      end = this.length
-    }
-    if (val.length === 1) {
-      var code = val.charCodeAt(0)
-      if (code < 256) {
-        val = code
-      }
-    }
-    if (encoding !== undefined && typeof encoding !== 'string') {
-      throw new TypeError('encoding must be a string')
-    }
-    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
-      throw new TypeError('Unknown encoding: ' + encoding)
-    }
-  } else if (typeof val === 'number') {
-    val = val & 255
-  }
-
-  // Invalid ranges are not set to a default, so can range check early.
-  if (start < 0 || this.length < start || this.length < end) {
-    throw new RangeError('Out of range index')
-  }
-
-  if (end <= start) {
-    return this
-  }
-
-  start = start >>> 0
-  end = end === undefined ? this.length : end >>> 0
-
-  if (!val) val = 0
-
-  var i
-  if (typeof val === 'number') {
-    for (i = start; i < end; ++i) {
-      this[i] = val
-    }
-  } else {
-    var bytes = Buffer.isBuffer(val)
-      ? val
-      : new Buffer(val, encoding)
-    var len = bytes.length
-    for (i = 0; i < end - start; ++i) {
-      this[i + start] = bytes[i % len]
-    }
-  }
-
-  return this
-}
-
-// HELPER FUNCTIONS
-// ================
-
-var INVALID_BASE64_RE = /[^+/0-9A-Za-z-_]/g
-
-function base64clean (str) {
-  // Node strips out invalid characters like \n and \t from the string, base64-js does not
-  str = str.trim().replace(INVALID_BASE64_RE, '')
-  // Node converts strings with length < 2 to ''
-  if (str.length < 2) return ''
-  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
-  while (str.length % 4 !== 0) {
-    str = str + '='
-  }
-  return str
-}
-
-function toHex (n) {
-  if (n < 16) return '0' + n.toString(16)
-  return n.toString(16)
-}
-
-function utf8ToBytes (string, units) {
-  units = units || Infinity
-  var codePoint
-  var length = string.length
-  var leadSurrogate = null
-  var bytes = []
-
-  for (var i = 0; i < length; ++i) {
-    codePoint = string.charCodeAt(i)
-
-    // is surrogate component
-    if (codePoint > 0xD7FF && codePoint < 0xE000) {
-      // last char was a lead
-      if (!leadSurrogate) {
-        // no lead yet
-        if (codePoint > 0xDBFF) {
-          // unexpected trail
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        } else if (i + 1 === length) {
-          // unpaired lead
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-          continue
-        }
-
-        // valid lead
-        leadSurrogate = codePoint
-
-        continue
-      }
-
-      // 2 leads in a row
-      if (codePoint < 0xDC00) {
-        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-        leadSurrogate = codePoint
-        continue
-      }
-
-      // valid surrogate pair
-      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
-    } else if (leadSurrogate) {
-      // valid bmp char, but last char was a lead
-      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
-    }
-
-    leadSurrogate = null
-
-    // encode utf8
-    if (codePoint < 0x80) {
-      if ((units -= 1) < 0) break
-      bytes.push(codePoint)
-    } else if (codePoint < 0x800) {
-      if ((units -= 2) < 0) break
-      bytes.push(
-        codePoint >> 0x6 | 0xC0,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x10000) {
-      if ((units -= 3) < 0) break
-      bytes.push(
-        codePoint >> 0xC | 0xE0,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else if (codePoint < 0x110000) {
-      if ((units -= 4) < 0) break
-      bytes.push(
-        codePoint >> 0x12 | 0xF0,
-        codePoint >> 0xC & 0x3F | 0x80,
-        codePoint >> 0x6 & 0x3F | 0x80,
-        codePoint & 0x3F | 0x80
-      )
-    } else {
-      throw new Error('Invalid code point')
-    }
-  }
-
-  return bytes
-}
-
-function asciiToBytes (str) {
-  var byteArray = []
-  for (var i = 0; i < str.length; ++i) {
-    // Node's code seems to be doing this and not & 0x7F..
-    byteArray.push(str.charCodeAt(i) & 0xFF)
-  }
-  return byteArray
-}
-
-function utf16leToBytes (str, units) {
-  var c, hi, lo
-  var byteArray = []
-  for (var i = 0; i < str.length; ++i) {
-    if ((units -= 2) < 0) break
-
-    c = str.charCodeAt(i)
-    hi = c >> 8
-    lo = c % 256
-    byteArray.push(lo)
-    byteArray.push(hi)
-  }
-
-  return byteArray
-}
-
-function base64ToBytes (str) {
-  return base64.toByteArray(base64clean(str))
-}
-
-function blitBuffer (src, dst, offset, length) {
-  for (var i = 0; i < length; ++i) {
-    if ((i + offset >= dst.length) || (i >= src.length)) break
-    dst[i + offset] = src[i]
-  }
-  return i
-}
-
-// ArrayBuffers from another context (i.e. an iframe) do not pass the `instanceof` check
-// but they should be treated as valid. See: https://github.com/feross/buffer/issues/166
-function isArrayBuffer (obj) {
-  return obj instanceof ArrayBuffer ||
-    (obj != null && obj.constructor != null && obj.constructor.name === 'ArrayBuffer' &&
-      typeof obj.byteLength === 'number')
-}
-
-// Node 0.10 supports `ArrayBuffer` but lacks `ArrayBuffer.isView`
-function isArrayBufferView (obj) {
-  return (typeof ArrayBuffer.isView === 'function') && ArrayBuffer.isView(obj)
-}
-
-function numberIsNaN (obj) {
-  return obj !== obj // eslint-disable-line no-self-compare
-}
-
-},{"base64-js":3,"ieee754":17}],8:[function(require,module,exports){
-'use strict';
-
-module.exports = earcut;
-module.exports.default = earcut;
-
-function earcut(data, holeIndices, dim) {
-
-    dim = dim || 2;
-
-    var hasHoles = holeIndices && holeIndices.length,
-        outerLen = hasHoles ? holeIndices[0] * dim : data.length,
-        outerNode = linkedList(data, 0, outerLen, dim, true),
-        triangles = [];
-
-    if (!outerNode) return triangles;
-
-    var minX, minY, maxX, maxY, x, y, invSize;
-
-    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
-
-    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
-    if (data.length > 80 * dim) {
-        minX = maxX = data[0];
-        minY = maxY = data[1];
-
-        for (var i = dim; i < outerLen; i += dim) {
-            x = data[i];
-            y = data[i + 1];
-            if (x < minX) minX = x;
-            if (y < minY) minY = y;
-            if (x > maxX) maxX = x;
-            if (y > maxY) maxY = y;
-        }
-
-        // minX, minY and invSize are later used to transform coords into integers for z-order calculation
-        invSize = Math.max(maxX - minX, maxY - minY);
-        invSize = invSize !== 0 ? 1 / invSize : 0;
-    }
-
-    earcutLinked(outerNode, triangles, dim, minX, minY, invSize);
-
-    return triangles;
-}
-
-// create a circular doubly linked list from polygon points in the specified winding order
-function linkedList(data, start, end, dim, clockwise) {
-    var i, last;
-
-    if (clockwise === (signedArea(data, start, end, dim) > 0)) {
-        for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
-    } else {
-        for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
-    }
-
-    if (last && equals(last, last.next)) {
-        removeNode(last);
-        last = last.next;
-    }
-
-    return last;
-}
-
-// eliminate colinear or duplicate points
-function filterPoints(start, end) {
-    if (!start) return start;
-    if (!end) end = start;
-
-    var p = start,
-        again;
-    do {
-        again = false;
-
-        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
-            removeNode(p);
-            p = end = p.prev;
-            if (p === p.next) break;
-            again = true;
-
-        } else {
-            p = p.next;
-        }
-    } while (again || p !== end);
-
-    return end;
-}
-
-// main ear slicing loop which triangulates a polygon (given as a linked list)
-function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
-    if (!ear) return;
-
-    // interlink polygon nodes in z-order
-    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
-
-    var stop = ear,
-        prev, next;
-
-    // iterate through ears, slicing them one by one
-    while (ear.prev !== ear.next) {
-        prev = ear.prev;
-        next = ear.next;
-
-        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
-            // cut off the triangle
-            triangles.push(prev.i / dim);
-            triangles.push(ear.i / dim);
-            triangles.push(next.i / dim);
-
-            removeNode(ear);
-
-            // skipping the next vertice leads to less sliver triangles
-            ear = next.next;
-            stop = next.next;
-
-            continue;
-        }
-
-        ear = next;
-
-        // if we looped through the whole remaining polygon and can't find any more ears
-        if (ear === stop) {
-            // try filtering points and slicing again
-            if (!pass) {
-                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
-
-            // if this didn't work, try curing all small self-intersections locally
-            } else if (pass === 1) {
-                ear = cureLocalIntersections(ear, triangles, dim);
-                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
-
-            // as a last resort, try splitting the remaining polygon into two
-            } else if (pass === 2) {
-                splitEarcut(ear, triangles, dim, minX, minY, invSize);
-            }
-
-            break;
-        }
-    }
-}
-
-// check whether a polygon node forms a valid ear with adjacent nodes
-function isEar(ear) {
-    var a = ear.prev,
-        b = ear,
-        c = ear.next;
-
-    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
-
-    // now make sure we don't have other points inside the potential ear
-    var p = ear.next.next;
-
-    while (p !== ear.prev) {
-        if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-            area(p.prev, p, p.next) >= 0) return false;
-        p = p.next;
-    }
-
-    return true;
-}
-
-function isEarHashed(ear, minX, minY, invSize) {
-    var a = ear.prev,
-        b = ear,
-        c = ear.next;
-
-    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
-
-    // triangle bbox; min & max are calculated like this for speed
-    var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x),
-        minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y),
-        maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x),
-        maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y);
-
-    // z-order range for the current triangle bbox;
-    var minZ = zOrder(minTX, minTY, minX, minY, invSize),
-        maxZ = zOrder(maxTX, maxTY, minX, minY, invSize);
-
-    var p = ear.prevZ,
-        n = ear.nextZ;
-
-    // look for points inside the triangle in both directions
-    while (p && p.z >= minZ && n && n.z <= maxZ) {
-        if (p !== ear.prev && p !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-            area(p.prev, p, p.next) >= 0) return false;
-        p = p.prevZ;
-
-        if (n !== ear.prev && n !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
-            area(n.prev, n, n.next) >= 0) return false;
-        n = n.nextZ;
-    }
-
-    // look for remaining points in decreasing z-order
-    while (p && p.z >= minZ) {
-        if (p !== ear.prev && p !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) &&
-            area(p.prev, p, p.next) >= 0) return false;
-        p = p.prevZ;
-    }
-
-    // look for remaining points in increasing z-order
-    while (n && n.z <= maxZ) {
-        if (n !== ear.prev && n !== ear.next &&
-            pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, n.x, n.y) &&
-            area(n.prev, n, n.next) >= 0) return false;
-        n = n.nextZ;
-    }
-
-    return true;
-}
-
-// go through all polygon nodes and cure small local self-intersections
-function cureLocalIntersections(start, triangles, dim) {
-    var p = start;
-    do {
-        var a = p.prev,
-            b = p.next.next;
-
-        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
-
-            triangles.push(a.i / dim);
-            triangles.push(p.i / dim);
-            triangles.push(b.i / dim);
-
-            // remove two nodes involved
-            removeNode(p);
-            removeNode(p.next);
-
-            p = start = b;
-        }
-        p = p.next;
-    } while (p !== start);
-
-    return p;
-}
-
-// try splitting polygon into two and triangulate them independently
-function splitEarcut(start, triangles, dim, minX, minY, invSize) {
-    // look for a valid diagonal that divides the polygon into two
-    var a = start;
-    do {
-        var b = a.next.next;
-        while (b !== a.prev) {
-            if (a.i !== b.i && isValidDiagonal(a, b)) {
-                // split the polygon in two by the diagonal
-                var c = splitPolygon(a, b);
-
-                // filter colinear points around the cuts
-                a = filterPoints(a, a.next);
-                c = filterPoints(c, c.next);
-
-                // run earcut on each half
-                earcutLinked(a, triangles, dim, minX, minY, invSize);
-                earcutLinked(c, triangles, dim, minX, minY, invSize);
-                return;
-            }
-            b = b.next;
-        }
-        a = a.next;
-    } while (a !== start);
-}
-
-// link every hole into the outer loop, producing a single-ring polygon without holes
-function eliminateHoles(data, holeIndices, outerNode, dim) {
-    var queue = [],
-        i, len, start, end, list;
-
-    for (i = 0, len = holeIndices.length; i < len; i++) {
-        start = holeIndices[i] * dim;
-        end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
-        list = linkedList(data, start, end, dim, false);
-        if (list === list.next) list.steiner = true;
-        queue.push(getLeftmost(list));
-    }
-
-    queue.sort(compareX);
-
-    // process holes from left to right
-    for (i = 0; i < queue.length; i++) {
-        eliminateHole(queue[i], outerNode);
-        outerNode = filterPoints(outerNode, outerNode.next);
-    }
-
-    return outerNode;
-}
-
-function compareX(a, b) {
-    return a.x - b.x;
-}
-
-// find a bridge between vertices that connects hole with an outer ring and and link it
-function eliminateHole(hole, outerNode) {
-    outerNode = findHoleBridge(hole, outerNode);
-    if (outerNode) {
-        var b = splitPolygon(outerNode, hole);
-        filterPoints(b, b.next);
-    }
-}
-
-// David Eberly's algorithm for finding a bridge between hole and outer polygon
-function findHoleBridge(hole, outerNode) {
-    var p = outerNode,
-        hx = hole.x,
-        hy = hole.y,
-        qx = -Infinity,
-        m;
-
-    // find a segment intersected by a ray from the hole's leftmost point to the left;
-    // segment's endpoint with lesser x will be potential connection point
-    do {
-        if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
-            var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
-            if (x <= hx && x > qx) {
-                qx = x;
-                if (x === hx) {
-                    if (hy === p.y) return p;
-                    if (hy === p.next.y) return p.next;
-                }
-                m = p.x < p.next.x ? p : p.next;
-            }
-        }
-        p = p.next;
-    } while (p !== outerNode);
-
-    if (!m) return null;
-
-    if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint
-
-    // look for points inside the triangle of hole point, segment intersection and endpoint;
-    // if there are no points found, we have a valid connection;
-    // otherwise choose the point of the minimum angle with the ray as connection point
-
-    var stop = m,
-        mx = m.x,
-        my = m.y,
-        tanMin = Infinity,
-        tan;
-
-    p = m.next;
-
-    while (p !== stop) {
-        if (hx >= p.x && p.x >= mx && hx !== p.x &&
-                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
-
-            tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
-
-            if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) {
-                m = p;
-                tanMin = tan;
-            }
-        }
-
-        p = p.next;
-    }
-
-    return m;
-}
-
-// interlink polygon nodes in z-order
-function indexCurve(start, minX, minY, invSize) {
-    var p = start;
-    do {
-        if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, invSize);
-        p.prevZ = p.prev;
-        p.nextZ = p.next;
-        p = p.next;
-    } while (p !== start);
-
-    p.prevZ.nextZ = null;
-    p.prevZ = null;
-
-    sortLinked(p);
-}
-
-// Simon Tatham's linked list merge sort algorithm
-// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
-function sortLinked(list) {
-    var i, p, q, e, tail, numMerges, pSize, qSize,
-        inSize = 1;
-
-    do {
-        p = list;
-        list = null;
-        tail = null;
-        numMerges = 0;
-
-        while (p) {
-            numMerges++;
-            q = p;
-            pSize = 0;
-            for (i = 0; i < inSize; i++) {
-                pSize++;
-                q = q.nextZ;
-                if (!q) break;
-            }
-            qSize = inSize;
-
-            while (pSize > 0 || (qSize > 0 && q)) {
-
-                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
-                    e = p;
-                    p = p.nextZ;
-                    pSize--;
-                } else {
-                    e = q;
-                    q = q.nextZ;
-                    qSize--;
-                }
-
-                if (tail) tail.nextZ = e;
-                else list = e;
-
-                e.prevZ = tail;
-                tail = e;
-            }
-
-            p = q;
-        }
-
-        tail.nextZ = null;
-        inSize *= 2;
-
-    } while (numMerges > 1);
-
-    return list;
-}
-
-// z-order of a point given coords and inverse of the longer side of data bbox
-function zOrder(x, y, minX, minY, invSize) {
-    // coords are transformed into non-negative 15-bit integer range
-    x = 32767 * (x - minX) * invSize;
-    y = 32767 * (y - minY) * invSize;
-
-    x = (x | (x << 8)) & 0x00FF00FF;
-    x = (x | (x << 4)) & 0x0F0F0F0F;
-    x = (x | (x << 2)) & 0x33333333;
-    x = (x | (x << 1)) & 0x55555555;
-
-    y = (y | (y << 8)) & 0x00FF00FF;
-    y = (y | (y << 4)) & 0x0F0F0F0F;
-    y = (y | (y << 2)) & 0x33333333;
-    y = (y | (y << 1)) & 0x55555555;
-
-    return x | (y << 1);
-}
-
-// find the leftmost node of a polygon ring
-function getLeftmost(start) {
-    var p = start,
-        leftmost = start;
-    do {
-        if (p.x < leftmost.x) leftmost = p;
-        p = p.next;
-    } while (p !== start);
-
-    return leftmost;
-}
-
-// check if a point lies within a convex triangle
-function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
-    return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 &&
-           (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 &&
-           (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0;
-}
-
-// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
-function isValidDiagonal(a, b) {
-    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) &&
-           locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b);
-}
-
-// signed area of a triangle
-function area(p, q, r) {
-    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
-}
-
-// check if two points are equal
-function equals(p1, p2) {
-    return p1.x === p2.x && p1.y === p2.y;
-}
-
-// check if two segments intersect
-function intersects(p1, q1, p2, q2) {
-    if ((equals(p1, q1) && equals(p2, q2)) ||
-        (equals(p1, q2) && equals(p2, q1))) return true;
-    return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 &&
-           area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0;
-}
-
-// check if a polygon diagonal intersects any polygon segments
-function intersectsPolygon(a, b) {
-    var p = a;
-    do {
-        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
-                intersects(p, p.next, a, b)) return true;
-        p = p.next;
-    } while (p !== a);
-
-    return false;
-}
-
-// check if a polygon diagonal is locally inside the polygon
-function locallyInside(a, b) {
-    return area(a.prev, a, a.next) < 0 ?
-        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
-        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
-}
-
-// check if the middle point of a polygon diagonal is inside the polygon
-function middleInside(a, b) {
-    var p = a,
-        inside = false,
-        px = (a.x + b.x) / 2,
-        py = (a.y + b.y) / 2;
-    do {
-        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
-                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
-            inside = !inside;
-        p = p.next;
-    } while (p !== a);
-
-    return inside;
-}
-
-// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
-// if one belongs to the outer ring and another to a hole, it merges it into a single ring
-function splitPolygon(a, b) {
-    var a2 = new Node(a.i, a.x, a.y),
-        b2 = new Node(b.i, b.x, b.y),
-        an = a.next,
-        bp = b.prev;
-
-    a.next = b;
-    b.prev = a;
-
-    a2.next = an;
-    an.prev = a2;
-
-    b2.next = a2;
-    a2.prev = b2;
-
-    bp.next = b2;
-    b2.prev = bp;
-
-    return b2;
-}
-
-// create a node and optionally link it with previous one (in a circular doubly linked list)
-function insertNode(i, x, y, last) {
-    var p = new Node(i, x, y);
-
-    if (!last) {
-        p.prev = p;
-        p.next = p;
-
-    } else {
-        p.next = last.next;
-        p.prev = last;
-        last.next.prev = p;
-        last.next = p;
-    }
-    return p;
-}
-
-function removeNode(p) {
-    p.next.prev = p.prev;
-    p.prev.next = p.next;
-
-    if (p.prevZ) p.prevZ.nextZ = p.nextZ;
-    if (p.nextZ) p.nextZ.prevZ = p.prevZ;
-}
-
-function Node(i, x, y) {
-    // vertice index in coordinates array
-    this.i = i;
-
-    // vertex coordinates
-    this.x = x;
-    this.y = y;
-
-    // previous and next vertice nodes in a polygon ring
-    this.prev = null;
-    this.next = null;
-
-    // z-order curve value
-    this.z = null;
-
-    // previous and next nodes in z-order
-    this.prevZ = null;
-    this.nextZ = null;
-
-    // indicates whether this is a steiner point
-    this.steiner = false;
-}
-
-// return a percentage difference between the polygon area and its triangulation area;
-// used to verify correctness of triangulation
-earcut.deviation = function (data, holeIndices, dim, triangles) {
-    var hasHoles = holeIndices && holeIndices.length;
-    var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
-
-    var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
-    if (hasHoles) {
-        for (var i = 0, len = holeIndices.length; i < len; i++) {
-            var start = holeIndices[i] * dim;
-            var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
-            polygonArea -= Math.abs(signedArea(data, start, end, dim));
-        }
-    }
-
-    var trianglesArea = 0;
-    for (i = 0; i < triangles.length; i += 3) {
-        var a = triangles[i] * dim;
-        var b = triangles[i + 1] * dim;
-        var c = triangles[i + 2] * dim;
-        trianglesArea += Math.abs(
-            (data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
-            (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
-    }
-
-    return polygonArea === 0 && trianglesArea === 0 ? 0 :
-        Math.abs((trianglesArea - polygonArea) / polygonArea);
-};
-
-function signedArea(data, start, end, dim) {
-    var sum = 0;
-    for (var i = start, j = end - dim; i < end; i += dim) {
-        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
-        j = i;
-    }
-    return sum;
-}
-
-// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
-earcut.flatten = function (data) {
-    var dim = data[0][0].length,
-        result = {vertices: [], holes: [], dimensions: dim},
-        holeIndex = 0;
-
-    for (var i = 0; i < data.length; i++) {
-        for (var j = 0; j < data[i].length; j++) {
-            for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
-        }
-        if (i > 0) {
-            holeIndex += data[i - 1].length;
-            result.holes.push(holeIndex);
-        }
-    }
-    return result;
-};
-
-},{}],9:[function(require,module,exports){
-'use strict';
-
-var OneVersionConstraint = require('individual/one-version');
-
-var MY_VERSION = '7';
-OneVersionConstraint('ev-store', MY_VERSION);
-
-var hashKey = '__EV_STORE_KEY@' + MY_VERSION;
-
-module.exports = EvStore;
-
-function EvStore(elem) {
-    var hash = elem[hashKey];
-
-    if (!hash) {
-        hash = elem[hashKey] = {};
-    }
-
-    return hash;
-}
-
-},{"individual/one-version":19}],10:[function(require,module,exports){
-'use strict';
-var request = require('./request');
-var buildQueryObject = require('./buildQueryObject');
-var isArray = Array.isArray;
-
-function simpleExtend(obj, obj2) {
-  var prop;
-  for (prop in obj2) {
-    obj[prop] = obj2[prop];
-  }
-  return obj;
-}
-
-function XMLHttpSource(jsongUrl, config) {
-  this._jsongUrl = jsongUrl;
-  if (typeof config === 'number') {
-    var newConfig = {
-      timeout: config
-    };
-    config = newConfig;
-  }
-  this._config = simpleExtend({
-    timeout: 15000,
-    headers: {}
-  }, config || {});
-}
-
-XMLHttpSource.prototype = {
-  // because javascript
-  constructor: XMLHttpSource,
-  /**
-   * buildQueryObject helper
-   */
-  buildQueryObject: buildQueryObject,
-
-  /**
-   * @inheritDoc DataSource#get
-   */
-  get: function httpSourceGet(pathSet) {
-    var method = 'GET';
-    var queryObject = this.buildQueryObject(this._jsongUrl, method, {
-      paths: pathSet,
-      method: 'get'
-    });
-    var config = simpleExtend(queryObject, this._config);
-    // pass context for onBeforeRequest callback
-    var context = this;
-    return request(method, config, context);
-  },
-
-  /**
-   * @inheritDoc DataSource#set
-   */
-  set: function httpSourceSet(jsongEnv) {
-    var method = 'POST';
-    var queryObject = this.buildQueryObject(this._jsongUrl, method, {
-      jsonGraph: jsongEnv,
-      method: 'set'
-    });
-    var config = simpleExtend(queryObject, this._config);
-    config.headers["Content-Type"] = "application/x-www-form-urlencoded";
-    
-    // pass context for onBeforeRequest callback
-    var context = this;
-    return request(method, config, context);
-
-  },
-
-  /**
-   * @inheritDoc DataSource#call
-   */
-  call: function httpSourceCall(callPath, args, pathSuffix, paths) {
-    // arguments defaults
-    args = args || [];
-    pathSuffix = pathSuffix || [];
-    paths = paths || [];
-
-    var method = 'POST';
-    var queryData = [];
-    queryData.push('method=call');
-    queryData.push('callPath=' + encodeURIComponent(JSON.stringify(callPath)));
-    queryData.push('arguments=' + encodeURIComponent(JSON.stringify(args)));
-    queryData.push('pathSuffixes=' + encodeURIComponent(JSON.stringify(pathSuffix)));
-    queryData.push('paths=' + encodeURIComponent(JSON.stringify(paths)));
-
-    var queryObject = this.buildQueryObject(this._jsongUrl, method, queryData.join('&'));
-    var config = simpleExtend(queryObject, this._config);
-    config.headers["Content-Type"] = "application/x-www-form-urlencoded";
-    
-    // pass context for onBeforeRequest callback
-    var context = this;
-    return request(method, config, context);
-  }
-};
-// ES6 modules
-XMLHttpSource.XMLHttpSource = XMLHttpSource;
-XMLHttpSource['default'] = XMLHttpSource;
-// commonjs
-module.exports = XMLHttpSource;
-
-},{"./buildQueryObject":11,"./request":14}],11:[function(require,module,exports){
-'use strict';
-module.exports = function buildQueryObject(url, method, queryData) {
-  var qData = [];
-  var keys;
-  var data = {url: url};
-  var isQueryParamUrl = url.indexOf('?') !== -1;
-  var startUrl = (isQueryParamUrl) ? '&' : '?';
-
-  if (typeof queryData === 'string') {
-    qData.push(queryData);
-  } else {
-
-    keys = Object.keys(queryData);
-    keys.forEach(function (k) {
-      var value = (typeof queryData[k] === 'object') ? JSON.stringify(queryData[k]) : queryData[k];
-      qData.push(k + '=' + encodeURIComponent(value));
-    });
-  }
-
-  if (method === 'GET') {
-    data.url += startUrl + qData.join('&');
-  } else {
-    data.data = qData.join('&');
-  }
-
-  return data;
-};
-
-},{}],12:[function(require,module,exports){
-(function (global){
-'use strict';
-// Get CORS support even for older IE
-module.exports = function getCORSRequest() {
-    var xhr = new global.XMLHttpRequest();
-    if ('withCredentials' in xhr) {
-        return xhr;
-    } else if (!!global.XDomainRequest) {
-        return new XDomainRequest();
-    } else {
-        throw new Error('CORS is not supported by your browser');
-    }
-};
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],13:[function(require,module,exports){
-(function (global){
-'use strict';
-module.exports = function getXMLHttpRequest() {
-  var progId,
-    progIds,
-    i;
-  if (global.XMLHttpRequest) {
-    return new global.XMLHttpRequest();
-  } else {
-    try {
-    progIds = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'];
-    for (i = 0; i < 3; i++) {
-      try {
-        progId = progIds[i];
-        if (new global.ActiveXObject(progId)) {
-          break;
-        }
-      } catch(e) { }
-    }
-    return new global.ActiveXObject(progId);
-    } catch (e) {
-    throw new Error('XMLHttpRequest is not supported by your browser');
-    }
-  }
-};
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],14:[function(require,module,exports){
-'use strict';
-var getXMLHttpRequest = require('./getXMLHttpRequest');
-var getCORSRequest = require('./getCORSRequest');
-var hasOwnProp = Object.prototype.hasOwnProperty;
-
-var noop = function() {};
-
-function Observable() {}
-
-Observable.create = function(subscribe) {
-  var o = new Observable();
-
-  o.subscribe = function(onNext, onError, onCompleted) {
-
-    var observer;
-    var disposable;
-
-    if (typeof onNext === 'function') {
-        observer = {
-            onNext: onNext,
-            onError: (onError || noop),
-            onCompleted: (onCompleted || noop)
-        };
-    } else {
-        observer = onNext;
-    }
-
-    disposable = subscribe(observer);
-
-    if (typeof disposable === 'function') {
-      return {
-        dispose: disposable
-      };
-    } else {
-      return disposable;
-    }
-  };
-
-  return o;
-};
-
-function request(method, options, context) {
-  return Observable.create(function requestObserver(observer) {
-
-    var config = {
-      method: method || 'GET',
-      crossDomain: false,
-      async: true,
-      headers: {},
-      responseType: 'json'
-    };
-
-    var xhr,
-      isDone,
-      headers,
-      header,
-      prop;
-
-    for (prop in options) {
-      if (hasOwnProp.call(options, prop)) {
-        config[prop] = options[prop];
-      }
-    }
-
-    // Add request with Headers
-    if (!config.crossDomain && !config.headers['X-Requested-With']) {
-      config.headers['X-Requested-With'] = 'XMLHttpRequest';
-    }
-
-    // allow the user to mutate the config open
-    if (context.onBeforeRequest != null) {
-      context.onBeforeRequest(config);
-    }
-
-    // create xhr
-    try {
-      xhr = config.crossDomain ? getCORSRequest() : getXMLHttpRequest();
-    } catch (err) {
-      observer.onError(err);
-    }
-    try {
-      // Takes the url and opens the connection
-      if (config.user) {
-        xhr.open(config.method, config.url, config.async, config.user, config.password);
-      } else {
-        xhr.open(config.method, config.url, config.async);
-      }
-
-      // Sets timeout information
-      xhr.timeout = config.timeout;
-
-      // Anything but explicit false results in true.
-      xhr.withCredentials = config.withCredentials !== false;
-
-      // Fills the request headers
-      headers = config.headers;
-      for (header in headers) {
-        if (hasOwnProp.call(headers, header)) {
-          xhr.setRequestHeader(header, headers[header]);
-        }
-      }
-
-      if (config.responseType) {
-        try {
-          xhr.responseType = config.responseType;
-        } catch (e) {
-          // WebKit added support for the json responseType value on 09/03/2013
-          // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are
-          // known to throw when setting the value "json" as the response type. Other older
-          // browsers implementing the responseType
-          //
-          // The json response type can be ignored if not supported, because JSON payloads are
-          // parsed on the client-side regardless.
-          if (config.responseType !== 'json') {
-            throw e;
-          }
-        }
-      }
-
-      xhr.onreadystatechange = function onreadystatechange(e) {
-        // Complete
-        if (xhr.readyState === 4) {
-          if (!isDone) {
-            isDone = true;
-            onXhrLoad(observer, xhr, e);
-          }
-        }
-      };
-
-      // Timeout
-      xhr.ontimeout = function ontimeout(e) {
-        if (!isDone) {
-          isDone = true;
-          onXhrError(observer, xhr, 'timeout error', e);
-        }
-      };
-
-      // Send Request
-      xhr.send(config.data);
-
-    } catch (e) {
-      observer.onError(e);
-    }
-    // Dispose
-    return function dispose() {
-      // Doesn't work in IE9
-      if (!isDone && xhr.readyState !== 4) {
-        isDone = true;
-        xhr.abort();
-      }
-    };//Dispose
-  });
-}
-
-/*
- * General handling of ultimate failure (after appropriate retries)
- */
-function _handleXhrError(observer, textStatus, errorThrown) {
-  // IE9: cross-domain request may be considered errors
-  if (!errorThrown) {
-    errorThrown = new Error(textStatus);
-  }
-
-  observer.onError(errorThrown);
-}
-
-function onXhrLoad(observer, xhr, e) {
-  var responseData,
-    responseObject,
-    responseType;
-
-  // If there's no observer, the request has been (or is being) cancelled.
-  if (xhr && observer) {
-    responseType = xhr.responseType;
-    // responseText is the old-school way of retrieving response (supported by IE8 & 9)
-    // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
-    responseData = ('response' in xhr) ? xhr.response : xhr.responseText;
-
-    // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
-    var status = (xhr.status === 1223) ? 204 : xhr.status;
-
-    if (status >= 200 && status <= 399) {
-      try {
-        if (responseType !== 'json') {
-          responseData = JSON.parse(responseData || '');
-        }
-        if (typeof responseData === 'string') {
-          responseData = JSON.parse(responseData || '');
-        }
-      } catch (e) {
-        _handleXhrError(observer, 'invalid json', e);
-      }
-      observer.onNext(responseData);
-      observer.onCompleted();
-      return;
-
-    } else if (status === 401 || status === 403 || status === 407) {
-
-      return _handleXhrError(observer, responseData);
-
-    } else if (status === 410) {
-      // TODO: Retry ?
-      return _handleXhrError(observer, responseData);
-
-    } else if (status === 408 || status === 504) {
-      // TODO: Retry ?
-      return _handleXhrError(observer, responseData);
-
-    } else {
-
-      return _handleXhrError(observer, responseData || ('Response code ' + status));
-
-    }//if
-  }//if
-}//onXhrLoad
-
-function onXhrError(observer, xhr, status, e) {
-  _handleXhrError(observer, status || xhr.statusText || 'request error', e);
-}
-
-module.exports = request;
-
-},{"./getCORSRequest":12,"./getXMLHttpRequest":13}],15:[function(require,module,exports){
-(function (global){
-!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.falcor=t()}}(function(){var t;return function e(t,n,r){function o(s,u){if(!n[s]){if(!t[s]){var a="function"==typeof require&&require;if(!u&&a)return a(s,!0);if(i)return i(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var p=n[s]={exports:{}};t[s][0].call(p.exports,function(e){var n=t[s][1][e];return o(n?n:e)},p,p.exports,e,t,n,r)}return n[s].exports}for(var i="function"==typeof require&&require,s=0;s<r.length;s++)o(r[s]);return o}({1:[function(t,e,n){var r=t(32),o=t(130);r.atom=o.atom,r.ref=o.ref,r.error=o.error,r.pathValue=o.pathValue,r.HttpDataSource=t(125),e.exports=r},{125:125,130:130,32:32}],2:[function(t,e,n){function r(t){var e=t||{};this._root=e._root||new o(e),this._path=e.path||e._path||[],this._scheduler=e.scheduler||e._scheduler||new l,this._source=e.source||e._source,this._request=e.request||e._request||new s(this,this._scheduler),this._ID=N++,"number"==typeof e.maxSize?this._maxSize=e.maxSize:this._maxSize=e._maxSize||r.prototype._maxSize,"number"==typeof e.collectRatio?this._collectRatio=e.collectRatio:this._collectRatio=e._collectRatio||r.prototype._collectRatio,(e.boxed||e.hasOwnProperty("_boxed"))&&(this._boxed=e.boxed||e._boxed),(e.materialized||e.hasOwnProperty("_materialized"))&&(this._materialized=e.materialized||e._materialized),"boolean"==typeof e.treatErrorsAsValues?this._treatErrorsAsValues=e.treatErrorsAsValues:e.hasOwnProperty("_treatErrorsAsValues")&&(this._treatErrorsAsValues=e._treatErrorsAsValues),e.cache&&this.setCache(e.cache)}var o=t(4),i=t(3),s=t(55),u=t(64),a=t(65),c=t(61),p=t(63),h=t(73),f=t(75),l=t(74),d=t(81),v=t(84),y=t(49),b=t(134),m=t(88),g=t(100),w=t(96),x=t(102),_=t(98),S=t(99),E=t(77),C=t(76),A=t(130),N=0,k=t(116),O=function(){},P=t(14),j=t(19),D={pathValue:!0,pathSyntax:!0,json:!0,jsonGraph:!0},q=t(72);e.exports=r,r.ref=A.ref,r.atom=A.atom,r.error=A.error,r.pathValue=A.pathValue,r.prototype.constructor=r,r.prototype._materialized=!1,r.prototype._boxed=!1,r.prototype._progressive=!1,r.prototype._treatErrorsAsValues=!1,r.prototype._maxSize=Math.pow(2,53)-1,r.prototype._collectRatio=.75,r.prototype.get=t(71),r.prototype._getWithPaths=t(70),r.prototype.set=function(){var t=k(arguments,D,"set");return t!==!0?new u(function(e){e.onError(t)}):this._set.apply(this,arguments)},r.prototype.preload=function(){var t=k(arguments,q,"preload");if(t!==!0)return new u(function(e){e.onError(t)});var e=Array.prototype.slice.call(arguments),n=this;return new u(function(t){return n.get.apply(n,e).subscribe(function(){},function(e){t.onError(e)},function(){t.onCompleted()})})},r.prototype._set=function(){var t,e=-1,n=arguments.length,r=arguments[n-1];for(w(r)?n-=1:r=void 0,t=new Array(n);++e<n;)t[e]=arguments[e];return a.create(this,t,r)},r.prototype.call=function(){var t,e=-1,n=arguments.length;for(t=new Array(n);++e<n;){var r=arguments[e];t[e]=r;var o=typeof r;if(e>1&&!Array.isArray(r)||0===e&&!Array.isArray(r)&&"string"!==o||1===e&&!Array.isArray(r)&&!x(r))return new u(function(t){t.onError(new Error("Invalid argument"))})}return c.create(this,t)},r.prototype.invalidate=function(){var t,e=-1,n=arguments.length,r=arguments[n-1];for(t=new Array(n);++e<n;)if(t[e]=b.fromPath(arguments[e]),"object"!=typeof t[e])throw new Error("Invalid argument");p.create(this,t,r).subscribe(O,function(t){throw t})},r.prototype.deref=t(5),r.prototype.getValue=t(16),r.prototype.setValue=t(79),r.prototype._getValueSync=t(24),r.prototype._setValueSync=t(80),r.prototype._derefSync=t(6),r.prototype.setCache=function(t){var e=this._root.cache;if(t!==e){var n=this._root,r=this._path;this._path=[],this._root.cache={},"undefined"!=typeof e&&y(n,n.expired,m(e),0),S(t)?C(this,[t]):_(t)?E(this,[t]):g(t)&&E(this,[{json:t}]),this._path=r}else"undefined"==typeof e&&(this._root.cache={});return this},r.prototype.getCache=function(){var t=v(arguments);if(0===t.length)return P(this._root.cache);var e=[{}],n=this._path;return j.getWithPathsAsJSONGraph(this,t,e),this._path=n,e[0].jsonGraph},r.prototype.getVersion=function(t){var e=t&&b.fromPath(t)||[];if(Array.isArray(e)===!1)throw new Error("Model#getVersion must be called with an Array path.");return this._path.length&&(e=this._path.concat(e)),this._getVersion(this,e)},r.prototype._syncCheck=function(t){if(Boolean(this._source)&&this._root.syncRefCount<=0&&this._root.unsafeMode===!1)throw new Error("Model#"+t+" may only be called within the context of a request selector.");return!0},r.prototype._clone=function(t){var e=new r(this);for(var n in t){var o=t[n];"delete"===o?delete e[n]:e[n]=o}return e.setCache=void 0,e},r.prototype.batch=function(t){var e=t;"number"==typeof e?e=new f(Math.round(Math.abs(e))):e&&e.schedule||(e=new h);var n=this._clone();return n._request=new s(n,e),n},r.prototype.unbatch=function(){var t=this._clone();return t._request=new s(t,new l),t},r.prototype.treatErrorsAsValues=function(){return this._clone({_treatErrorsAsValues:!0})},r.prototype.asDataSource=function(){return new i(this)},r.prototype._materialize=function(){return this._clone({_materialized:!0})},r.prototype._dematerialize=function(){return this._clone({_materialized:"delete"})},r.prototype.boxValues=function(){return this._clone({_boxed:!0})},r.prototype.unboxValues=function(){return this._clone({_boxed:"delete"})},r.prototype.withoutDataSource=function(){return this._clone({_source:"delete"})},r.prototype.toJSON=function(){return{$type:"ref",value:this._path}},r.prototype.getPath=function(){return d(this._path)},r.prototype._getBoundValue=t(13),r.prototype._getVersion=t(18),r.prototype._getValueSync=t(17),r.prototype._getPathValuesAsPathMap=j.getWithPathsAsPathMap,r.prototype._getPathValuesAsJSONG=j.getWithPathsAsJSONGraph,r.prototype._setPathValuesAsJSON=t(78),r.prototype._setPathValuesAsJSONG=t(78),r.prototype._setPathValuesAsPathMap=t(78),r.prototype._setPathValuesAsValues=t(78),r.prototype._setPathMapsAsJSON=t(77),r.prototype._setPathMapsAsJSONG=t(77),r.prototype._setPathMapsAsPathMap=t(77),r.prototype._setPathMapsAsValues=t(77),r.prototype._setJSONGsAsJSON=t(76),r.prototype._setJSONGsAsJSONG=t(76),r.prototype._setJSONGsAsPathMap=t(76),r.prototype._setJSONGsAsValues=t(76),r.prototype._setCache=t(77),r.prototype._invalidatePathValuesAsJSON=t(48),r.prototype._invalidatePathMapsAsJSON=t(47)},{100:100,102:102,116:116,13:13,130:130,134:134,14:14,16:16,17:17,18:18,19:19,24:24,3:3,4:4,47:47,48:48,49:49,5:5,55:55,6:6,61:61,63:63,64:64,65:65,70:70,71:71,72:72,73:73,74:74,75:75,76:76,77:77,78:78,79:79,80:80,81:81,84:84,88:88,96:96,98:98,99:99}],3:[function(t,e,n){function r(t){this._model=t._materialize().treatErrorsAsValues()}r.prototype.get=function(t){return this._model.get.apply(this._model,t)._toJSONG()},r.prototype.set=function(t){return this._model.set(t)._toJSONG()},r.prototype.call=function(t,e,n,r){var o=[t,e,n].concat(r);return this._model.call.apply(this._model,o)._toJSONG()},e.exports=r},{}],4:[function(t,e,n){function r(t){var e=t||{};this.syncRefCount=0,this.expired=e.expired||[],this.unsafeMode=e.unsafeMode||!1,this.collectionScheduler=e.collectionScheduler||new s,this.cache={},o(e.comparator)&&(this.comparator=e.comparator),o(e.errorSelector)&&(this.errorSelector=e.errorSelector),o(e.onChange)&&(this.onChange=e.onChange)}var o=t(96),i=t(91),s=t(74);r.prototype.errorSelector=function(t,e){return e},r.prototype.comparator=function(t,e){return i(t,"value")&&i(e,"value")?t.value===e.value&&t.$type===e.$type&&t.$expires===e.$expires:t===e},e.exports=r},{74:74,91:91,96:96}],5:[function(t,e,n){function r(t,e){var n,r=!1;try{++t._root.syncRefCount,n=t._derefSync(e)}catch(i){n=i,r=!0}finally{--t._root.syncRefCount}return r?o.Observable["throw"](n):o.Observable["return"](n)}var o=t(159),i=t(134);e.exports=function(t){for(var e=this,n=-1,s=arguments.length-1,u=new Array(s),a=i.fromPath(t);++n<s;)u[n]=i.fromPath(arguments[n+1]);if(0===s)throw new Error("Model#deref requires at least one value path.");return o.Observable.defer(function(){return r(e,a)}).flatMap(function(t){if(Boolean(t)){if(s>0){var n=o.Observable.of(t);return t.get.apply(t,u)["catch"](o.Observable.empty()).concat(n).last().flatMap(function(){return r(e,a)}).filter(function(t){return t})}return o.Observable["return"](t)}if(s>0){var i=u.map(function(t){return a.concat(t)});return e.get.apply(e,i).concat(o.Observable.defer(function(){return r(e,a)})).last().filter(function(t){return t})}return o.Observable.empty()})}},{134:134,159:159}],6:[function(t,e,n){var r=t(134),o=t(13),i=t(8),s=t(118);e.exports=function(t){var e=r.fromPath(t);if(!Array.isArray(e))throw new Error("Model#derefSync must be called with an Array path.");var n=o(this,this._path.concat(e),!1),u=n.path,a=n.value,c=n.found;if(c&&void 0!==a&&(a.$type!==s||void 0!==a.value)){if(a.$type)throw new i;return this._clone({_path:u})}}},{118:118,13:13,134:134,8:8}],7:[function(t,e,n){function r(){this.message=r.message,this.stack=(new Error).stack}r.prototype=new Error,r.prototype.name="BoundJSONGraphModelError",r.message="It is not legal to use the JSON Graph format from a bound Model. JSON Graph format can only be used from a root model.",e.exports=r},{}],8:[function(t,e,n){function r(t,e){this.message=i,this.stack=(new Error).stack,this.boundPath=t,this.shortedPath=e}var o="InvalidModelError",i="The boundPath of the model is not valid since a value or error was found before the path end.";r.prototype=new Error,r.prototype.name=o,r.message=i,e.exports=r},{}],9:[function(t,e,n){function r(t){this.message="An exception was thrown when making a request.",this.stack=(new Error).stack,this.innerError=t}var o="InvalidSourceError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],10:[function(t,e,n){function r(){this.message="The allowed number of retries have been exceeded.",this.stack=(new Error).stack}var o="MaxRetryExceededError";r.prototype=new Error,r.prototype.name=o,r.is=function(t){return t&&t.name===o},e.exports=r},{}],11:[function(t,e,n){function r(t,e,n,r,o,h,f){for(var l,d,v=n,y=o,b=r,m=0;;){if(0===m&&b[c]?(m=y.length,d=b[c]):(l=y[m++],d=v[l]),d){var g=d.$type,w=g&&d.value||d;if(m<y.length){if(g){v=d;break}v=d;continue}if(v=d,g&&u(d))break;if(b[c]||i(b,d),g===a){f?s(t,d,h,null,null,null,y,y.length,f):p(t,d),m=0,y=w,b=d,v=e;continue}break}v=void 0;break}if(m<y.length&&void 0!==v){for(var x=[],_=0;m>_;_++)x[_]=y[_];y=x}return[v,y]}var o=t(26),i=o.create,s=t(22),u=t(27),a=t(120),c=t(33),p=t(29).promote;e.exports=r},{120:120,22:22,26:26,27:27,29:29,33:33}],12:[function(t,e,n){var r=t(15),o=t(8),i=t(7);e.exports=function(t,e){return function(n,s,u){var a,c,p,h=u[0],f={values:u,optimizedPaths:[]},l=n._root.cache,d=n._path,v=l,y=d.length,b=[];if(y){if(e)return{criticalError:new i};if(v=r(n,d),v.$type)return{criticalError:new o(d,d)};for(a=[],c=0;y>c;++c)a[c]=d[c]}else a=[],y=0;for(c=0,p=s.length;p>c;c++)t(n,l,v,s[c],0,h,f,b,a,y,e);return f}}},{15:15,7:7,8:8}],13:[function(t,e,n){var r=t(17),o=t(8);e.exports=function(t,e,n){var i,s,u,a,c,p=e,h=e;for(i=t._boxed,n=t._materialized,s=t._treatErrorsAsValues,t._boxed=!0,t._materialized=void 0===n||n,t._treatErrorsAsValues=!0,u=r(t,p.concat(null),!0),t._boxed=i,t._materialized=n,t._treatErrorsAsValues=s,p=u.optimizedPath,a=u.shorted,c=u.found,u=u.value;p.length&&null===p[p.length-1];)p.pop();if(c&&a)throw new o(h,p);return{path:p,value:u,shorted:a,found:c}}},{17:17,8:8}],14:[function(t,e,n){function r(t){var e,n,r,o={},i=Object.keys(t);for(n=0,r=i.length;r>n;n++)e=i[n],s(e)||(o[e]=t[e]);return o}function o(t,e,n){Object.keys(t).filter(function(e){return!s(e)&&t[e]}).forEach(function(n){var s=t[n],u=e[n];if(u||(u=e[n]={}),s.$type){var a,c=s.value&&"object"==typeof s.value,p=!t[i];return a=c||p?r(s):s.value,void(e[n]=a)}o(s,u,n)})}var i=t(37),s=t(97);e.exports=function(t){var e={};return o(t,e),e}},{37:37,97:97}],15:[function(t,e,n){e.exports=function(t,e){for(var n=t._root.cache,r=-1,o=e.length;++r<o&&n&&!n.$type;)n=n[e[r]];return n}},{}],16:[function(t,e,n){var r=t(64),o=t(134);e.exports=function(t){for(var e=o.fromPath(t),n=0,i=e.length;++n<i;)if("object"==typeof e[n])return new r(function(t){t.onError(new Error("Paths must be simple paths"))});var s=this;return new r(function(t){return s.get(e).subscribe(function(n){for(var r=n.json,o=-1,i=e.length;r&&++o<i;)r=r[e[o]];t.onNext(r)},function(e){t.onError(e)},function(){t.onCompleted()})})}},{134:134,64:64}],17:[function(t,e,n){var r=t(11),o=t(25),i=t(27),s=t(29).promote,u=t(120),a=t(118),c=t(119);e.exports=function(t,e,n){for(var p,h,f,l,d,v=t._root.cache,y=e.length,b=[],m=!1,g=!1,w=0,x=v,_=v,S=v,E=!0,C=!1;x&&y>w;){if(p=e[w++],null!==p&&(x=_[p],b[b.length]=p),!x){S=void 0,m=!0,E=!1;break}if(f=x.$type,f===a&&void 0===x.value){S=void 0,E=!1,m=y>w;break}if(y>w){if(f===u){if(i(x)){C=!0,S=void 0,E=!1;break}if(l=r(t,v,v,x,x.value),d=l[0],!d){S=void 0,x=void 0,E=!1;break}f=d.$type,x=d,b=l[1].slice(0)}if(f)break}else S=x;_=x}if(y>w&&!C){for(h=w;y>h;++h)if(null!==e[w]){g=!0;break}for(g?(m=!0,S=void 0):S=x,h=w;y>h;++h)null!==e[h]&&(b[b.length]=e[h])}if(S&&f&&(i(S)?S=void 0:s(t,S)),S&&f===c&&!t._treatErrorsAsValues)throw{path:w===y?e:e.slice(0,w),value:S.value};return S&&t._boxed?S=Boolean(f)&&!n?o(S):S:!S&&t._materialized?S={$type:a}:S&&(S=S.value),{value:S,shorted:m,optimizedPath:b,found:E}}},{11:11,118:118,119:119,120:120,25:25,27:27,29:29}],18:[function(t,e,n){var r=t(46);e.exports=function(t,e){var n=t._getValueSync({_boxed:!0,_root:t._root,_treatErrorsAsValues:t._treatErrorsAsValues},e,!0).value,o=n&&n[r];return null==o?-1:o}},{46:46}],19:[function(t,e,n){var r=t(12),o=t(31),i=r(o,!1),s=r(o,!0);e.exports={getValueSync:t(17),getBoundValue:t(13),getWithPathsAsPathMap:i,getWithPathsAsJSONGraph:s}},{12:12,13:13,17:17,31:31}],20:[function(t,e,n){var r=t(29),o=t(25),i=r.promote;e.exports=function(t,e,n,r,s){var u=e.value;s.errors||(s.errors=[]),t._boxed&&(u=o(e)),s.errors.push({path:r.slice(0,n+1),value:u}),i(t,e)}},{25:25,29:29}],21:[function(t,e,n){function r(t,e,n,r,o,i,s){s.requestedMissingPaths.push(r.slice(0,n).concat(e)),s.optimizedMissingPaths.push(o.slice(0,i).concat(e))}var o=t(30),i=o.fastCopy;e.exports=function(t,e,n,o,s,u,a){var c;o.requestedMissingPaths||(o.requestedMissingPaths=[],o.optimizedMissingPaths=[]),c=n<e.length?i(e,n):[],r(t,c,n,s,u,a,o)}},{30:30}],22:[function(t,e,n){var r=t(29),o=t(25),i=r.promote,s=t(120),u=t(118),a=t(119),c=t(37);e.exports=function(t,e,n,r,p,h,f,l,d,v){if(n){var y,b,m,g,w,x,_,S,E=!1;if(e&&i(t,e),e&&void 0!==e.value||(E=t._materialized),E)S={$type:u};else if(t._boxed)S=o(e);else if(e.$type===s||e.$type===a)S=d?o(e):e.value;else if(d){var C=e.value&&"object"==typeof e.value,A=!e[c];S=C||A?o(e):e.value}else S=e.value;if(p&&(p.hasValue=!0),d){for(w=n.jsonGraph,w||(w=n.jsonGraph={},n.paths=[]),y=0,b=l-1;b>y;y++)g=f[y],w[g]||(w[g]={}),w=w[g];g=f[y],w[g]=E?{$type:u}:S,h&&n.paths.push(h.slice(0,r))}else if(0===r)n.json=S;else{for(w=n.json,w||(w=n.json={}),y=0;r-1>y;y++)m=h[y],w[m]||(w[m]={}),x=w,_=m,w=w[m];m=h[y],null!==m?w[m]=S:x[_]=S}}}},{118:118,119:119,120:120,25:25,29:29,37:37}],23:[function(t,e,n){var r=t(27),o=t(26),i=t(29),s=o.remove,u=i.splice,a=t(119),c=t(20),p=t(22),h=t(21),f=t(28),l=t(35);e.exports=function(t,e,n,o,i,d,v,y,b,m,g){var w=e&&e.$type,x=e&&void 0===e.value;return e&&w?void(r(e)?(e[l]||(u(t,e),s(e)),h(t,n,o,d,v,y,b)):w===a?(g&&(v[o]=null),m||t._treatErrorsAsValues?p(t,e,i,o,d,v,y,b,m,g):c(t,e,o,v,d)):(g&&(v[o]=null),(!x||x&&t._materialized)&&p(t,e,i,o,d,v,y,b,m,g))):void(f(t)?p(t,e,i,o,d,v,y,b,m,g):h(t,n,o,d,v,y,b))}},{119:119,20:20,21:21,22:22,26:26,27:27,28:28,29:29,35:35}],24:[function(t,e,n){var r=t(134);e.exports=function(t){var e=r.fromPath(t);if(Array.isArray(e)===!1)throw new Error("Model#getValueSync must be called with an Array path.");return this._path.length&&(e=this._path.concat(e)),this._syncCheck("getValueSync")&&this._getValueSync(this,e).value}},{134:134}],25:[function(t,e,n){var r=t(40);e.exports=function(t){var e,n,o,i=Object.keys(t);for(e={},n=0,o=i.length;o>n;n++){var s=i[n];s[0]!==r&&(e[s]=t[s])}return e}},{40:40}],26:[function(t,e,n){function r(t,e){var n=e[a]||0;e[i+n]=t,e[a]=n+1,t[u]=n,t[s]=e}function o(t){var e=t[s];if(e){for(var n=t[u],r=e[a];r>n;)e[i+n]=e[i+n+1],++n;e[a]=r-1,t[s]=void 0,t[u]=void 0}}var i=t(43),s=t(33),u=t(42),a=t(44);e.exports={create:r,remove:o}},{33:33,42:42,43:43,44:44}],27:[function(t,e,n){var r=t(106);e.exports=function(t){var e=void 0===t.$expires&&-1||t.$expires;return-1!==e&&1!==e&&(0===e||e<r())}},{106:106}],28:[function(t,e,n){e.exports=function(t){return t._materialized&&!t._source}},{}],29:[function(t,e,n){function r(t,e){var n=t._root,r=n[i];if(r!==e){var o=e[a],s=e[u];s&&(s[a]=o),o&&(o[u]=s),e[a]=void 0,n[i]=e,e[u]=r,r[a]=e}}function o(t,e){var n=t._root,r=e[a],o=e[u];o&&(o[a]=r),r&&(r[u]=o),e[a]=void 0,e===n[i]&&(n[i]=void 0),e===n[s]&&(n[s]=void 0),e[c]=!0,n.expired.push(e)}var i=t(34),s=t(45),u=t(38),a=t(41),c=t(35);e.exports={promote:r,splice:o}},{34:34,35:35,38:38,41:41,45:45}],30:[function(t,e,n){function r(t,e){var n,r,o,i=[];for(r=0,o=e||0,n=t.length;n>o;r++,o++)i[r]=t[o];return i}function o(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)null!==e[o]&&(i[n++]=e[o]);return i}function i(t,e){var n,r,o,i=[];for(n=0,r=t.length;r>n;n++)i[n]=t[n];for(o=0,r=e.length;r>o;o++)i[n++]=e[o];return i}e.exports={fastCat:i,fastCatSkipNulls:o,fastCopy:r}},{}],31:[function(t,e,n){var r=t(11),o=t(23),i=t(27),s=t(143).iterateKeySet,u=t(120),a=t(29).promote;e.exports=function c(t,e,n,p,h,f,l,d,v,y,b,m){var g=m,w=v;if(!n||n&&n.$type||h===p.length)return void o(t,n,p,h,f,l,d,w,y,b,g);var x,_;x=p[h];var S="object"==typeof x,E=h+1,C=!1,A=x;if(S&&(C={},A=s(x,C)),void 0!==A||!C.done){var N=y+1;do{g=!1;var k;null===A?k=n:(k=n[A],w[y]=A,d[h]=A);var O=w,P=N;if(k){var j=k.$type,D=j&&k.value||k;if(E<p.length&&j&&j===u&&!i(k)){b&&o(t,k,p,E,f,l,null,w,P,b,g),a(t,k);var q=r(t,e,e,k,D,f,b);g=!0,k=q[0];var R=q[1];for(O=[],P=R.length,_=0;P>_;++_)O[_]=R[_]}}c(t,e,k,p,E,f,l,d,O,P,b,g),C&&!C.done&&(A=s(x,C))}while(C&&!C.done)}}},{11:11,120:120,143:143,23:23,27:27,29:29}],32:[function(t,e,n){"use strict";function r(t){return new r.Model(t)}"function"==typeof Promise?r.Promise=Promise:r.Promise=t(151),e.exports=r,r.Model=t(2)},{151:151,2:2}],33:[function(t,e,n){e.exports=t(40)+"context"},{40:40}],34:[function(t,e,n){e.exports=t(40)+"head"},{40:40}],35:[function(t,e,n){e.exports=t(40)+"invalidated"},{40:40}],36:[function(t,e,n){e.exports=t(40)+"key"},{40:40}],37:[function(t,e,n){e.exports="$modelCreated"},{}],38:[function(t,e,n){e.exports=t(40)+"next"},{40:40}],39:[function(t,e,n){e.exports=t(40)+"parent"},{40:40}],40:[function(t,e,n){e.exports=String.fromCharCode(30)},{}],41:[function(t,e,n){e.exports=t(40)+"prev"},{40:40}],42:[function(t,e,n){e.exports=t(40)+"ref-index"},{40:40}],43:[function(t,e,n){e.exports=t(40)+"ref"},{40:40}],44:[function(t,e,n){e.exports=t(40)+"refs-length"},{40:40}],45:[function(t,e,n){e.exports=t(40)+"tail"},{40:40}],46:[function(t,e,n){e.exports=t(40)+"version"},{40:40}],47:[function(t,e,n){function r(t,e,n,o,s,u,c,p,h,f){if(!_(t)&&!t.$type)for(var l in t)if(l[0]!==a&&"$"!==l[0]&&m(t,l)){var d=t[l],v=g(d)&&!d.$type,y=i(n,o,s,l,d,v,!1,u,c,p,h,f),w=y[0],x=y[1];w&&(v?r(d,e+1,n,x,w,u,c,p,h,f):A(w,x,l,p)&&C(x,b(w),p,u))}}function o(t,e,n,r,o,s,a,h){if(w(n))return S(n,o,s),[void 0,e];y(s,n);var d=n,v=n.value,b=e;if(n=n[p],null!=n)b=n[c]||e;else{var m=0,g=v.length-1;b=n=e;do{var x=v[m],E=g>m,C=i(e,b,n,x,t,E,!0,r,o,s,a,h);if(n=C[0],_(n))return C;b=C[1]}while(m++<g);if(d[p]!==n){var A=n[l]||0;n[l]=A+1,n[u+A]=d,d[p]=n,d[f]=A}}return[n,b]}function i(t,e,n,r,i,u,a,c,p,h,f,l){for(var v=n.$type;v===d;){var y=o(i,t,n,c,p,h,f,l);if(n=y[0],_(n))return y;e=y[1],v=n&&n.$type}if(void 0!==v)return[n,e];if(null==r){if(u)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return[n,e]}var s=t(36),u=t(43),a=t(40),c=t(39),p=t(33),h=t(46),f=t(42),l=t(44),d=t(120),v=t(13),y=t(50),b=t(88),m=t(91),g=t(100),w=t(95),x=t(96),_=t(102),S=t(86),E=t(92),C=t(115),A=t(109);e.exports=function(t,e){for(var n=t._root,o=n,i=n.expired,s=E(),u=n._comparator,a=n._errorSelector,p=t._path,f=n.cache,l=p.length?v(t,p).value:f,d=l[c]||f,y=f[h],b=-1,m=e.length;++b<m;){var g=e[b];r(g.json,0,f,d,l,s,i,o,u,a)}var w=f[h],_=n.onChange;x(_)&&y!==w&&_()}},{100:100,102:102,109:109,115:115,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,88:88,91:91,92:92,95:95,96:96}],48:[function(t,e,n){function r(t,e,n,o,s,u,a,c){var p={},h=e<t.length-1,f=t[e],l=x(f,p);do{var d=i(n,o,s,l,h,!1,u,a,c),v=d[0],b=d[1];v&&(h?r(t,e+1,n,b,v,u,a,c):E(v,b,l,c)&&S(b,y(v),c,u)),l=x(f,p)}while(!p.done)}function o(t,e,n,r,o){if(b(e))return w(e,r,o),[void 0,t];v(o,e);var s=e,p=e.value,l=t;if(e=e[c],null!=e)l=e[a]||t;else{var d=0,y=p.length-1;l=e=t;do{var m=p[d],x=y>d,_=i(t,l,e,m,x,!0,n,r,o);if(e=_[0],g(e))return _;l=_[1]}while(d++<y);if(s[c]!==e){var S=e[f]||0;e[f]=S+1,e[u+S]=s,s[c]=e,s[h]=S}}return[e,l]}function i(t,e,n,r,i,u,a,c,p){for(var h=n.$type;h===l;){var f=o(t,n,a,c,p);if(n=f[0],g(n))return f;e=f[1],h=n.$type}if(void 0!==h)return[n,e];if(null==r){if(i)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return[n,e]}var s=t(36),u=t(43),a=t(39),c=t(33),p=t(46),h=t(42),f=t(44),l=t(120),d=t(13),v=t(50),y=t(88),b=t(95),m=t(96),g=t(102),w=t(86),x=t(143).iterateKeySet,_=t(92),S=t(115),E=t(109);e.exports=function(t,e){for(var n=t._root,o=n,i=n.expired,s=_(),u=t._path,c=n.cache,h=u.length?d(t,u).value:c,f=h[a]||c,l=c[p],v=-1,y=e.length;++v<y;){var b=e[v];r(b,0,c,f,h,s,i,o)}var g=c[p],w=n.onChange;m(w)&&l!==g&&w()}},{102:102,109:109,115:115,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,88:88,92:92,95:95,96:96}],49:[function(t,e,n){var r=t(36),o=t(39),i=t(34),s=t(45),u=t(38),a=t(41),c=t(108),p=t(115);e.exports=function(t,e,n,h,f,l){var d=n,v=f;"number"!=typeof v&&(v=.75);var y,b,m,g="number"==typeof l,w=h*v;for(b=e.pop();b;)m=b.$size||0,d-=m,g===!0?p(b,m,t,l):(y=b[o])&&c(b,y,b[r],t),b=e.pop();if(d>=h){var x=t[s];for(b=x;d>=w&&b;)x=x[a],m=b.$size||0,d-=m,g===!0&&p(b,m,t,l),b=x;t[s]=t[a]=b,null==b?t[i]=t[u]=void 0:b[u]=void 0}}},{108:108,115:115,34:34,36:36,38:38,39:39,41:41,45:45}],50:[function(t,e,n){var r=t(121),o=t(34),i=t(45),s=t(38),u=t(41),a=t(100);e.exports=function(t,e){if(a(e)&&e.$expires!==r){var n=t[o],c=t[i],p=e[s],h=e[u];e!==n&&(null!=p&&"object"==typeof p&&(p[u]=h),null!=h&&"object"==typeof h&&(h[s]=p),p=n,null!=n&&"object"==typeof n&&(n[u]=e),t[o]=t[s]=n=e,n[s]=p,n[u]=void 0),null!=c&&e!==c||(t[i]=t[u]=c=h||e)}return e}},{100:100,121:121,34:34,38:38,41:41,45:45}],51:[function(t,e,n){var r=t(34),o=t(45),i=t(38),s=t(41);e.exports=function(t,e){var n=t[r],u=t[o],a=e[i],c=e[s];null!=a&&"object"==typeof a&&(a[s]=c),null!=c&&"object"==typeof c&&(c[i]=a),e===n&&(t[r]=t[i]=a),e===u&&(t[o]=t[s]=c),e[i]=e[s]=void 0,n=u=a=c=void 0}},{34:34,38:38,41:41,45:45}],52:[function(t,e,n){function r(t,e){var n=!1;return function(){if(!n&&!t._disposed){n=!0,t._callbacks[e]=null,t._optimizedPaths[e]=[],t._requestedPaths[e]=[];var r=--t._count;0!==r||t.sent||(t._disposable.dispose(),t.requestQueue.removeRequest(t))}}}function o(t){for(var e=[],n=-1,r=0,o=t.length;o>r;++r)for(var i=t[r],s=0,u=i.length;u>s;++s)e[++n]=i[s];return e}var i=t(59),s=t(60),u=0,a=t(57).GetRequest,c=t(76),p=t(78),h=t(119),f=[],l=function(t,e){this.sent=!1,this.scheduled=!1,this.requestQueue=e,this.id=++u,this.type=a,this._scheduler=t,this._pathMap={},this._optimizedPaths=[],this._requestedPaths=[],this._callbacks=[],this._count=0,this._disposable=null,this._collapsed=null,this._disposed=!1};l.prototype={batch:function(t,e,n){var o=this,i=o._optimizedPaths,u=o._requestedPaths,a=o._callbacks,c=i.length;return i[c]=e,u[c]=t,a[c]=n,++o._count,o.scheduled||(o.scheduled=!0,o._disposable=o._scheduler.schedule(function(){s(o,i,function(t,e){if(o.requestQueue.removeRequest(o),o._disposed=!0,o._count){o._merge(u,t,e);for(var n=0,r=a.length;r>n;++n){var i=a[n];i&&i(t,e)}}})})),r(o,c)},add:function(t,e,n){var o,s,u=this,a=i(t,e,u._pathMap);a?(s=a[2],o=a[1]):(s=t,o=e);var c=!1,p=!1;if(o.length<e.length){c=!0;var h=u._callbacks.length;u._callbacks[h]=n,u._requestedPaths[h]=a[0],u._optimizedPaths[h]=[],++u._count,p=r(u,h)}return[c,s,o,p]},_merge:function(t,e,n){var r=this,i=r.requestQueue.model,s=i._root,u=s.errorSelector,a=s.comparator,l=i._path;i._path=f;var d=o(t);if(e){var v=e;v instanceof Error&&(v={message:v.message}),v.$type||(v={$type:h,value:v});var y=d.map(function(t){return{path:t,value:v}});p(i,y,null,u,a)}else c(i,[{paths:d,jsonGraph:n.jsonGraph}],null,u,a);i._path=l}},e.exports=l},{119:119,57:57,59:59,60:60,76:76,78:78}],53:[function(t,e,n){function r(){this.length=0,this.pending=!1,this.pathmaps=[],s.call(this,this._subscribe)}var o=t(159),i=o.Observer,s=o.Observable,u=o.Disposable,a=o.SerialDisposable,c=o.CompositeDisposable,p=t(9),h=t(143),f=h.iterateKeySet;r.create=function(t,e,n){var r=new this;return r.queue=t,r.model=e,r.index=n,r},r.prototype=Object.create(s.prototype),r.prototype.constructor=r,r.prototype.insertPath=function(t,e,n,r,o){var i=r||0,s=o||t.length-1,u=n||this.pathmaps[s+1]||(this.pathmaps[s+1]=Object.create(null));if(void 0===u||null===u)return!1;var a,c,p=t[i],h={};a=f(p,h);do{if(c=u[a],s>i){if(null==c){if(e)return!1;c=u[a]=Object.create(null)}if(this.insertPath(t,e,c,i+1,s)===!1)return!1}else u[a]=(c||0)+1,this.length+=1;h.done||(a=f(p,h))}while(!h.done);return!0},r.prototype.removePath=function(t,e,n,r){var o=n||0,i=r||t.length-1,s=e||this.pathmaps[i+1];if(void 0===s||null===s)return!0;var u,a,c=0,p=t[o],h={};u=f(p,h);do if(a=s[u],void 0!==a&&null!==a){if(i>o){c+=this.removePath(t,a,o+1,i);var l=void 0;for(l in a)break;void 0===l&&delete s[u]}else a=s[u]=(a||1)-1,0===a&&delete s[u],c+=1,this.length-=1;h.done||(u=f(p,h))}while(!h.done);return c},r.prototype.getSourceObserver=function(t){var e=this;return i.create(function(n){n.jsonGraph=n.jsonGraph||n.jsong||n.values||n.value,n.index=e.index,t.onNext(n)},function(e){t.onError(e)},function(){t.onCompleted()})},r.prototype._subscribe=function(t){var e=this,n=this.queue;e.pending=!0;var r=!1,o=new a,i=u.create(function(){r||(r=!0,n&&n._remove(e))}),s=new c(o,i);try{o.setDisposable(this.model._source[this.method](this.getSourceArgs()).subscribe(this.getSourceObserver(t)))}catch(h){throw new p(h)}return s},e.exports=r},{143:143,159:159,9:9}],54:[function(t,e,n){function r(t,e){this.total=0,this.model=t,this.requests=[],this.scheduler=e}var o=t(58),i=t(40),s=t(90),u=t(100),a=t(143);r.prototype.set=function(t){return t.paths=a.collapse(t.paths),o.create(this.model,t)},r.prototype._remove=function(t){var e=this.requests,n=e.indexOf(t);-1!==n&&e.splice(n,1)},r.prototype.distributePaths=function(t,e,n){var r,o,i=this.model,s=-1,u=t.length,a=-1,c=e.length,p=[];t:for(;++s<u;){var h=t[s];for(a=-1;++a<c;)if(o=e[a],o.insertPath(h,o.pending)){p[a]=o;continue t}r||(r=n.create(this,i,this.total++),e[a]=r,p[c++]=r),r.insertPath(h,!1)}var f=[],l=-1;for(a=-1;++a<c;)o=p[a],null!=o&&(f[++l]=o);return f},r.prototype.mergeJSONGraphs=function(t,e){var n=0,r=[],o=[],a=[],c=t.index,p=e.index;t.index=Math.max(c,p),r[-1]=t.jsonGraph||{},o[-1]=e.jsonGraph||{};t:for(;n>-1;){for(var h=r[n-1],f=o[n-1],l=a[n-1]||(a[n-1]=Object.keys(f));l.length>0;){var d=l.pop();if(d[0]!==i)if(h.hasOwnProperty(d)){var v=h[d],y=s(v),b=f[d],m=s(b);if(u(v)&&u(b)&&!y&&!m){r[n]=v,o[n]=b,n+=1;continue t}p>c&&(h[d]=b)}else h[d]=f[d]}n-=1}return t},e.exports=r},{100:100,143:143,40:40,58:58,90:90}],55:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(54),i=t(56);r.prototype.get=i.prototype.get,r.prototype.removeRequest=i.prototype.removeRequest,r.prototype.set=o.prototype.set,r.prototype.call=o.prototype.call,e.exports=r},{54:54,56:56}],56:[function(t,e,n){function r(t,e){this.model=t,this.scheduler=e,this.requests=this._requests=[]}var o=t(57),i=t(52);r.prototype={setScheduler:function(t){this.scheduler=t},get:function(t,e,n){function r(){v||(--h,0===h&&n())}var s,u,a,c=this,p=[],h=0,f=c._requests,l=e,d=t,v=!1;for(s=0,u=f.length;u>s;++s)if(a=f[s],a.type===o.GetRequest){if(a.sent){var y=a.add(d,l,r);y[0]&&(d=y[1],l=y[2],p[p.length]=y[3],++h)}else a.batch(d,l,r),l=[],d=[],++h;if(!l.length)break}if(l.length){a=new i(c.scheduler,c),f[f.length]=a,++h;var b=a.batch(d,l,r);p[p.length]=b}return function(){if(!v&&0!==h){v=!0;for(var t=p.length,e=0;t>e;++e)p[e]()}}},removeRequest:function(t){for(var e=this._requests,n=e.length;--n>=0;)if(e[n].id===t.id){e.splice(n,1);break}}},e.exports=r},{52:52,57:57}],57:[function(t,e,n){e.exports={GetRequest:"GET"}},{}],58:[function(t,e,n){function r(){s.call(this)}var o=t(159),i=o.Observer,s=t(53),u=t(83),a=t(76),c=t(78),p=new Array(0);r.create=function(t,e){var n=new r;return n.model=t,n.jsonGraphEnvelope=e,n},r.prototype=Object.create(s.prototype),r.prototype.constructor=r,r.prototype.method="set",r.prototype.insertPath=function(){return!1},r.prototype.removePath=function(){return 0},r.prototype.getSourceArgs=function(){return this.jsonGraphEnvelope},r.prototype.getSourceObserver=function(t){var e=this.model,n=e._path,r=this.jsonGraphEnvelope.paths,o=e._root,h=o.errorSelector,f=o.comparator;return s.prototype.getSourceObserver.call(this,i.create(function(o){e._path=p;var i=a(e,[{paths:r,jsonGraph:o.jsonGraph}],null,h,f);o.paths=i[1],e._path=n,t.onNext(o)},function(o){e._path=p,c(e,u(r,function(t){return{path:t,value:o}}),null,h,f),e._path=n,t.onError(o)},function(){t.onCompleted()}))},e.exports=r},{159:159,53:53,76:76,78:78,83:83}],59:[function(t,e,n){var r=t(143).hasIntersection,o=t(84);e.exports=function(t,e,n){for(var i=[],s=[],u=[],a=-1,c=-1,p=!1,h=0,f=e.length;f>h;++h){var l=e[h],d=n[l.length];d&&r(d,l,0)?(!p&&h>0&&(s=o(t,0,h),i=o(e,0,h)),u[++a]=t[h],p=!0):p&&(i[++c]=l,s[c]=t[h])}return p?[u,i,s]:null}},{143:143,84:84}],60:[function(t,e,n){var r=t(143),o=r.toTree,i=r.toPaths;e.exports=function(t,e,n){if(0===t._count)return void t.requestQueue.removeRequest(t);t.sent=!0,t.scheduled=!1;for(var r=t._pathMap,s=Object.keys(e),u=0,a=s.length;a>u;++u)for(var c=e[u],p=0,h=c.length;h>p;++p){var f=c[p],l=f.length;if(r[l]){var d=r[l];d[d.length]=f}else r[l]=[f]}for(var v=Object.keys(r),y=0,b=v.length;b>y;++y){var m=v[y];r[m]=o(r[m])}var g,w=t._collasped=i(r);t.requestQueue.model._source.get(w).subscribe(function(t){g=t},function(t){n(t,g)},function(){n(null,g)})}},{143:143}],61:[function(t,e,n){function r(t){u.call(this,t||i)}function o(t){return s.Observable.defer(function(){return t})}function i(t){function e(t){function e(t,e){if(Boolean(e.invalidated))t.invalidations.push(t.localThisPath.concat(e.path));else{var n=e.path,r=e.value;Boolean(r)&&"object"==typeof r&&r.$type===f?t.references.push({path:i(n),value:e.value}):t.values.push({path:i(n),value:e.value})}return t}function n(t){var e=t.values.concat(t.references);return e.length>0?o(g.set.apply(g,e)._toJSONG()).map(function(e){return{results:t,envelope:e}}):u["return"]({results:t,envelope:{jsonGraph:{},paths:[]}})}function r(t){var e,n=t.envelope,r=t.results,c=r.values,p=r.references,h=r.invalidations,f=c.map(a).map(i),l=p.reduce(s,[]),d=b.map(i),v=l.concat(d);return e=v.length>0?o(m.get.apply(m,f.concat(v))._toJSONG()):u["return"](n),e.doAction(function(t){t.invalidated=h})}function s(t,e){var n=e.path;return t.push.apply(t,y.map(function(t){return n.concat(t)})),t}function a(t){return t.path}var c=t&&t.localFn;if("function"==typeof c){var p=t.model,h=p._path,l=c.apply(p,v).reduce(e,{values:[],references:[],invalidations:[],localThisPath:h}).flatMap(n).flatMap(r);return u["return"](l)}return u.empty()}function n(t){function e(t){var e=t.invalidated;return e&&e.length&&m.invalidate.apply(m,e),t}return t&&"object"==typeof t?s.Observable.defer(function(){
-var e;try{e=t.call(x,v,y,b)}catch(n){e=u["throw"](new p(n))}return e}).map(e):u.empty()}function r(t){return o(g.set(t)).reduce(function(t){return t},null).map(function(){return{invalidated:t.invalidated,paths:t.paths.map(function(t){return t.slice(w.length)})}})}function i(t){return _.concat(t)}var c=this.args,l=this.model,d=h.fromPath(c[0]),v=c[1]||[],y=(c[2]||[]).map(h.fromPath),b=(c[3]||[]).map(h.fromPath),m=l._clone({_path:[]}),g=m.withoutDataSource(),w=l._path,x=w.concat(d),_=x.slice(0,-1),S=o(l.withoutDataSource().get(d)).map(function(t){for(var e=t.json,n=-1,r=d.length;e&&++n<r;)e=e[d[n]];var o=m._derefSync(_).boxValues();return{model:o,localFn:e}}).flatMap(e).defaultIfEmpty(n(l._source)).mergeAll().flatMap(r),E=new a;return E.add(S.subscribe(function(e){var n=e.paths,r=e.invalidated,i=l.get.apply(l,n);"AsJSONG"===t.outputFormat&&(i=o(i._toJSONG()).doAction(function(t){t.invalidated=r})),E.add(i.subscribe(t))},function(e){t.onError(e)})),E}var s=t(159)&&t(158),u=s.Observable,a=s.CompositeDisposable,c=t(64),p=t(9),h=t(134),f=t(120);r.create=c.create,r.prototype=Object.create(u.prototype),r.prototype.constructor=r,r.prototype.invokeSourceRequest=function(t){return this},r.prototype.ensureCollect=function(t){return this},r.prototype.initialize=function(){return this},e.exports=r},{120:120,134:134,158:158,159:159,64:64,9:9}],62:[function(t,e,n){function r(t){i.call(this,t)}var o=t(159),i=o.Observable,s=t(64),u=t(134),a=t(88),c=t(49),p=t(81),h=t(46),f=Array.isArray,l=t(101),d=t(98),v=t(99);r.create=s.create,r.prototype=Object.create(i.prototype),r.prototype.constructor=r,r.prototype.subscribeCount=0,r.prototype.subscribeLimit=10,r.prototype.initialize=function(){for(var t,e,n=this.model,r=this.outputFormat||"AsPathMap",o=this.isProgressive,i=[{}],s=[],a=this.args,c=-1,h=a.length;++c<h;){var y,b=a[c];f(b)||"string"==typeof b?(b=u.fromPath(b),y="PathValues"):l(b)?(b.path=u.fromPath(b.path),y="PathValues"):v(b)?y="JSONGs":d(b)&&(y="PathMaps"),e!==y&&(e=y,t={inputType:y,arguments:[]},s.push(t),t.values=i),t.arguments.push(b)}return this.boundPath=p(n._path),this.groups=s,this.outputFormat=r,this.isProgressive=o,this.isCompleted=!1,this.isMaster=null==n._source,this.values=i,this},r.prototype.invokeSourceRequest=function(t){return this},r.prototype.ensureCollect=function(t){var e=this["finally"](function(){var e=t._root,n=e.cache;e.collectionScheduler.schedule(function(){c(e,e.expired,a(n),t._maxSize,t._collectRatio,n[h])})});return new this.constructor(function(t){return e.subscribe(t)})},e.exports=r},{101:101,134:134,159:159,46:46,49:49,64:64,81:81,88:88,98:98,99:99}],63:[function(t,e,n){function r(t){u.call(this,t||o)}function o(t){for(var e=this.model,n=this.method,r=this.groups,o=-1,i=r.length;++o<i;){var u=r[o],a=u.inputType,c=u.arguments;if(c.length>0){var p="_"+n+a+"AsJSON",h=e[p];h(e,c)}}return t.onCompleted(),s.empty}var i=t(159),s=i.Disposable,u=t(62);r.create=u.create,r.prototype=Object.create(u.prototype),r.prototype.method="invalidate",r.prototype.constructor=r,e.exports=r},{159:159,62:62}],64:[function(t,e,n){function r(t){this._subscribe=t}function o(t){var e=this.model,n=new this.type;return n.model=e,n.args=this.args,n.outputFormat=t.outputFormat||"AsPathMap",n.isProgressive=t.isProgressive||!1,n.subscribeCount=0,n.subscribeLimit=t.retryLimit||10,n.initialize().invokeSourceRequest(e).ensureCollect(e).subscribe(t)}var i=t(32),s=t(159)&&t(158),u=s.Observable,a=t(84),c=t(105),p={outputFormat:{value:"AsJSONG"}},h={isProgressive:{value:!0}};r.create=function(t,e){var n=new r(o);return n.args=e,n.type=this,n.model=t,n},r.prototype=Object.create(u.prototype),r.prototype.constructor=r,r.prototype._mixin=function(){var t=this,e=a(arguments);return new t.constructor(function(n){return t.subscribe(e.reduce(function(t,e){return Object.create(t,e)},n))})},r.prototype._toJSONG=function(){return this._mixin(p)},r.prototype.progressively=function(){return this._mixin(h)},r.prototype.subscribe=function(t,e,n){var r=t;r&&"object"==typeof r||(r={onNext:t||c,onError:e||c,onCompleted:n||c});var o=this._subscribe(r);switch(typeof o){case"function":return{dispose:o};case"object":return o||{dispose:c};default:return{dispose:c}}},r.prototype.then=function(t,e){var n=this;return new i.Promise(function(t,e){var r,o=!1;n.toArray().subscribe(function(t){r=t.length<=1?t[0]:t},function(t){o=!0,e(t)},function(){o===!1&&t(r)})}).then(t,e)},e.exports=r},{105:105,158:158,159:159,32:32,84:84}],65:[function(t,e,n){function r(t){l.call(this,t||o)}function o(t){return this.isCompleted?s.call(this,t):i.call(this,t)}function i(t){if(this.subscribeCount++>this.subscribeLimit)return t.onError("Loop kill switch thrown."),h.empty;for(var e=[],n=[],r=this.model,o=this.isMaster,i=r._root,c=this.outputFormat,p=i.errorSelector,f=this.method,l=this.groups,d=-1,y=l.length;++d<y;){var b=l[d],m=b.inputType,g=b.arguments;if(g.length>0){var w="_"+f+m+c,x=r[w],_=x(r,g,null,p);n.push.apply(n,_[1]),"PathValues"===m?e.push.apply(e,g.map(u)):"JSONGs"===m?e.push.apply(e,v(g,a)):e.push.apply(e,_[0])}}return this.requestedPaths=e,o?(this.isCompleted=!0,s.call(this,t)):void t.onError({method:f,optimizedPaths:n,invokeSourceRequest:!0})}function s(t){var e=new f(this.model,this.requestedPaths);return"AsJSONG"===this.outputFormat&&(e=e._toJSONG()),this.isProgressive&&(e=e.progressively()),e.subscribe(t)}function u(t){return t.path}function a(t){return t.paths}var c=t(159),p=c.Observable,h=c.Disposable,f=t(67),l=t(62),d=t(9),v=t(82),y=new Array(0);r.create=l.create,r.prototype=Object.create(l.prototype),r.prototype.method="set",r.prototype.constructor=r,r.prototype.invokeSourceRequest=function(t){var e=this,n=this["catch"](function(r){var o;if(r&&r.invokeSourceRequest===!0){var i={},s=t._path,u=r.optimizedPaths;t._path=y,t._getPathValuesAsJSONG(t._materialize().withoutDataSource(),u,[i]),t._path=s,o=t._request.set(i)["do"](function(t){e.isCompleted=u.length===t.paths.length},function(){e.isCompleted=!0}).materialize().flatMap(function(t){if("C"===t.kind)return p.empty();if("E"===t.kind){var e=t.exception;if(d.is(e))return p["throw"](t.exception)}return n})}else o=p["throw"](r);return o});return new this.constructor(function(t){return n.subscribe(t)})},e.exports=r},{159:159,62:62,67:67,82:82,9:9}],66:[function(t,e,n){var r=function(t){this.disposed=!1,this.currentDisposable=t};r.prototype={dispose:function(){if(!this.disposed&&this.currentDisposable){this.disposed=!0;var t=this.currentDisposable;t.dispose?t.dispose():t()}}},e.exports=r},{}],67:[function(t,e,n){var r=t(64),o=t(68),i=t(69),s={dispose:function(){}},u=t(159).Observable,a=e.exports=function(t,e,n,r){this.model=t,this.currentRemainingPaths=e,this.isJSONGraph=n||!1,this.isProgressive=r||!1};a.prototype=Object.create(u.prototype),a.prototype.subscribe=r.prototype.subscribe,a.prototype.then=r.prototype.then,a.prototype._toJSONG=function(){return new a(this.model,this.currentRemainingPaths,!0,this.isProgressive)},a.prototype.progressively=function(){return new a(this.model,this.currentRemainingPaths,this.isJSONGraph,!0)},a.prototype._subscribe=function(t){var e=[{}],n=[],r=t.isJSONG=this.isJSONGraph,u=this.isProgressive,a=o(this.model,this.currentRemainingPaths,t,u,r,e,n);return a?i(this,this.model,a,t,e,n,1):s}},{159:159,64:64,68:68,69:69}],68:[function(t,e,n){var r=t(19),o=r.getWithPathsAsJSONGraph,i=r.getWithPathsAsPathMap;e.exports=function(t,e,n,r,s,u,a){var c;if(c=s?o(t,e,u):i(t,e,u),c.criticalError)return n.onError(c.criticalError),null;var p=c.hasValue,h=!c.requestedMissingPaths||!t._source,f=u[0].json||u[0].jsonGraph;if(c.errors)for(var l=c.errors,d=a.length,v=0,y=l.length;y>v;++v,++d)a[d]=l[v];if(p&&r||f&&h)try{++t._root.syncRefCount,n.onNext(u[0])}catch(b){throw b}finally{--t._root.syncRefCount}return h?(a.length?n.onError(a):n.onCompleted(),null):c}},{19:19}],69:[function(t,e,n){var r=t(68),o=t(10),i=t(30).fastCat,s=t(49),u=t(88),a=t(66),c=t(46);e.exports=function p(t,e,n,h,f,l,d){if(10===d)throw new o;var v=e._request,y=n.requestedMissingPaths,b=n.optimizedMissingPaths,m=new a,g=[],w=e._path;if(w.length)for(var x=0,_=y.length;_>x;++x)g[x]=i(w,y[x]);else g=y;var S=v.get(g,b,function(){var n=r(e,y,h,t.isProgressive,t.isJSONGraph,f,l);if(n)m.currentDisposable=p(t,e,n,h,f,l,d+1);else{var o=e._root,i=o.cache,a=i[c];s(o,o.expired,u(i),e._maxSize,e._collectRatio,a)}});return m.currentDisposable=S,m}},{10:10,30:30,46:46,49:49,66:66,68:68,88:88}],70:[function(t,e,n){var r=t(67);e.exports=function(t){return new r(this,t)}},{67:67}],71:[function(t,e,n){var r=t(134),o=t(64),i=t(72),s=t(116),u=t(67);e.exports=function(){var t=s(arguments,i,"get");if(t!==!0)return new o(function(e){e.onError(t)});var e=r.fromPathsOrPathValues(arguments);return new u(this,e)}},{116:116,134:134,64:64,67:67,72:72}],72:[function(t,e,n){e.exports={path:!0,pathSyntax:!0}},{}],73:[function(t,e,n){function r(){}var o=t(123),i=t(159),s=i.Disposable;r.prototype.schedule=function(t){return o(t),s.empty},r.prototype.scheduleWithState=function(t,e){var n=this;return o(function(){e(n,t)}),s.empty},e.exports=r},{123:123,159:159}],74:[function(t,e,n){function r(){}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){return t(),i.empty},r.prototype.scheduleWithState=function(t,e){return e(this,t),i.empty},e.exports=r},{159:159}],75:[function(t,e,n){function r(t){this.delay=t}var o=t(159),i=o.Disposable;r.prototype.schedule=function(t){var e=setTimeout(t,this.delay);return i.create(function(){void 0!==e&&(clearTimeout(e),e=void 0)})},r.prototype.scheduleWithState=function(t,e){var n=this,r=setTimeout(function(){e(n,t)},this.delay);return i.create(function(){void 0!==r&&(clearTimeout(r),r=void 0)})},e.exports=r},{159:159}],76:[function(t,e,n){function r(t,e,n,o,s,u,a,c,p,h,f,d,v,y,b,g,w){for(var x={},_=e<t.length-1,S=t[e],E=m(S,x),C=d.index;;){f.depth=e;var A=i(n,o,s,u,a,c,E,_,!1,f,d,v,y,b,g,w);f[e]=E,f.index=e,d[d.index++]=E;var N=A[0],k=A[1];if(N&&(_?r(t,e+1,n,k,N,u,A[3],A[2],p,h,f,d,v,y,b,g,w):(l(b,N),p.push(f.slice(0,f.index+1)),h.push(d.slice(0,d.index)))),E=m(S,x),x.done)break;d.index=C}}function o(t,e,n,r,o,s,c,f,v,m,g){var w=e.value;if(s.splice(0,s.length),s.push.apply(s,w),d(e))return s.index=w.length,b(e,f,v),[void 0,t,r,n];l(v,e);var x=0,_=e,S=w.length-1,E=e=t,C=r=n;do{var A=w[x],N=S>x,k=i(t,E,e,n,C,r,A,N,!0,o,s,c,f,v,m,g);if(e=k[0],y(e))return s.index=x,k;E=k[1],r=k[2],C=k[3]}while(x++<S);if(s.index=x,_[a]!==e){var O=e[h]||0;e[h]=O+1,e[u+O]=_,_[a]=e,_[p]=O}return[e,E,r,C]}function i(t,e,n,r,i,u,a,c,p,h,l,d,v,b,m,g){for(var x=n.$type;x===f;){var _=o(t,n,r,u,h,l,d,v,b,m,g);if(n=_[0],y(n))return _;e=_[1],u=_[2],i=_[3],x=n.$type}if(void 0!==x)return[n,e,u,i];if(null==a){if(c)throw new Error("`null` is not allowed in branch key positions.");n&&(a=n[s])}else e=n,i=u,n=e[a],u=i&&i[a];return n=w(e,n,u,a,h,l,d,v,b,m,g),[n,e,u,i]}var s=t(36),u=t(43),a=t(33),c=t(46),p=t(42),h=t(44),f=t(120),l=t(50),d=t(94),v=t(96),y=t(102),b=t(86),m=t(143).iterateKeySet,g=t(92),w=t(103);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,a=s.expired,p=g(),h=s.cache,f=h[c],l=[],d=[],y=[],b=[],m=-1,w=e.length;++m<w;)for(var x=e[m],_=x.paths,S=x.jsonGraph,E=-1,C=_.length;++E<C;){var A=_[E];d.index=0,r(A,0,h,h,h,S,S,S,y,b,l,d,p,a,u,i,o)}var N=h[c],k=s.onChange;return v(k)&&f!==N&&k(),[y,b]}},{102:102,103:103,120:120,143:143,33:33,36:36,42:42,43:43,44:44,46:46,50:50,86:86,92:92,94:94,96:96}],77:[function(t,e,n){function r(t,e,n,o,u,a,c,p,h,f,l,d,v,y){var b=s(t);if(b&&b.length)for(var g=0,x=b.length,_=h.index;;){var S=b[g],E=t[S],C=w(E)&&!E.$type;p.depth=e;var A=i(n,o,u,S,E,C,!1,p,h,f,l,d,v,y);p[e]=S,p.index=e,h[h.index++]=S;var N=A[0],k=A[1];if(N&&(C?r(E,e+1,n,k,N,a,c,p,h,f,l,d,v,y):(m(d,N),a.push(p.slice(0,p.index+1)),c.push(h.slice(0,h.index)))),++g>=x)break;h.index=_}}function o(t,e,n,r,o,s,u,c,f,v){var y=n.value;if(o.splice(0,o.length),o.push.apply(o,y),x(n))return o.index=y.length,E(n,u,c),[void 0,e];m(c,n);var b=n,g=e;if(n=n[h],null!=n)g=n[p]||e,o.index=y.length;else{var w=0,_=y.length-1;g=n=e;do{var C=y[w],A=_>w,N=i(e,g,n,C,t,A,!0,r,o,s,u,c,f,v);if(n=N[0],S(n))return o.index=w,N;g=N[1]}while(w++<_);if(o.index=w,b[h]!==n){var k=n[d]||0;n[d]=k+1,n[a+k]=b,b[h]=n,b[l]=k}}return[n,g]}function i(t,e,n,r,i,s,a,c,p,h,f,l,d,y){for(var b=n.$type;b===v;){var m=o(i,t,n,c,p,h,f,l,d,y);if(n=m[0],S(n))return m;e=m[1],b=n&&n.$type}if(void 0!==b)return[n,e];if(null==r){if(s)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[u])}else e=n,n=e[r];return n=A(e,n,r,i,s,a,c,p,h,f,l,d,y),[n,e]}function s(t){if(w(t)&&!t.$type){var e=[],n=0;b(t)&&(e[n++]="length");for(var r in t)r[0]!==c&&"$"!==r[0]&&g(t,r)&&(e[n++]=r);return e}}var u=t(36),a=t(43),c=t(40),p=t(39),h=t(33),f=t(46),l=t(42),d=t(44),v=t(120),y=t(13),b=Array.isArray,m=t(50),g=t(91),w=t(100),x=t(95),_=t(96),S=t(102),E=t(86),C=t(92),A=t(104);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,a=s.expired,c=C(),h=t._path,l=s.cache,d=h.length?y(t,h).value:l,v=d[p]||l,b=l[f],m=[],g=[],w=[],x=h.length,S=-1,E=e.length;++S<E;){var A=e[S],N=h.slice(0);N.index=x,r(A.json,0,l,v,d,g,w,m,N,c,a,u,i,o)}var k=l[f],O=s.onChange;return _(O)&&b!==k&&O(),[g,w]}},{100:100,102:102,104:104,120:120,13:13,33:33,36:36,39:39,40:40,42:42,43:43,44:44,46:46,50:50,86:86,91:91,92:92,95:95,96:96}],78:[function(t,e,n){function r(t,e,n,o,s,u,a,c,p,h,f,l,d,y,b){for(var m={},g=n<e.length-1,x=e[n],_=w(x,m),S=h.index;;){p.depth=n;var E=i(o,s,u,_,t,g,!1,p,h,f,l,d,y,b);p[n]=_,p.index=n,h[h.index++]=_;var C=E[0],A=E[1];if(C&&(g?r(t,e,n+1,o,A,C,a,c,p,h,f,l,d,y,b):(v(d,C),a.push(p.slice(0,p.index+1)),c.push(h.slice(0,h.index)))),_=w(x,m),m.done)break;h.index=S}}function o(t,e,n,r,o,s,p,l,d,b){var w=n.value;if(o.splice(0,o.length),o.push.apply(o,w),y(n))return o.index=w.length,g(n,p,l),[void 0,e];v(l,n);var x=n,_=e;if(n=n[c],null!=n)_=n[a]||e,o.index=w.length;else{var S=0,E=w.length-1;_=n=e;do{var C=w[S],A=E>S,N=i(e,_,n,C,t,A,!0,r,o,s,p,l,d,b);if(n=N[0],m(n))return o.index=S,N;_=N[1]}while(S++<E);if(o.index=S,x[c]!==n){var k=n[f]||0;n[f]=k+1,n[u+k]=x,x[c]=n,x[h]=k}}return[n,_]}function i(t,e,n,r,i,u,a,c,p,h,f,d,v,y){for(var b=n.$type;b===l;){var g=o(i,t,n,c,p,h,f,d,v,y);if(n=g[0],m(n))return g;e=g[1],b=n.$type}if(void 0!==b)return[n,e];if(null==r){if(u)throw new Error("`null` is not allowed in branch key positions.");n&&(r=n[s])}else e=n,n=e[r];return n=_(e,n,r,i,u,a,c,p,h,f,d,v,y),[n,e]}var s=t(36),u=t(43),a=t(39),c=t(33),p=t(46),h=t(42),f=t(44),l=t(120),d=t(13),v=t(50),y=t(95),b=t(96),m=t(102),g=t(86),w=t(143).iterateKeySet,x=t(92),_=t(104);e.exports=function(t,e,n,o,i){for(var s=t._root,u=s,c=s.expired,h=x(),f=t._path,l=s.cache,v=f.length?d(t,f).value:l,y=v[a]||l,m=l[p],g=[],w=[],_=[],S=f.length,E=-1,C=e.length;++E<C;){var A=e[E],N=A.path,k=A.value,O=f.slice(0);O.index=S,r(k,N,0,l,y,v,w,_,g,O,h,c,u,i,o)}var P=l[p],j=s.onChange;return b(j)&&m!==P&&j(),[w,_]}},{102:102,104:104,120:120,13:13,143:143,33:33,36:36,39:39,42:42,43:43,44:44,46:46,50:50,86:86,92:92,95:95,96:96}],79:[function(t,e,n){var r=t(130),o=t(64),i=t(101);e.exports=function(t,e){for(var n=i(t)?t:r.pathValue(t,e),s=0,u=n.path,a=u.length;++s<a;)if("object"==typeof u[s])return new o(function(t){t.onError(new Error("Paths must be simple paths"))});var c=this;return new o(function(t){return c._set(n).subscribe(function(e){for(var n=e.json,r=-1,o=u.length;n&&++r<o;)n=n[u[r]];t.onNext(n)},function(e){t.onError(e)},function(){t.onCompleted()})})}},{101:101,130:130,64:64}],80:[function(t,e,n){var r=t(134),o=t(101),i=t(78);e.exports=function(t,e,n,s){var u=r.fromPath(t),a=e,c=n,p=s;if(o(u)?(p=c,c=a,a=u):a={path:u,value:a},o(a)===!1)throw new Error("Model#setValueSync must be called with an Array path.");return"function"!=typeof c&&(c=this._root._errorSelector),"function"!=typeof p&&(p=this._root._comparator),this._syncCheck("setValueSync")?(i(this,[a]),this._getValueSync(this,a.path).value):void 0}},{101:101,134:134,78:78}],81:[function(t,e,n){e.exports=function(t){if(!t)return t;for(var e=-1,n=t.length,r=[];++e<n;)r[e]=t[e];return r}},{}],82:[function(t,e,n){e.exports=function(t,e){for(var n=-1,r=-1,o=t.length,i=[];++r<o;)for(var s=e(t[r],r,t),u=-1,a=s.length;++u<a;)i[++n]=s[u];return i}},{}],83:[function(t,e,n){e.exports=function(t,e){for(var n=-1,r=t.length,o=new Array(r);++n<r;)o[n]=e(t[n],n,t);return o}},{}],84:[function(t,e,n){e.exports=function(t,e,n){var r=e||0,o=-1,i=t.length-r;0>i&&(i=0),n>0&&i>n&&(i=n);for(var s=new Array(i);++o<i;)s[o]=t[o+r];return s}},{}],85:[function(t,e,n){var r=t(40),o=t(91),i=Array.isArray,s=t(100);e.exports=function(t){var e=t;if(s(e)){e=i(t)?[]:{};var n=t;for(var u in n)u[0]!==r&&o(n,u)&&(e[u]=n[u])}return e}},{100:100,40:40,91:91}],86:[function(t,e,n){var r=t(51),o=t(35);e.exports=function(t,e,n){return t[o]||(t[o]=!0,e.push(t),r(n,t)),t}},{35:35,51:51}],87:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$expires||void 0}},{100:100}],88:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$size||0}},{100:100}],89:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&t.$timestamp||void 0}},{100:100}],90:[function(t,e,n){var r=t(100);e.exports=function(t,e){var n=r(t)&&t.$type||void 0;return e&&n?"branch":n}},{100:100}],91:[function(t,e,n){var r=t(100),o=Object.prototype.hasOwnProperty;e.exports=function(t,e){return r(t)&&o.call(t,e)}},{100:100}],92:[function(t,e,n){var r=1;e.exports=function(){return r++}},{}],93:[function(t,e,n){var r=t(36),o=t(39),i=t(46);e.exports=function(t,e,n,s){return t[r]=n,t[o]=e,t[i]=s,e[n]=t,t}},{36:36,39:39,46:46}],94:[function(t,e,n){var r=t(106),o=t(122),i=t(121);e.exports=function(t){var e=t.$expires;return null!=e&&e!==i&&e!==o&&e<r()}},{106:106,121:121,122:122}],95:[function(t,e,n){var r=t(106),o=t(122),i=t(121);e.exports=function(t){var e=t.$expires;return null!=e&&e!==i&&(e===o||e<r())}},{106:106,121:121,122:122}],96:[function(t,e,n){var r="function";e.exports=function(t){return Boolean(t)&&typeof t===r}},{}],97:[function(t,e,n){var r=t(40);e.exports=function(t){return"$size"===t||t&&t.charAt(0)===r}},{40:40}],98:[function(t,e,n){var r=t(100);e.exports=function(t){return r(t)&&"json"in t}},{100:100}],99:[function(t,e,n){var r=Array.isArray,o=t(100);e.exports=function(t){return o(t)&&r(t.paths)&&(o(t.jsonGraph)||o(t.jsong)||o(t.json)||o(t.values)||o(t.value))}},{100:100}],100:[function(t,e,n){var r="object";e.exports=function(t){return null!==t&&typeof t===r}},{}],101:[function(t,e,n){var r=Array.isArray,o=t(100);e.exports=function(t){return o(t)&&(r(t.path)||"string"==typeof t.path)}},{100:100}],102:[function(t,e,n){var r="object";e.exports=function(t){return null==t||typeof t!==r}},{}],103:[function(t,e,n){var r=t(36),o=t(39),i=t(120),s=t(119),u=t(88),a=t(89),c=t(100),p=t(95),h=t(96),f=t(50),l=t(117),d=t(93),v=t(86),y=t(110),b=t(115),m=t(107);e.exports=function(t,e,n,g,w,x,_,S,E,C,A){var N,k,O,P,j,D,q;if(e===n){if(null===n)return e=l(n,void 0,n),t=b(t,-e.$size,E,_),e=d(e,t,g),f(E,e),e;if(void 0===n)return n;if(P=c(e),P&&(k=e.$type,null==k))return null==e[o]&&(e[r]=g,e[o]=t),e}else P=c(e),P&&(k=e.$type);if(k!==i){if(j=c(n),j&&(O=n.$type),P&&!k&&(null==n||j&&!O))return e}else{if(null==n)return p(e)?void v(e,S,E):e;if(j=c(n),j&&(O=n.$type,O===i))if(e===n){if(null!=e[o])return e}else if(D=e.$timestamp,q=n.$timestamp,!p(e)&&!p(n)&&D>q)return}if(k&&j&&!O)return d(y(e,n,t,g,E),t,g);if(O||!j){if(O===s&&h(A)&&(n=A(m(w,g),n)),O&&e===n)null==e[o]&&(e=l(e,k,e.value),t=b(t,-e.$size,E,_),e=d(e,t,g,_));else{var R=!0;!k&&P||(R=a(n)<a(e)==!1,(k||O)&&h(C)&&(R=!C(e,n,x.slice(0,x.index)))),R&&(n=l(n,O,O?n.value:n),N=u(e)-u(n),e=y(e,n,t,g,E),t=b(t,N,E,_),e=d(e,t,g,_))}p(e)?v(e,S,E):f(E,e)}else null==e&&(e=d(n,t,g));return e}},{100:100,107:107,110:110,115:115,117:117,119:119,120:120,36:36,39:39,50:50,86:86,88:88,89:89,93:93,95:95,96:96}],104:[function(t,e,n){var r=t(120),o=t(119),i=t(90),s=t(88),u=t(89),a=t(95),c=t(102),p=t(96),h=t(117),f=t(86),l=t(93),d=t(110),v=t(115),y=t(114),b=t(107);e.exports=function(t,e,n,m,g,w,x,_,S,E,C,A,N){var k=i(e,w);if(g||w)k&&a(e)&&(k="expired",f(e,E,C)),(k&&k!==r||c(e))&&(e=d(e,{},t,n,C),e=l(e,t,n,S),e=y(e,S));else{var O=m,P=i(O),j=u(O)<u(e)==!1;if((k||P)&&p(A)&&(j=!A(e,O,_.slice(0,_.index))),j){P===o&&p(N)&&(O=N(b(x,n),O)),O=h(O,P,P?O.value:O);var D=s(e)-s(O);e=d(e,O,t,n,C),t=v(t,D,C,S),e=l(e,t,n,S)}}return e}},{102:102,107:107,110:110,114:114,115:115,117:117,119:119,120:120,86:86,88:88,89:89,90:90,93:93,95:95,96:96}],105:[function(t,e,n){e.exports=function(){}},{}],106:[function(t,e,n){e.exports=Date.now},{}],107:[function(t,e,n){e.exports=function(t,e){var n=t.slice(0,t.depth);return n[n.length]=e,n}},{}],108:[function(t,e,n){var r=t(120),o=t(39),i=t(51),s=t(100),u=t(112),a=t(113);e.exports=function(t,e,n,c){if(s(t)){var p=t.$type;return Boolean(p)&&(p===r&&a(t),i(c,t)),u(t),e[n]=t[o]=void 0,!0}return!1}},{100:100,112:112,113:113,120:120,39:39,51:51}],109:[function(t,e,n){var r=t(91),o=t(40),i=t(108);e.exports=function s(t,e,n,u){if(i(t,e,n,u)){if(null==t.$type)for(var a in t)a[0]!==o&&"$"!==a[0]&&r(t,a)&&s(t[a],t,a,u);return!0}return!1}},{108:108,40:40,91:91}],110:[function(t,e,n){var r=t(100),o=t(111),i=t(109);e.exports=function(t,e,n,s,u){return t===e?t:(r(t)&&(o(t,e),i(t,n,s,u)),n[s]=e,e)}},{100:100,109:109,111:111}],111:[function(t,e,n){var r=t(43),o=t(33),i=t(44);e.exports=function(t,e){for(var n=t[i]||0,s=e[i]||0,u=-1;++u<n;){var a=t[r+u];void 0!==a&&(a[o]=e,e[r+(s+u)]=a,t[r+u]=void 0)}return e[i]=n+s,t[i]=void 0,e}},{33:33,43:43,44:44}],112:[function(t,e,n){var r=t(43),o=t(33),i=t(42),s=t(44);e.exports=function(t){for(var e=-1,n=t[s]||0;++e<n;){var u=t[r+e];null!=u&&(u[o]=u[i]=t[r+e]=void 0)}return t[s]=void 0,t}},{33:33,42:42,43:43,44:44}],113:[function(t,e,n){var r=t(43),o=t(33),i=t(42),s=t(44);e.exports=function(t){var e=t[o];if(e){for(var n=(t[i]||0)-1,u=(e[s]||0)-1;++n<=u;)e[r+n]=e[r+(n+1)];e[s]=u,t[i]=t[o]=e=void 0}return t}},{33:33,42:42,43:43,44:44}],114:[function(t,e,n){var r=t(43),o=t(39),i=t(46),s=t(44);e.exports=function(t,e){var n=[t],u=0;do{var a=n[u--];if(a&&a[i]!==e){a[i]=e,n[u++]=a[o];for(var c=-1,p=a[s]||0;++c<p;)n[u++]=a[r+c]}}while(u>-1);return t}},{39:39,43:43,44:44,46:46}],115:[function(t,e,n){var r=t(36),o=t(46),i=t(39),s=t(108),u=t(114);e.exports=function(t,e,n,a){var c=t;do{var p=c[i],h=c.$size=(c.$size||0)-e;0>=h&&null!=p?s(c,p,c[r],n):c[o]!==a&&u(c,a),c=p}while(c);return t}},{108:108,114:114,36:36,39:39,46:46}],116:[function(t,e,n){var r=Array.isArray,o=t(101),i=t(99),s=t(98),u=t(134);e.exports=function(t,e,n){for(var a=0,c=t.length;c>a;++a){var p=t[a],h=!1;if(r(p)&&e.path?h=!0:"string"==typeof p&&e.pathSyntax?h=!0:o(p)&&e.pathValue?(p.path=u.fromPath(p.path),h=!0):i(p)&&e.jsonGraph?h=!0:s(p)&&e.json?h=!0:"function"==typeof p&&a+1===c&&e.selector&&(h=!0),!h)return new Error("Unrecognized argument "+typeof p+" ["+String(p)+"] to Model#"+n)}return!0}},{101:101,134:134,98:98,99:99}],117:[function(t,e,n){var r=t(130),o=r.atom,i=t(106),s=t(122),u=t(37),a=50,c=t(85),p=Array.isArray,h=t(88),f=t(87);e.exports=function(t,e,n){var r=0,l=t,d=e;if(d?(l=c(l),r=h(l),l.$type=d):(l=o(n),d=l.$type,l[u]=!0),null==n)r=a+1;else if(null==r||0>=r)switch(typeof n){case"object":r=p(n)?a+n.length:a+1;break;case"string":r=a+n.length;break;default:r=a+1}var v=f(l);return"number"==typeof v&&s>v&&(l.$expires=i()+-1*v),l.$size=r,l}},{106:106,122:122,130:130,37:37,85:85,87:87,88:88}],118:[function(t,e,n){e.exports="atom"},{}],119:[function(t,e,n){e.exports="error"},{}],120:[function(t,e,n){e.exports="ref"},{}],121:[function(t,e,n){e.exports=1},{}],122:[function(t,e,n){e.exports=0},{}],123:[function(t,e,n){"use strict";function r(){if(a.length)throw a.shift()}function o(t){var e;e=u.length?u.pop():new i,e.task=t,s(e)}function i(){this.task=null}var s=t(124),u=[],a=[],c=s.makeRequestCallFromTimer(r);e.exports=o,i.prototype.call=function(){try{this.task.call()}catch(t){o.onerror?o.onerror(t):(a.push(t),c())}finally{this.task=null,u[u.length]=this}}},{124:124}],124:[function(t,e,n){(function(t){"use strict";function n(t){u.length||(s(),a=!0),u[u.length]=t}function r(){for(;c<u.length;){var t=c;if(c+=1,u[t].call(),c>p){for(var e=0,n=u.length-c;n>e;e++)u[e]=u[e+c];u.length-=c,c=0}}u.length=0,c=0,a=!1}function o(t){var e=1,n=new h(t),r=document.createTextNode("");return n.observe(r,{characterData:!0}),function(){e=-e,r.data=e}}function i(t){return function(){function e(){clearTimeout(n),clearInterval(r),t()}var n=setTimeout(e,0),r=setInterval(e,50)}}e.exports=n;var s,u=[],a=!1,c=0,p=1024,h=t.MutationObserver||t.WebKitMutationObserver;s="function"==typeof h?o(r):i(r),n.requestFlush=s,n.makeRequestCallFromTimer=i}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],125:[function(t,e,n){"use strict";function r(t,e){var n;for(n in e)t[n]=e[n];return t}function o(t,e){if(this._jsongUrl=t,"number"==typeof e){var n={timeout:e};e=n}this._config=r({timeout:15e3,headers:{}},e||{})}var i=t(129),s=t(126);Array.isArray;o.prototype={constructor:o,buildQueryObject:s,get:function(t){var e="GET",n=this.buildQueryObject(this._jsongUrl,e,{paths:t,method:"get"}),o=r(n,this._config),s=this;return i(e,o,s)},set:function(t){var e="POST",n=this.buildQueryObject(this._jsongUrl,e,{jsonGraph:t,method:"set"}),o=r(n,this._config);o.headers["Content-Type"]="application/x-www-form-urlencoded";var s=this;return i(e,o,s)},call:function(t,e,n,o){e=e||[],n=n||[],o=o||[];var s="POST",u=[];u.push("method=call"),u.push("callPath="+encodeURIComponent(JSON.stringify(t))),u.push("arguments="+encodeURIComponent(JSON.stringify(e))),u.push("pathSuffixes="+encodeURIComponent(JSON.stringify(n))),u.push("paths="+encodeURIComponent(JSON.stringify(o)));var a=this.buildQueryObject(this._jsongUrl,s,u.join("&")),c=r(a,this._config);c.headers["Content-Type"]="application/x-www-form-urlencoded";var p=this;return i(s,c,p)}},o.XMLHttpSource=o,o["default"]=o,e.exports=o},{126:126,129:129}],126:[function(t,e,n){"use strict";e.exports=function(t,e,n){var r,o=[],i={url:t},s=-1!==t.indexOf("?"),u=s?"&":"?";return"string"==typeof n?o.push(n):(r=Object.keys(n),r.forEach(function(t){var e="object"==typeof n[t]?JSON.stringify(n[t]):n[t];o.push(t+"="+encodeURIComponent(e))})),"GET"===e?i.url+=u+o.join("&"):i.data=o.join("&"),i}},{}],127:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e=new t.XMLHttpRequest;if("withCredentials"in e)return e;if(t.XDomainRequest)return new XDomainRequest;throw new Error("CORS is not supported by your browser")}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],128:[function(t,e,n){(function(t){"use strict";e.exports=function(){var e,n,r;if(t.XMLHttpRequest)return new t.XMLHttpRequest;try{for(n=["Msxml2.XMLHTTP","Microsoft.XMLHTTP","Msxml2.XMLHTTP.4.0"],r=0;3>r;r++)try{if(e=n[r],new t.ActiveXObject(e))break}catch(o){}return new t.ActiveXObject(e)}catch(o){throw new Error("XMLHttpRequest is not supported by your browser")}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],129:[function(t,e,n){"use strict";function r(){}function o(t,e,n){return r.create(function(r){var o,i,h,f,l,d={method:t||"GET",crossDomain:!1,async:!0,headers:{},responseType:"json"};for(l in e)p.call(e,l)&&(d[l]=e[l]);d.crossDomain||d.headers["X-Requested-With"]||(d.headers["X-Requested-With"]="XMLHttpRequest"),null!=n.onBeforeRequest&&n.onBeforeRequest(d);try{o=d.crossDomain?c():a()}catch(v){r.onError(v)}try{d.user?o.open(d.method,d.url,d.async,d.user,d.password):o.open(d.method,d.url,d.async),o.timeout=d.timeout,o.withCredentials=d.withCredentials!==!1,h=d.headers;for(f in h)p.call(h,f)&&o.setRequestHeader(f,h[f]);if(d.responseType)try{o.responseType=d.responseType}catch(y){if("json"!==d.responseType)throw y}o.onreadystatechange=function(t){4===o.readyState&&(i||(i=!0,s(r,o,t)))},o.ontimeout=function(t){i||(i=!0,u(r,o,"timeout error",t))},o.send(d.data)}catch(y){r.onError(y)}return function(){i||4===o.readyState||(i=!0,o.abort())}})}function i(t,e,n){n||(n=new Error(e)),t.onError(n)}function s(t,e,n){var r,o;if(e&&t){o=e.responseType,r="response"in e?e.response:e.responseText;var s=1223===e.status?204:e.status;if(s>=200&&399>=s){try{"json"!==o&&(r=JSON.parse(r||"")),"string"==typeof r&&(r=JSON.parse(r||""))}catch(n){i(t,"invalid json",n)}return t.onNext(r),void t.onCompleted()}return 401===s||403===s||407===s?i(t,r):410===s?i(t,r):408===s||504===s?i(t,r):i(t,r||"Response code "+s)}}function u(t,e,n,r){i(t,n||e.statusText||"request error",r)}var a=t(128),c=t(127),p=Object.prototype.hasOwnProperty,h=function(){};r.create=function(t){var e=new r;return e.subscribe=function(e,n,r){var o,i;return o="function"==typeof e?{onNext:e,onError:n||h,onCompleted:r||h}:e,i=t(o),"function"==typeof i?{dispose:i}:i},e},e.exports=o},{127:127,128:128}],130:[function(t,e,n){function r(t,e,n){var r=Object.create(null);if(null!=n){for(var o in n)r[o]=n[o];return r.$type=t,r.value=e,r}return{$type:t,value:e}}var o=t(134);e.exports={ref:function(t,e){return r("ref",o.fromPath(t),e)},atom:function(t,e){return r("atom",t,e)},undefined:function(){return r("atom")},error:function(t,e){return r("error",t,e)},pathValue:function(t,e){return{path:o.fromPath(t),value:e}},pathInvalidation:function(t){return{path:o.fromPath(t),invalidated:!0}}}},{134:134}],131:[function(t,e,n){e.exports={integers:"integers",ranges:"ranges",keys:"keys"}},{}],132:[function(t,e,n){var r={token:"token",dotSeparator:".",commaSeparator:",",openingBracket:"[",closingBracket:"]",openingBrace:"{",closingBrace:"}",escape:"\\",space:" ",colon:":",quote:"quote",unknown:"unknown"};e.exports=r},{}],133:[function(t,e,n){e.exports={indexer:{nested:"Indexers cannot be nested.",needQuotes:"unquoted indexers must be numeric.",empty:"cannot have empty indexers.",leadingDot:"Indexers cannot have leading dots.",leadingComma:"Indexers cannot have leading comma.",requiresComma:"Indexers require commas between indexer args.",routedTokens:"Only one token can be used per indexer when specifying routed tokens."},range:{precedingNaN:"ranges must be preceded by numbers.",suceedingNaN:"ranges must be suceeded by numbers."},routed:{invalid:"Invalid routed token.  only integers|ranges|keys are supported."},quote:{empty:"cannot have empty quoted keys.",illegalEscape:"Invalid escape character.  Only quotes are escapable."},unexpectedToken:"Unexpected token.",invalidIdentifier:"Invalid Identifier.",invalidPath:"Please provide a valid path.",throwError:function(t,e,n){if(n)throw t+" -- "+e.parseString+" with next token: "+n;throw t+" -- "+e.parseString}}},{}],134:[function(t,e,n){var r=t(140),o=t(135),i=t(131),s=function(t,e){return o(new r(t,e))};e.exports=s,s.fromPathsOrPathValues=function(t,e){if(!t)return[];for(var n=[],r=0,o=t.length;o>r;r++)"string"==typeof t[r]?n[r]=s(t[r],e):"string"==typeof t[r].path?n[r]={path:s(t[r].path,e),value:t[r].value}:n[r]=t[r];return n},s.fromPath=function(t,e){return t?"string"==typeof t?s(t,e):t:[]},s.RoutedTokens=i},{131:131,135:135,140:140}],135:[function(t,e,n){var r=t(132),o=t(133),i=t(136);e.exports=function(t){for(var e=t.next(),n={},s=[];!e.done;){switch(e.type){case r.token:var u=+e.token[0];isNaN(u)||o.throwError(o.invalidIdentifier,t),s[s.length]=e.token;break;case r.dotSeparator:0===s.length&&o.throwError(o.unexpectedToken,t);break;case r.space:break;case r.openingBracket:i(t,e,n,s);break;default:o.throwError(o.unexpectedToken,t)}e=t.next()}return 0===s.length&&o.throwError(o.invalidPath,t),s}},{132:132,133:133,136:136}],136:[function(t,e,n){var r=t(132),o=t(133),i=o.indexer,s=t(138),u=t(137),a=t(139);e.exports=function(t,e,n,c){var p=t.next(),h=!1,f=1,l=!1;for(n.indexer=[];!p.done;){switch(p.type){case r.token:case r.quote:n.indexer.length===f&&o.throwError(i.requiresComma,t)}switch(p.type){case r.openingBrace:l=!0,a(t,p,n,c);break;case r.token:var d=+p.token;isNaN(d)&&o.throwError(i.needQuotes,t),n.indexer[n.indexer.length]=d;break;case r.dotSeparator:n.indexer.length||o.throwError(i.leadingDot,t),s(t,p,n,c);
-break;case r.space:break;case r.closingBracket:h=!0;break;case r.quote:u(t,p,n,c);break;case r.openingBracket:o.throwError(i.nested,t);break;case r.commaSeparator:++f;break;default:o.throwError(o.unexpectedToken,t)}if(h)break;p=t.next()}0===n.indexer.length&&o.throwError(i.empty,t),n.indexer.length>1&&l&&o.throwError(i.routedTokens,t),1===n.indexer.length&&(n.indexer=n.indexer[0]),c[c.length]=n.indexer,n.indexer=void 0}},{132:132,133:133,137:137,138:138,139:139}],137:[function(t,e,n){var r=t(132),o=t(133),i=o.quote;e.exports=function(t,e,n,s){for(var u=t.next(),a="",c=e.token,p=!1,h=!1;!u.done;){switch(u.type){case r.token:case r.space:case r.dotSeparator:case r.commaSeparator:case r.openingBracket:case r.closingBracket:case r.openingBrace:case r.closingBrace:p&&o.throwError(i.illegalEscape,t),a+=u.token;break;case r.quote:p?(a+=u.token,p=!1):u.token!==c?a+=u.token:h=!0;break;case r.escape:p=!0;break;default:o.throwError(o.unexpectedToken,t)}if(h)break;u=t.next()}0===a.length&&o.throwError(i.empty,t),n.indexer[n.indexer.length]=a}},{132:132,133:133}],138:[function(t,e,n){var r=t(140),o=t(132),i=t(133);e.exports=function(t,e,n,s){var u,a=t.peek(),c=1,p=!1,h=!0,f=n.indexer.length-1,l=r.toNumber(n.indexer[f]);for(isNaN(l)&&i.throwError(i.range.precedingNaN,t);!p&&!a.done;){switch(a.type){case o.dotSeparator:3===c&&i.throwError(i.unexpectedToken,t),++c,3===c&&(h=!1);break;case o.token:u=r.toNumber(t.next().token),isNaN(u)&&i.throwError(i.range.suceedingNaN,t),p=!0;break;default:p=!0}if(p)break;t.next(),a=t.peek()}n.indexer[f]={from:l,to:h?u:u-1}}},{132:132,133:133,140:140}],139:[function(t,e,n){var r=t(132),o=t(131),i=t(133),s=i.routed;e.exports=function(t,e,n,u){var a=t.next(),c=!1,p="";switch(a.token){case o.integers:case o.ranges:case o.keys:break;default:i.throwError(s.invalid,t)}var h=t.next();if(h.type===r.colon&&(c=!0,h=t.next(),h.type!==r.token&&i.throwError(s.invalid,t),p=h.token,h=t.next()),h.type===r.closingBrace){var f={type:a.token,named:c,name:p};n.indexer[n.indexer.length]=f}else i.throwError(s.invalid,t)}},{131:131,132:132,133:133}],140:[function(t,e,n){function r(t,e,n){return{token:t,done:n,type:e}}function o(t,e,n){var o,g=!1,w="",x=n?m:b;do{if(o=e+1>=t.length)break;var _=t[e+1];if(void 0===_||-1!==x.indexOf(_)){if(w.length)break;++e;var S;switch(_){case s:S=i.dotSeparator;break;case u:S=i.commaSeparator;break;case a:S=i.openingBracket;break;case c:S=i.closingBracket;break;case p:S=i.openingBrace;break;case h:S=i.closingBrace;break;case y:S=i.space;break;case d:case v:S=i.quote;break;case l:S=i.escape;break;case f:S=i.colon;break;default:S=i.unknown}g=r(_,S,!1);break}w+=_,++e}while(!o);return!g&&w.length&&(g=r(w,i.token,!1)),g||(g={done:!0}),{token:g,idx:e}}var i=t(132),s=".",u=",",a="[",c="]",p="{",h="}",f=":",l="\\",d='"',v="'",y=" ",b="\\'\"[]., ",m="\\{}'\"[]., :",g=e.exports=function(t,e){this._string=t,this._idx=-1,this._extended=e,this.parseString=""};g.prototype={next:function(){var t=this._nextToken?this._nextToken:o(this._string,this._idx,this._extended);return this._idx=t.idx,this._nextToken=!1,this.parseString+=t.token.token,t.token},peek:function(){var t=this._nextToken?this._nextToken:o(this._string,this._idx,this._extended);return this._nextToken=t,t.token}},g.toNumber=function(t){return isNaN(+t)?NaN:+t}},{132:132}],141:[function(t,e,n){var r=t(147),o=t(148);e.exports=function(t){var e=t.reduce(function(t,e){var n=e.length;return t[n]||(t[n]=[]),t[n].push(e),t},{});return Object.keys(e).forEach(function(t){e[t]=o(e[t])}),r(e)}},{147:147,148:148}],142:[function(t,e,n){var r=t(144);e.exports=function o(t,e,n){for(var i=t,s=!0;s&&n<e.length;++n){var u=e[n],a=typeof u;if(u&&"object"===a){var c={},p=r(u,c),h=n+1;do{var f=i[p];s=void 0!==f,s&&(s=o(f,e,h)),p=r(u,c)}while(s&&!c.done);break}i=i[u],s=void 0!==i}return s}},{144:144}],143:[function(t,e,n){e.exports={iterateKeySet:t(144),toTree:t(148),toTreeWithUnion:t(149),pathsComplementFromTree:t(146),pathsComplementFromLengthTree:t(145),hasIntersection:t(142),toPaths:t(147),collapse:t(141)}},{141:141,142:142,144:144,145:145,146:146,147:147,148:148,149:149}],144:[function(t,e,n){function r(t,e){var n=e.from=t.from||0,r=e.to=t.to||"number"==typeof t.length&&e.from+t.length-1||0;e.rangeOffset=e.from,e.loaded=!0,n>r&&(e.empty=!0)}function o(t,e){e.done=!1;var n=e.isObject=!(!t||"object"!=typeof t);e.isArray=n&&i(t),e.arrayOffset=0}var i=Array.isArray;e.exports=function(t,e){if(void 0===e.isArray&&o(t,e),e.isArray){var n;do{e.loaded&&e.rangeOffset>e.to&&(++e.arrayOffset,e.loaded=!1);var i=e.arrayOffset,s=t.length;if(i>=s){e.done=!0;break}var u=t[e.arrayOffset],a=typeof u;if("object"===a){if(e.loaded||r(u,e),e.empty)continue;n=e.rangeOffset++}else++e.arrayOffset,n=u}while(void 0===n);return n}return e.isObject?(e.loaded||r(t,e),e.rangeOffset>e.to?void(e.done=!0):e.rangeOffset++):(e.done=!0,t)}},{}],145:[function(t,e,n){var r=t(142);e.exports=function(t,e){for(var n=[],o=-1,i=0,s=t.length;s>i;++i){var u=t[i];r(e[u.length],u,0)||(n[++o]=u)}return n}},{142:142}],146:[function(t,e,n){var r=t(142);e.exports=function(t,e){for(var n=[],o=-1,i=0,s=t.length;s>i;++i)r(e,t[i],0)||(n[++o]=t[i]);return n}},{142:142}],147:[function(t,e,n){function r(t){return null!==t&&typeof t===f}function o(t,e,n){var r,i,s,u,h,f,l,d,v,y,b,m,g,w,x=c(String(e)),_=Object.create(null),S=[],E=-1,C=0,A=[],N=0;if(u=[],h=-1,n-1>e){for(f=a(t,u);++h<f;)r=u[h],i=o(t[r],e+1,n),s=i.code,_[s]?i=_[s]:(S[C++]=s,i=_[s]={keys:[],sets:i.sets}),x=c(x+r+s),p(r)&&i.keys.push(parseInt(r,10))||i.keys.push(r);for(;++E<C;)if(r=S[E],i=_[r],u=i.keys,f=u.length,f>0)for(l=i.sets,d=-1,v=l.length,g=u[0];++d<v;){for(y=l[d],b=-1,m=y.length,w=new Array(m+1),w[0]=f>1&&u||g;++b<m;)w[b+1]=y[b];A[N++]=w}}else for(f=a(t,u),f>1?A[N++]=[u]:A[N++]=u;++h<f;)x=c(x+u[h]);return{code:x,sets:A}}function i(t){for(var e=-1,n=t.length;++e<n;){var r=t[e];h(r)&&(t[e]=s(r))}return t}function s(t){for(var e=-1,n=t.length-1,r=n>0;++e<=n;){var o=t[e];if(!p(o)){r=!1;break}t[e]=parseInt(o,10)}if(r===!0){t.sort(u);var i=t[0],s=t[n];if(n>=s-i)return{from:i,to:s}}return t}function u(t,e){return t-e}function a(t,e,n){var r=0;for(var o in t)e[r++]=o;return r>1&&e.sort(n),r}function c(t){for(var e=5381,n=-1,r=t.length;++n<r;)e=(e<<5)+e+t.charCodeAt(n);return String(e)}function p(t){return!h(t)&&t-parseFloat(t)+1>=0}var h=Array.isArray,f="object";e.exports=function(t){var e,n=[],s=0;for(var u in t)if(p(u)&&r(e=t[u]))for(var a=o(e,0,parseInt(u,10)).sets,c=-1,h=a.length;++c<h;)n[s++]=i(a[c]);return n}},{}],148:[function(t,e,n){function r(t,e,n){var i,s=e[n],u={},a=n+1;i=o(s,u);do{var c=t[i];c||(a===e.length?t[i]=null:c=t[i]={}),a<e.length&&r(c,e,a),u.done||(i=o(s,u))}while(!u.done)}var o=t(144);Array.isArray;e.exports=function(t){return t.reduce(function(t,e){return r(t,e,0),t},{})}},{144:144}],149:[function(t,e,n){},{}],150:[function(t,e,n){function r(){p=!1,u.length?c=u.concat(c):h=-1,c.length&&o()}function o(){if(!p){var t=setTimeout(r);p=!0;for(var e=c.length;e;){for(u=c,c=[];++h<e;)u&&u[h].run();h=-1,e=c.length}u=null,p=!1,clearTimeout(t)}}function i(t,e){this.fun=t,this.array=e}function s(){}var u,a=e.exports={},c=[],p=!1,h=-1;a.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var n=1;n<arguments.length;n++)e[n-1]=arguments[n];c.push(new i(t,e)),1!==c.length||p||setTimeout(o,0)},i.prototype.run=function(){this.fun.apply(null,this.array)},a.title="browser",a.browser=!0,a.env={},a.argv=[],a.version="",a.versions={},a.on=s,a.addListener=s,a.once=s,a.off=s,a.removeListener=s,a.removeAllListeners=s,a.emit=s,a.binding=function(t){throw new Error("process.binding is not supported")},a.cwd=function(){return"/"},a.chdir=function(t){throw new Error("process.chdir is not supported")},a.umask=function(){return 0}},{}],151:[function(t,e,n){"use strict";e.exports=t(156)},{156:156}],152:[function(t,e,n){"use strict";function r(){}function o(t){try{return t.then}catch(e){return y=e,b}}function i(t,e){try{return t(e)}catch(n){return y=n,b}}function s(t,e,n){try{t(e,n)}catch(r){return y=r,b}}function u(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._37=0,this._12=null,this._59=[],t!==r&&d(t,this)}function a(t,e,n){return new t.constructor(function(o,i){var s=new u(r);s.then(o,i),c(t,new l(e,n,s))})}function c(t,e){for(;3===t._37;)t=t._12;return 0===t._37?void t._59.push(e):void v(function(){var n=1===t._37?e.onFulfilled:e.onRejected;if(null===n)return void(1===t._37?p(e.promise,t._12):h(e.promise,t._12));var r=i(n,t._12);r===b?h(e.promise,y):p(e.promise,r)})}function p(t,e){if(e===t)return h(t,new TypeError("A promise cannot be resolved with itself."));if(e&&("object"==typeof e||"function"==typeof e)){var n=o(e);if(n===b)return h(t,y);if(n===t.then&&e instanceof u)return t._37=3,t._12=e,void f(t);if("function"==typeof n)return void d(n.bind(e),t)}t._37=1,t._12=e,f(t)}function h(t,e){t._37=2,t._12=e,f(t)}function f(t){for(var e=0;e<t._59.length;e++)c(t,t._59[e]);t._59=null}function l(t,e,n){this.onFulfilled="function"==typeof t?t:null,this.onRejected="function"==typeof e?e:null,this.promise=n}function d(t,e){var n=!1,r=s(t,function(t){n||(n=!0,p(e,t))},function(t){n||(n=!0,h(e,t))});n||r!==b||(n=!0,h(e,y))}var v=t(124),y=null,b={};e.exports=u,u._99=r,u.prototype.then=function(t,e){if(this.constructor!==u)return a(this,t,e);var n=new u(r);return c(this,new l(t,e,n)),n}},{124:124}],153:[function(t,e,n){"use strict";var r=t(152);e.exports=r,r.prototype.done=function(t,e){var n=arguments.length?this.then.apply(this,arguments):this;n.then(null,function(t){setTimeout(function(){throw t},0)})}},{152:152}],154:[function(t,e,n){"use strict";function r(t){var e=new o(o._99);return e._37=1,e._12=t,e}var o=t(152);e.exports=o;var i=r(!0),s=r(!1),u=r(null),a=r(void 0),c=r(0),p=r("");o.resolve=function(t){if(t instanceof o)return t;if(null===t)return u;if(void 0===t)return a;if(t===!0)return i;if(t===!1)return s;if(0===t)return c;if(""===t)return p;if("object"==typeof t||"function"==typeof t)try{var e=t.then;if("function"==typeof e)return new o(e.bind(t))}catch(n){return new o(function(t,e){e(n)})}return r(t)},o.all=function(t){var e=Array.prototype.slice.call(t);return new o(function(t,n){function r(s,u){if(u&&("object"==typeof u||"function"==typeof u)){if(u instanceof o&&u.then===o.prototype.then){for(;3===u._37;)u=u._12;return 1===u._37?r(s,u._12):(2===u._37&&n(u._12),void u.then(function(t){r(s,t)},n))}var a=u.then;if("function"==typeof a){var c=new o(a.bind(u));return void c.then(function(t){r(s,t)},n)}}e[s]=u,0===--i&&t(e)}if(0===e.length)return t([]);for(var i=e.length,s=0;s<e.length;s++)r(s,e[s])})},o.reject=function(t){return new o(function(e,n){n(t)})},o.race=function(t){return new o(function(e,n){t.forEach(function(t){o.resolve(t).then(e,n)})})},o.prototype["catch"]=function(t){return this.then(null,t)}},{152:152}],155:[function(t,e,n){"use strict";var r=t(152);e.exports=r,r.prototype["finally"]=function(t){return this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})})}},{152:152}],156:[function(t,e,n){"use strict";e.exports=t(152),t(153),t(155),t(154),t(157)},{152:152,153:153,154:154,155:155,157:157}],157:[function(t,e,n){"use strict";var r=t(152),o=t(123);e.exports=r,r.denodeify=function(t,e){return e=e||1/0,function(){var n=this,o=Array.prototype.slice.call(arguments,0,e>0?e:0);return new r(function(e,r){o.push(function(t,n){t?r(t):e(n)});var i=t.apply(n,o);!i||"object"!=typeof i&&"function"!=typeof i||"function"!=typeof i.then||e(i)})}},r.nodeify=function(t){return function(){var e=Array.prototype.slice.call(arguments),n="function"==typeof e[e.length-1]?e.pop():null,i=this;try{return t.apply(this,arguments).nodeify(n,i)}catch(s){if(null===n||"undefined"==typeof n)return new r(function(t,e){e(s)});o(function(){n.call(i,s)})}}},r.prototype.nodeify=function(t,e){return"function"!=typeof t?this:void this.then(function(n){o(function(){t.call(e,null,n)})},function(n){o(function(){t.call(e,n)})})}},{123:123,152:152}],158:[function(e,n,r){(function(o){(function(i){var s={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},u=s[typeof window]&&window||this,a=s[typeof r]&&r&&!r.nodeType&&r,c=s[typeof n]&&n&&!n.nodeType&&n,p=(c&&c.exports===a&&a,s[typeof o]&&o);!p||p.global!==p&&p.window!==p||(u=p),"function"==typeof t&&t.amd?t(["rx"],function(t,e){return i(u,e,t)}):"object"==typeof n&&n&&n.exports===a?n.exports=i(u,n.exports,e(159)):u.Rx=i(u,{},u.Rx)}).call(this,function(t,e,n,r){function o(){try{return l.apply(this,arguments)}catch(t){return M.e=t,M}}function i(t){if(!E(t))throw new TypeError("fn must be a function");return l=t,o}function s(t,e,n){return new b(function(r){var o=!1,i=null,s=[];return t.subscribe(function(t){var u,a;try{a=e(t)}catch(c){return void r.onError(c)}if(u=0,o)try{u=n(a,i)}catch(p){return void r.onError(p)}else o=!0,i=a;u>0&&(i=a,s=[]),u>=0&&s.push(t)},function(t){r.onError(t)},function(){r.onNext(s),r.onCompleted()})},t)}function u(t){if(0===t.length)throw new D;return t[0]}function a(t,e,n,r){if(0>e)throw new R;return new b(function(o){var i=e;return t.subscribe(function(t){0===i--&&(o.onNext(t),o.onCompleted())},function(t){o.onError(t)},function(){n?(o.onNext(r),o.onCompleted()):o.onError(new R)})},t)}function c(t,e,n){return new b(function(r){var o=n,i=!1;return t.subscribe(function(t){i?r.onError(new Error("Sequence contains more than one element")):(o=t,i=!0)},function(t){r.onError(t)},function(){i||e?(r.onNext(o),r.onCompleted()):r.onError(new D)})},t)}function p(t,e,n){return new b(function(r){return t.subscribe(function(t){r.onNext(t),r.onCompleted()},function(t){r.onError(t)},function(){e?(r.onNext(n),r.onCompleted()):r.onError(new D)})},t)}function h(t,e,n){return new b(function(r){var o=n,i=!1;return t.subscribe(function(t){o=t,i=!0},function(t){r.onError(t)},function(){i||e?(r.onNext(o),r.onCompleted()):r.onError(new D)})},t)}function f(t,e,n,o){var i=j(e,n,3);return new b(function(e){var n=0;return t.subscribe(function(r){var s;try{s=i(r,n,t)}catch(u){return void e.onError(u)}s?(e.onNext(o?n:r),e.onCompleted()):n++},function(t){e.onError(t)},function(){e.onNext(o?-1:r),e.onCompleted()})},t)}var l,d=n.Observable,v=d.prototype,y=n.CompositeDisposable,b=n.AnonymousObservable,m=n.Disposable.empty,g=(n.internals.isEqual,n.helpers),w=g.not,x=g.defaultComparer,_=g.identity,S=g.defaultSubComparer,E=g.isFunction,C=g.isPromise,A=g.isArrayLike,N=g.isIterable,k=n.internals.inherits,O=d.fromPromise,P=d.from,j=n.internals.bindCallback,D=n.EmptyError,q=n.ObservableBase,R=n.ArgumentOutOfRangeError,M={e:{}};v.aggregate=function(){var t,e,n=!1,r=this;return 2===arguments.length?(n=!0,e=arguments[0],t=arguments[1]):t=arguments[0],new b(function(o){var i,s,u;return r.subscribe(function(r){!u&&(u=!0);try{i?s=t(s,r):(s=n?t(e,r):r,i=!0)}catch(a){return o.onError(a)}},function(t){o.onError(t)},function(){u&&o.onNext(s),!u&&n&&o.onNext(e),!u&&!n&&o.onError(new D),o.onCompleted()})},r)};var T=function(t){function e(e,n,r,o){this.source=e,this.acc=n,this.hasSeed=r,this.seed=o,t.call(this)}function n(t,e){this.o=t,this.acc=e.acc,this.hasSeed=e.hasSeed,this.seed=e.seed,this.hasAccumulation=!1,this.result=null,this.hasValue=!1,this.isStopped=!1}return k(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this))},n.prototype.onNext=function(t){this.isStopped||(!this.hasValue&&(this.hasValue=!0),this.hasAccumulation?this.result=i(this.acc)(this.result,t):(this.result=this.hasSeed?i(this.acc)(this.seed,t):t,this.hasAccumulation=!0),this.result===M&&this.o.onError(this.result.e))},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.hasValue&&this.o.onNext(this.result),!this.hasValue&&this.hasSeed&&this.o.onNext(this.seed),!this.hasValue&&!this.hasSeed&&this.o.onError(new D),this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(q);return v.reduce=function(t){var e=!1;if(2===arguments.length){e=!0;var n=arguments[1]}return new T(this,t,e,n)},v.some=function(t,e){var n=this;return t?n.filter(t,e).some():new b(function(t){return n.subscribe(function(){t.onNext(!0),t.onCompleted()},function(e){t.onError(e)},function(){t.onNext(!1),t.onCompleted()})},n)},v.any=function(){return this.some.apply(this,arguments)},v.isEmpty=function(){return this.any().map(w)},v.every=function(t,e){return this.filter(function(e){return!t(e)},e).some().map(w)},v.all=function(){return this.every.apply(this,arguments)},v.includes=function(t,e){function n(t,e){return 0===t&&0===e||t===e||isNaN(t)&&isNaN(e)}var r=this;return new b(function(o){var i=0,s=+e||0;return Math.abs(s)===1/0&&(s=0),0>s?(o.onNext(!1),o.onCompleted(),m):r.subscribe(function(e){i++>=s&&n(e,t)&&(o.onNext(!0),o.onCompleted())},function(t){o.onError(t)},function(){o.onNext(!1),o.onCompleted()})},this)},v.contains=function(t,e){v.includes(t,e)},v.count=function(t,e){return t?this.filter(t,e).count():this.reduce(function(t){return t+1},0)},v.indexOf=function(t,e){var n=this;return new b(function(r){var o=0,i=+e||0;return Math.abs(i)===1/0&&(i=0),0>i?(r.onNext(-1),r.onCompleted(),m):n.subscribe(function(e){o>=i&&e===t&&(r.onNext(o),r.onCompleted()),o++},function(t){r.onError(t)},function(){r.onNext(-1),r.onCompleted()})},n)},v.sum=function(t,e){return t&&E(t)?this.map(t,e).sum():this.reduce(function(t,e){return t+e},0)},v.minBy=function(t,e){return e||(e=S),s(this,t,function(t,n){return-1*e(t,n)})},v.min=function(t){return this.minBy(_,t).map(function(t){return u(t)})},v.maxBy=function(t,e){return e||(e=S),s(this,t,e)},v.max=function(t){return this.maxBy(_,t).map(function(t){return u(t)})},v.average=function(t,e){return t&&E(t)?this.map(t,e).average():this.reduce(function(t,e){return{sum:t.sum+e,count:t.count+1}},{sum:0,count:0}).map(function(t){if(0===t.count)throw new D;return t.sum/t.count})},v.sequenceEqual=function(t,e){var n=this;return e||(e=x),new b(function(r){var o=!1,i=!1,s=[],u=[],a=n.subscribe(function(t){var n,o;if(u.length>0){o=u.shift();try{n=e(o,t)}catch(a){return void r.onError(a)}n||(r.onNext(!1),r.onCompleted())}else i?(r.onNext(!1),r.onCompleted()):s.push(t)},function(t){r.onError(t)},function(){o=!0,0===s.length&&(u.length>0?(r.onNext(!1),r.onCompleted()):i&&(r.onNext(!0),r.onCompleted()))});(A(t)||N(t))&&(t=P(t)),C(t)&&(t=O(t));var c=t.subscribe(function(t){var n;if(s.length>0){var i=s.shift();try{n=e(i,t)}catch(a){return void r.onError(a)}n||(r.onNext(!1),r.onCompleted())}else o?(r.onNext(!1),r.onCompleted()):u.push(t)},function(t){r.onError(t)},function(){i=!0,0===u.length&&(s.length>0?(r.onNext(!1),r.onCompleted()):o&&(r.onNext(!0),r.onCompleted()))});return new y(a,c)},n)},v.elementAt=function(t){return a(this,t,!1)},v.elementAtOrDefault=function(t,e){return a(this,t,!0,e)},v.single=function(t,e){return t&&E(t)?this.where(t,e).single():c(this,!1)},v.singleOrDefault=function(t,e,n){return t&&E(t)?this.filter(t,n).singleOrDefault(null,e):c(this,!0,e)},v.first=function(t,e){return t?this.where(t,e).first():p(this,!1)},v.firstOrDefault=function(t,e,n){return t?this.where(t).firstOrDefault(null,e):p(this,!0,e)},v.last=function(t,e){return t?this.where(t,e).last():h(this,!1)},v.lastOrDefault=function(t,e,n){return t?this.where(t,n).lastOrDefault(null,e):h(this,!0,e)},v.find=function(t,e){return f(this,t,e,!1)},v.findIndex=function(t,e){return f(this,t,e,!0)},v.toSet=function(){if("undefined"==typeof t.Set)throw new TypeError;var e=this;return new b(function(n){var r=new t.Set;return e.subscribe(function(t){r.add(t)},function(t){n.onError(t)},function(){n.onNext(r),n.onCompleted()})},e)},v.toMap=function(e,n){if("undefined"==typeof t.Map)throw new TypeError;var r=this;return new b(function(o){var i=new t.Map;return r.subscribe(function(t){var r;try{r=e(t)}catch(s){return void o.onError(s)}var u=t;if(n)try{u=n(t)}catch(s){return void o.onError(s)}i.set(r,u)},function(t){o.onError(t)},function(){o.onNext(i),o.onCompleted()})},r)},n})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{159:159}],159:[function(e,n,r){(function(e,o){(function(i){function u(t){for(var e=[],n=0,r=t.length;r>n;n++)e.push(t[n]);return e}function a(t,e){if(ct&&e.stack&&"object"==typeof t&&null!==t&&t.stack&&-1===t.stack.indexOf(lt)){for(var n=[],r=e;r;r=r.source)r.stack&&n.unshift(r.stack);n.unshift(t.stack);var o=n.join("\n"+lt+"\n");t.stack=c(o)}}function c(t){for(var e=t.split("\n"),n=[],r=0,o=e.length;o>r;r++){var i=e[r];p(i)||h(i)||!i||n.push(i)}return n.join("\n")}function p(t){var e=l(t);if(!e)return!1;var n=e[0],r=e[1];return n===ht&&r>=ft&&$n>=r}function h(t){return-1!==t.indexOf("(module.js:")||-1!==t.indexOf("(node.js:")}function f(){if(ct)try{throw new Error}catch(t){var e=t.stack.split("\n"),n=e[0].indexOf("@")>0?e[1]:e[2],r=l(n);if(!r)return;return ht=r[0],r[1]}}function l(t){var e=/at .+ \((.+):(\d+):(?:\d+)\)$/.exec(t);if(e)return[e[1],Number(e[2])];var n=/at ([^ ]+):(\d+):(?:\d+)$/.exec(t);if(n)return[n[1],Number(n[2])];var r=/.*@(.+):(\d+)$/.exec(t);return r?[r[1],Number(r[2])]:void 0}function d(t){var e=[];if(!Ht(t))return e;Ut.nonEnumArgs&&t.length&&Xt(t)&&(t=Yt.call(t));var n=Ut.enumPrototypes&&"function"==typeof t,r=Ut.enumErrorProps&&(t===Jt||t instanceof Error);for(var o in t)n&&"prototype"==o||r&&("message"==o||"name"==o)||e.push(o);if(Ut.nonEnumShadows&&t!==It){var i=t.constructor,s=-1,u=kt;if(t===(i&&i.prototype))var a=t===Lt?$t:t===Jt?qt:Wt.call(t),c=Ft[a];for(;++s<u;)o=Nt[s],c&&c[o]||!zt.call(t,o)||e.push(o)}return e}function v(t,e,n){for(var r=-1,o=n(t),i=o.length;++r<i;){var s=o[r];if(e(t[s],s,t)===!1)break}return t}function y(t,e){return v(t,e,d)}function b(t){return"function"!=typeof t.toString&&"string"==typeof(t+"")}function m(t,e,n,r){if(t===e)return 0!==t||1/t==1/e;var o=typeof t,i=typeof e;if(t===t&&(null==t||null==e||"function"!=o&&"object"!=o&&"function"!=i&&"object"!=i))return!1;var s=Wt.call(t),u=Wt.call(e);if(s==Ot&&(s=Tt),u==Ot&&(u=Tt),s!=u)return!1;switch(s){case jt:case Dt:return+t==+e;case Mt:return t!=+t?e!=+e:0==t?1/t==1/e:t==+e;case Vt:case $t:return t==String(e)}var a=s==Pt;if(!a){if(s!=Tt||!Ut.nodeClass&&(b(t)||b(e)))return!1;var c=!Ut.argsObject&&Xt(t)?Object:t.constructor,p=!Ut.argsObject&&Xt(e)?Object:e.constructor;if(!(c==p||zt.call(t,"constructor")&&zt.call(e,"constructor")||at(c)&&c instanceof c&&at(p)&&p instanceof p||!("constructor"in t&&"constructor"in e)))return!1}n||(n=[]),r||(r=[]);for(var h=n.length;h--;)if(n[h]==t)return r[h]==e;var f=0,l=!0;if(n.push(t),r.push(e),a){if(h=t.length,f=e.length,l=f==h)for(;f--;){var d=e[f];if(!(l=m(t[f],d,n,r)))break}}else y(e,function(e,o,i){return zt.call(i,o)?(f++,l=zt.call(t,o)&&m(t[o],e,n,r)):void 0}),l&&y(t,function(t,e,n){return zt.call(n,e)?l=--f>-1:void 0});return n.pop(),r.pop(),l}function g(t,e){for(var n=new Array(t),r=0;t>r;r++)n[r]=e();return n}function w(){try{return Qt.apply(this,arguments)}catch(t){return ne.e=t,ne}}function x(t){if(!at(t))throw new TypeError("fn must be a function");return Qt=t,w}function _(t){throw t}function S(t,e){this.id=t,this.value=e}function E(t,e){this.scheduler=t,this.disposable=e,this.isDisposed=!1}function C(t,e){e.isDisposed||(e.isDisposed=!0,e.disposable.dispose())}function A(t){this._s=s}function N(t){this._s=s,this._l=s.length,this._i=0}function k(t){this._a=t}function O(t){this._a=t,this._l=q(t),this._i=0}function P(t){return"number"==typeof t&&X.isFinite(t)}function j(t){var e,n=t[xt];if(!n&&"string"==typeof t)return e=new A(t),e[xt]();if(!n&&t.length!==i)return e=new k(t),e[xt]();if(!n)throw new TypeError("Object is not iterable");return t[xt]()}function D(t){var e=+t;return 0===e?e:isNaN(e)?e:0>e?-1:1}function q(t){var e=+t.length;return isNaN(e)?0:0!==e&&P(e)?(e=D(e)*Math.floor(Math.abs(e)),0>=e?0:e>en?en:e):e}function R(t,e){this.observer=t,this.parent=e}function M(t,e){return me(t)||(t=_e),new rn(e,t)}function T(t,e){this.observer=t,this.parent=e}function V(t,e){this.observer=t,this.parent=e}function $(t,e){return new qn(function(n){var r=new fe,o=new le;return o.setDisposable(r),r.setDisposable(t.subscribe(function(t){n.onNext(t)},function(t){try{var r=e(t)}catch(i){return n.onError(i)}ut(r)&&(r=Xe(r));var s=new fe;o.setDisposable(s),s.setDisposable(r.subscribe(n))},function(t){n.onCompleted(t)})),o},t)}function W(){return!1}function z(t,e){var n=this;return new qn(function(r){var o=0,i=t.length;return n.subscribe(function(n){if(i>o){var s=t[o++],u=x(e)(n,s);if(u===ne)return r.onError(u.e);r.onNext(u)}else r.onCompleted()},function(t){r.onError(t)},function(){r.onCompleted()})},n)}function W(){return!1}function G(){return[]}function W(){return!1}function J(){return[]}function I(t,e){this.observer=t,this.accumulator=e.accumulator,this.hasSeed=e.hasSeed,this.seed=e.seed,this.hasAccumulation=!1,this.accumulation=null,this.hasValue=!1,this.isStopped=!1}function L(t,e,n){var r=At(e,n,3);return t.map(function(e,n){var o=r(e,n,t);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o}).concatAll()}function B(t,e,n){for(var r=0,o=t.length;o>r;r++)if(n(t[r],e))return r;return-1}function F(t){this.comparer=t,this.set=[]}function U(t,e,n){var r=At(e,n,3);return t.map(function(e,n){var o=r(e,n,t);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o}).mergeAll()}var H={"boolean":!1,"function":!0,object:!0,number:!1,string:!1,undefined:!1},X=H[typeof window]&&window||this,Q=H[typeof r]&&r&&!r.nodeType&&r,K=H[typeof n]&&n&&!n.nodeType&&n,Y=K&&K.exports===Q&&Q,Z=H[typeof o]&&o;!Z||Z.global!==Z&&Z.window!==Z||(X=Z);var tt={internals:{},config:{Promise:X.Promise},helpers:{}},et=tt.helpers.noop=function(){},nt=(tt.helpers.notDefined=function(t){return"undefined"==typeof t},tt.helpers.identity=function(t){return t}),rt=(tt.helpers.pluck=function(t){return function(e){return e[t]}},tt.helpers.just=function(t){return function(){return t}},tt.helpers.defaultNow=Date.now),ot=tt.helpers.defaultComparer=function(t,e){return Kt(t,e)},it=tt.helpers.defaultSubComparer=function(t,e){return t>e?1:e>t?-1:0},st=(tt.helpers.defaultKeySerializer=function(t){return t.toString()},tt.helpers.defaultError=function(t){throw t}),ut=tt.helpers.isPromise=function(t){return!!t&&"function"!=typeof t.subscribe&&"function"==typeof t.then},at=(tt.helpers.asArray=function(){return Array.prototype.slice.call(arguments)},tt.helpers.not=function(t){return!t},tt.helpers.isFunction=function(){var t=function(t){return"function"==typeof t||!1};return t(/x/)&&(t=function(t){return"function"==typeof t&&"[object Function]"==Wt.call(t)}),t}());tt.config.longStackSupport=!1;var ct=!1;try{throw new Error}catch(pt){ct=!!pt.stack}var ht,ft=f(),lt="From previous event:",dt=tt.EmptyError=function(){this.message="Sequence contains no elements.",Error.call(this)};dt.prototype=Error.prototype;var vt=tt.ObjectDisposedError=function(){this.message="Object has been disposed",Error.call(this)};vt.prototype=Error.prototype;var yt=tt.ArgumentOutOfRangeError=function(){this.message="Argument out of range",Error.call(this)};yt.prototype=Error.prototype;var bt=tt.NotSupportedError=function(t){this.message=t||"This operation is not supported",Error.call(this)};bt.prototype=Error.prototype;var mt=tt.NotImplementedError=function(t){this.message=t||"This operation is not implemented",Error.call(this)};mt.prototype=Error.prototype;var gt=tt.helpers.notImplemented=function(){throw new mt},wt=tt.helpers.notSupported=function(){throw new bt},xt="function"==typeof Symbol&&Symbol.iterator||"_es6shim_iterator_";X.Set&&"function"==typeof(new X.Set)["@@iterator"]&&(xt="@@iterator");var _t=tt.doneEnumerator={done:!0,value:i},St=tt.helpers.isIterable=function(t){return t[xt]!==i},Et=tt.helpers.isArrayLike=function(t){return t&&t.length!==i};tt.helpers.iterator=xt;var Ct,At=tt.internals.bindCallback=function(t,e,n){if("undefined"==typeof e)return t;switch(n){case 0:return function(){return t.call(e)};case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}},Nt=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],kt=Nt.length,Ot="[object Arguments]",Pt="[object Array]",jt="[object Boolean]",Dt="[object Date]",qt="[object Error]",Rt="[object Function]",Mt="[object Number]",Tt="[object Object]",Vt="[object RegExp]",$t="[object String]",Wt=Object.prototype.toString,zt=Object.prototype.hasOwnProperty,Gt=Wt.call(arguments)==Ot,Jt=Error.prototype,It=Object.prototype,Lt=String.prototype,Bt=It.propertyIsEnumerable;try{Ct=!(Wt.call(document)==Tt&&!({toString:0}+""))}catch(pt){Ct=!0}var Ft={};Ft[Pt]=Ft[Dt]=Ft[Mt]={constructor:!0,toLocaleString:!0,toString:!0,valueOf:!0},Ft[jt]=Ft[$t]={constructor:!0,toString:!0,valueOf:!0},Ft[qt]=Ft[Rt]=Ft[Vt]={constructor:!0,toString:!0},Ft[Tt]={constructor:!0};var Ut={};!function(){var t=function(){this.x=1},e=[];t.prototype={valueOf:1,y:1};for(var n in new t)e.push(n);for(n in arguments);Ut.enumErrorProps=Bt.call(Jt,"message")||Bt.call(Jt,"name"),Ut.enumPrototypes=Bt.call(t,"prototype"),Ut.nonEnumArgs=0!=n,Ut.nonEnumShadows=!/valueOf/.test(e)}(1);var Ht=tt.internals.isObject=function(t){var e=typeof t;return t&&("function"==e||"object"==e)||!1},Xt=function(t){return t&&"object"==typeof t?Wt.call(t)==Ot:!1};Gt||(Xt=function(t){return t&&"object"==typeof t?zt.call(t,"callee"):!1});var Qt,Kt=tt.internals.isEqual=function(t,e){return m(t,e,[],[])},Yt=({}.hasOwnProperty,Array.prototype.slice),Zt=this.inherits=tt.internals.inherits=function(t,e){function n(){this.constructor=t}n.prototype=e.prototype,t.prototype=new n},te=tt.internals.addProperties=function(t){for(var e=[],n=1,r=arguments.length;r>n;n++)e.push(arguments[n]);for(var o=0,i=e.length;i>o;o++){var s=e[o];for(var u in s)t[u]=s[u]}},ee=tt.internals.addRef=function(t,e){return new qn(function(n){return new ie(e.getDisposable(),t.subscribe(n))})},ne={e:{}};S.prototype.compareTo=function(t){var e=this.value.compareTo(t.value);return 0===e&&(e=this.id-t.id),e};var re=tt.internals.PriorityQueue=function(t){this.items=new Array(t),this.length=0},oe=re.prototype;oe.isHigherPriority=function(t,e){return this.items[t].compareTo(this.items[e])<0},oe.percolate=function(t){if(!(t>=this.length||0>t)){var e=t-1>>1;if(!(0>e||e===t)&&this.isHigherPriority(t,e)){var n=this.items[t];this.items[t]=this.items[e],this.items[e]=n,this.percolate(e)}}},oe.heapify=function(t){if(+t||(t=0),!(t>=this.length||0>t)){var e=2*t+1,n=2*t+2,r=t;if(e<this.length&&this.isHigherPriority(e,r)&&(r=e),n<this.length&&this.isHigherPriority(n,r)&&(r=n),r!==t){var o=this.items[t];this.items[t]=this.items[r],this.items[r]=o,this.heapify(r)}}},oe.peek=function(){return this.items[0].value},oe.removeAt=function(t){this.items[t]=this.items[--this.length],this.items[this.length]=i,this.heapify()},oe.dequeue=function(){var t=this.peek();return this.removeAt(0),t},oe.enqueue=function(t){var e=this.length++;this.items[e]=new S(re.count++,t),this.percolate(e)},oe.remove=function(t){for(var e=0;e<this.length;e++)if(this.items[e].value===t)return this.removeAt(e),!0;return!1},re.count=0;var ie=tt.CompositeDisposable=function(){var t,e,n=[];if(Array.isArray(arguments[0]))n=arguments[0],e=n.length;else for(e=arguments.length,n=new Array(e),t=0;e>t;t++)n[t]=arguments[t];for(t=0;e>t;t++)if(!pe(n[t]))throw new TypeError("Not a disposable");this.disposables=n,this.isDisposed=!1,this.length=n.length},se=ie.prototype;se.add=function(t){this.isDisposed?t.dispose():(this.disposables.push(t),this.length++)},se.remove=function(t){var e=!1;if(!this.isDisposed){var n=this.disposables.indexOf(t);-1!==n&&(e=!0,this.disposables.splice(n,1),this.length--,t.dispose())}return e},se.dispose=function(){
-if(!this.isDisposed){this.isDisposed=!0;for(var t=this.disposables.length,e=new Array(t),n=0;t>n;n++)e[n]=this.disposables[n];for(this.disposables=[],this.length=0,n=0;t>n;n++)e[n].dispose()}};var ue=tt.Disposable=function(t){this.isDisposed=!1,this.action=t||et};ue.prototype.dispose=function(){this.isDisposed||(this.action(),this.isDisposed=!0)};var ae=ue.create=function(t){return new ue(t)},ce=ue.empty={dispose:et},pe=ue.isDisposable=function(t){return t&&at(t.dispose)},he=ue.checkDisposed=function(t){if(t.isDisposed)throw new vt},fe=tt.SingleAssignmentDisposable=function(){this.isDisposed=!1,this.current=null};fe.prototype.getDisposable=function(){return this.current},fe.prototype.setDisposable=function(t){if(this.current)throw new Error("Disposable has already been assigned");var e=this.isDisposed;!e&&(this.current=t),e&&t&&t.dispose()},fe.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null}t&&t.dispose()};var le=tt.SerialDisposable=function(){this.isDisposed=!1,this.current=null};le.prototype.getDisposable=function(){return this.current},le.prototype.setDisposable=function(t){var e=this.isDisposed;if(!e){var n=this.current;this.current=t}n&&n.dispose(),e&&t&&t.dispose()},le.prototype.dispose=function(){if(!this.isDisposed){this.isDisposed=!0;var t=this.current;this.current=null}t&&t.dispose()};var de=tt.RefCountDisposable=function(){function t(t){this.disposable=t,this.disposable.count++,this.isInnerDisposed=!1}function e(t){this.underlyingDisposable=t,this.isDisposed=!1,this.isPrimaryDisposed=!1,this.count=0}return t.prototype.dispose=function(){this.disposable.isDisposed||this.isInnerDisposed||(this.isInnerDisposed=!0,this.disposable.count--,0===this.disposable.count&&this.disposable.isPrimaryDisposed&&(this.disposable.isDisposed=!0,this.disposable.underlyingDisposable.dispose()))},e.prototype.dispose=function(){this.isDisposed||this.isPrimaryDisposed||(this.isPrimaryDisposed=!0,0===this.count&&(this.isDisposed=!0,this.underlyingDisposable.dispose()))},e.prototype.getDisposable=function(){return this.isDisposed?ce:new t(this)},e}();E.prototype.dispose=function(){this.scheduler.scheduleWithState(this,C)};var ve=tt.internals.ScheduledItem=function(t,e,n,r,o){this.scheduler=t,this.state=e,this.action=n,this.dueTime=r,this.comparer=o||it,this.disposable=new fe};ve.prototype.invoke=function(){this.disposable.setDisposable(this.invokeCore())},ve.prototype.compareTo=function(t){return this.comparer(this.dueTime,t.dueTime)},ve.prototype.isCancelled=function(){return this.disposable.isDisposed},ve.prototype.invokeCore=function(){return this.action(this.scheduler,this.state)};var ye=tt.Scheduler=function(){function t(t,e,n,r){this.now=t,this._schedule=e,this._scheduleRelative=n,this._scheduleAbsolute=r}function e(t,e){return e(),ce}t.isScheduler=function(e){return e instanceof t};var n=t.prototype;return n.schedule=function(t){return this._schedule(t,e)},n.scheduleWithState=function(t,e){return this._schedule(t,e)},n.scheduleWithRelative=function(t,n){return this._scheduleRelative(n,t,e)},n.scheduleWithRelativeAndState=function(t,e,n){return this._scheduleRelative(t,e,n)},n.scheduleWithAbsolute=function(t,n){return this._scheduleAbsolute(n,t,e)},n.scheduleWithAbsoluteAndState=function(t,e,n){return this._scheduleAbsolute(t,e,n)},t.now=rt,t.normalize=function(t){return 0>t&&(t=0),t},t}(),be=ye.normalize,me=ye.isScheduler;!function(t){function e(t,e){function n(e){o(e,function(e){var r=!1,o=!1,s=t.scheduleWithState(e,function(t,e){return r?i.remove(s):o=!0,n(e),ce});o||(i.add(s),r=!0)})}var r=e[0],o=e[1],i=new ie;return n(r),i}function n(t,e,n){function r(e){i(e,function(e,o){var i=!1,u=!1,a=t[n](e,o,function(t,e){return i?s.remove(a):u=!0,r(e),ce});u||(s.add(a),i=!0)})}var o=e[0],i=e[1],s=new ie;return r(o),s}function r(t,e){t(function(n){e(t,n)})}t.scheduleRecursive=function(t){return this.scheduleRecursiveWithState(t,r)},t.scheduleRecursiveWithState=function(t,n){return this.scheduleWithState([t,n],e)},t.scheduleRecursiveWithRelative=function(t,e){return this.scheduleRecursiveWithRelativeAndState(e,t,r)},t.scheduleRecursiveWithRelativeAndState=function(t,e,r){return this._scheduleRelative([t,r],e,function(t,e){return n(t,e,"scheduleWithRelativeAndState")})},t.scheduleRecursiveWithAbsolute=function(t,e){return this.scheduleRecursiveWithAbsoluteAndState(e,t,r)},t.scheduleRecursiveWithAbsoluteAndState=function(t,e,r){return this._scheduleAbsolute([t,r],e,function(t,e){return n(t,e,"scheduleWithAbsoluteAndState")})}}(ye.prototype),function(t){ye.prototype.schedulePeriodic=function(t,e){return this.schedulePeriodicWithState(null,t,e)},ye.prototype.schedulePeriodicWithState=function(t,e,n){if("undefined"==typeof X.setInterval)throw new bt;e=be(e);var r=t,o=X.setInterval(function(){r=n(r)},e);return ae(function(){X.clearInterval(o)})}}(ye.prototype),function(t){t.catchError=t["catch"]=function(t){return new Ae(this,t)}}(ye.prototype);var ge,we,xe=(tt.internals.SchedulePeriodicRecursive=function(){function t(t,e){e(0,this._period);try{this._state=this._action(this._state)}catch(n){throw this._cancel.dispose(),n}}function e(t,e,n,r){this._scheduler=t,this._state=e,this._period=n,this._action=r}return e.prototype.start=function(){var e=new fe;return this._cancel=e,e.setDisposable(this._scheduler.scheduleRecursiveWithRelativeAndState(0,this._period,t.bind(this))),e},e}(),ye.immediate=function(){function t(t,e){return e(this,t)}return new ye(rt,t,wt,wt)}()),_e=ye.currentThread=function(){function t(){for(;n.length>0;){var t=n.dequeue();!t.isCancelled()&&t.invoke()}}function e(e,r){var o=new ve(this,e,r,this.now());if(n)n.enqueue(o);else{n=new re(4),n.enqueue(o);var i=x(t)();if(n=null,i===ne)return _(i.e)}return o.disposable}var n,r=new ye(rt,e,wt,wt);return r.scheduleRequired=function(){return!n},r}(),Se=function(){var t,e=et;if(X.setTimeout)t=X.setTimeout,e=X.clearTimeout;else{if(!X.WScript)throw new bt;t=function(t,e){X.WScript.Sleep(e),t()}}return{setTimeout:t,clearTimeout:e}}(),Ee=Se.setTimeout,Ce=Se.clearTimeout;!function(){function t(e){if(s)Ee(function(){t(e)},0);else{var n=i[e];if(n){s=!0;var r=x(n)();if(we(e),s=!1,r===ne)return _(r.e)}}}function n(){if(!X.postMessage||X.importScripts)return!1;var t=!1,e=X.onmessage;return X.onmessage=function(){t=!0},X.postMessage("","*"),X.onmessage=e,t}function r(e){"string"==typeof e.data&&e.data.substring(0,c.length)===c&&t(e.data.substring(c.length))}var o=1,i={},s=!1;we=function(t){delete i[t]};var u=RegExp("^"+String(Wt).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),a="function"==typeof(a=Z&&Y&&Z.setImmediate)&&!u.test(a)&&a;if(at(a))ge=function(e){var n=o++;return i[n]=e,a(function(){t(n)}),n};else if("undefined"!=typeof e&&"[object process]"==={}.toString.call(e))ge=function(n){var r=o++;return i[r]=n,e.nextTick(function(){t(r)}),r};else if(n()){var c="ms.rx.schedule"+Math.random();X.addEventListener?X.addEventListener("message",r,!1):X.attachEvent?X.attachEvent("onmessage",r):X.onmessage=r,ge=function(t){var e=o++;return i[e]=t,X.postMessage(c+currentId,"*"),e}}else if(X.MessageChannel){var p=new X.MessageChannel;p.port1.onmessage=function(e){t(e.data)},ge=function(t){var e=o++;return i[e]=t,p.port2.postMessage(e),e}}else ge="document"in X&&"onreadystatechange"in X.document.createElement("script")?function(e){var n=X.document.createElement("script"),r=o++;return i[r]=e,n.onreadystatechange=function(){t(r),n.onreadystatechange=null,n.parentNode.removeChild(n),n=null},X.document.documentElement.appendChild(n),r}:function(e){var n=o++;return i[n]=e,Ee(function(){t(n)},0),n}}();var Ae=(ye.timeout=ye["default"]=function(){function t(t,e){var n=this,r=new fe,o=ge(function(){!r.isDisposed&&r.setDisposable(e(n,t))});return new ie(r,ae(function(){we(o)}))}function e(t,e,n){var r=this,o=ye.normalize(e),i=new fe;if(0===o)return r.scheduleWithState(t,n);var s=Ee(function(){!i.isDisposed&&i.setDisposable(n(r,t))},o);return new ie(i,ae(function(){Ce(s)}))}function n(t,e,n){return this.scheduleWithRelativeAndState(t,e-this.now(),n)}return new ye(rt,t,e,n)}(),function(t){function e(t,e){return this._scheduler.scheduleWithState(t,this._wrap(e))}function n(t,e,n){return this._scheduler.scheduleWithRelativeAndState(t,e,this._wrap(n))}function r(t,e,n){return this._scheduler.scheduleWithAbsoluteAndState(t,e,this._wrap(n))}function o(o,i){this._scheduler=o,this._handler=i,this._recursiveOriginal=null,this._recursiveWrapper=null,t.call(this,this._scheduler.now.bind(this._scheduler),e,n,r)}return Zt(o,t),o.prototype._clone=function(t){return new o(t,this._handler)},o.prototype._wrap=function(t){var e=this;return function(n,r){try{return t(e._getRecursiveWrapper(n),r)}catch(o){if(!e._handler(o))throw o;return ce}}},o.prototype._getRecursiveWrapper=function(t){if(this._recursiveOriginal!==t){this._recursiveOriginal=t;var e=this._clone(t);e._recursiveOriginal=t,e._recursiveWrapper=e,this._recursiveWrapper=e}return this._recursiveWrapper},o.prototype.schedulePeriodicWithState=function(t,e,n){var r=this,o=!1,i=new fe;return i.setDisposable(this._scheduler.schedulePeriodicWithState(t,e,function(t){if(o)return null;try{return n(t)}catch(e){if(o=!0,!r._handler(e))throw e;return i.dispose(),null}})),i},o}(ye)),Ne=tt.Notification=function(){function t(t,e,n,r,o,i){this.kind=t,this.value=e,this.exception=n,this._accept=r,this._acceptObservable=o,this.toString=i}return t.prototype.accept=function(t,e,n){return t&&"object"==typeof t?this._acceptObservable(t):this._accept(t,e,n)},t.prototype.toObservable=function(t){var e=this;return me(t)||(t=xe),new qn(function(n){return t.scheduleWithState(e,function(t,e){e._acceptObservable(n),"N"===e.kind&&n.onCompleted()})})},t}(),ke=Ne.createOnNext=function(){function t(t){return t(this.value)}function e(t){return t.onNext(this.value)}function n(){return"OnNext("+this.value+")"}return function(r){return new Ne("N",r,null,t,e,n)}}(),Oe=Ne.createOnError=function(){function t(t,e){return e(this.exception)}function e(t){return t.onError(this.exception)}function n(){return"OnError("+this.exception+")"}return function(r){return new Ne("E",null,r,t,e,n)}}(),Pe=Ne.createOnCompleted=function(){function t(t,e,n){return n()}function e(t){return t.onCompleted()}function n(){return"OnCompleted()"}return function(){return new Ne("C",null,null,t,e,n)}}(),je=tt.Observer=function(){};je.prototype.toNotifier=function(){var t=this;return function(e){return e.accept(t)}},je.prototype.asObserver=function(){return new Me(this.onNext.bind(this),this.onError.bind(this),this.onCompleted.bind(this))},je.prototype.checked=function(){return new Te(this)};var De=je.create=function(t,e,n){return t||(t=et),e||(e=st),n||(n=et),new Me(t,e,n)};je.fromNotifier=function(t,e){return new Me(function(n){return t.call(e,ke(n))},function(n){return t.call(e,Oe(n))},function(){return t.call(e,Pe())})},je.prototype.notifyOn=function(t){return new $e(t,this)},je.prototype.makeSafe=function(t){return new AnonymousSafeObserver(this._onNext,this._onError,this._onCompleted,t)};var qe,Re=tt.internals.AbstractObserver=function(t){function e(){this.isStopped=!1,t.call(this)}return Zt(e,t),e.prototype.next=gt,e.prototype.error=gt,e.prototype.completed=gt,e.prototype.onNext=function(t){this.isStopped||this.next(t)},e.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.error(t))},e.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.completed())},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.error(t),!0)},e}(je),Me=tt.AnonymousObserver=function(t){function e(e,n,r){t.call(this),this._onNext=e,this._onError=n,this._onCompleted=r}return Zt(e,t),e.prototype.next=function(t){this._onNext(t)},e.prototype.error=function(t){this._onError(t)},e.prototype.completed=function(){this._onCompleted()},e}(Re),Te=function(t){function e(e){t.call(this),this._observer=e,this._state=0}Zt(e,t);var n=e.prototype;return n.onNext=function(t){this.checkAccess();var e=x(this._observer.onNext).call(this._observer,t);this._state=0,e===ne&&_(e.e)},n.onError=function(t){this.checkAccess();var e=x(this._observer.onError).call(this._observer,t);this._state=2,e===ne&&_(e.e)},n.onCompleted=function(){this.checkAccess();var t=x(this._observer.onCompleted).call(this._observer);this._state=2,t===ne&&_(t.e)},n.checkAccess=function(){if(1===this._state)throw new Error("Re-entrancy detected");if(2===this._state)throw new Error("Observer completed");0===this._state&&(this._state=1)},e}(je),Ve=tt.internals.ScheduledObserver=function(t){function e(e,n){t.call(this),this.scheduler=e,this.observer=n,this.isAcquired=!1,this.hasFaulted=!1,this.queue=[],this.disposable=new le}return Zt(e,t),e.prototype.next=function(t){var e=this;this.queue.push(function(){e.observer.onNext(t)})},e.prototype.error=function(t){var e=this;this.queue.push(function(){e.observer.onError(t)})},e.prototype.completed=function(){var t=this;this.queue.push(function(){t.observer.onCompleted()})},e.prototype.ensureActive=function(){var t=!1,e=this;!this.hasFaulted&&this.queue.length>0&&(t=!this.isAcquired,this.isAcquired=!0),t&&this.disposable.setDisposable(this.scheduler.scheduleRecursive(function(t){var n;if(!(e.queue.length>0))return void(e.isAcquired=!1);n=e.queue.shift();try{n()}catch(r){throw e.queue=[],e.hasFaulted=!0,r}t()}))},e.prototype.dispose=function(){t.prototype.dispose.call(this),this.disposable.dispose()},e}(Re),$e=function(t){function e(e,n,r){t.call(this,e,n),this._cancel=r}return Zt(e,t),e.prototype.next=function(e){t.prototype.next.call(this,e),this.ensureActive()},e.prototype.error=function(e){t.prototype.error.call(this,e),this.ensureActive()},e.prototype.completed=function(){t.prototype.completed.call(this),this.ensureActive()},e.prototype.dispose=function(){t.prototype.dispose.call(this),this._cancel&&this._cancel.dispose(),this._cancel=null},e}(Ve),We=tt.Observable=function(){function t(t){if(tt.config.longStackSupport&&ct){try{throw new Error}catch(e){this.stack=e.stack.substring(e.stack.indexOf("\n")+1)}var n=this;this._subscribe=function(e){var r=e.onError.bind(e);return e.onError=function(t){a(t,n),r(t)},t.call(n,e)}}else this._subscribe=t}return qe=t.prototype,qe.subscribe=qe.forEach=function(t,e,n){return this._subscribe("object"==typeof t?t:De(t,e,n))},qe.subscribeOnNext=function(t,e){return this._subscribe(De("undefined"!=typeof e?function(n){t.call(e,n)}:t))},qe.subscribeOnError=function(t,e){return this._subscribe(De(null,"undefined"!=typeof e?function(n){t.call(e,n)}:t))},qe.subscribeOnCompleted=function(t,e){return this._subscribe(De(null,null,"undefined"!=typeof e?function(){t.call(e)}:t))},t}(),ze=tt.ObservableBase=function(t){function e(t){return t&&at(t.dispose)?t:at(t)?ae(t):ce}function n(t,n){var r=n[0],o=n[1],i=x(o.subscribeCore).call(o,r);return i!==ne||r.fail(ne.e)?void r.setDisposable(e(i)):_(ne.e)}function r(t){var e=new Rn(t),r=[e,this];return _e.scheduleRequired()?_e.scheduleWithState(r,n):n(null,r),e}function o(){t.call(this,r)}return Zt(o,t),o.prototype.subscribeCore=gt,o}(We),Ge=tt.internals.Enumerable=function(){},Je=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e,n){this.o=t,this.s=e,this.e=n,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){var e,r=new le,o=xe.scheduleRecursiveWithState(this.sources[xt](),function(o,i){if(!e){var s=x(o.next).call(o);if(s===ne)return t.onError(s.e);if(s.done)return t.onCompleted();var u=s.value;ut(u)&&(u=Xe(u));var a=new fe;r.setDisposable(a),a.setDisposable(u.subscribe(new n(t,i,o)))}});return new ie(r,o,ae(function(){e=!0}))},n.prototype.onNext=function(t){this.isStopped||this.o.onNext(t)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.s(this.e))},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);Ge.prototype.concat=function(){return new Je(this)};var Ie=function(t){function e(e){this.sources=e,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e,n=this.sources[xt](),r=new le,o=xe.scheduleRecursiveWithState(null,function(o,i){if(!e){var s=x(n.next).call(n);if(s===ne)return t.onError(s.e);if(s.done)return null!==o?t.onError(o):t.onCompleted();var u=s.value;ut(u)&&(u=Xe(u));var a=new fe;r.setDisposable(a),a.setDisposable(u.subscribe(function(e){t.onNext(e)},i,function(){t.onCompleted()}))}});return new ie(r,o,ae(function(){e=!0}))},e}(ze);Ge.prototype.catchError=function(){return new Ie(this)},Ge.prototype.catchErrorWhen=function(t){var e=this;return new qn(function(n){var r,o,i=new Tn,s=new Tn,u=t(i),a=u.subscribe(s),c=e[xt](),p=new le,h=xe.scheduleRecursive(function(t){if(!r){var e=x(c.next).call(c);if(e===ne)return n.onError(e.e);if(e.done)return void(o?n.onError(o):n.onCompleted());var u=e.value;ut(u)&&(u=Xe(u));var a=new fe,h=new fe;p.setDisposable(new ie(h,a)),a.setDisposable(u.subscribe(function(t){n.onNext(t)},function(e){h.setDisposable(s.subscribe(t,function(t){n.onError(t)},function(){n.onCompleted()})),i.onNext(e)},function(){n.onCompleted()}))}});return new ie(a,p,h,ae(function(){r=!0}))})};var Le=function(t){function e(t,e){this.v=t,this.c=null==e?-1:e}function n(t){this.v=t.v,this.l=t.c}return Zt(e,t),e.prototype[xt]=function(){return new n(this)},n.prototype.next=function(){return 0===this.l?_t:(this.l>0&&this.l--,{done:!1,value:this.v})},e}(Ge),Be=Ge.repeat=function(t,e){return new Le(t,e)},Fe=function(t){function e(t,e,n){this.s=t,this.fn=e?At(e,n,3):null}function n(t){this.i=-1,this.s=t.s,this.l=this.s.length,this.fn=t.fn}return Zt(e,t),e.prototype[xt]=function(){return new n(this)},n.prototype.next=function(){return++this.i<this.l?{done:!1,value:this.fn?this.fn(this.s[this.i],this.i,this.s):this.s[this.i]}:_t},e}(Ge),Ue=Ge.of=function(t,e,n){return new Fe(t,e,n)};qe.observeOn=function(t){var e=this;return new qn(function(n){return e.subscribe(new $e(t,n))},e)},qe.subscribeOn=function(t){var e=this;return new qn(function(n){var r=new fe,o=new le;return o.setDisposable(r),r.setDisposable(t.schedule(function(){o.setDisposable(new E(t,e.subscribe(n)))})),o},e)};var He=function(t){function e(e){this.p=e,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.p.then(function(e){t.onNext(e),t.onCompleted()},function(e){t.onError(e)}),ce},e}(ze),Xe=We.fromPromise=function(t){return new He(t)};qe.toPromise=function(t){if(t||(t=tt.config.Promise),!t)throw new bt("Promise type not provided nor in Rx.config.Promise");var e=this;return new t(function(t,n){var r,o=!1;e.subscribe(function(t){r=t,o=!0},n,function(){o&&t(r)})})};var Qe=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.a=[],this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=function(t){this.isStopped||this.a.push(t)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onNext(this.a),this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.toArray=function(){return new Qe(this)},We.create=We.createWithDisposable=function(t,e){return new qn(t,e)};var Ke=(We.defer=function(t){return new qn(function(e){var n;try{n=t()}catch(r){return dn(r).subscribe(e)}return ut(n)&&(n=Xe(n)),n.subscribe(e)})},function(t){function e(e){this.scheduler=e,t.call(this)}function n(t,e){this.observer=t,this.parent=e}function r(t,e){e.onCompleted()}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.parent.scheduler.scheduleWithState(this.observer,r)},e}(ze)),Ye=We.empty=function(t){return me(t)||(t=xe),new Ke(t)},Ze=function(t){function e(e,n,r){this.iterable=e,this.mapper=n,this.scheduler=r,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new tn(t,this);return e.run()},e}(ze),tn=function(){function t(t,e){this.observer=t,this.parent=e}return t.prototype.run=function(){function t(t,e){try{var i=n.next()}catch(s){return r.onError(s)}if(i.done)return r.onCompleted();var u=i.value;if(o)try{u=o(u,t)}catch(s){return r.onError(s)}r.onNext(u),e(t+1)}var e=Object(this.parent.iterable),n=j(e),r=this.observer,o=this.parent.mapper;return this.parent.scheduler.scheduleRecursiveWithState(0,t)},t}(),en=Math.pow(2,53)-1;A.prototype[xt]=function(){return new N(this._s)},N.prototype[xt]=function(){return this},N.prototype.next=function(){return this._i<this._l?{done:!1,value:this._s.charAt(this._i++)}:_t},k.prototype[xt]=function(){return new O(this._a)},O.prototype[xt]=function(){return this},O.prototype.next=function(){return this._i<this._l?{done:!1,value:this._a[this._i++]}:_t};var nn=We.from=function(t,e,n,r){if(null==t)throw new Error("iterable cannot be null.");if(e&&!at(e))throw new Error("mapFn when provided must be a function");if(e)var o=At(e,n,2);return me(r)||(r=_e),new Ze(t,o,r)},rn=function(t){function e(e,n){this.args=e,this.scheduler=n,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new R(t,this);return e.run()},e}(ze);R.prototype.run=function(){function t(t,o){r>t?(e.onNext(n[t]),o(t+1)):e.onCompleted()}var e=this.observer,n=this.parent.args,r=n.length;return this.parent.scheduler.scheduleRecursiveWithState(0,t)};var on=We.fromArray=function(t,e){return me(e)||(e=_e),new rn(t,e)};We.generate=function(t,e,n,r,o){return me(o)||(o=_e),new qn(function(i){var s=!0;return o.scheduleRecursiveWithState(t,function(t,o){var u,a;try{s?s=!1:t=n(t),u=e(t),u&&(a=r(t))}catch(c){return i.onError(c)}u?(i.onNext(a),o(t)):i.onCompleted()})})};var sn=function(t){function e(){t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return ce},e}(ze),un=We.never=function(){return new sn};We.of=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return new rn(e,_e)},We.ofWithScheduler=function(t){for(var e=arguments.length,n=new Array(e-1),r=1;e>r;r++)n[r-1]=arguments[r];return new rn(n,t)};var an=function(t){function e(e,n){this.obj=e,this.keys=Object.keys(e),this.scheduler=n,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new T(t,this);return e.run()},e}(ze);T.prototype.run=function(){function t(t,i){if(o>t){var s=r[t];e.onNext([s,n[s]]),i(t+1)}else e.onCompleted()}var e=this.observer,n=this.parent.obj,r=this.parent.keys,o=r.length;return this.parent.scheduler.scheduleRecursiveWithState(0,t)},We.pairs=function(t,e){return e||(e=_e),new an(t,e)};var cn=function(t){function e(e,n,r){this.start=e,this.rangeCount=n,this.scheduler=r,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new pn(t,this);return e.run()},e}(ze),pn=function(){function t(t,e){this.observer=t,this.parent=e}return t.prototype.run=function(){function t(t,o){n>t?(r.onNext(e+t),o(t+1)):r.onCompleted()}var e=this.parent.start,n=this.parent.rangeCount,r=this.observer;return this.parent.scheduler.scheduleRecursiveWithState(0,t)},t}();We.range=function(t,e,n){return me(n)||(n=_e),new cn(t,e,n)};var hn=function(t){function e(e,n,r){this.value=e,this.repeatCount=null==n?-1:n,this.scheduler=r,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new V(t,this);return e.run()},e}(ze);V.prototype.run=function(){function t(t,r){return(-1===t||t>0)&&(e.onNext(n),t>0&&t--),0===t?e.onCompleted():void r(t)}var e=this.observer,n=this.parent.value;return this.parent.scheduler.scheduleRecursiveWithState(this.parent.repeatCount,t)},We.repeat=function(t,e,n){return me(n)||(n=_e),new hn(t,e,n)};var fn=function(t){function e(e,n){this.value=e,this.scheduler=n,t.call(this)}function n(t,e){this.observer=t,this.parent=e}function r(t,e){var n=e[0],r=e[1];r.onNext(n),r.onCompleted()}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.parent.scheduler.scheduleWithState([this.parent.value,this.observer],r)},e}(ze),ln=(We["return"]=We.just=We.returnValue=function(t,e){return me(e)||(e=xe),new fn(t,e)},function(t){function e(e,n){this.error=e,this.scheduler=n,t.call(this)}function n(t,e){this.o=t,this.p=e}function r(t,e){var n=e[0],r=e[1];r.onError(n)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(t,this);return e.run()},n.prototype.run=function(){return this.p.scheduler.scheduleWithState([this.p.error,this.o],r)},e}(ze)),dn=We["throw"]=We.throwError=We.throwException=function(t,e){return me(e)||(e=xe),new ln(t,e)};We.using=function(t,e){return new qn(function(n){var r,o,i=ce;try{r=t(),r&&(i=r),o=e(r)}catch(s){return new ie(dn(s).subscribe(n),i)}return new ie(o.subscribe(n),i)})},qe.amb=function(t){var e=this;return new qn(function(n){function r(){i||(i=s,c.dispose())}function o(){i||(i=u,a.dispose())}var i,s="L",u="R",a=new fe,c=new fe;return ut(t)&&(t=Xe(t)),a.setDisposable(e.subscribe(function(t){r(),i===s&&n.onNext(t)},function(t){r(),i===s&&n.onError(t)},function(){r(),i===s&&n.onCompleted()})),c.setDisposable(t.subscribe(function(t){o(),i===u&&n.onNext(t)},function(t){o(),i===u&&n.onError(t)},function(){o(),i===u&&n.onCompleted()})),new ie(a,c)})},We.amb=function(){function t(t,e){return t.amb(e)}var e=un(),n=[];if(Array.isArray(arguments[0]))n=arguments[0];else for(var r=0,o=arguments.length;o>r;r++)n.push(arguments[r]);for(var r=0,o=n.length;o>r;r++)e=t(e,n[r]);return e},qe["catch"]=qe.catchError=qe.catchException=function(t){return"function"==typeof t?$(this,t):vn([this,t])};var vn=We.catchError=We["catch"]=We.catchException=function(){var t=[];if(Array.isArray(arguments[0]))t=arguments[0];else for(var e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return Ue(t).catchError()};qe.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];return Array.isArray(e[0])?e[0].unshift(this):e.unshift(this),yn.apply(this,e)};var yn=We.combineLatest=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.pop();return Array.isArray(e[0])&&(e=e[0]),new qn(function(t){function n(e){if(u[e]=!0,a||(a=u.every(nt))){try{var n=r.apply(null,p)}catch(o){return t.onError(o)}t.onNext(n)}else c.filter(function(t,n){return n!==e}).every(nt)&&t.onCompleted()}function o(e){c[e]=!0,c.every(nt)&&t.onCompleted()}for(var i=e.length,s=function(){return!1},u=g(i,s),a=!1,c=g(i,s),p=new Array(i),h=new Array(i),f=0;i>f;f++)!function(r){var i=e[r],s=new fe;ut(i)&&(i=Xe(i)),s.setDisposable(i.subscribe(function(t){p[r]=t,n(r)},function(e){t.onError(e)},function(){o(r)})),h[r]=s}(f);return new ie(h)},this)};qe.concat=function(){for(var t=[],e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return t.unshift(this),mn.apply(null,t)};var bn=function(t){function e(e){this.sources=e,t.call(this)}function n(t,e){this.sources=t,this.o=e}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new n(this.sources,t);return e.run()},n.prototype.run=function(){var t,e=new le,n=this.sources,r=n.length,o=this.o,i=xe.scheduleRecursiveWithState(0,function(i,s){if(!t){if(i===r)return o.onCompleted();var u=n[i];ut(u)&&(u=Xe(u));var a=new fe;e.setDisposable(a),a.setDisposable(u.subscribe(function(t){o.onNext(t)},function(t){o.onError(t)},function(){s(i+1)}))}});return new ie(e,i,ae(function(){t=!0}))},e}(ze),mn=We.concat=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{t=new Array(arguments.length);for(var e=0,n=arguments.length;n>e;e++)t[e]=arguments[e]}return new bn(t)};qe.concatAll=qe.concatObservable=function(){return this.merge(1)};var gn=function(t){function e(e,n){this.source=e,this.maxConcurrent=n,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new ie;return e.add(this.source.subscribe(new wn(t,this.maxConcurrent,e))),e},e}(ze),wn=function(){function t(t,e,n){this.o=t,this.max=e,this.g=n,this.done=!1,this.q=[],this.activeCount=0,this.isStopped=!1}function e(t,e){this.parent=t,this.sad=e,this.isStopped=!1}return t.prototype.handleSubscribe=function(t){var n=new fe;this.g.add(n),ut(t)&&(t=Xe(t)),n.setDisposable(t.subscribe(new e(this,n)))},t.prototype.onNext=function(t){this.isStopped||(this.activeCount<this.max?(this.activeCount++,this.handleSubscribe(t)):this.q.push(t))},t.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},t.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,0===this.activeCount&&this.o.onCompleted())},t.prototype.dispose=function(){this.isStopped=!0},t.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e.prototype.onNext=function(t){this.isStopped||this.parent.o.onNext(t)},e.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.o.onError(t))},e.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var t=this.parent;t.g.remove(this.sad),t.q.length>0?t.handleSubscribe(t.q.shift()):(t.activeCount--,t.done&&0===t.activeCount&&t.o.onCompleted())}},e.prototype.dispose=function(){this.isStopped=!0},e.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},t}();qe.merge=function(t){return"number"!=typeof t?xn(this,t):new gn(this,t)};var xn=We.merge=function(){var t,e,n=[],r=arguments.length;if(arguments[0])if(me(arguments[0]))for(t=arguments[0],e=1;r>e;e++)n.push(arguments[e]);else for(t=xe,e=0;r>e;e++)n.push(arguments[e]);else for(t=xe,e=1;r>e;e++)n.push(arguments[e]);return Array.isArray(n[0])&&(n=n[0]),M(t,n).mergeAll()},_n=tt.CompositeError=function(t){this.name="NotImplementedError",this.innerErrors=t,this.message="This contains multiple errors. Check the innerErrors",Error.call(this)};_n.prototype=Error.prototype,We.mergeDelayError=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}var r=M(null,t);return new qn(function(t){function e(){0===s.length?t.onCompleted():1===s.length?t.onError(s[0]):t.onError(new _n(s))}var n=new ie,o=new fe,i=!1,s=[];return n.add(o),o.setDisposable(r.subscribe(function(r){var o=new fe;n.add(o),ut(r)&&(r=Xe(r)),o.setDisposable(r.subscribe(function(e){t.onNext(e)},function(t){s.push(t),n.remove(o),i&&1===n.length&&e()},function(){n.remove(o),i&&1===n.length&&e()}))},function(t){s.push(t),i=!0,1===n.length&&e()},function(){i=!0,1===n.length&&e()})),n})};var Sn=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.g=e,this.isStopped=!1,this.done=!1}function r(t,e,n){this.parent=t,this.g=e,this.sad=n,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new ie,r=new fe;return e.add(r),r.setDisposable(this.source.subscribe(new n(t,e))),e},n.prototype.onNext=function(t){if(!this.isStopped){var e=new fe;this.g.add(e),ut(t)&&(t=Xe(t)),e.setDisposable(t.subscribe(new r(this,this.g,e)))}},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.done=!0,1===this.g.length&&this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},r.prototype.onNext=function(t){this.isStopped||this.parent.o.onNext(t)},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.o.onError(t))},r.prototype.onCompleted=function(){if(!this.isStopped){var t=this.parent;this.isStopped=!0,t.g.remove(this.sad),t.done&&1===t.g.length&&t.o.onCompleted()}},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},e}(ze);qe.mergeAll=qe.mergeObservable=function(){
-return new Sn(this)},qe.onErrorResumeNext=function(t){if(!t)throw new Error("Second observable is required");return En([this,t])};var En=We.onErrorResumeNext=function(){var t=[];if(Array.isArray(arguments[0]))t=arguments[0];else for(var e=0,n=arguments.length;n>e;e++)t.push(arguments[e]);return new qn(function(e){var n=0,r=new le,o=xe.scheduleRecursive(function(o){var i,s;n<t.length?(i=t[n++],ut(i)&&(i=Xe(i)),s=new fe,r.setDisposable(s),s.setDisposable(i.subscribe(e.onNext.bind(e),o,o))):e.onCompleted()});return new ie(r,o)})};qe.skipUntil=function(t){var e=this;return new qn(function(n){var r=!1,o=new ie(e.subscribe(function(t){r&&n.onNext(t)},function(t){n.onError(t)},function(){r&&n.onCompleted()}));ut(t)&&(t=Xe(t));var i=new fe;return o.add(i),i.setDisposable(t.subscribe(function(){r=!0,i.dispose()},function(t){n.onError(t)},function(){i.dispose()})),o},e)};var Cn=function(t){function e(e){this.source=e,t.call(this)}function n(t,e){this.o=t,this.inner=e,this.stopped=!1,this.latest=0,this.hasLatest=!1,this.isStopped=!1}function r(t,e){this.parent=t,this.id=e,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){var e=new le,r=this.source.subscribe(new n(t,e));return new ie(r,e)},n.prototype.onNext=function(t){if(!this.isStopped){var e=new fe,n=++this.latest;this.hasLatest=!0,this.inner.setDisposable(e),ut(t)&&(t=Xe(t)),e.setDisposable(t.subscribe(new r(this,n)))}},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.stopped=!0,!this.hasLatest&&this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},r.prototype.onNext=function(t){this.isStopped||this.parent.latest===this.id&&this.parent.o.onNext(t)},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&this.parent.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.parent.latest===this.id&&(this.parent.hasLatest=!1,this.parent.isStopped&&this.parent.o.onCompleted()))},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.parent.o.onError(t),!0)},e}(ze);qe["switch"]=qe.switchLatest=function(){return new Cn(this)};var An=function(t){function e(e,n){this.source=e,this.other=ut(n)?Xe(n):n,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return new ie(this.source.subscribe(t),this.other.subscribe(new n(t)))},n.prototype.onNext=function(t){this.isStopped||this.o.onCompleted()},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){!this.isStopped&&(this.isStopped=!0)},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.takeUntil=function(t){return new An(this,t)},qe.withLatestFrom=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.pop(),o=this;return Array.isArray(e[0])&&(e=e[0]),new qn(function(t){for(var n=e.length,i=g(n,W),s=!1,u=new Array(n),a=new Array(n+1),c=0;n>c;c++)!function(n){var r=e[n],o=new fe;ut(r)&&(r=Xe(r)),o.setDisposable(r.subscribe(function(t){u[n]=t,i[n]=!0,s=i.every(nt)},function(e){t.onError(e)},et)),a[n]=o}(c);var p=new fe;return p.setDisposable(o.subscribe(function(e){var n=[e].concat(u);if(s){var o=x(r).apply(null,n);return o===ne?t.onError(o.e):void t.onNext(o)}},function(e){t.onError(e)},function(){t.onCompleted()})),a[n]=p,new ie(a)},this)},qe.zip=function(){if(Array.isArray(arguments[0]))return z.apply(this,arguments);for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=this,o=e.pop();return e.unshift(r),new qn(function(t){for(var n=e.length,i=g(n,G),s=g(n,W),u=new Array(n),a=0;n>a;a++)!function(n){var a=e[n],c=new fe;ut(a)&&(a=Xe(a)),c.setDisposable(a.subscribe(function(e){if(i[n].push(e),i.every(function(t){return t.length>0})){var u=i.map(function(t){return t.shift()}),a=x(o).apply(r,u);if(a===ne)return t.onError(a.e);t.onNext(a)}else s.filter(function(t,e){return e!==n}).every(nt)&&t.onCompleted()},function(e){t.onError(e)},function(){s[n]=!0,s.every(nt)&&t.onCompleted()})),u[n]=c}(a);return new ie(u)},r)},We.zip=function(){for(var t=arguments.length,e=new Array(t),n=0;t>n;n++)e[n]=arguments[n];var r=e.shift();return r.zip.apply(r,e)},We.zipArray=function(){var t;if(Array.isArray(arguments[0]))t=arguments[0];else{var e=arguments.length;t=new Array(e);for(var n=0;e>n;n++)t[n]=arguments[n]}return new qn(function(e){for(var n=t.length,r=g(n,J),o=g(n,W),i=new Array(n),s=0;n>s;s++)!function(n){i[n]=new fe,i[n].setDisposable(t[n].subscribe(function(t){if(r[n].push(t),r.every(function(t){return t.length>0})){var i=r.map(function(t){return t.shift()});e.onNext(i)}else if(o.filter(function(t,e){return e!==n}).every(nt))return e.onCompleted()},function(t){e.onError(t)},function(){o[n]=!0,o.every(nt)&&e.onCompleted()}))}(s);return new ie(i)})},qe.asObservable=function(){var t=this;return new qn(function(e){return t.subscribe(e)},t)},qe.bufferWithCount=function(t,e){return"number"!=typeof e&&(e=t),this.windowWithCount(t,e).selectMany(function(t){return t.toArray()}).where(function(t){return t.length>0})},qe.dematerialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){return t.accept(e)},function(t){e.onError(t)},function(){e.onCompleted()})},this)},qe.distinctUntilChanged=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o,i=!1;return n.subscribe(function(n){var s=n;if(t&&(s=x(t)(n),s===ne))return r.onError(s.e);if(i){var u=x(e)(o,s);if(u===ne)return r.onError(u.e)}i&&u||(i=!0,o=s,r.onNext(n))},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Nn=function(t){function e(e,n,r,o){this.source=e,this.t=!n||at(n)?De(n||et,r||et,o||et):n,t.call(this)}function n(t,e){this.o=t,this.t=e,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.t))},n.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.t.onNext).call(this.t,t);e===ne&&this.o.onError(e.e),this.o.onNext(t)}},n.prototype.onError=function(t){if(!this.isStopped){this.isStopped=!0;var e=x(this.t.onError).call(this.t,t);if(e===ne)return this.o.onError(e.e);this.o.onError(t)}},n.prototype.onCompleted=function(){if(!this.isStopped){this.isStopped=!0;var t=x(this.t.onCompleted).call(this.t);if(t===ne)return this.o.onError(t.e);this.o.onCompleted()}},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe["do"]=qe.tap=qe.doAction=function(t,e,n){return new Nn(this,t,e,n)},qe.doOnNext=qe.tapOnNext=function(t,e){return this.tap("undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnError=qe.tapOnError=function(t,e){return this.tap(et,"undefined"!=typeof e?function(n){t.call(e,n)}:t)},qe.doOnCompleted=qe.tapOnCompleted=function(t,e){return this.tap(et,null,"undefined"!=typeof e?function(){t.call(e)}:t)},qe["finally"]=qe.ensure=function(t){var e=this;return new qn(function(n){var r;try{r=e.subscribe(n)}catch(o){throw t(),o}return ae(function(){try{r.dispose()}catch(e){throw e}finally{t()}})},this)},qe.finallyAction=function(t){return this.ensure(t)};var kn=function(t){function e(e){this.source=e,t.call(this)}function n(t){this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t))},n.prototype.onNext=et,n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},e}(ze);qe.ignoreElements=function(){return new kn(this)},qe.materialize=function(){var t=this;return new qn(function(e){return t.subscribe(function(t){e.onNext(ke(t))},function(t){e.onNext(Oe(t)),e.onCompleted()},function(){e.onNext(Pe()),e.onCompleted()})},t)},qe.repeat=function(t){return Be(this,t).concat()},qe.retry=function(t){return Be(this,t).catchError()},qe.retryWhen=function(t){return Be(this).catchErrorWhen(t)};var On=function(t){function e(e,n,r,o){this.source=e,this.accumulator=n,this.hasSeed=r,this.seed=o,t.call(this)}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new I(t,this))},e}(ze);I.prototype.onNext=function(t){if(!this.isStopped){!this.hasValue&&(this.hasValue=!0);try{this.hasAccumulation?this.accumulation=this.accumulator(this.accumulation,t):(this.accumulation=this.hasSeed?this.accumulator(this.seed,t):t,this.hasAccumulation=!0)}catch(e){return this.observer.onError(e)}this.observer.onNext(this.accumulation)}},I.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.observer.onError(t))},I.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,!this.hasValue&&this.hasSeed&&this.observer.onNext(this.seed),this.observer.onCompleted())},I.prototype.dispose=function(){this.isStopped=!0},I.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.observer.onError(t),!0)},qe.scan=function(){var t,e,n=!1;return 2===arguments.length?(n=!0,t=arguments[0],e=arguments[1]):e=arguments[0],new On(this,e,n,t)},qe.skipLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&n.onNext(r.shift())},function(t){n.onError(t)},function(){n.onCompleted()})},e)},qe.startWith=function(){var t,e=0;arguments.length&&me(arguments[0])?(t=arguments[0],e=1):t=xe;for(var n=[],r=e,o=arguments.length;o>r;r++)n.push(arguments[r]);return Ue([on(n,t),this]).concat()},qe.takeLast=function(t){if(0>t)throw new yt;var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){for(;r.length>0;)n.onNext(r.shift());n.onCompleted()})},e)},qe.takeLastBuffer=function(t){var e=this;return new qn(function(n){var r=[];return e.subscribe(function(e){r.push(e),r.length>t&&r.shift()},function(t){n.onError(t)},function(){n.onNext(r),n.onCompleted()})},e)},qe.windowWithCount=function(t,e){var n=this;if(+t||(t=0),Math.abs(t)===1/0&&(t=0),0>=t)throw new yt;if(null==e&&(e=t),+e||(e=0),Math.abs(e)===1/0&&(e=0),0>=e)throw new yt;return new qn(function(r){function o(){var t=new Tn;a.push(t),r.onNext(ee(t,s))}var i=new fe,s=new de(i),u=0,a=[];return o(),i.setDisposable(n.subscribe(function(n){for(var r=0,i=a.length;i>r;r++)a[r].onNext(n);var s=u-t+1;s>=0&&s%e===0&&a.shift().onCompleted(),++u%e===0&&o()},function(t){for(;a.length>0;)a.shift().onError(t);r.onError(t)},function(){for(;a.length>0;)a.shift().onCompleted();r.onCompleted()})),s},n)},qe.selectConcat=qe.concatMap=function(t,e,n){return at(t)&&at(e)?this.concatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})}):at(t)?L(this,t,n):L(this,function(){return t})},qe.concatMapObserver=qe.selectConcatObserver=function(t,e,n,r){var o=this,i=At(t,r,2),s=At(e,r,1),u=At(n,r,0);return new qn(function(t){var e=0;return o.subscribe(function(n){var r;try{r=i(n,e++)}catch(o){return void t.onError(o)}ut(r)&&(r=Xe(r)),t.onNext(r)},function(e){var n;try{n=s(e)}catch(r){return void t.onError(r)}ut(n)&&(n=Xe(n)),t.onNext(n),t.onCompleted()},function(){var e;try{e=u()}catch(n){return void t.onError(n)}ut(e)&&(e=Xe(e)),t.onNext(e),t.onCompleted()})},this).concatAll()},qe.defaultIfEmpty=function(t){var e=this;return t===i&&(t=null),new qn(function(n){var r=!1;return e.subscribe(function(t){r=!0,n.onNext(t)},function(t){n.onError(t)},function(){!r&&n.onNext(t),n.onCompleted()})},e)},F.prototype.push=function(t){var e=-1===B(this.set,t,this.comparer);return e&&this.set.push(t),e},qe.distinct=function(t,e){var n=this;return e||(e=ot),new qn(function(r){var o=new F(e);return n.subscribe(function(e){var n=e;if(t)try{n=t(e)}catch(i){return void r.onError(i)}o.push(n)&&r.onNext(e)},function(t){r.onError(t)},function(){r.onCompleted()})},this)};var Pn=function(t){function e(e,n,r){this.source=e,this.selector=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return t.call(this,e.selector(n,r,o),r,o)}}function r(t,e,n){this.o=t,this.selector=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.internalMap=function(t,r){return new e(this.source,n(t,this),r)},e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.selector,this))},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.selector)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void this.o.onNext(e)}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.map=qe.select=function(t,e){var n="function"==typeof t?t:function(){return t};return this instanceof Pn?this.internalMap(n,e):new Pn(this,n,e)},qe.pluck=function(){var t=arguments,e=arguments.length;if(0===e)throw new Error("List of properties cannot be empty.");return this.map(function(n){for(var r=n,o=0;e>o;o++){var s=r[t[o]];if("undefined"==typeof s)return i;r=s}return r})},qe.flatMapObserver=qe.selectManyObserver=function(t,e,n,r){var o=this;return new qn(function(i){var s=0;return o.subscribe(function(e){var n;try{n=t.call(r,e,s++)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n)},function(t){var n;try{n=e.call(r,t)}catch(o){return void i.onError(o)}ut(n)&&(n=Xe(n)),i.onNext(n),i.onCompleted()},function(){var t;try{t=n.call(r)}catch(e){return void i.onError(e)}ut(t)&&(t=Xe(t)),i.onNext(t),i.onCompleted()})},o).mergeAll()},qe.selectMany=qe.flatMap=function(t,e,n){return at(t)&&at(e)?this.flatMap(function(n,r){var o=t(n,r);return ut(o)&&(o=Xe(o)),(Et(o)||St(o))&&(o=nn(o)),o.map(function(t,o){return e(n,t,r,o)})},n):at(t)?U(this,t,n):U(this,function(){return t})},qe.selectSwitch=qe.flatMapLatest=qe.switchMap=function(t,e){return this.select(t,e).switchLatest()};var jn=function(t){function e(e,n){this.source=e,this.skipCount=n,t.call(this)}function n(t,e){this.c=e,this.r=e,this.o=t,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new n(t,this.skipCount))},n.prototype.onNext=function(t){this.isStopped||(this.r<=0?this.o.onNext(t):this.r--)},n.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},n.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},n.prototype.dispose=function(){this.isStopped=!0},n.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.skip=function(t){if(0>t)throw new yt;return new jn(this,t)},qe.skipWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!1;return n.subscribe(function(i){if(!o)try{o=!r(i,e++,n)}catch(s){return void t.onError(s)}o&&t.onNext(i)},function(e){t.onError(e)},function(){t.onCompleted()})},n)},qe.take=function(t,e){if(0>t)throw new yt;if(0===t)return Ye(e);var n=this;return new qn(function(e){var r=t;return n.subscribe(function(t){r-- >0&&(e.onNext(t),0>=r&&e.onCompleted())},function(t){e.onError(t)},function(){e.onCompleted()})},n)},qe.takeWhile=function(t,e){var n=this,r=At(t,e,3);return new qn(function(t){var e=0,o=!0;return n.subscribe(function(i){if(o){try{o=r(i,e++,n)}catch(s){return void t.onError(s)}o?t.onNext(i):t.onCompleted()}},function(e){t.onError(e)},function(){t.onCompleted()})},n)};var Dn=function(t){function e(e,n,r){this.source=e,this.predicate=At(n,r,3),t.call(this)}function n(t,e){return function(n,r,o){return e.predicate(n,r,o)&&t.call(this,n,r,o)}}function r(t,e,n){this.o=t,this.predicate=e,this.source=n,this.i=0,this.isStopped=!1}return Zt(e,t),e.prototype.subscribeCore=function(t){return this.source.subscribe(new r(t,this.predicate,this))},e.prototype.internalFilter=function(t,r){return new e(this.source,n(t,this),r)},r.prototype.onNext=function(t){if(!this.isStopped){var e=x(this.predicate)(t,this.i++,this.source);return e===ne?this.o.onError(e.e):void(e&&this.o.onNext(t))}},r.prototype.onError=function(t){this.isStopped||(this.isStopped=!0,this.o.onError(t))},r.prototype.onCompleted=function(){this.isStopped||(this.isStopped=!0,this.o.onCompleted())},r.prototype.dispose=function(){this.isStopped=!0},r.prototype.fail=function(t){return this.isStopped?!1:(this.isStopped=!0,this.o.onError(t),!0)},e}(ze);qe.filter=qe.where=function(t,e){return this instanceof Dn?this.internalFilter(t,e):new Dn(this,t,e)},qe.transduce=function(t){function e(t){return{"@@transducer/init":function(){return t},"@@transducer/step":function(t,e){return t.onNext(e)},"@@transducer/result":function(t){return t.onCompleted()}}}var n=this;return new qn(function(r){var o=t(e(r));return n.subscribe(function(t){try{o["@@transducer/step"](r,t)}catch(e){r.onError(e)}},function(t){r.onError(t)},function(){o["@@transducer/result"](r)})},n)};var qn=tt.AnonymousObservable=function(t){function e(t){return t&&at(t.dispose)?t:at(t)?ae(t):ce}function n(t,n){var r=n[0],o=n[1],i=x(o)(r);return i!==ne||r.fail(ne.e)?void r.setDisposable(e(i)):_(ne.e)}function r(e,r){function o(t){var r=new Rn(t),o=[r,e];return _e.scheduleRequired()?_e.scheduleWithState(o,n):n(null,o),r}this.source=r,t.call(this,o)}return Zt(r,t),r}(We),Rn=function(t){function e(e){t.call(this),this.observer=e,this.m=new fe}Zt(e,t);var n=e.prototype;return n.next=function(t){var e=x(this.observer.onNext).call(this.observer,t);e===ne&&(this.dispose(),_(e.e))},n.error=function(t){var e=x(this.observer.onError).call(this.observer,t);this.dispose(),e===ne&&_(e.e)},n.completed=function(){var t=x(this.observer.onCompleted).call(this.observer);this.dispose(),t===ne&&_(t.e)},n.setDisposable=function(t){this.m.setDisposable(t)},n.getDisposable=function(){return this.m.getDisposable()},n.dispose=function(){t.prototype.dispose.call(this),this.m.dispose()},e}(Re),Mn=function(t,e){this.subject=t,this.observer=e};Mn.prototype.dispose=function(){if(!this.subject.isDisposed&&null!==this.observer){var t=this.subject.observers.indexOf(this.observer);this.subject.observers.splice(t,1),this.observer=null}};var Tn=tt.Subject=function(t){function e(t){return he(this),this.isStopped?this.hasError?(t.onError(this.error),ce):(t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je.prototype,{hasObservers:function(){return this.observers.length>0},onCompleted:function(){if(he(this),!this.isStopped){this.isStopped=!0;for(var t=0,e=u(this.observers),n=e.length;n>t;t++)e[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.error=t,this.hasError=!0;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){if(he(this),!this.isStopped)for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onNext(t)},dispose:function(){this.isDisposed=!0,this.observers=null}}),n.create=function(t,e){return new Vn(t,e)},n}(We),Vn=(tt.AsyncSubject=function(t){function e(t){return he(this),this.isStopped?(this.hasError?t.onError(this.error):this.hasValue?(t.onNext(this.value),t.onCompleted()):t.onCompleted(),ce):(this.observers.push(t),new Mn(this,t))}function n(){t.call(this,e),this.isDisposed=!1,this.isStopped=!1,this.hasValue=!1,this.observers=[],this.hasError=!1}return Zt(n,t),te(n.prototype,je,{hasObservers:function(){return he(this),this.observers.length>0},onCompleted:function(){var t,e;if(he(this),!this.isStopped){this.isStopped=!0;var n=u(this.observers),e=n.length;if(this.hasValue)for(t=0;e>t;t++){var r=n[t];r.onNext(this.value),r.onCompleted()}else for(t=0;e>t;t++)n[t].onCompleted();this.observers.length=0}},onError:function(t){if(he(this),!this.isStopped){this.isStopped=!0,this.hasError=!0,this.error=t;for(var e=0,n=u(this.observers),r=n.length;r>e;e++)n[e].onError(t);this.observers.length=0}},onNext:function(t){he(this),this.isStopped||(this.value=t,this.hasValue=!0)},dispose:function(){this.isDisposed=!0,this.observers=null,this.exception=null,this.value=null}}),n}(We),tt.AnonymousSubject=function(t){function e(t){return this.observable.subscribe(t)}function n(n,r){this.observer=n,this.observable=r,t.call(this,e)}return Zt(n,t),te(n.prototype,je.prototype,{onCompleted:function(){this.observer.onCompleted()},onError:function(t){this.observer.onError(t)},onNext:function(t){this.observer.onNext(t)}}),n}(We));"function"==typeof t&&"object"==typeof t.amd&&t.amd?(X.Rx=tt,t(function(){return tt})):Q&&K?Y?(K.exports=tt).Rx=tt:Q.Rx=tt:X.Rx=tt;var $n=f()}).call(this)}).call(this,e(150),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{150:150}]},{},[1])(1)});
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],16:[function(require,module,exports){
-(function (global){
-var topLevel = typeof global !== 'undefined' ? global :
-    typeof window !== 'undefined' ? window : {}
-var minDoc = require('min-document');
-
-var doccy;
-
-if (typeof document !== 'undefined') {
-    doccy = document;
-} else {
-    doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'];
-
-    if (!doccy) {
-        doccy = topLevel['__GLOBAL_DOCUMENT_CACHE@4'] = minDoc;
-    }
-}
-
-module.exports = doccy;
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{"min-document":4}],17:[function(require,module,exports){
-exports.read = function (buffer, offset, isLE, mLen, nBytes) {
-  var e, m
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var nBits = -7
-  var i = isLE ? (nBytes - 1) : 0
-  var d = isLE ? -1 : 1
-  var s = buffer[offset + i]
-
-  i += d
-
-  e = s & ((1 << (-nBits)) - 1)
-  s >>= (-nBits)
-  nBits += eLen
-  for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  m = e & ((1 << (-nBits)) - 1)
-  e >>= (-nBits)
-  nBits += mLen
-  for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-  if (e === 0) {
-    e = 1 - eBias
-  } else if (e === eMax) {
-    return m ? NaN : ((s ? -1 : 1) * Infinity)
-  } else {
-    m = m + Math.pow(2, mLen)
-    e = e - eBias
-  }
-  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-}
-
-exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
-  var e, m, c
-  var eLen = nBytes * 8 - mLen - 1
-  var eMax = (1 << eLen) - 1
-  var eBias = eMax >> 1
-  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)
-  var i = isLE ? 0 : (nBytes - 1)
-  var d = isLE ? 1 : -1
-  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0
-
-  value = Math.abs(value)
-
-  if (isNaN(value) || value === Infinity) {
-    m = isNaN(value) ? 1 : 0
-    e = eMax
-  } else {
-    e = Math.floor(Math.log(value) / Math.LN2)
-    if (value * (c = Math.pow(2, -e)) < 1) {
-      e--
-      c *= 2
-    }
-    if (e + eBias >= 1) {
-      value += rt / c
-    } else {
-      value += rt * Math.pow(2, 1 - eBias)
-    }
-    if (value * c >= 2) {
-      e++
-      c /= 2
-    }
-
-    if (e + eBias >= eMax) {
-      m = 0
-      e = eMax
-    } else if (e + eBias >= 1) {
-      m = (value * c - 1) * Math.pow(2, mLen)
-      e = e + eBias
-    } else {
-      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)
-      e = 0
-    }
-  }
-
-  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
-  e = (e << mLen) | m
-  eLen += mLen
-  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
-  buffer[offset + i - d] |= s * 128
-}
-
-},{}],18:[function(require,module,exports){
-(function (global){
-'use strict';
-
-/*global window, global*/
-
-var root = typeof window !== 'undefined' ?
-    window : typeof global !== 'undefined' ?
-    global : {};
-
-module.exports = Individual;
-
-function Individual(key, value) {
-    if (key in root) {
-        return root[key];
-    }
-
-    root[key] = value;
-
-    return value;
-}
-
-}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-
-},{}],19:[function(require,module,exports){
-'use strict';
-
-var Individual = require('./index.js');
-
-module.exports = OneVersion;
-
-function OneVersion(moduleName, version, defaultValue) {
-    var key = '__INDIVIDUAL_ONE_VERSION_' + moduleName;
-    var enforceKey = key + '_ENFORCE_SINGLETON';
-
-    var versionValue = Individual(enforceKey, version);
-
-    if (versionValue !== version) {
-        throw new Error('Can only have one copy of ' +
-            moduleName + '.\n' +
-            'You already have version ' + versionValue +
-            ' installed.\n' +
-            'This means you cannot install version ' + version);
-    }
-
-    return Individual(key, defaultValue);
-}
-
-},{"./index.js":18}],20:[function(require,module,exports){
-"use strict";
-
-module.exports = function isObject(x) {
-       return typeof x === "object" && x !== null;
-};
-
-},{}],21:[function(require,module,exports){
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-/* Geohash encoding/decoding and associated functions   (c) Chris Veness 2014-2016 / MIT Licence  */
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-
-'use strict';
-
-
-/**
- * Geohash encode, decode, bounds, neighbours.
- *
- * @namespace
- */
-var Geohash = {};
-
-/* (Geohash-specific) Base32 map */
-Geohash.base32 = '0123456789bcdefghjkmnpqrstuvwxyz';
-
-/**
- * Encodes latitude/longitude to geohash, either to specified precision or to automatically
- * evaluated precision.
- *
- * @param   {number} lat - Latitude in degrees.
- * @param   {number} lon - Longitude in degrees.
- * @param   {number} [precision] - Number of characters in resulting geohash.
- * @returns {string} Geohash of supplied latitude/longitude.
- * @throws  Invalid geohash.
- *
- * @example
- *     var geohash = Geohash.encode(52.205, 0.119, 7); // geohash: 'u120fxw'
- */
-Geohash.encode = function(lat, lon, precision) {
-    // infer precision?
-    if (typeof precision == 'undefined') {
-        // refine geohash until it matches precision of supplied lat/lon
-        for (var p=1; p<=12; p++) {
-            var hash = Geohash.encode(lat, lon, p);
-            var posn = Geohash.decode(hash);
-            if (posn.lat==lat && posn.lon==lon) return hash;
-        }
-        precision = 12; // set to maximum
-    }
-
-    lat = Number(lat);
-    lon = Number(lon);
-    precision = Number(precision);
-
-    if (isNaN(lat) || isNaN(lon) || isNaN(precision)) throw new Error('Invalid geohash');
-
-    var idx = 0; // index into base32 map
-    var bit = 0; // each char holds 5 bits
-    var evenBit = true;
-    var geohash = '';
-
-    var latMin =  -90, latMax =  90;
-    var lonMin = -180, lonMax = 180;
-
-    while (geohash.length < precision) {
-        if (evenBit) {
-            // bisect E-W longitude
-            var lonMid = (lonMin + lonMax) / 2;
-            if (lon >= lonMid) {
-                idx = idx*2 + 1;
-                lonMin = lonMid;
-            } else {
-                idx = idx*2;
-                lonMax = lonMid;
-            }
-        } else {
-            // bisect N-S latitude
-            var latMid = (latMin + latMax) / 2;
-            if (lat >= latMid) {
-                idx = idx*2 + 1;
-                latMin = latMid;
-            } else {
-                idx = idx*2;
-                latMax = latMid;
-            }
-        }
-        evenBit = !evenBit;
-
-        if (++bit == 5) {
-            // 5 bits gives us a character: append it and start over
-            geohash += Geohash.base32.charAt(idx);
-            bit = 0;
-            idx = 0;
-        }
-    }
-
-    return geohash;
-};
-
-
-/**
- * Decode geohash to latitude/longitude (location is approximate centre of geohash cell,
- *     to reasonable precision).
- *
- * @param   {string} geohash - Geohash string to be converted to latitude/longitude.
- * @returns {{lat:number, lon:number}} (Center of) geohashed location.
- * @throws  Invalid geohash.
- *
- * @example
- *     var latlon = Geohash.decode('u120fxw'); // latlon: { lat: 52.205, lon: 0.1188 }
- */
-Geohash.decode = function(geohash) {
-
-    var bounds = Geohash.bounds(geohash); // <-- the hard work
-    // now just determine the centre of the cell...
-
-    var latMin = bounds.sw.lat, lonMin = bounds.sw.lon;
-    var latMax = bounds.ne.lat, lonMax = bounds.ne.lon;
-
-    // cell centre
-    var lat = (latMin + latMax)/2;
-    var lon = (lonMin + lonMax)/2;
-
-    // round to close to centre without excessive precision: âŒŠ2-log10(Δ°)⌋ decimal places
-    lat = lat.toFixed(Math.floor(2-Math.log(latMax-latMin)/Math.LN10));
-    lon = lon.toFixed(Math.floor(2-Math.log(lonMax-lonMin)/Math.LN10));
-
-    return { lat: Number(lat), lon: Number(lon) };
-};
-
-
-/**
- * Returns SW/NE latitude/longitude bounds of specified geohash.
- *
- * @param   {string} geohash - Cell that bounds are required of.
- * @returns {{sw: {lat: number, lon: number}, ne: {lat: number, lon: number}}}
- * @throws  Invalid geohash.
- */
-Geohash.bounds = function(geohash) {
-    if (geohash.length === 0) throw new Error('Invalid geohash');
-
-    geohash = geohash.toLowerCase();
-
-    var evenBit = true;
-    var latMin =  -90, latMax =  90;
-    var lonMin = -180, lonMax = 180;
-
-    for (var i=0; i<geohash.length; i++) {
-        var chr = geohash.charAt(i);
-        var idx = Geohash.base32.indexOf(chr);
-        if (idx == -1) throw new Error('Invalid geohash');
-
-        for (var n=4; n>=0; n--) {
-            var bitN = idx >> n & 1;
-            if (evenBit) {
-                // longitude
-                var lonMid = (lonMin+lonMax) / 2;
-                if (bitN == 1) {
-                    lonMin = lonMid;
-                } else {
-                    lonMax = lonMid;
-                }
-            } else {
-                // latitude
-                var latMid = (latMin+latMax) / 2;
-                if (bitN == 1) {
-                    latMin = latMid;
-                } else {
-                    latMax = latMid;
-                }
-            }
-            evenBit = !evenBit;
-        }
-    }
-
-    var bounds = {
-        sw: { lat: latMin, lon: lonMin },
-        ne: { lat: latMax, lon: lonMax },
-    };
-
-    return bounds;
-};
-
-
-/**
- * Determines adjacent cell in given direction.
- *
- * @param   geohash - Cell to which adjacent cell is required.
- * @param   direction - Direction from geohash (N/S/E/W).
- * @returns {string} Geocode of adjacent cell.
- * @throws  Invalid geohash.
- */
-Geohash.adjacent = function(geohash, direction) {
-    // based on github.com/davetroy/geohash-js
-
-    geohash = geohash.toLowerCase();
-    direction = direction.toLowerCase();
-
-    if (geohash.length === 0) throw new Error('Invalid geohash');
-    if ('nsew'.indexOf(direction) == -1) throw new Error('Invalid direction');
-
-    var neighbour = {
-        n: [ 'p0r21436x8zb9dcf5h7kjnmqesgutwvy', 'bc01fg45238967deuvhjyznpkmstqrwx' ],
-        s: [ '14365h7k9dcfesgujnmqp0r2twvyx8zb', '238967debc01fg45kmstqrwxuvhjyznp' ],
-        e: [ 'bc01fg45238967deuvhjyznpkmstqrwx', 'p0r21436x8zb9dcf5h7kjnmqesgutwvy' ],
-        w: [ '238967debc01fg45kmstqrwxuvhjyznp', '14365h7k9dcfesgujnmqp0r2twvyx8zb' ],
-    };
-    var border = {
-        n: [ 'prxz',     'bcfguvyz' ],
-        s: [ '028b',     '0145hjnp' ],
-        e: [ 'bcfguvyz', 'prxz'     ],
-        w: [ '0145hjnp', '028b'     ],
-    };
-
-    var lastCh = geohash.slice(-1);    // last character of hash
-    var parent = geohash.slice(0, -1); // hash without last character
-
-    var type = geohash.length % 2;
-
-    // check for edge-cases which don't share common prefix
-    if (border[direction][type].indexOf(lastCh) != -1 && parent !== '') {
-        parent = Geohash.adjacent(parent, direction);
-    }
-
-    // append letter for direction to parent
-    return parent + Geohash.base32.charAt(neighbour[direction][type].indexOf(lastCh));
-};
-
-
-/**
- * Returns all 8 adjacent cells to specified geohash.
- *
- * @param   {string} geohash - Geohash neighbours are required of.
- * @returns {{n,ne,e,se,s,sw,w,nw: string}}
- * @throws  Invalid geohash.
- */
-Geohash.neighbours = function(geohash) {
-    return {
-        'n':  Geohash.adjacent(geohash, 'n'),
-        'ne': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'e'),
-        'e':  Geohash.adjacent(geohash, 'e'),
-        'se': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'e'),
-        's':  Geohash.adjacent(geohash, 's'),
-        'sw': Geohash.adjacent(Geohash.adjacent(geohash, 's'), 'w'),
-        'w':  Geohash.adjacent(geohash, 'w'),
-        'nw': Geohash.adjacent(Geohash.adjacent(geohash, 'n'), 'w'),
-    };
-};
-
-
-/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  */
-if (typeof module != 'undefined' && module.exports) module.exports = Geohash; // CommonJS, node.js
-
-},{}],22:[function(require,module,exports){
-/**
- * martinez v0.5.0
- * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
- *
- * @author Alex Milevski <info@w8r.name>
- * @license MIT
- * @preserve
- */
-
-(function (global, factory) {
-  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-  typeof define === 'function' && define.amd ? define(['exports'], factory) :
-  (factory((global.martinez = {})));
-}(this, (function (exports) { 'use strict';
-
-  function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
-
-  var SplayTree = function SplayTree(compare, noDuplicates) {
-    if ( compare === void 0 ) compare = DEFAULT_COMPARE;
-    if ( noDuplicates === void 0 ) noDuplicates = false;
-
-    this._compare = compare;
-    this._root = null;
-    this._size = 0;
-    this._noDuplicates = !!noDuplicates;
-  };
-
-  var prototypeAccessors = { size: { configurable: true } };
-
-
-  SplayTree.prototype.rotateLeft = function rotateLeft (x) {
-    var y = x.right;
-    if (y) {
-      x.right = y.left;
-      if (y.left) { y.left.parent = x; }
-      y.parent = x.parent;
-    }
-
-    if (!x.parent)              { this._root = y; }
-    else if (x === x.parent.left) { x.parent.left = y; }
-    else                        { x.parent.right = y; }
-    if (y) { y.left = x; }
-    x.parent = y;
-  };
-
-
-  SplayTree.prototype.rotateRight = function rotateRight (x) {
-    var y = x.left;
-    if (y) {
-      x.left = y.right;
-      if (y.right) { y.right.parent = x; }
-      y.parent = x.parent;
-    }
-
-    if (!x.parent)             { this._root = y; }
-    else if(x === x.parent.left) { x.parent.left = y; }
-    else                       { x.parent.right = y; }
-    if (y) { y.right = x; }
-    x.parent = y;
-  };
-
-
-  SplayTree.prototype._splay = function _splay (x) {
-      var this$1 = this;
-
-    while (x.parent) {
-      var p = x.parent;
-      if (!p.parent) {
-        if (p.left === x) { this$1.rotateRight(p); }
-        else            { this$1.rotateLeft(p); }
-      } else if (p.left === x && p.parent.left === p) {
-        this$1.rotateRight(p.parent);
-        this$1.rotateRight(p);
-      } else if (p.right === x && p.parent.right === p) {
-        this$1.rotateLeft(p.parent);
-        this$1.rotateLeft(p);
-      } else if (p.left === x && p.parent.right === p) {
-        this$1.rotateRight(p);
-        this$1.rotateLeft(p);
-      } else {
-        this$1.rotateLeft(p);
-        this$1.rotateRight(p);
-      }
-    }
-  };
-
-
-  SplayTree.prototype.splay = function splay (x) {
-      var this$1 = this;
-
-    var p, gp, ggp, l, r;
-
-    while (x.parent) {
-      p = x.parent;
-      gp = p.parent;
-
-      if (gp && gp.parent) {
-        ggp = gp.parent;
-        if (ggp.left === gp) { ggp.left= x; }
-        else               { ggp.right = x; }
-        x.parent = ggp;
-      } else {
-        x.parent = null;
-        this$1._root = x;
-      }
-
-      l = x.left; r = x.right;
-
-      if (x === p.left) { // left
-        if (gp) {
-          if (gp.left === p) {
-            /* zig-zig */
-            if (p.right) {
-              gp.left = p.right;
-              gp.left.parent = gp;
-            } else { gp.left = null; }
-
-            p.right = gp;
-            gp.parent = p;
-          } else {
-            /* zig-zag */
-            if (l) {
-              gp.right = l;
-              l.parent = gp;
-            } else { gp.right = null; }
-
-            x.left  = gp;
-            gp.parent = x;
-          }
-        }
-        if (r) {
-          p.left = r;
-          r.parent = p;
-        } else { p.left = null; }
-
-        x.right= p;
-        p.parent = x;
-      } else { // right
-        if (gp) {
-          if (gp.right === p) {
-            /* zig-zig */
-            if (p.left) {
-              gp.right = p.left;
-              gp.right.parent = gp;
-            } else { gp.right = null; }
-
-            p.left = gp;
-            gp.parent = p;
-          } else {
-            /* zig-zag */
-            if (r) {
-              gp.left = r;
-              r.parent = gp;
-            } else { gp.left = null; }
-
-            x.right = gp;
-            gp.parent = x;
-          }
-        }
-        if (l) {
-          p.right = l;
-          l.parent = p;
-        } else { p.right = null; }
-
-        x.left = p;
-        p.parent = x;
-      }
-    }
-  };
-
-
-  SplayTree.prototype.replace = function replace (u, v) {
-    if (!u.parent) { this._root = v; }
-    else if (u === u.parent.left) { u.parent.left = v; }
-    else { u.parent.right = v; }
-    if (v) { v.parent = u.parent; }
-  };
-
-
-  SplayTree.prototype.minNode = function minNode (u) {
-      if ( u === void 0 ) u = this._root;
-
-    if (u) { while (u.left) { u = u.left; } }
-    return u;
-  };
-
-
-  SplayTree.prototype.maxNode = function maxNode (u) {
-      if ( u === void 0 ) u = this._root;
-
-    if (u) { while (u.right) { u = u.right; } }
-    return u;
-  };
-
-
-  SplayTree.prototype.insert = function insert (key, data) {
-    var z = this._root;
-    var p = null;
-    var comp = this._compare;
-    var cmp;
-
-    if (this._noDuplicates) {
-      while (z) {
-        p = z;
-        cmp = comp(z.key, key);
-        if (cmp === 0) { return; }
-        else if (comp(z.key, key) < 0) { z = z.right; }
-        else { z = z.left; }
-      }
-    } else {
-      while (z) {
-        p = z;
-        if (comp(z.key, key) < 0) { z = z.right; }
-        else { z = z.left; }
-      }
-    }
-
-    z = { key: key, data: data, left: null, right: null, parent: p };
-
-    if (!p)                        { this._root = z; }
-    else if (comp(p.key, z.key) < 0) { p.right = z; }
-    else                           { p.left= z; }
-
-    this.splay(z);
-    this._size++;
-    return z;
-  };
-
-
-  SplayTree.prototype.find = function find (key) {
-    var z  = this._root;
-    var comp = this._compare;
-    while (z) {
-      var cmp = comp(z.key, key);
-      if    (cmp < 0) { z = z.right; }
-      else if (cmp > 0) { z = z.left; }
-      else            { return z; }
-    }
-    return null;
-  };
-
-  /**
-   * Whether the tree contains a node with the given key
-   * @param{Key} key
-   * @return {boolean} true/false
-   */
-  SplayTree.prototype.contains = function contains (key) {
-    var node     = this._root;
-    var comparator = this._compare;
-    while (node){
-      var cmp = comparator(key, node.key);
-      if    (cmp === 0) { return true; }
-      else if (cmp < 0) { node = node.left; }
-      else              { node = node.right; }
-    }
-
-    return false;
-  };
-
-
-  SplayTree.prototype.remove = function remove (key) {
-    var z = this.find(key);
-
-    if (!z) { return false; }
-
-    this.splay(z);
-
-    if (!z.left) { this.replace(z, z.right); }
-    else if (!z.right) { this.replace(z, z.left); }
-    else {
-      var y = this.minNode(z.right);
-      if (y.parent !== z) {
-        this.replace(y, y.right);
-        y.right = z.right;
-        y.right.parent = y;
-      }
-      this.replace(z, y);
-      y.left = z.left;
-      y.left.parent = y;
-    }
-
-    this._size--;
-    return true;
-  };
-
-
-  SplayTree.prototype.removeNode = function removeNode (z) {
-    if (!z) { return false; }
-
-    this.splay(z);
-
-    if (!z.left) { this.replace(z, z.right); }
-    else if (!z.right) { this.replace(z, z.left); }
-    else {
-      var y = this.minNode(z.right);
-      if (y.parent !== z) {
-        this.replace(y, y.right);
-        y.right = z.right;
-        y.right.parent = y;
-      }
-      this.replace(z, y);
-      y.left = z.left;
-      y.left.parent = y;
-    }
-
-    this._size--;
-    return true;
-  };
-
-
-  SplayTree.prototype.erase = function erase (key) {
-    var z = this.find(key);
-    if (!z) { return; }
-
-    this.splay(z);
-
-    var s = z.left;
-    var t = z.right;
-
-    var sMax = null;
-    if (s) {
-      s.parent = null;
-      sMax = this.maxNode(s);
-      this.splay(sMax);
-      this._root = sMax;
-    }
-    if (t) {
-      if (s) { sMax.right = t; }
-      else { this._root = t; }
-      t.parent = sMax;
-    }
-
-    this._size--;
-  };
-
-  /**
-   * Removes and returns the node with smallest key
-   * @return {?Node}
-   */
-  SplayTree.prototype.pop = function pop () {
-    var node = this._root, returnValue = null;
-    if (node) {
-      while (node.left) { node = node.left; }
-      returnValue = { key: node.key, data: node.data };
-      this.remove(node.key);
-    }
-    return returnValue;
-  };
-
-
-  /* eslint-disable class-methods-use-this */
-
-  /**
-   * Successor node
-   * @param{Node} node
-   * @return {?Node}
-   */
-  SplayTree.prototype.next = function next (node) {
-    var successor = node;
-    if (successor) {
-      if (successor.right) {
-        successor = successor.right;
-        while (successor && successor.left) { successor = successor.left; }
-      } else {
-        successor = node.parent;
-        while (successor && successor.right === node) {
-          node = successor; successor = successor.parent;
-        }
-      }
-    }
-    return successor;
-  };
-
-
-  /**
-   * Predecessor node
-   * @param{Node} node
-   * @return {?Node}
-   */
-  SplayTree.prototype.prev = function prev (node) {
-    var predecessor = node;
-    if (predecessor) {
-      if (predecessor.left) {
-        predecessor = predecessor.left;
-        while (predecessor && predecessor.right) { predecessor = predecessor.right; }
-      } else {
-        predecessor = node.parent;
-        while (predecessor && predecessor.left === node) {
-          node = predecessor;
-          predecessor = predecessor.parent;
-        }
-      }
-    }
-    return predecessor;
-  };
-  /* eslint-enable class-methods-use-this */
-
-
-  /**
-   * @param{forEachCallback} callback
-   * @return {SplayTree}
-   */
-  SplayTree.prototype.forEach = function forEach (callback) {
-    var current = this._root;
-    var s = [], done = false, i = 0;
-
-    while (!done) {
-      // Reach the left most Node of the current Node
-      if (current) {
-        // Place pointer to a tree node on the stack
-        // before traversing the node's left subtree
-        s.push(current);
-        current = current.left;
-      } else {
-        // BackTrack from the empty subtree and visit the Node
-        // at the top of the stack; however, if the stack is
-        // empty you are done
-        if (s.length > 0) {
-          current = s.pop();
-          callback(current, i++);
-
-          // We have visited the node and its left
-          // subtree. Now, it's right subtree's turn
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return this;
-  };
-
-
-  /**
-   * Walk key range from `low` to `high`. Stops if `fn` returns a value.
-   * @param{Key}    low
-   * @param{Key}    high
-   * @param{Function} fn
-   * @param{*?}     ctx
-   * @return {SplayTree}
-   */
-  SplayTree.prototype.range = function range (low, high, fn, ctx) {
-      var this$1 = this;
-
-    var Q = [];
-    var compare = this._compare;
-    var node = this._root, cmp;
-
-    while (Q.length !== 0 || node) {
-      if (node) {
-        Q.push(node);
-        node = node.left;
-      } else {
-        node = Q.pop();
-        cmp = compare(node.key, high);
-        if (cmp > 0) {
-          break;
-        } else if (compare(node.key, low) >= 0) {
-          if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
-        }
-        node = node.right;
-      }
-    }
-    return this;
-  };
-
-  /**
-   * Returns all keys in order
-   * @return {Array<Key>}
-   */
-  SplayTree.prototype.keys = function keys () {
-    var current = this._root;
-    var s = [], r = [], done = false;
-
-    while (!done) {
-      if (current) {
-        s.push(current);
-        current = current.left;
-      } else {
-        if (s.length > 0) {
-          current = s.pop();
-          r.push(current.key);
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return r;
-  };
-
-
-  /**
-   * Returns `data` fields of all nodes in order.
-   * @return {Array<Value>}
-   */
-  SplayTree.prototype.values = function values () {
-    var current = this._root;
-    var s = [], r = [], done = false;
-
-    while (!done) {
-      if (current) {
-        s.push(current);
-        current = current.left;
-      } else {
-        if (s.length > 0) {
-          current = s.pop();
-          r.push(current.data);
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return r;
-  };
-
-
-  /**
-   * Returns node at given index
-   * @param{number} index
-   * @return {?Node}
-   */
-  SplayTree.prototype.at = function at (index) {
-    // removed after a consideration, more misleading than useful
-    // index = index % this.size;
-    // if (index < 0) index = this.size - index;
-
-    var current = this._root;
-    var s = [], done = false, i = 0;
-
-    while (!done) {
-      if (current) {
-        s.push(current);
-        current = current.left;
-      } else {
-        if (s.length > 0) {
-          current = s.pop();
-          if (i === index) { return current; }
-          i++;
-          current = current.right;
-        } else { done = true; }
-      }
-    }
-    return null;
-  };
-
-  /**
-   * Bulk-load items. Both array have to be same size
-   * @param{Array<Key>}  keys
-   * @param{Array<Value>}[values]
-   * @param{Boolean}     [presort=false] Pre-sort keys and values, using
-   *                                       tree's comparator. Sorting is done
-   *                                       in-place
-   * @return {AVLTree}
-   */
-  SplayTree.prototype.load = function load (keys, values, presort) {
-      if ( keys === void 0 ) keys = [];
-      if ( values === void 0 ) values = [];
-      if ( presort === void 0 ) presort = false;
-
-    if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
-    var size = keys.length;
-    if (presort) { sort(keys, values, 0, size - 1, this._compare); }
-    this._root = loadRecursive(null, keys, values, 0, size);
-    this._size = size;
-    return this;
-  };
-
-
-  SplayTree.prototype.min = function min () {
-    var node = this.minNode(this._root);
-    if (node) { return node.key; }
-    else    { return null; }
-  };
-
-
-  SplayTree.prototype.max = function max () {
-    var node = this.maxNode(this._root);
-    if (node) { return node.key; }
-    else    { return null; }
-  };
-
-  SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
-  prototypeAccessors.size.get = function () { return this._size; };
-
-
-  /**
-   * Create a tree and load it with items
-   * @param{Array<Key>}        keys
-   * @param{Array<Value>?}      [values]
-
-   * @param{Function?}          [comparator]
-   * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
-   *                                             tree's comparator. Sorting is done
-   *                                             in-place
-   * @param{Boolean?}           [noDuplicates=false] Allow duplicates
-   * @return {SplayTree}
-   */
-  SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
-    return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
-  };
-
-  Object.defineProperties( SplayTree.prototype, prototypeAccessors );
-
-
-  function loadRecursive (parent, keys, values, start, end) {
-    var size = end - start;
-    if (size > 0) {
-      var middle = start + Math.floor(size / 2);
-      var key    = keys[middle];
-      var data   = values[middle];
-      var node   = { key: key, data: data, parent: parent };
-      node.left    = loadRecursive(node, keys, values, start, middle);
-      node.right   = loadRecursive(node, keys, values, middle + 1, end);
-      return node;
-    }
-    return null;
-  }
-
-
-  function sort(keys, values, left, right, compare) {
-    if (left >= right) { return; }
-
-    var pivot = keys[(left + right) >> 1];
-    var i = left - 1;
-    var j = right + 1;
-
-    while (true) {
-      do { i++; } while (compare(keys[i], pivot) < 0);
-      do { j--; } while (compare(keys[j], pivot) > 0);
-      if (i >= j) { break; }
-
-      var tmp = keys[i];
-      keys[i] = keys[j];
-      keys[j] = tmp;
-
-      tmp = values[i];
-      values[i] = values[j];
-      values[j] = tmp;
-    }
-
-    sort(keys, values,  left,     j, compare);
-    sort(keys, values, j + 1, right, compare);
-  }
-
-  var NORMAL               = 0;
-  var NON_CONTRIBUTING     = 1;
-  var SAME_TRANSITION      = 2;
-  var DIFFERENT_TRANSITION = 3;
-
-  var INTERSECTION = 0;
-  var UNION        = 1;
-  var DIFFERENCE   = 2;
-  var XOR          = 3;
-
-  /**
-   * @param  {SweepEvent} event
-   * @param  {SweepEvent} prev
-   * @param  {Operation} operation
-   */
-  function computeFields (event, prev, operation) {
-    // compute inOut and otherInOut fields
-    if (prev === null) {
-      event.inOut      = false;
-      event.otherInOut = true;
-
-    // previous line segment in sweepline belongs to the same polygon
-    } else {
-      if (event.isSubject === prev.isSubject) {
-        event.inOut      = !prev.inOut;
-        event.otherInOut = prev.otherInOut;
-
-      // previous line segment in sweepline belongs to the clipping polygon
-      } else {
-        event.inOut      = !prev.otherInOut;
-        event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
-      }
-
-      // compute prevInResult field
-      if (prev) {
-        event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
-          ? prev.prevInResult : prev;
-      }
-    }
-
-    // check if the line segment belongs to the Boolean operation
-    event.inResult = inResult(event, operation);
-  }
-
-
-  /* eslint-disable indent */
-  function inResult(event, operation) {
-    switch (event.type) {
-      case NORMAL:
-        switch (operation) {
-          case INTERSECTION:
-            return !event.otherInOut;
-          case UNION:
-            return event.otherInOut;
-          case DIFFERENCE:
-            // return (event.isSubject && !event.otherInOut) ||
-            //         (!event.isSubject && event.otherInOut);
-            return (event.isSubject && event.otherInOut) ||
-                    (!event.isSubject && !event.otherInOut);
-          case XOR:
-            return true;
-        }
-        break;
-      case SAME_TRANSITION:
-        return operation === INTERSECTION || operation === UNION;
-      case DIFFERENT_TRANSITION:
-        return operation === DIFFERENCE;
-      case NON_CONTRIBUTING:
-        return false;
-    }
-    return false;
-  }
-  /* eslint-enable indent */
-
-  var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
-
-    /**
-     * Is left endpoint?
-     * @type {Boolean}
-     */
-    this.left = left;
-
-    /**
-     * @type {Array.<Number>}
-     */
-    this.point = point;
-
-    /**
-     * Other edge reference
-     * @type {SweepEvent}
-     */
-    this.otherEvent = otherEvent;
-
-    /**
-     * Belongs to source or clipping polygon
-     * @type {Boolean}
-     */
-    this.isSubject = isSubject;
-
-    /**
-     * Edge contribution type
-     * @type {Number}
-     */
-    this.type = edgeType || NORMAL;
-
-
-    /**
-     * In-out transition for the sweepline crossing polygon
-     * @type {Boolean}
-     */
-    this.inOut = false;
-
-
-    /**
-     * @type {Boolean}
-     */
-    this.otherInOut = false;
-
-    /**
-     * Previous event in result?
-     * @type {SweepEvent}
-     */
-    this.prevInResult = null;
-
-    /**
-     * Does event belong to result?
-     * @type {Boolean}
-     */
-    this.inResult = false;
-
-
-    // connection step
-
-    /**
-     * @type {Boolean}
-     */
-    this.resultInOut = false;
-
-    this.isExteriorRing = true;
-  };
-
-
-  /**
-   * @param{Array.<Number>}p
-   * @return {Boolean}
-   */
-  SweepEvent.prototype.isBelow = function isBelow (p) {
-    var p0 = this.point, p1 = this.otherEvent.point;
-    return this.left
-      ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
-      // signedArea(this.point, this.otherEvent.point, p) > 0 :
-      : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
-      //signedArea(this.otherEvent.point, this.point, p) > 0;
-  };
-
-
-  /**
-   * @param{Array.<Number>}p
-   * @return {Boolean}
-   */
-  SweepEvent.prototype.isAbove = function isAbove (p) {
-    return !this.isBelow(p);
-  };
-
-
-  /**
-   * @return {Boolean}
-   */
-  SweepEvent.prototype.isVertical = function isVertical () {
-    return this.point[0] === this.otherEvent.point[0];
-  };
-
-
-  SweepEvent.prototype.clone = function clone () {
-    var copy = new SweepEvent(
-      this.point, this.left, this.otherEvent, this.isSubject, this.type);
-
-    copy.inResult     = this.inResult;
-    copy.prevInResult = this.prevInResult;
-    copy.isExteriorRing = this.isExteriorRing;
-    copy.inOut        = this.inOut;
-    copy.otherInOut   = this.otherInOut;
-
-    return copy;
-  };
-
-  function equals(p1, p2) {
-    if (p1[0] === p2[0]) {
-      if (p1[1] === p2[1]) {
-        return true;
-      } else {
-        return false;
-      }
-    }
-    return false;
-  }
-
-  // const EPSILON = 1e-9;
-  // const abs = Math.abs;
-  // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
-  // Precision problem.
-  //
-  // module.exports = function equals(p1, p2) {
-  //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
-  // };
-
-  /**
-   * Signed area of the triangle (p0, p1, p2)
-   * @param  {Array.<Number>} p0
-   * @param  {Array.<Number>} p1
-   * @param  {Array.<Number>} p2
-   * @return {Number}
-   */
-  function signedArea(p0, p1, p2) {
-    return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
-  }
-
-  /**
-   * @param  {SweepEvent} e1
-   * @param  {SweepEvent} e2
-   * @return {Number}
-   */
-  function compareEvents(e1, e2) {
-    var p1 = e1.point;
-    var p2 = e2.point;
-
-    // Different x-coordinate
-    if (p1[0] > p2[0]) { return 1; }
-    if (p1[0] < p2[0]) { return -1; }
-
-    // Different points, but same x-coordinate
-    // Event with lower y-coordinate is processed first
-    if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
-
-    return specialCases(e1, e2, p1, p2);
-  }
-
-
-  /* eslint-disable no-unused-vars */
-  function specialCases(e1, e2, p1, p2) {
-    // Same coordinates, but one is a left endpoint and the other is
-    // a right endpoint. The right endpoint is processed first
-    if (e1.left !== e2.left)
-      { return e1.left ? 1 : -1; }
-
-    // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
-    // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
-    // Same coordinates, both events
-    // are left endpoints or right endpoints.
-    // not collinear
-    if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
-      // the event associate to the bottom segment is processed first
-      return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
-    }
-
-    return (!e1.isSubject && e2.isSubject) ? 1 : -1;
-  }
-  /* eslint-enable no-unused-vars */
-
-  /**
-   * @param  {SweepEvent} se
-   * @param  {Array.<Number>} p
-   * @param  {Queue} queue
-   * @return {Queue}
-   */
-  function divideSegment(se, p, queue)  {
-    var r = new SweepEvent(p, false, se,            se.isSubject);
-    var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
-
-    /* eslint-disable no-console */
-    if (equals(se.point, se.otherEvent.point)) {
-
-      console.warn('what is that, a collapsed segment?', se);
-    }
-    /* eslint-enable no-console */
-
-    r.contourId = l.contourId = se.contourId;
-
-    // avoid a rounding error. The left event would be processed after the right event
-    if (compareEvents(l, se.otherEvent) > 0) {
-      se.otherEvent.left = true;
-      l.left = false;
-    }
-
-    // avoid a rounding error. The left event would be processed after the right event
-    // if (compareEvents(se, r) > 0) {}
-
-    se.otherEvent.otherEvent = l;
-    se.otherEvent = r;
-
-    queue.push(l);
-    queue.push(r);
-
-    return queue;
-  }
-
-  //const EPS = 1e-9;
-
-  /**
-   * Finds the magnitude of the cross product of two vectors (if we pretend
-   * they're in three dimensions)
-   *
-   * @param {Object} a First vector
-   * @param {Object} b Second vector
-   * @private
-   * @returns {Number} The magnitude of the cross product
-   */
-  function crossProduct(a, b) {
-    return (a[0] * b[1]) - (a[1] * b[0]);
-  }
-
-  /**
-   * Finds the dot product of two vectors.
-   *
-   * @param {Object} a First vector
-   * @param {Object} b Second vector
-   * @private
-   * @returns {Number} The dot product
-   */
-  function dotProduct(a, b) {
-    return (a[0] * b[0]) + (a[1] * b[1]);
-  }
-
-  /**
-   * Finds the intersection (if any) between two line segments a and b, given the
-   * line segments' end points a1, a2 and b1, b2.
-   *
-   * This algorithm is based on Schneider and Eberly.
-   * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
-   * Page 244.
-   *
-   * @param {Array.<Number>} a1 point of first line
-   * @param {Array.<Number>} a2 point of first line
-   * @param {Array.<Number>} b1 point of second line
-   * @param {Array.<Number>} b2 point of second line
-   * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
-   *                                         (meaning connected segments) as
-   *                                         intersections
-   * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
-   * intersection. If they overlap, the two end points of the overlapping segment.
-   * Otherwise, null.
-   */
-  function intersection (a1, a2, b1, b2, noEndpointTouch) {
-    // The algorithm expects our lines in the form P + sd, where P is a point,
-    // s is on the interval [0, 1], and d is a vector.
-    // We are passed two points. P can be the first point of each pair. The
-    // vector, then, could be thought of as the distance (in x and y components)
-    // from the first point to the second point.
-    // So first, let's make our vectors:
-    var va = [a2[0] - a1[0], a2[1] - a1[1]];
-    var vb = [b2[0] - b1[0], b2[1] - b1[1]];
-    // We also define a function to convert back to regular point form:
-
-    /* eslint-disable arrow-body-style */
-
-    function toPoint(p, s, d) {
-      return [
-        p[0] + s * d[0],
-        p[1] + s * d[1]
-      ];
-    }
-
-    /* eslint-enable arrow-body-style */
-
-    // The rest is pretty much a straight port of the algorithm.
-    var e = [b1[0] - a1[0], b1[1] - a1[1]];
-    var kross    = crossProduct(va, vb);
-    var sqrKross = kross * kross;
-    var sqrLenA  = dotProduct(va, va);
-    //const sqrLenB  = dotProduct(vb, vb);
-
-    // Check for line intersection. This works because of the properties of the
-    // cross product -- specifically, two vectors are parallel if and only if the
-    // cross product is the 0 vector. The full calculation involves relative error
-    // to account for possible very small line segments. See Schneider & Eberly
-    // for details.
-    if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
-      // If they're not parallel, then (because these are line segments) they
-      // still might not actually intersect. This code checks that the
-      // intersection point of the lines is actually on both line segments.
-      var s = crossProduct(e, vb) / kross;
-      if (s < 0 || s > 1) {
-        // not on line segment a
-        return null;
-      }
-      var t = crossProduct(e, va) / kross;
-      if (t < 0 || t > 1) {
-        // not on line segment b
-        return null;
-      }
-      if (s === 0 || s === 1) {
-        // on an endpoint of line segment a
-        return noEndpointTouch ? null : [toPoint(a1, s, va)];
-      }
-      if (t === 0 || t === 1) {
-        // on an endpoint of line segment b
-        return noEndpointTouch ? null : [toPoint(b1, t, vb)];
-      }
-      return [toPoint(a1, s, va)];
-    }
-
-    // If we've reached this point, then the lines are either parallel or the
-    // same, but the segments could overlap partially or fully, or not at all.
-    // So we need to find the overlap, if any. To do that, we can use e, which is
-    // the (vector) difference between the two initial points. If this is parallel
-    // with the line itself, then the two lines are the same line, and there will
-    // be overlap.
-    //const sqrLenE = dotProduct(e, e);
-    kross = crossProduct(e, va);
-    sqrKross = kross * kross;
-
-    if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
-    // Lines are just parallel, not the same. No overlap.
-      return null;
-    }
-
-    var sa = dotProduct(va, e) / sqrLenA;
-    var sb = sa + dotProduct(va, vb) / sqrLenA;
-    var smin = Math.min(sa, sb);
-    var smax = Math.max(sa, sb);
-
-    // this is, essentially, the FindIntersection acting on floats from
-    // Schneider & Eberly, just inlined into this function.
-    if (smin <= 1 && smax >= 0) {
-
-      // overlap on an end point
-      if (smin === 1) {
-        return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
-      }
-
-      if (smax === 0) {
-        return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
-      }
-
-      if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
-
-      // There's overlap on a segment -- two points of intersection. Return both.
-      return [
-        toPoint(a1, smin > 0 ? smin : 0, va),
-        toPoint(a1, smax < 1 ? smax : 1, va)
-      ];
-    }
-
-    return null;
-  }
-
-  /**
-   * @param  {SweepEvent} se1
-   * @param  {SweepEvent} se2
-   * @param  {Queue}      queue
-   * @return {Number}
-   */
-  function possibleIntersection (se1, se2, queue) {
-    // that disallows self-intersecting polygons,
-    // did cost us half a day, so I'll leave it
-    // out of respect
-    // if (se1.isSubject === se2.isSubject) return;
-    var inter = intersection(
-      se1.point, se1.otherEvent.point,
-      se2.point, se2.otherEvent.point
-    );
-
-    var nintersections = inter ? inter.length : 0;
-    if (nintersections === 0) { return 0; } // no intersection
-
-    // the line segments intersect at an endpoint of both line segments
-    if ((nintersections === 1) &&
-        (equals(se1.point, se2.point) ||
-         equals(se1.otherEvent.point, se2.otherEvent.point))) {
-      return 0;
-    }
-
-    if (nintersections === 2 && se1.isSubject === se2.isSubject) {
-      // if(se1.contourId === se2.contourId){
-      // console.warn('Edges of the same polygon overlap',
-      //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
-      // }
-      //throw new Error('Edges of the same polygon overlap');
-      return 0;
-    }
-
-    // The line segments associated to se1 and se2 intersect
-    if (nintersections === 1) {
-
-      // if the intersection point is not an endpoint of se1
-      if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
-        divideSegment(se1, inter[0], queue);
-      }
-
-      // if the intersection point is not an endpoint of se2
-      if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
-        divideSegment(se2, inter[0], queue);
-      }
-      return 1;
-    }
-
-    // The line segments associated to se1 and se2 overlap
-    var events        = [];
-    var leftCoincide  = false;
-    var rightCoincide = false;
-
-    if (equals(se1.point, se2.point)) {
-      leftCoincide = true; // linked
-    } else if (compareEvents(se1, se2) === 1) {
-      events.push(se2, se1);
-    } else {
-      events.push(se1, se2);
-    }
-
-    if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
-      rightCoincide = true;
-    } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
-      events.push(se2.otherEvent, se1.otherEvent);
-    } else {
-      events.push(se1.otherEvent, se2.otherEvent);
-    }
-
-    if ((leftCoincide && rightCoincide) || leftCoincide) {
-      // both line segments are equal or share the left endpoint
-      se2.type = NON_CONTRIBUTING;
-      se1.type = (se2.inOut === se1.inOut)
-        ? SAME_TRANSITION : DIFFERENT_TRANSITION;
-
-      if (leftCoincide && !rightCoincide) {
-        // honestly no idea, but changing events selection from [2, 1]
-        // to [0, 1] fixes the overlapping self-intersecting polygons issue
-        divideSegment(events[1].otherEvent, events[0].point, queue);
-      }
-      return 2;
-    }
-
-    // the line segments share the right endpoint
-    if (rightCoincide) {
-      divideSegment(events[0], events[1].point, queue);
-      return 3;
-    }
-
-    // no line segment includes totally the other one
-    if (events[0] !== events[3].otherEvent) {
-      divideSegment(events[0], events[1].point, queue);
-      divideSegment(events[1], events[2].point, queue);
-      return 3;
-    }
-
-    // one line segment includes the other one
-    divideSegment(events[0], events[1].point, queue);
-    divideSegment(events[3].otherEvent, events[2].point, queue);
-
-    return 3;
-  }
-
-  /**
-   * @param  {SweepEvent} le1
-   * @param  {SweepEvent} le2
-   * @return {Number}
-   */
-  function compareSegments(le1, le2) {
-    if (le1 === le2) { return 0; }
-
-    // Segments are not collinear
-    if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
-      signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
-
-      // If they share their left endpoint use the right endpoint to sort
-      if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
-
-      // Different left endpoint: use the left endpoint to sort
-      if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
-
-      // has the line segment associated to e1 been inserted
-      // into S after the line segment associated to e2 ?
-      if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
-
-      // The line segment associated to e2 has been inserted
-      // into S after the line segment associated to e1
-      return le1.isBelow(le2.point) ? -1 : 1;
-    }
-
-    if (le1.isSubject === le2.isSubject) { // same polygon
-      var p1 = le1.point, p2 = le2.point;
-      if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
-        p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
-        if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
-        else { return le1.contourId > le2.contourId ? 1 : -1; }
-      }
-    } else { // Segments are collinear, but belong to separate polygons
-      return le1.isSubject ? -1 : 1;
-    }
-
-    return compareEvents(le1, le2) === 1 ? 1 : -1;
-  }
-
-  function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
-    var sweepLine = new SplayTree(compareSegments);
-    var sortedEvents = [];
-
-    var rightbound = Math.min(sbbox[2], cbbox[2]);
-
-    var prev, next, begin;
-
-    while (eventQueue.length !== 0) {
-      var event = eventQueue.pop();
-      sortedEvents.push(event);
-
-      // optimization by bboxes for intersection and difference goes here
-      if ((operation === INTERSECTION && event.point[0] > rightbound) ||
-          (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
-        break;
-      }
-
-      if (event.left) {
-        next  = prev = sweepLine.insert(event);
-        begin = sweepLine.minNode();
-
-        if (prev !== begin) { prev = sweepLine.prev(prev); }
-        else                { prev = null; }
-
-        next = sweepLine.next(next);
-
-        var prevEvent = prev ? prev.key : null;
-        var prevprevEvent = (void 0);
-        computeFields(event, prevEvent, operation);
-        if (next) {
-          if (possibleIntersection(event, next.key, eventQueue) === 2) {
-            computeFields(event, prevEvent, operation);
-            computeFields(event, next.key, operation);
-          }
-        }
-
-        if (prev) {
-          if (possibleIntersection(prev.key, event, eventQueue) === 2) {
-            var prevprev = prev;
-            if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
-            else                    { prevprev = null; }
-
-            prevprevEvent = prevprev ? prevprev.key : null;
-            computeFields(prevEvent, prevprevEvent, operation);
-            computeFields(event,     prevEvent,     operation);
-          }
-        }
-      } else {
-        event = event.otherEvent;
-        next = prev = sweepLine.find(event);
-
-        if (prev && next) {
-
-          if (prev !== begin) { prev = sweepLine.prev(prev); }
-          else                { prev = null; }
-
-          next = sweepLine.next(next);
-          sweepLine.remove(event);
-
-          if (next && prev) {
-            possibleIntersection(prev.key, next.key, eventQueue);
-          }
-        }
-      }
-    }
-    return sortedEvents;
-  }
-
-  /**
-   * @param  {Array.<SweepEvent>} sortedEvents
-   * @return {Array.<SweepEvent>}
-   */
-  function orderEvents(sortedEvents) {
-    var event, i, len, tmp;
-    var resultEvents = [];
-    for (i = 0, len = sortedEvents.length; i < len; i++) {
-      event = sortedEvents[i];
-      if ((event.left && event.inResult) ||
-        (!event.left && event.otherEvent.inResult)) {
-        resultEvents.push(event);
-      }
-    }
-    // Due to overlapping edges the resultEvents array can be not wholly sorted
-    var sorted = false;
-    while (!sorted) {
-      sorted = true;
-      for (i = 0, len = resultEvents.length; i < len; i++) {
-        if ((i + 1) < len &&
-          compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
-          tmp = resultEvents[i];
-          resultEvents[i] = resultEvents[i + 1];
-          resultEvents[i + 1] = tmp;
-          sorted = false;
-        }
-      }
-    }
-
-
-    for (i = 0, len = resultEvents.length; i < len; i++) {
-      event = resultEvents[i];
-      event.pos = i;
-    }
-
-    // imagine, the right event is found in the beginning of the queue,
-    // when his left counterpart is not marked yet
-    for (i = 0, len = resultEvents.length; i < len; i++) {
-      event = resultEvents[i];
-      if (!event.left) {
-        tmp = event.pos;
-        event.pos = event.otherEvent.pos;
-        event.otherEvent.pos = tmp;
-      }
-    }
-
-    return resultEvents;
-  }
-
-
-  /**
-   * @param  {Number} pos
-   * @param  {Array.<SweepEvent>} resultEvents
-   * @param  {Object>}    processed
-   * @return {Number}
-   */
-  function nextPos(pos, resultEvents, processed, origIndex) {
-    var p, p1;
-    var newPos = pos + 1;
-    var length = resultEvents.length;
-
-    p  = resultEvents[pos].point;
-
-    if (newPos < length)
-      { p1 = resultEvents[newPos].point; }
-
-
-    // while in range and not the current one by value
-    while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
-      if (!processed[newPos]) {
-        return newPos;
-      } else   {
-        newPos++;
-      }
-      p1 = resultEvents[newPos].point;
-    }
-
-    newPos = pos - 1;
-
-    while (processed[newPos] && newPos >= origIndex) {
-      newPos--;
-    }
-    return newPos;
-  }
-
-
-  /**
-   * @param  {Array.<SweepEvent>} sortedEvents
-   * @return {Array.<*>} polygons
-   */
-  function connectEdges(sortedEvents, operation) {
-    var i, len;
-    var resultEvents = orderEvents(sortedEvents);
-
-    // "false"-filled array
-    var processed = {};
-    var result = [];
-    var event;
-
-    for (i = 0, len = resultEvents.length; i < len; i++) {
-      if (processed[i]) { continue; }
-      var contour = [[]];
-
-      if (!resultEvents[i].isExteriorRing) {
-        if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
-          result.push(contour);
-        } else if (result.length === 0) {
-          result.push([[contour]]);
-        } else {
-          result[result.length - 1].push(contour[0]);
-        }
-      } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
-        result[result.length - 1].push(contour[0]);
-      } else {
-        result.push(contour);
-      }
-
-      var ringId = result.length - 1;
-      var pos = i;
-
-      var initial = resultEvents[i].point;
-      contour[0].push(initial);
-
-      while (pos >= i) {
-        event = resultEvents[pos];
-        processed[pos] = true;
-
-        if (event.left) {
-          event.resultInOut = false;
-          event.contourId   = ringId;
-        } else {
-          event.otherEvent.resultInOut = true;
-          event.otherEvent.contourId   = ringId;
-        }
-
-        pos = event.pos;
-        processed[pos] = true;
-        contour[0].push(resultEvents[pos].point);
-        pos = nextPos(pos, resultEvents, processed, i);
-      }
-
-      pos = pos === -1 ? i : pos;
-
-      event = resultEvents[pos];
-      processed[pos] = processed[event.pos] = true;
-      event.otherEvent.resultInOut = true;
-      event.otherEvent.contourId   = ringId;
-    }
-
-    // Handle if the result is a polygon (eg not multipoly)
-    // Commented it again, let's see what do we mean by that
-    // if (result.length === 1) result = result[0];
-    return result;
-  }
-
-  var tinyqueue = TinyQueue;
-  var default_1 = TinyQueue;
-
-  function TinyQueue(data, compare) {
-      var this$1 = this;
-
-      if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
-
-      this.data = data || [];
-      this.length = this.data.length;
-      this.compare = compare || defaultCompare;
-
-      if (this.length > 0) {
-          for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
-      }
-  }
-
-  function defaultCompare(a, b) {
-      return a < b ? -1 : a > b ? 1 : 0;
-  }
-
-  TinyQueue.prototype = {
-
-      push: function (item) {
-          this.data.push(item);
-          this.length++;
-          this._up(this.length - 1);
-      },
-
-      pop: function () {
-          if (this.length === 0) { return undefined; }
-
-          var top = this.data[0];
-          this.length--;
-
-          if (this.length > 0) {
-              this.data[0] = this.data[this.length];
-              this._down(0);
-          }
-          this.data.pop();
-
-          return top;
-      },
-
-      peek: function () {
-          return this.data[0];
-      },
-
-      _up: function (pos) {
-          var data = this.data;
-          var compare = this.compare;
-          var item = data[pos];
-
-          while (pos > 0) {
-              var parent = (pos - 1) >> 1;
-              var current = data[parent];
-              if (compare(item, current) >= 0) { break; }
-              data[pos] = current;
-              pos = parent;
-          }
-
-          data[pos] = item;
-      },
-
-      _down: function (pos) {
-          var this$1 = this;
-
-          var data = this.data;
-          var compare = this.compare;
-          var halfLength = this.length >> 1;
-          var item = data[pos];
-
-          while (pos < halfLength) {
-              var left = (pos << 1) + 1;
-              var right = left + 1;
-              var best = data[left];
-
-              if (right < this$1.length && compare(data[right], best) < 0) {
-                  left = right;
-                  best = data[right];
-              }
-              if (compare(best, item) >= 0) { break; }
-
-              data[pos] = best;
-              pos = left;
-          }
-
-          data[pos] = item;
-      }
-  };
-  tinyqueue.default = default_1;
-
-  var max = Math.max;
-  var min = Math.min;
-
-  var contourId = 0;
-
-
-  function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
-    var i, len, s1, s2, e1, e2;
-    for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
-      s1 = contourOrHole[i];
-      s2 = contourOrHole[i + 1];
-      e1 = new SweepEvent(s1, false, undefined, isSubject);
-      e2 = new SweepEvent(s2, false, e1,        isSubject);
-      e1.otherEvent = e2;
-
-      if (s1[0] === s2[0] && s1[1] === s2[1]) {
-        continue; // skip collapsed edges, or it breaks
-      }
-
-      e1.contourId = e2.contourId = depth;
-      if (!isExteriorRing) {
-        e1.isExteriorRing = false;
-        e2.isExteriorRing = false;
-      }
-      if (compareEvents(e1, e2) > 0) {
-        e2.left = true;
-      } else {
-        e1.left = true;
-      }
-
-      var x = s1[0], y = s1[1];
-      bbox[0] = min(bbox[0], x);
-      bbox[1] = min(bbox[1], y);
-      bbox[2] = max(bbox[2], x);
-      bbox[3] = max(bbox[3], y);
-
-      // Pushing it so the queue is sorted from left to right,
-      // with object on the left having the highest priority.
-      Q.push(e1);
-      Q.push(e2);
-    }
-  }
-
-
-  function fillQueue(subject, clipping, sbbox, cbbox, operation) {
-    var eventQueue = new tinyqueue(null, compareEvents);
-    var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
-
-    for (i = 0, ii = subject.length; i < ii; i++) {
-      polygonSet = subject[i];
-      for (j = 0, jj = polygonSet.length; j < jj; j++) {
-        isExteriorRing = j === 0;
-        if (isExteriorRing) { contourId++; }
-        processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
-      }
-    }
-
-    for (i = 0, ii = clipping.length; i < ii; i++) {
-      polygonSet = clipping[i];
-      for (j = 0, jj = polygonSet.length; j < jj; j++) {
-        isExteriorRing = j === 0;
-        if (operation === DIFFERENCE) { isExteriorRing = false; }
-        if (isExteriorRing) { contourId++; }
-        processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
-      }
-    }
-
-    return eventQueue;
-  }
-
-  var EMPTY = [];
-
-
-  function trivialOperation(subject, clipping, operation) {
-    var result = null;
-    if (subject.length * clipping.length === 0) {
-      if        (operation === INTERSECTION) {
-        result = EMPTY;
-      } else if (operation === DIFFERENCE) {
-        result = subject;
-      } else if (operation === UNION ||
-                 operation === XOR) {
-        result = (subject.length === 0) ? clipping : subject;
-      }
-    }
-    return result;
-  }
-
-
-  function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
-    var result = null;
-    if (sbbox[0] > cbbox[2] ||
-        cbbox[0] > sbbox[2] ||
-        sbbox[1] > cbbox[3] ||
-        cbbox[1] > sbbox[3]) {
-      if        (operation === INTERSECTION) {
-        result = EMPTY;
-      } else if (operation === DIFFERENCE) {
-        result = subject;
-      } else if (operation === UNION ||
-                 operation === XOR) {
-        result = subject.concat(clipping);
-      }
-    }
-    return result;
-  }
-
-
-  function boolean(subject, clipping, operation) {
-    if (typeof subject[0][0][0] === 'number') {
-      subject = [subject];
-    }
-    if (typeof clipping[0][0][0] === 'number') {
-      clipping = [clipping];
-    }
-    var trivial = trivialOperation(subject, clipping, operation);
-    if (trivial) {
-      return trivial === EMPTY ? null : trivial;
-    }
-    var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
-    var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
-
-    //console.time('fill queue');
-    var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
-    //console.timeEnd('fill queue');
-
-    trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
-    if (trivial) {
-      return trivial === EMPTY ? null : trivial;
-    }
-    //console.time('subdivide edges');
-    var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
-    //console.timeEnd('subdivide edges');
-
-    //console.time('connect vertices');
-    var result = connectEdges(sortedEvents, operation);
-    //console.timeEnd('connect vertices');
-    return result;
-  }
-
-  function union (subject, clipping) {
-    return boolean(subject, clipping, UNION);
-  }
-
-  function diff (subject, clipping) {
-    return boolean(subject, clipping, DIFFERENCE);
-  }
-
-  function xor (subject, clipping){
-    return boolean(subject, clipping, XOR);
-  }
-
-  function intersection$1 (subject, clipping) {
-    return boolean(subject, clipping, INTERSECTION);
-  }
-
-  /**
-   * @enum {Number}
-   */
-  var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
-
-  exports.union = union;
-  exports.diff = diff;
-  exports.xor = xor;
-  exports.intersection = intersection$1;
-  exports.operations = operations;
-
-  Object.defineProperty(exports, '__esModule', { value: true });
-
-})));
-
-
-},{}],23:[function(require,module,exports){
-(function (process){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a
-// copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to permit
-// persons to whom the Software is furnished to do so, subject to the
-// following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
-// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
-// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
-// USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-// resolves . and .. elements in a path array with directory names there
-// must be no slashes, empty elements, or device names (c:\) in the array
-// (so also no leading and trailing slashes - it does not distinguish
-// relative and absolute paths)
-function normalizeArray(parts, allowAboveRoot) {
-  // if the path tries to go above the root, `up` ends up > 0
-  var up = 0;
-  for (var i = parts.length - 1; i >= 0; i--) {
-    var last = parts[i];
-    if (last === '.') {
-      parts.splice(i, 1);
-    } else if (last === '..') {
-      parts.splice(i, 1);
-      up++;
-    } else if (up) {
-      parts.splice(i, 1);
-      up--;
-    }
-  }
-
-  // if the path is allowed to go above the root, restore leading ..s
-  if (allowAboveRoot) {
-    for (; up--; up) {
-      parts.unshift('..');
-    }
-  }
-
-  return parts;
-}
-
-// Split a filename into [root, dir, basename, ext], unix version
-// 'root' is just a slash, or nothing.
-var splitPathRe =
-    /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;
-var splitPath = function(filename) {
-  return splitPathRe.exec(filename).slice(1);
-};
-
-// path.resolve([from ...], to)
-// posix version
-exports.resolve = function() {
-  var resolvedPath = '',
-      resolvedAbsolute = false;
-
-  for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
-    var path = (i >= 0) ? arguments[i] : process.cwd();
-
-    // Skip empty and invalid entries
-    if (typeof path !== 'string') {
-      throw new TypeError('Arguments to path.resolve must be strings');
-    } else if (!path) {
-      continue;
-    }
-
-    resolvedPath = path + '/' + resolvedPath;
-    resolvedAbsolute = path.charAt(0) === '/';
-  }
-
-  // At this point the path should be resolved to a full absolute path, but
-  // handle relative paths to be safe (might happen when process.cwd() fails)
-
-  // Normalize the path
-  resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) {
-    return !!p;
-  }), !resolvedAbsolute).join('/');
-
-  return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.';
-};
-
-// path.normalize(path)
-// posix version
-exports.normalize = function(path) {
-  var isAbsolute = exports.isAbsolute(path),
-      trailingSlash = substr(path, -1) === '/';
-
-  // Normalize the path
-  path = normalizeArray(filter(path.split('/'), function(p) {
-    return !!p;
-  }), !isAbsolute).join('/');
-
-  if (!path && !isAbsolute) {
-    path = '.';
-  }
-  if (path && trailingSlash) {
-    path += '/';
-  }
-
-  return (isAbsolute ? '/' : '') + path;
-};
-
-// posix version
-exports.isAbsolute = function(path) {
-  return path.charAt(0) === '/';
-};
-
-// posix version
-exports.join = function() {
-  var paths = Array.prototype.slice.call(arguments, 0);
-  return exports.normalize(filter(paths, function(p, index) {
-    if (typeof p !== 'string') {
-      throw new TypeError('Arguments to path.join must be strings');
-    }
-    return p;
-  }).join('/'));
-};
-
-
-// path.relative(from, to)
-// posix version
-exports.relative = function(from, to) {
-  from = exports.resolve(from).substr(1);
-  to = exports.resolve(to).substr(1);
-
-  function trim(arr) {
-    var start = 0;
-    for (; start < arr.length; start++) {
-      if (arr[start] !== '') break;
-    }
-
-    var end = arr.length - 1;
-    for (; end >= 0; end--) {
-      if (arr[end] !== '') break;
-    }
-
-    if (start > end) return [];
-    return arr.slice(start, end - start + 1);
-  }
-
-  var fromParts = trim(from.split('/'));
-  var toParts = trim(to.split('/'));
-
-  var length = Math.min(fromParts.length, toParts.length);
-  var samePartsLength = length;
-  for (var i = 0; i < length; i++) {
-    if (fromParts[i] !== toParts[i]) {
-      samePartsLength = i;
-      break;
-    }
-  }
-
-  var outputParts = [];
-  for (var i = samePartsLength; i < fromParts.length; i++) {
-    outputParts.push('..');
-  }
-
-  outputParts = outputParts.concat(toParts.slice(samePartsLength));
-
-  return outputParts.join('/');
-};
-
-exports.sep = '/';
-exports.delimiter = ':';
-
-exports.dirname = function(path) {
-  var result = splitPath(path),
-      root = result[0],
-      dir = result[1];
-
-  if (!root && !dir) {
-    // No dirname whatsoever
-    return '.';
-  }
-
-  if (dir) {
-    // It has a dirname, strip trailing slash
-    dir = dir.substr(0, dir.length - 1);
-  }
-
-  return root + dir;
-};
-
-
-exports.basename = function(path, ext) {
-  var f = splitPath(path)[2];
-  // TODO: make this comparison case-insensitive on windows?
-  if (ext && f.substr(-1 * ext.length) === ext) {
-    f = f.substr(0, f.length - ext.length);
-  }
-  return f;
-};
-
-
-exports.extname = function(path) {
-  return splitPath(path)[3];
-};
-
-function filter (xs, f) {
-    if (xs.filter) return xs.filter(f);
-    var res = [];
-    for (var i = 0; i < xs.length; i++) {
-        if (f(xs[i], i, xs)) res.push(xs[i]);
-    }
-    return res;
-}
-
-// String.prototype.substr - negative index don't work in IE8
-var substr = 'ab'.substr(-1) === 'b'
-    ? function (str, start, len) { return str.substr(start, len) }
-    : function (str, start, len) {
-        if (start < 0) start = str.length + start;
-        return str.substr(start, len);
-    }
-;
-
-}).call(this,require('_process'))
-
-},{"_process":6}],24:[function(require,module,exports){
-'use strict';
-
-module.exports = Pbf;
-
-var ieee754 = require('ieee754');
-
-function Pbf(buf) {
-    this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
-    this.pos = 0;
-    this.type = 0;
-    this.length = this.buf.length;
-}
-
-Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
-Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
-Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
-Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
-
-var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
-    SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
-
-Pbf.prototype = {
-
-    destroy: function() {
-        this.buf = null;
-    },
-
-    // === READING =================================================================
-
-    readFields: function(readField, result, end) {
-        end = end || this.length;
-
-        while (this.pos < end) {
-            var val = this.readVarint(),
-                tag = val >> 3,
-                startPos = this.pos;
-
-            this.type = val & 0x7;
-            readField(tag, result, this);
-
-            if (this.pos === startPos) this.skip(val);
-        }
-        return result;
-    },
-
-    readMessage: function(readField, result) {
-        return this.readFields(readField, result, this.readVarint() + this.pos);
-    },
-
-    readFixed32: function() {
-        var val = readUInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
-
-    readSFixed32: function() {
-        var val = readInt32(this.buf, this.pos);
-        this.pos += 4;
-        return val;
-    },
-
-    // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
-
-    readFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
-
-    readSFixed64: function() {
-        var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
-        this.pos += 8;
-        return val;
-    },
-
-    readFloat: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 23, 4);
-        this.pos += 4;
-        return val;
-    },
-
-    readDouble: function() {
-        var val = ieee754.read(this.buf, this.pos, true, 52, 8);
-        this.pos += 8;
-        return val;
-    },
-
-    readVarint: function(isSigned) {
-        var buf = this.buf,
-            val, b;
-
-        b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
-        b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
-        b = buf[this.pos];   val |= (b & 0x0f) << 28;
-
-        return readVarintRemainder(val, isSigned, this);
-    },
-
-    readVarint64: function() { // for compatibility with v2.0.1
-        return this.readVarint(true);
-    },
-
-    readSVarint: function() {
-        var num = this.readVarint();
-        return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
-    },
-
-    readBoolean: function() {
-        return Boolean(this.readVarint());
-    },
-
-    readString: function() {
-        var end = this.readVarint() + this.pos,
-            str = readUtf8(this.buf, this.pos, end);
-        this.pos = end;
-        return str;
-    },
-
-    readBytes: function() {
-        var end = this.readVarint() + this.pos,
-            buffer = this.buf.subarray(this.pos, end);
-        this.pos = end;
-        return buffer;
-    },
-
-    // verbose for performance reasons; doesn't affect gzipped size
-
-    readPackedVarint: function(arr, isSigned) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readVarint(isSigned));
-        return arr;
-    },
-    readPackedSVarint: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSVarint());
-        return arr;
-    },
-    readPackedBoolean: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readBoolean());
-        return arr;
-    },
-    readPackedFloat: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFloat());
-        return arr;
-    },
-    readPackedDouble: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readDouble());
-        return arr;
-    },
-    readPackedFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed32());
-        return arr;
-    },
-    readPackedSFixed32: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed32());
-        return arr;
-    },
-    readPackedFixed64: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readFixed64());
-        return arr;
-    },
-    readPackedSFixed64: function(arr) {
-        var end = readPackedEnd(this);
-        arr = arr || [];
-        while (this.pos < end) arr.push(this.readSFixed64());
-        return arr;
-    },
-
-    skip: function(val) {
-        var type = val & 0x7;
-        if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
-        else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
-        else if (type === Pbf.Fixed32) this.pos += 4;
-        else if (type === Pbf.Fixed64) this.pos += 8;
-        else throw new Error('Unimplemented type: ' + type);
-    },
-
-    // === WRITING =================================================================
-
-    writeTag: function(tag, type) {
-        this.writeVarint((tag << 3) | type);
-    },
-
-    realloc: function(min) {
-        var length = this.length || 16;
-
-        while (length < this.pos + min) length *= 2;
-
-        if (length !== this.length) {
-            var buf = new Uint8Array(length);
-            buf.set(this.buf);
-            this.buf = buf;
-            this.length = length;
-        }
-    },
-
-    finish: function() {
-        this.length = this.pos;
-        this.pos = 0;
-        return this.buf.subarray(0, this.length);
-    },
-
-    writeFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
-
-    writeSFixed32: function(val) {
-        this.realloc(4);
-        writeInt32(this.buf, val, this.pos);
-        this.pos += 4;
-    },
-
-    writeFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
-
-    writeSFixed64: function(val) {
-        this.realloc(8);
-        writeInt32(this.buf, val & -1, this.pos);
-        writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
-        this.pos += 8;
-    },
-
-    writeVarint: function(val) {
-        val = +val || 0;
-
-        if (val > 0xfffffff || val < 0) {
-            writeBigVarint(val, this);
-            return;
-        }
-
-        this.realloc(4);
-
-        this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
-        this.buf[this.pos++] =   (val >>> 7) & 0x7f;
-    },
-
-    writeSVarint: function(val) {
-        this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
-    },
-
-    writeBoolean: function(val) {
-        this.writeVarint(Boolean(val));
-    },
-
-    writeString: function(str) {
-        str = String(str);
-        this.realloc(str.length * 4);
-
-        this.pos++; // reserve 1 byte for short string length
-
-        var startPos = this.pos;
-        // write the string directly to the buffer and see how much was written
-        this.pos = writeUtf8(this.buf, str, this.pos);
-        var len = this.pos - startPos;
-
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
-
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
-
-    writeFloat: function(val) {
-        this.realloc(4);
-        ieee754.write(this.buf, val, this.pos, true, 23, 4);
-        this.pos += 4;
-    },
-
-    writeDouble: function(val) {
-        this.realloc(8);
-        ieee754.write(this.buf, val, this.pos, true, 52, 8);
-        this.pos += 8;
-    },
-
-    writeBytes: function(buffer) {
-        var len = buffer.length;
-        this.writeVarint(len);
-        this.realloc(len);
-        for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
-    },
-
-    writeRawMessage: function(fn, obj) {
-        this.pos++; // reserve 1 byte for short message length
-
-        // write the message directly to the buffer and see how much was written
-        var startPos = this.pos;
-        fn(obj, this);
-        var len = this.pos - startPos;
-
-        if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
-
-        // finally, write the message length in the reserved place and restore the position
-        this.pos = startPos - 1;
-        this.writeVarint(len);
-        this.pos += len;
-    },
-
-    writeMessage: function(tag, fn, obj) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeRawMessage(fn, obj);
-    },
-
-    writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
-    writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
-    writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
-    writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
-    writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
-    writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
-    writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
-    writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
-    writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
-
-    writeBytesField: function(tag, buffer) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeBytes(buffer);
-    },
-    writeFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFixed32(val);
-    },
-    writeSFixed32Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeSFixed32(val);
-    },
-    writeFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeFixed64(val);
-    },
-    writeSFixed64Field: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeSFixed64(val);
-    },
-    writeVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeVarint(val);
-    },
-    writeSVarintField: function(tag, val) {
-        this.writeTag(tag, Pbf.Varint);
-        this.writeSVarint(val);
-    },
-    writeStringField: function(tag, str) {
-        this.writeTag(tag, Pbf.Bytes);
-        this.writeString(str);
-    },
-    writeFloatField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed32);
-        this.writeFloat(val);
-    },
-    writeDoubleField: function(tag, val) {
-        this.writeTag(tag, Pbf.Fixed64);
-        this.writeDouble(val);
-    },
-    writeBooleanField: function(tag, val) {
-        this.writeVarintField(tag, Boolean(val));
-    }
-};
-
-function readVarintRemainder(l, s, p) {
-    var buf = p.buf,
-        h, b;
-
-    b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
-    b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
-
-    throw new Error('Expected varint not more than 10 bytes');
-}
-
-function readPackedEnd(pbf) {
-    return pbf.type === Pbf.Bytes ?
-        pbf.readVarint() + pbf.pos : pbf.pos + 1;
-}
-
-function toNum(low, high, isSigned) {
-    if (isSigned) {
-        return high * 0x100000000 + (low >>> 0);
-    }
-
-    return ((high >>> 0) * 0x100000000) + (low >>> 0);
-}
-
-function writeBigVarint(val, pbf) {
-    var low, high;
-
-    if (val >= 0) {
-        low  = (val % 0x100000000) | 0;
-        high = (val / 0x100000000) | 0;
-    } else {
-        low  = ~(-val % 0x100000000);
-        high = ~(-val / 0x100000000);
-
-        if (low ^ 0xffffffff) {
-            low = (low + 1) | 0;
-        } else {
-            low = 0;
-            high = (high + 1) | 0;
-        }
-    }
-
-    if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
-        throw new Error('Given varint doesn\'t fit into 10 bytes');
-    }
-
-    pbf.realloc(10);
-
-    writeBigVarintLow(low, high, pbf);
-    writeBigVarintHigh(high, pbf);
-}
-
-function writeBigVarintLow(low, high, pbf) {
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
-    pbf.buf[pbf.pos]   = low & 0x7f;
-}
-
-function writeBigVarintHigh(high, pbf) {
-    var lsb = (high & 0x07) << 4;
-
-    pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
-    pbf.buf[pbf.pos++]  = high & 0x7f;
-}
-
-function makeRoomForExtraLength(startPos, len, pbf) {
-    var extraLen =
-        len <= 0x3fff ? 1 :
-        len <= 0x1fffff ? 2 :
-        len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
-
-    // if 1 byte isn't enough for encoding message length, shift the data to the right
-    pbf.realloc(extraLen);
-    for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
-}
-
-function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
-function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
-function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
-function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
-function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
-function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
-function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
-function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
-function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
-
-// Buffer code below from https://github.com/feross/buffer, MIT-licensed
-
-function readUInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] * 0x1000000);
-}
-
-function writeInt32(buf, val, pos) {
-    buf[pos] = val;
-    buf[pos + 1] = (val >>> 8);
-    buf[pos + 2] = (val >>> 16);
-    buf[pos + 3] = (val >>> 24);
-}
-
-function readInt32(buf, pos) {
-    return ((buf[pos]) |
-        (buf[pos + 1] << 8) |
-        (buf[pos + 2] << 16)) +
-        (buf[pos + 3] << 24);
-}
-
-function readUtf8(buf, pos, end) {
-    var str = '';
-    var i = pos;
-
-    while (i < end) {
-        var b0 = buf[i];
-        var c = null; // codepoint
-        var bytesPerSequence =
-            b0 > 0xEF ? 4 :
-            b0 > 0xDF ? 3 :
-            b0 > 0xBF ? 2 : 1;
-
-        if (i + bytesPerSequence > end) break;
-
-        var b1, b2, b3;
-
-        if (bytesPerSequence === 1) {
-            if (b0 < 0x80) {
-                c = b0;
-            }
-        } else if (bytesPerSequence === 2) {
-            b1 = buf[i + 1];
-            if ((b1 & 0xC0) === 0x80) {
-                c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
-                if (c <= 0x7F) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 3) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
-                if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
-                    c = null;
-                }
-            }
-        } else if (bytesPerSequence === 4) {
-            b1 = buf[i + 1];
-            b2 = buf[i + 2];
-            b3 = buf[i + 3];
-            if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
-                c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
-                if (c <= 0xFFFF || c >= 0x110000) {
-                    c = null;
-                }
-            }
-        }
-
-        if (c === null) {
-            c = 0xFFFD;
-            bytesPerSequence = 1;
-
-        } else if (c > 0xFFFF) {
-            c -= 0x10000;
-            str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
-            c = 0xDC00 | c & 0x3FF;
-        }
-
-        str += String.fromCharCode(c);
-        i += bytesPerSequence;
-    }
-
-    return str;
-}
-
-function writeUtf8(buf, str, pos) {
-    for (var i = 0, c, lead; i < str.length; i++) {
-        c = str.charCodeAt(i); // code point
-
-        if (c > 0xD7FF && c < 0xE000) {
-            if (lead) {
-                if (c < 0xDC00) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                    lead = c;
-                    continue;
-                } else {
-                    c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
-                    lead = null;
-                }
-            } else {
-                if (c > 0xDBFF || (i + 1 === str.length)) {
-                    buf[pos++] = 0xEF;
-                    buf[pos++] = 0xBF;
-                    buf[pos++] = 0xBD;
-                } else {
-                    lead = c;
-                }
-                continue;
-            }
-        } else if (lead) {
-            buf[pos++] = 0xEF;
-            buf[pos++] = 0xBF;
-            buf[pos++] = 0xBD;
-            lead = null;
-        }
-
-        if (c < 0x80) {
-            buf[pos++] = c;
-        } else {
-            if (c < 0x800) {
-                buf[pos++] = c >> 0x6 | 0xC0;
-            } else {
-                if (c < 0x10000) {
-                    buf[pos++] = c >> 0xC | 0xE0;
-                } else {
-                    buf[pos++] = c >> 0x12 | 0xF0;
-                    buf[pos++] = c >> 0xC & 0x3F | 0x80;
-                }
-                buf[pos++] = c >> 0x6 & 0x3F | 0x80;
-            }
-            buf[pos++] = c & 0x3F | 0x80;
-        }
-    }
-    return pos;
-}
-
-},{"ieee754":17}],25:[function(require,module,exports){
-(function (global, factory) {
-       typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-       typeof define === 'function' && define.amd ? define(factory) :
-       (global.quickselect = factory());
-}(this, (function () { 'use strict';
-
-function quickselect(arr, k, left, right, compare) {
-    quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
-}
-
-function quickselectStep(arr, k, left, right, compare) {
-
-    while (right > left) {
-        if (right - left > 600) {
-            var n = right - left + 1;
-            var m = k - left + 1;
-            var z = Math.log(n);
-            var s = 0.5 * Math.exp(2 * z / 3);
-            var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
-            var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
-            var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
-            quickselectStep(arr, k, newLeft, newRight, compare);
-        }
-
-        var t = arr[k];
-        var i = left;
-        var j = right;
-
-        swap(arr, left, k);
-        if (compare(arr[right], t) > 0) swap(arr, left, right);
-
-        while (i < j) {
-            swap(arr, i, j);
-            i++;
-            j--;
-            while (compare(arr[i], t) < 0) i++;
-            while (compare(arr[j], t) > 0) j--;
-        }
-
-        if (compare(arr[left], t) === 0) swap(arr, left, j);
-        else {
-            j++;
-            swap(arr, j, right);
-        }
-
-        if (j <= k) left = j + 1;
-        if (k <= j) right = j - 1;
-    }
-}
-
-function swap(arr, i, j) {
-    var tmp = arr[i];
-    arr[i] = arr[j];
-    arr[j] = tmp;
-}
-
-function defaultCompare(a, b) {
-    return a < b ? -1 : a > b ? 1 : 0;
-}
-
-return quickselect;
-
-})));
-
-},{}],26:[function(require,module,exports){
-'use strict';
-
-module.exports = rbush;
-module.exports.default = rbush;
-
-var quickselect = require('quickselect');
-
-function rbush(maxEntries, format) {
-    if (!(this instanceof rbush)) return new rbush(maxEntries, format);
-
-    // max entries in a node is 9 by default; min node fill is 40% for best performance
-    this._maxEntries = Math.max(4, maxEntries || 9);
-    this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
-
-    if (format) {
-        this._initFormat(format);
-    }
-
-    this.clear();
-}
-
-rbush.prototype = {
-
-    all: function () {
-        return this._all(this.data, []);
-    },
-
-    search: function (bbox) {
-
-        var node = this.data,
-            result = [],
-            toBBox = this.toBBox;
-
-        if (!intersects(bbox, node)) return result;
-
-        var nodesToSearch = [],
-            i, len, child, childBBox;
-
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
-
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
-
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf) result.push(child);
-                    else if (contains(bbox, childBBox)) this._all(child, result);
-                    else nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
-
-        return result;
-    },
-
-    collides: function (bbox) {
-
-        var node = this.data,
-            toBBox = this.toBBox;
-
-        if (!intersects(bbox, node)) return false;
-
-        var nodesToSearch = [],
-            i, len, child, childBBox;
-
-        while (node) {
-            for (i = 0, len = node.children.length; i < len; i++) {
-
-                child = node.children[i];
-                childBBox = node.leaf ? toBBox(child) : child;
-
-                if (intersects(bbox, childBBox)) {
-                    if (node.leaf || contains(bbox, childBBox)) return true;
-                    nodesToSearch.push(child);
-                }
-            }
-            node = nodesToSearch.pop();
-        }
-
-        return false;
-    },
-
-    load: function (data) {
-        if (!(data && data.length)) return this;
-
-        if (data.length < this._minEntries) {
-            for (var i = 0, len = data.length; i < len; i++) {
-                this.insert(data[i]);
-            }
-            return this;
-        }
-
-        // recursively build the tree with the given data from scratch using OMT algorithm
-        var node = this._build(data.slice(), 0, data.length - 1, 0);
-
-        if (!this.data.children.length) {
-            // save as is if tree is empty
-            this.data = node;
-
-        } else if (this.data.height === node.height) {
-            // split root if trees have the same height
-            this._splitRoot(this.data, node);
-
-        } else {
-            if (this.data.height < node.height) {
-                // swap trees if inserted one is bigger
-                var tmpNode = this.data;
-                this.data = node;
-                node = tmpNode;
-            }
-
-            // insert the small tree into the large tree at appropriate level
-            this._insert(node, this.data.height - node.height - 1, true);
-        }
-
-        return this;
-    },
-
-    insert: function (item) {
-        if (item) this._insert(item, this.data.height - 1);
-        return this;
-    },
-
-    clear: function () {
-        this.data = createNode([]);
-        return this;
-    },
-
-    remove: function (item, equalsFn) {
-        if (!item) return this;
-
-        var node = this.data,
-            bbox = this.toBBox(item),
-            path = [],
-            indexes = [],
-            i, parent, index, goingUp;
-
-        // depth-first iterative tree traversal
-        while (node || path.length) {
-
-            if (!node) { // go up
-                node = path.pop();
-                parent = path[path.length - 1];
-                i = indexes.pop();
-                goingUp = true;
-            }
-
-            if (node.leaf) { // check current node
-                index = findItem(item, node.children, equalsFn);
-
-                if (index !== -1) {
-                    // item found, remove the item and condense tree upwards
-                    node.children.splice(index, 1);
-                    path.push(node);
-                    this._condense(path);
-                    return this;
-                }
-            }
-
-            if (!goingUp && !node.leaf && contains(node, bbox)) { // go down
-                path.push(node);
-                indexes.push(i);
-                i = 0;
-                parent = node;
-                node = node.children[0];
-
-            } else if (parent) { // go right
-                i++;
-                node = parent.children[i];
-                goingUp = false;
-
-            } else node = null; // nothing found
-        }
-
-        return this;
-    },
-
-    toBBox: function (item) { return item; },
-
-    compareMinX: compareNodeMinX,
-    compareMinY: compareNodeMinY,
-
-    toJSON: function () { return this.data; },
-
-    fromJSON: function (data) {
-        this.data = data;
-        return this;
-    },
-
-    _all: function (node, result) {
-        var nodesToSearch = [];
-        while (node) {
-            if (node.leaf) result.push.apply(result, node.children);
-            else nodesToSearch.push.apply(nodesToSearch, node.children);
-
-            node = nodesToSearch.pop();
-        }
-        return result;
-    },
-
-    _build: function (items, left, right, height) {
-
-        var N = right - left + 1,
-            M = this._maxEntries,
-            node;
-
-        if (N <= M) {
-            // reached leaf level; return leaf
-            node = createNode(items.slice(left, right + 1));
-            calcBBox(node, this.toBBox);
-            return node;
-        }
-
-        if (!height) {
-            // target height of the bulk-loaded tree
-            height = Math.ceil(Math.log(N) / Math.log(M));
-
-            // target number of root entries to maximize storage utilization
-            M = Math.ceil(N / Math.pow(M, height - 1));
-        }
-
-        node = createNode([]);
-        node.leaf = false;
-        node.height = height;
-
-        // split the items into M mostly square tiles
-
-        var N2 = Math.ceil(N / M),
-            N1 = N2 * Math.ceil(Math.sqrt(M)),
-            i, j, right2, right3;
-
-        multiSelect(items, left, right, N1, this.compareMinX);
-
-        for (i = left; i <= right; i += N1) {
-
-            right2 = Math.min(i + N1 - 1, right);
-
-            multiSelect(items, i, right2, N2, this.compareMinY);
-
-            for (j = i; j <= right2; j += N2) {
-
-                right3 = Math.min(j + N2 - 1, right2);
-
-                // pack each entry recursively
-                node.children.push(this._build(items, j, right3, height - 1));
-            }
-        }
-
-        calcBBox(node, this.toBBox);
-
-        return node;
-    },
-
-    _chooseSubtree: function (bbox, node, level, path) {
-
-        var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
-
-        while (true) {
-            path.push(node);
-
-            if (node.leaf || path.length - 1 === level) break;
-
-            minArea = minEnlargement = Infinity;
-
-            for (i = 0, len = node.children.length; i < len; i++) {
-                child = node.children[i];
-                area = bboxArea(child);
-                enlargement = enlargedArea(bbox, child) - area;
-
-                // choose entry with the least area enlargement
-                if (enlargement < minEnlargement) {
-                    minEnlargement = enlargement;
-                    minArea = area < minArea ? area : minArea;
-                    targetNode = child;
-
-                } else if (enlargement === minEnlargement) {
-                    // otherwise choose one with the smallest area
-                    if (area < minArea) {
-                        minArea = area;
-                        targetNode = child;
-                    }
-                }
-            }
-
-            node = targetNode || node.children[0];
-        }
-
-        return node;
-    },
-
-    _insert: function (item, level, isNode) {
-
-        var toBBox = this.toBBox,
-            bbox = isNode ? item : toBBox(item),
-            insertPath = [];
-
-        // find the best node for accommodating the item, saving all nodes along the path too
-        var node = this._chooseSubtree(bbox, this.data, level, insertPath);
-
-        // put the item into the node
-        node.children.push(item);
-        extend(node, bbox);
-
-        // split on node overflow; propagate upwards if necessary
-        while (level >= 0) {
-            if (insertPath[level].children.length > this._maxEntries) {
-                this._split(insertPath, level);
-                level--;
-            } else break;
-        }
-
-        // adjust bboxes along the insertion path
-        this._adjustParentBBoxes(bbox, insertPath, level);
-    },
-
-    // split overflowed node into two
-    _split: function (insertPath, level) {
-
-        var node = insertPath[level],
-            M = node.children.length,
-            m = this._minEntries;
-
-        this._chooseSplitAxis(node, m, M);
-
-        var splitIndex = this._chooseSplitIndex(node, m, M);
-
-        var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
-        newNode.height = node.height;
-        newNode.leaf = node.leaf;
-
-        calcBBox(node, this.toBBox);
-        calcBBox(newNode, this.toBBox);
-
-        if (level) insertPath[level - 1].children.push(newNode);
-        else this._splitRoot(node, newNode);
-    },
-
-    _splitRoot: function (node, newNode) {
-        // split root node
-        this.data = createNode([node, newNode]);
-        this.data.height = node.height + 1;
-        this.data.leaf = false;
-        calcBBox(this.data, this.toBBox);
-    },
-
-    _chooseSplitIndex: function (node, m, M) {
-
-        var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
-
-        minOverlap = minArea = Infinity;
-
-        for (i = m; i <= M - m; i++) {
-            bbox1 = distBBox(node, 0, i, this.toBBox);
-            bbox2 = distBBox(node, i, M, this.toBBox);
-
-            overlap = intersectionArea(bbox1, bbox2);
-            area = bboxArea(bbox1) + bboxArea(bbox2);
-
-            // choose distribution with minimum overlap
-            if (overlap < minOverlap) {
-                minOverlap = overlap;
-                index = i;
-
-                minArea = area < minArea ? area : minArea;
-
-            } else if (overlap === minOverlap) {
-                // otherwise choose distribution with minimum area
-                if (area < minArea) {
-                    minArea = area;
-                    index = i;
-                }
-            }
-        }
-
-        return index;
-    },
-
-    // sorts node children by the best axis for split
-    _chooseSplitAxis: function (node, m, M) {
-
-        var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
-            compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
-            xMargin = this._allDistMargin(node, m, M, compareMinX),
-            yMargin = this._allDistMargin(node, m, M, compareMinY);
-
-        // if total distributions margin value is minimal for x, sort by minX,
-        // otherwise it's already sorted by minY
-        if (xMargin < yMargin) node.children.sort(compareMinX);
-    },
-
-    // total margin of all possible split distributions where each node is at least m full
-    _allDistMargin: function (node, m, M, compare) {
-
-        node.children.sort(compare);
-
-        var toBBox = this.toBBox,
-            leftBBox = distBBox(node, 0, m, toBBox),
-            rightBBox = distBBox(node, M - m, M, toBBox),
-            margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
-            i, child;
-
-        for (i = m; i < M - m; i++) {
-            child = node.children[i];
-            extend(leftBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(leftBBox);
-        }
-
-        for (i = M - m - 1; i >= m; i--) {
-            child = node.children[i];
-            extend(rightBBox, node.leaf ? toBBox(child) : child);
-            margin += bboxMargin(rightBBox);
-        }
-
-        return margin;
-    },
-
-    _adjustParentBBoxes: function (bbox, path, level) {
-        // adjust bboxes along the given tree path
-        for (var i = level; i >= 0; i--) {
-            extend(path[i], bbox);
-        }
-    },
-
-    _condense: function (path) {
-        // go through the path, removing empty nodes and updating bboxes
-        for (var i = path.length - 1, siblings; i >= 0; i--) {
-            if (path[i].children.length === 0) {
-                if (i > 0) {
-                    siblings = path[i - 1].children;
-                    siblings.splice(siblings.indexOf(path[i]), 1);
-
-                } else this.clear();
-
-            } else calcBBox(path[i], this.toBBox);
-        }
-    },
-
-    _initFormat: function (format) {
-        // data format (minX, minY, maxX, maxY accessors)
-
-        // uses eval-type function compilation instead of just accepting a toBBox function
-        // because the algorithms are very sensitive to sorting functions performance,
-        // so they should be dead simple and without inner calls
-
-        var compareArr = ['return a', ' - b', ';'];
-
-        this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
-        this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
-
-        this.toBBox = new Function('a',
-            'return {minX: a' + format[0] +
-            ', minY: a' + format[1] +
-            ', maxX: a' + format[2] +
-            ', maxY: a' + format[3] + '};');
-    }
-};
-
-function findItem(item, items, equalsFn) {
-    if (!equalsFn) return items.indexOf(item);
-
-    for (var i = 0; i < items.length; i++) {
-        if (equalsFn(item, items[i])) return i;
-    }
-    return -1;
-}
-
-// calculate node's bbox from bboxes of its children
-function calcBBox(node, toBBox) {
-    distBBox(node, 0, node.children.length, toBBox, node);
-}
-
-// min bounding rectangle of node children from k to p-1
-function distBBox(node, k, p, toBBox, destNode) {
-    if (!destNode) destNode = createNode(null);
-    destNode.minX = Infinity;
-    destNode.minY = Infinity;
-    destNode.maxX = -Infinity;
-    destNode.maxY = -Infinity;
-
-    for (var i = k, child; i < p; i++) {
-        child = node.children[i];
-        extend(destNode, node.leaf ? toBBox(child) : child);
-    }
-
-    return destNode;
-}
-
-function extend(a, b) {
-    a.minX = Math.min(a.minX, b.minX);
-    a.minY = Math.min(a.minY, b.minY);
-    a.maxX = Math.max(a.maxX, b.maxX);
-    a.maxY = Math.max(a.maxY, b.maxY);
-    return a;
-}
-
-function compareNodeMinX(a, b) { return a.minX - b.minX; }
-function compareNodeMinY(a, b) { return a.minY - b.minY; }
-
-function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
-function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
-
-function enlargedArea(a, b) {
-    return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
-           (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
-}
-
-function intersectionArea(a, b) {
-    var minX = Math.max(a.minX, b.minX),
-        minY = Math.max(a.minY, b.minY),
-        maxX = Math.min(a.maxX, b.maxX),
-        maxY = Math.min(a.maxY, b.maxY);
-
-    return Math.max(0, maxX - minX) *
-           Math.max(0, maxY - minY);
-}
-
-function contains(a, b) {
-    return a.minX <= b.minX &&
-           a.minY <= b.minY &&
-           b.maxX <= a.maxX &&
-           b.maxY <= a.maxY;
-}
-
-function intersects(a, b) {
-    return b.minX <= a.maxX &&
-           b.minY <= a.maxY &&
-           b.maxX >= a.minX &&
-           b.maxY >= a.minY;
-}
-
-function createNode(children) {
-    return {
-        children: children,
-        height: 1,
-        leaf: true,
-        minX: Infinity,
-        minY: Infinity,
-        maxX: -Infinity,
-        maxY: -Infinity
-    };
-}
-
-// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
-// combines selection algorithm with binary divide & conquer approach
-
-function multiSelect(arr, left, right, n, compare) {
-    var stack = [left, right],
-        mid;
-
-    while (stack.length) {
-        right = stack.pop();
-        left = stack.pop();
-
-        if (right - left <= n) continue;
-
-        mid = left + Math.ceil((right - left) / n / 2) * n;
-        quickselect(arr, mid, left, right, compare);
-
-        stack.push(left, mid, mid, right);
-    }
-}
-
-},{"quickselect":25}],27:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("./internal/Observable");
-exports.Observable = Observable_1.Observable;
-var ConnectableObservable_1 = require("./internal/observable/ConnectableObservable");
-exports.ConnectableObservable = ConnectableObservable_1.ConnectableObservable;
-var groupBy_1 = require("./internal/operators/groupBy");
-exports.GroupedObservable = groupBy_1.GroupedObservable;
-var observable_1 = require("./internal/symbol/observable");
-exports.observable = observable_1.observable;
-var Subject_1 = require("./internal/Subject");
-exports.Subject = Subject_1.Subject;
-var BehaviorSubject_1 = require("./internal/BehaviorSubject");
-exports.BehaviorSubject = BehaviorSubject_1.BehaviorSubject;
-var ReplaySubject_1 = require("./internal/ReplaySubject");
-exports.ReplaySubject = ReplaySubject_1.ReplaySubject;
-var AsyncSubject_1 = require("./internal/AsyncSubject");
-exports.AsyncSubject = AsyncSubject_1.AsyncSubject;
-var asap_1 = require("./internal/scheduler/asap");
-exports.asapScheduler = asap_1.asap;
-var async_1 = require("./internal/scheduler/async");
-exports.asyncScheduler = async_1.async;
-var queue_1 = require("./internal/scheduler/queue");
-exports.queueScheduler = queue_1.queue;
-var animationFrame_1 = require("./internal/scheduler/animationFrame");
-exports.animationFrameScheduler = animationFrame_1.animationFrame;
-var VirtualTimeScheduler_1 = require("./internal/scheduler/VirtualTimeScheduler");
-exports.VirtualTimeScheduler = VirtualTimeScheduler_1.VirtualTimeScheduler;
-exports.VirtualAction = VirtualTimeScheduler_1.VirtualAction;
-var Scheduler_1 = require("./internal/Scheduler");
-exports.Scheduler = Scheduler_1.Scheduler;
-var Subscription_1 = require("./internal/Subscription");
-exports.Subscription = Subscription_1.Subscription;
-var Subscriber_1 = require("./internal/Subscriber");
-exports.Subscriber = Subscriber_1.Subscriber;
-var Notification_1 = require("./internal/Notification");
-exports.Notification = Notification_1.Notification;
-var pipe_1 = require("./internal/util/pipe");
-exports.pipe = pipe_1.pipe;
-var noop_1 = require("./internal/util/noop");
-exports.noop = noop_1.noop;
-var identity_1 = require("./internal/util/identity");
-exports.identity = identity_1.identity;
-var isObservable_1 = require("./internal/util/isObservable");
-exports.isObservable = isObservable_1.isObservable;
-var ArgumentOutOfRangeError_1 = require("./internal/util/ArgumentOutOfRangeError");
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-var EmptyError_1 = require("./internal/util/EmptyError");
-exports.EmptyError = EmptyError_1.EmptyError;
-var ObjectUnsubscribedError_1 = require("./internal/util/ObjectUnsubscribedError");
-exports.ObjectUnsubscribedError = ObjectUnsubscribedError_1.ObjectUnsubscribedError;
-var UnsubscriptionError_1 = require("./internal/util/UnsubscriptionError");
-exports.UnsubscriptionError = UnsubscriptionError_1.UnsubscriptionError;
-var TimeoutError_1 = require("./internal/util/TimeoutError");
-exports.TimeoutError = TimeoutError_1.TimeoutError;
-var bindCallback_1 = require("./internal/observable/bindCallback");
-exports.bindCallback = bindCallback_1.bindCallback;
-var bindNodeCallback_1 = require("./internal/observable/bindNodeCallback");
-exports.bindNodeCallback = bindNodeCallback_1.bindNodeCallback;
-var combineLatest_1 = require("./internal/observable/combineLatest");
-exports.combineLatest = combineLatest_1.combineLatest;
-var concat_1 = require("./internal/observable/concat");
-exports.concat = concat_1.concat;
-var defer_1 = require("./internal/observable/defer");
-exports.defer = defer_1.defer;
-var empty_1 = require("./internal/observable/empty");
-exports.empty = empty_1.empty;
-var forkJoin_1 = require("./internal/observable/forkJoin");
-exports.forkJoin = forkJoin_1.forkJoin;
-var from_1 = require("./internal/observable/from");
-exports.from = from_1.from;
-var fromEvent_1 = require("./internal/observable/fromEvent");
-exports.fromEvent = fromEvent_1.fromEvent;
-var fromEventPattern_1 = require("./internal/observable/fromEventPattern");
-exports.fromEventPattern = fromEventPattern_1.fromEventPattern;
-var generate_1 = require("./internal/observable/generate");
-exports.generate = generate_1.generate;
-var iif_1 = require("./internal/observable/iif");
-exports.iif = iif_1.iif;
-var interval_1 = require("./internal/observable/interval");
-exports.interval = interval_1.interval;
-var merge_1 = require("./internal/observable/merge");
-exports.merge = merge_1.merge;
-var never_1 = require("./internal/observable/never");
-exports.never = never_1.never;
-var of_1 = require("./internal/observable/of");
-exports.of = of_1.of;
-var onErrorResumeNext_1 = require("./internal/observable/onErrorResumeNext");
-exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
-var pairs_1 = require("./internal/observable/pairs");
-exports.pairs = pairs_1.pairs;
-var race_1 = require("./internal/observable/race");
-exports.race = race_1.race;
-var range_1 = require("./internal/observable/range");
-exports.range = range_1.range;
-var throwError_1 = require("./internal/observable/throwError");
-exports.throwError = throwError_1.throwError;
-var timer_1 = require("./internal/observable/timer");
-exports.timer = timer_1.timer;
-var using_1 = require("./internal/observable/using");
-exports.using = using_1.using;
-var zip_1 = require("./internal/observable/zip");
-exports.zip = zip_1.zip;
-var empty_2 = require("./internal/observable/empty");
-exports.EMPTY = empty_2.EMPTY;
-var never_2 = require("./internal/observable/never");
-exports.NEVER = never_2.NEVER;
-var config_1 = require("./internal/config");
-exports.config = config_1.config;
-
-},{"./internal/AsyncSubject":28,"./internal/BehaviorSubject":29,"./internal/Notification":31,"./internal/Observable":32,"./internal/ReplaySubject":35,"./internal/Scheduler":36,"./internal/Subject":37,"./internal/Subscriber":39,"./internal/Subscription":40,"./internal/config":41,"./internal/observable/ConnectableObservable":42,"./internal/observable/bindCallback":44,"./internal/observable/bindNodeCallback":45,"./internal/observable/combineLatest":46,"./internal/observable/concat":47,"./internal/observable/defer":48,"./internal/observable/empty":49,"./internal/observable/forkJoin":50,"./internal/observable/from":51,"./internal/observable/fromEvent":53,"./internal/observable/fromEventPattern":54,"./internal/observable/generate":58,"./internal/observable/iif":59,"./internal/observable/interval":60,"./internal/observable/merge":61,"./internal/observable/never":62,"./internal/observable/of":63,"./internal/observable/onErrorResumeNext":64,"./internal/observable/pairs":65,"./internal/observable/race":66,"./internal/observable/range":67,"./internal/observable/throwError":69,"./internal/observable/timer":70,"./internal/observable/using":71,"./internal/observable/zip":72,"./internal/operators/groupBy":108,"./internal/scheduler/VirtualTimeScheduler":185,"./internal/scheduler/animationFrame":186,"./internal/scheduler/asap":187,"./internal/scheduler/async":188,"./internal/scheduler/queue":189,"./internal/symbol/observable":191,"./internal/util/ArgumentOutOfRangeError":193,"./internal/util/EmptyError":194,"./internal/util/ObjectUnsubscribedError":196,"./internal/util/TimeoutError":197,"./internal/util/UnsubscriptionError":198,"./internal/util/identity":202,"./internal/util/isObservable":211,"./internal/util/noop":214,"./internal/util/pipe":216}],28:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var Subscription_1 = require("./Subscription");
-var AsyncSubject = (function (_super) {
-    __extends(AsyncSubject, _super);
-    function AsyncSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.value = null;
-        _this.hasNext = false;
-        _this.hasCompleted = false;
-        return _this;
-    }
-    AsyncSubject.prototype._subscribe = function (subscriber) {
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.hasCompleted && this.hasNext) {
-            subscriber.next(this.value);
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        return _super.prototype._subscribe.call(this, subscriber);
-    };
-    AsyncSubject.prototype.next = function (value) {
-        if (!this.hasCompleted) {
-            this.value = value;
-            this.hasNext = true;
-        }
-    };
-    AsyncSubject.prototype.error = function (error) {
-        if (!this.hasCompleted) {
-            _super.prototype.error.call(this, error);
-        }
-    };
-    AsyncSubject.prototype.complete = function () {
-        this.hasCompleted = true;
-        if (this.hasNext) {
-            _super.prototype.next.call(this, this.value);
-        }
-        _super.prototype.complete.call(this);
-    };
-    return AsyncSubject;
-}(Subject_1.Subject));
-exports.AsyncSubject = AsyncSubject;
-
-},{"./Subject":37,"./Subscription":40}],29:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var BehaviorSubject = (function (_super) {
-    __extends(BehaviorSubject, _super);
-    function BehaviorSubject(_value) {
-        var _this = _super.call(this) || this;
-        _this._value = _value;
-        return _this;
-    }
-    Object.defineProperty(BehaviorSubject.prototype, "value", {
-        get: function () {
-            return this.getValue();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    BehaviorSubject.prototype._subscribe = function (subscriber) {
-        var subscription = _super.prototype._subscribe.call(this, subscriber);
-        if (subscription && !subscription.closed) {
-            subscriber.next(this._value);
-        }
-        return subscription;
-    };
-    BehaviorSubject.prototype.getValue = function () {
-        if (this.hasError) {
-            throw this.thrownError;
-        }
-        else if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return this._value;
-        }
-    };
-    BehaviorSubject.prototype.next = function (value) {
-        _super.prototype.next.call(this, this._value = value);
-    };
-    return BehaviorSubject;
-}(Subject_1.Subject));
-exports.BehaviorSubject = BehaviorSubject;
-
-},{"./Subject":37,"./util/ObjectUnsubscribedError":196}],30:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("./Subscriber");
-var InnerSubscriber = (function (_super) {
-    __extends(InnerSubscriber, _super);
-    function InnerSubscriber(parent, outerValue, outerIndex) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.outerValue = outerValue;
-        _this.outerIndex = outerIndex;
-        _this.index = 0;
-        return _this;
-    }
-    InnerSubscriber.prototype._next = function (value) {
-        this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this);
-    };
-    InnerSubscriber.prototype._error = function (error) {
-        this.parent.notifyError(error, this);
-        this.unsubscribe();
-    };
-    InnerSubscriber.prototype._complete = function () {
-        this.parent.notifyComplete(this);
-        this.unsubscribe();
-    };
-    return InnerSubscriber;
-}(Subscriber_1.Subscriber));
-exports.InnerSubscriber = InnerSubscriber;
-
-},{"./Subscriber":39}],31:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var empty_1 = require("./observable/empty");
-var of_1 = require("./observable/of");
-var throwError_1 = require("./observable/throwError");
-var Notification = (function () {
-    function Notification(kind, value, error) {
-        this.kind = kind;
-        this.value = value;
-        this.error = error;
-        this.hasValue = kind === 'N';
-    }
-    Notification.prototype.observe = function (observer) {
-        switch (this.kind) {
-            case 'N':
-                return observer.next && observer.next(this.value);
-            case 'E':
-                return observer.error && observer.error(this.error);
-            case 'C':
-                return observer.complete && observer.complete();
-        }
-    };
-    Notification.prototype.do = function (next, error, complete) {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return next && next(this.value);
-            case 'E':
-                return error && error(this.error);
-            case 'C':
-                return complete && complete();
-        }
-    };
-    Notification.prototype.accept = function (nextOrObserver, error, complete) {
-        if (nextOrObserver && typeof nextOrObserver.next === 'function') {
-            return this.observe(nextOrObserver);
-        }
-        else {
-            return this.do(nextOrObserver, error, complete);
-        }
-    };
-    Notification.prototype.toObservable = function () {
-        var kind = this.kind;
-        switch (kind) {
-            case 'N':
-                return of_1.of(this.value);
-            case 'E':
-                return throwError_1.throwError(this.error);
-            case 'C':
-                return empty_1.empty();
-        }
-        throw new Error('unexpected notification kind value');
-    };
-    Notification.createNext = function (value) {
-        if (typeof value !== 'undefined') {
-            return new Notification('N', value);
-        }
-        return Notification.undefinedValueNotification;
-    };
-    Notification.createError = function (err) {
-        return new Notification('E', undefined, err);
-    };
-    Notification.createComplete = function () {
-        return Notification.completeNotification;
-    };
-    Notification.completeNotification = new Notification('C');
-    Notification.undefinedValueNotification = new Notification('N', undefined);
-    return Notification;
-}());
-exports.Notification = Notification;
-
-},{"./observable/empty":49,"./observable/of":63,"./observable/throwError":69}],32:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var canReportError_1 = require("./util/canReportError");
-var toSubscriber_1 = require("./util/toSubscriber");
-var observable_1 = require("../internal/symbol/observable");
-var pipe_1 = require("./util/pipe");
-var config_1 = require("./config");
-var Observable = (function () {
-    function Observable(subscribe) {
-        this._isScalar = false;
-        if (subscribe) {
-            this._subscribe = subscribe;
-        }
-    }
-    Observable.prototype.lift = function (operator) {
-        var observable = new Observable();
-        observable.source = this;
-        observable.operator = operator;
-        return observable;
-    };
-    Observable.prototype.subscribe = function (observerOrNext, error, complete) {
-        var operator = this.operator;
-        var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
-        if (operator) {
-            operator.call(sink, this.source);
-        }
-        else {
-            sink.add(this.source || (config_1.config.useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ?
-                this._subscribe(sink) :
-                this._trySubscribe(sink));
-        }
-        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-            if (sink.syncErrorThrowable) {
-                sink.syncErrorThrowable = false;
-                if (sink.syncErrorThrown) {
-                    throw sink.syncErrorValue;
-                }
-            }
-        }
-        return sink;
-    };
-    Observable.prototype._trySubscribe = function (sink) {
-        try {
-            return this._subscribe(sink);
-        }
-        catch (err) {
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                sink.syncErrorThrown = true;
-                sink.syncErrorValue = err;
-            }
-            if (canReportError_1.canReportError(sink)) {
-                sink.error(err);
-            }
-            else {
-                console.warn(err);
-            }
-        }
-    };
-    Observable.prototype.forEach = function (next, promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var subscription;
-            subscription = _this.subscribe(function (value) {
-                try {
-                    next(value);
-                }
-                catch (err) {
-                    reject(err);
-                    if (subscription) {
-                        subscription.unsubscribe();
-                    }
-                }
-            }, reject, resolve);
-        });
-    };
-    Observable.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        return source && source.subscribe(subscriber);
-    };
-    Observable.prototype[observable_1.observable] = function () {
-        return this;
-    };
-    Observable.prototype.pipe = function () {
-        var operations = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            operations[_i] = arguments[_i];
-        }
-        if (operations.length === 0) {
-            return this;
-        }
-        return pipe_1.pipeFromArray(operations)(this);
-    };
-    Observable.prototype.toPromise = function (promiseCtor) {
-        var _this = this;
-        promiseCtor = getPromiseCtor(promiseCtor);
-        return new promiseCtor(function (resolve, reject) {
-            var value;
-            _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); });
-        });
-    };
-    Observable.create = function (subscribe) {
-        return new Observable(subscribe);
-    };
-    return Observable;
-}());
-exports.Observable = Observable;
-function getPromiseCtor(promiseCtor) {
-    if (!promiseCtor) {
-        promiseCtor = config_1.config.Promise || Promise;
-    }
-    if (!promiseCtor) {
-        throw new Error('no Promise impl found');
-    }
-    return promiseCtor;
-}
-
-},{"../internal/symbol/observable":191,"./config":41,"./util/canReportError":199,"./util/pipe":216,"./util/toSubscriber":223}],33:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var config_1 = require("./config");
-var hostReportError_1 = require("./util/hostReportError");
-exports.empty = {
-    closed: true,
-    next: function (value) { },
-    error: function (err) {
-        if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-            throw err;
-        }
-        else {
-            hostReportError_1.hostReportError(err);
-        }
-    },
-    complete: function () { }
-};
-
-},{"./config":41,"./util/hostReportError":201}],34:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("./Subscriber");
-var OuterSubscriber = (function (_super) {
-    __extends(OuterSubscriber, _super);
-    function OuterSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    OuterSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.destination.error(error);
-    };
-    OuterSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.destination.complete();
-    };
-    return OuterSubscriber;
-}(Subscriber_1.Subscriber));
-exports.OuterSubscriber = OuterSubscriber;
-
-},{"./Subscriber":39}],35:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("./Subject");
-var queue_1 = require("./scheduler/queue");
-var Subscription_1 = require("./Subscription");
-var observeOn_1 = require("./operators/observeOn");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var SubjectSubscription_1 = require("./SubjectSubscription");
-var ReplaySubject = (function (_super) {
-    __extends(ReplaySubject, _super);
-    function ReplaySubject(bufferSize, windowTime, scheduler) {
-        if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-        if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this) || this;
-        _this.scheduler = scheduler;
-        _this._events = [];
-        _this._infiniteTimeWindow = false;
-        _this._bufferSize = bufferSize < 1 ? 1 : bufferSize;
-        _this._windowTime = windowTime < 1 ? 1 : windowTime;
-        if (windowTime === Number.POSITIVE_INFINITY) {
-            _this._infiniteTimeWindow = true;
-            _this.next = _this.nextInfiniteTimeWindow;
-        }
-        else {
-            _this.next = _this.nextTimeWindow;
-        }
-        return _this;
-    }
-    ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) {
-        var _events = this._events;
-        _events.push(value);
-        if (_events.length > this._bufferSize) {
-            _events.shift();
-        }
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype.nextTimeWindow = function (value) {
-        this._events.push(new ReplayEvent(this._getNow(), value));
-        this._trimBufferThenGetEvents();
-        _super.prototype.next.call(this, value);
-    };
-    ReplaySubject.prototype._subscribe = function (subscriber) {
-        var _infiniteTimeWindow = this._infiniteTimeWindow;
-        var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents();
-        var scheduler = this.scheduler;
-        var len = _events.length;
-        var subscription;
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.isStopped || this.hasError) {
-            subscription = Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            subscription = new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-        if (scheduler) {
-            subscriber.add(subscriber = new observeOn_1.ObserveOnSubscriber(subscriber, scheduler));
-        }
-        if (_infiniteTimeWindow) {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i]);
-            }
-        }
-        else {
-            for (var i = 0; i < len && !subscriber.closed; i++) {
-                subscriber.next(_events[i].value);
-            }
-        }
-        if (this.hasError) {
-            subscriber.error(this.thrownError);
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-        }
-        return subscription;
-    };
-    ReplaySubject.prototype._getNow = function () {
-        return (this.scheduler || queue_1.queue).now();
-    };
-    ReplaySubject.prototype._trimBufferThenGetEvents = function () {
-        var now = this._getNow();
-        var _bufferSize = this._bufferSize;
-        var _windowTime = this._windowTime;
-        var _events = this._events;
-        var eventsCount = _events.length;
-        var spliceCount = 0;
-        while (spliceCount < eventsCount) {
-            if ((now - _events[spliceCount].time) < _windowTime) {
-                break;
-            }
-            spliceCount++;
-        }
-        if (eventsCount > _bufferSize) {
-            spliceCount = Math.max(spliceCount, eventsCount - _bufferSize);
-        }
-        if (spliceCount > 0) {
-            _events.splice(0, spliceCount);
-        }
-        return _events;
-    };
-    return ReplaySubject;
-}(Subject_1.Subject));
-exports.ReplaySubject = ReplaySubject;
-var ReplayEvent = (function () {
-    function ReplayEvent(time, value) {
-        this.time = time;
-        this.value = value;
-    }
-    return ReplayEvent;
-}());
-
-},{"./Subject":37,"./SubjectSubscription":38,"./Subscription":40,"./operators/observeOn":123,"./scheduler/queue":189,"./util/ObjectUnsubscribedError":196}],36:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Scheduler = (function () {
-    function Scheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler.now; }
-        this.SchedulerAction = SchedulerAction;
-        this.now = now;
-    }
-    Scheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        return new this.SchedulerAction(this, work).schedule(state, delay);
-    };
-    Scheduler.now = function () { return Date.now(); };
-    return Scheduler;
-}());
-exports.Scheduler = Scheduler;
-
-},{}],37:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("./Observable");
-var Subscriber_1 = require("./Subscriber");
-var Subscription_1 = require("./Subscription");
-var ObjectUnsubscribedError_1 = require("./util/ObjectUnsubscribedError");
-var SubjectSubscription_1 = require("./SubjectSubscription");
-var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
-var SubjectSubscriber = (function (_super) {
-    __extends(SubjectSubscriber, _super);
-    function SubjectSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        return _this;
-    }
-    return SubjectSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SubjectSubscriber = SubjectSubscriber;
-var Subject = (function (_super) {
-    __extends(Subject, _super);
-    function Subject() {
-        var _this = _super.call(this) || this;
-        _this.observers = [];
-        _this.closed = false;
-        _this.isStopped = false;
-        _this.hasError = false;
-        _this.thrownError = null;
-        return _this;
-    }
-    Subject.prototype[rxSubscriber_1.rxSubscriber] = function () {
-        return new SubjectSubscriber(this);
-    };
-    Subject.prototype.lift = function (operator) {
-        var subject = new AnonymousSubject(this, this);
-        subject.operator = operator;
-        return subject;
-    };
-    Subject.prototype.next = function (value) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        if (!this.isStopped) {
-            var observers = this.observers;
-            var len = observers.length;
-            var copy = observers.slice();
-            for (var i = 0; i < len; i++) {
-                copy[i].next(value);
-            }
-        }
-    };
-    Subject.prototype.error = function (err) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.hasError = true;
-        this.thrownError = err;
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].error(err);
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.complete = function () {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        this.isStopped = true;
-        var observers = this.observers;
-        var len = observers.length;
-        var copy = observers.slice();
-        for (var i = 0; i < len; i++) {
-            copy[i].complete();
-        }
-        this.observers.length = 0;
-    };
-    Subject.prototype.unsubscribe = function () {
-        this.isStopped = true;
-        this.closed = true;
-        this.observers = null;
-    };
-    Subject.prototype._trySubscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else {
-            return _super.prototype._trySubscribe.call(this, subscriber);
-        }
-    };
-    Subject.prototype._subscribe = function (subscriber) {
-        if (this.closed) {
-            throw new ObjectUnsubscribedError_1.ObjectUnsubscribedError();
-        }
-        else if (this.hasError) {
-            subscriber.error(this.thrownError);
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else if (this.isStopped) {
-            subscriber.complete();
-            return Subscription_1.Subscription.EMPTY;
-        }
-        else {
-            this.observers.push(subscriber);
-            return new SubjectSubscription_1.SubjectSubscription(this, subscriber);
-        }
-    };
-    Subject.prototype.asObservable = function () {
-        var observable = new Observable_1.Observable();
-        observable.source = this;
-        return observable;
-    };
-    Subject.create = function (destination, source) {
-        return new AnonymousSubject(destination, source);
-    };
-    return Subject;
-}(Observable_1.Observable));
-exports.Subject = Subject;
-var AnonymousSubject = (function (_super) {
-    __extends(AnonymousSubject, _super);
-    function AnonymousSubject(destination, source) {
-        var _this = _super.call(this) || this;
-        _this.destination = destination;
-        _this.source = source;
-        return _this;
-    }
-    AnonymousSubject.prototype.next = function (value) {
-        var destination = this.destination;
-        if (destination && destination.next) {
-            destination.next(value);
-        }
-    };
-    AnonymousSubject.prototype.error = function (err) {
-        var destination = this.destination;
-        if (destination && destination.error) {
-            this.destination.error(err);
-        }
-    };
-    AnonymousSubject.prototype.complete = function () {
-        var destination = this.destination;
-        if (destination && destination.complete) {
-            this.destination.complete();
-        }
-    };
-    AnonymousSubject.prototype._subscribe = function (subscriber) {
-        var source = this.source;
-        if (source) {
-            return this.source.subscribe(subscriber);
-        }
-        else {
-            return Subscription_1.Subscription.EMPTY;
-        }
-    };
-    return AnonymousSubject;
-}(Subject));
-exports.AnonymousSubject = AnonymousSubject;
-
-},{"../internal/symbol/rxSubscriber":192,"./Observable":32,"./SubjectSubscription":38,"./Subscriber":39,"./Subscription":40,"./util/ObjectUnsubscribedError":196}],38:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("./Subscription");
-var SubjectSubscription = (function (_super) {
-    __extends(SubjectSubscription, _super);
-    function SubjectSubscription(subject, subscriber) {
-        var _this = _super.call(this) || this;
-        _this.subject = subject;
-        _this.subscriber = subscriber;
-        _this.closed = false;
-        return _this;
-    }
-    SubjectSubscription.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.closed = true;
-        var subject = this.subject;
-        var observers = subject.observers;
-        this.subject = null;
-        if (!observers || observers.length === 0 || subject.isStopped || subject.closed) {
-            return;
-        }
-        var subscriberIndex = observers.indexOf(this.subscriber);
-        if (subscriberIndex !== -1) {
-            observers.splice(subscriberIndex, 1);
-        }
-    };
-    return SubjectSubscription;
-}(Subscription_1.Subscription));
-exports.SubjectSubscription = SubjectSubscription;
-
-},{"./Subscription":40}],39:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isFunction_1 = require("./util/isFunction");
-var Observer_1 = require("./Observer");
-var Subscription_1 = require("./Subscription");
-var rxSubscriber_1 = require("../internal/symbol/rxSubscriber");
-var config_1 = require("./config");
-var hostReportError_1 = require("./util/hostReportError");
-var Subscriber = (function (_super) {
-    __extends(Subscriber, _super);
-    function Subscriber(destinationOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this.syncErrorValue = null;
-        _this.syncErrorThrown = false;
-        _this.syncErrorThrowable = false;
-        _this.isStopped = false;
-        _this._parentSubscription = null;
-        switch (arguments.length) {
-            case 0:
-                _this.destination = Observer_1.empty;
-                break;
-            case 1:
-                if (!destinationOrNext) {
-                    _this.destination = Observer_1.empty;
-                    break;
-                }
-                if (typeof destinationOrNext === 'object') {
-                    if (destinationOrNext instanceof Subscriber) {
-                        _this.syncErrorThrowable = destinationOrNext.syncErrorThrowable;
-                        _this.destination = destinationOrNext;
-                        destinationOrNext.add(_this);
-                    }
-                    else {
-                        _this.syncErrorThrowable = true;
-                        _this.destination = new SafeSubscriber(_this, destinationOrNext);
-                    }
-                    break;
-                }
-            default:
-                _this.syncErrorThrowable = true;
-                _this.destination = new SafeSubscriber(_this, destinationOrNext, error, complete);
-                break;
-        }
-        return _this;
-    }
-    Subscriber.prototype[rxSubscriber_1.rxSubscriber] = function () { return this; };
-    Subscriber.create = function (next, error, complete) {
-        var subscriber = new Subscriber(next, error, complete);
-        subscriber.syncErrorThrowable = false;
-        return subscriber;
-    };
-    Subscriber.prototype.next = function (value) {
-        if (!this.isStopped) {
-            this._next(value);
-        }
-    };
-    Subscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._error(err);
-        }
-    };
-    Subscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            this.isStopped = true;
-            this._complete();
-        }
-    };
-    Subscriber.prototype.unsubscribe = function () {
-        if (this.closed) {
-            return;
-        }
-        this.isStopped = true;
-        _super.prototype.unsubscribe.call(this);
-    };
-    Subscriber.prototype._next = function (value) {
-        this.destination.next(value);
-    };
-    Subscriber.prototype._error = function (err) {
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    Subscriber.prototype._complete = function () {
-        this.destination.complete();
-        this.unsubscribe();
-    };
-    Subscriber.prototype._unsubscribeAndRecycle = function () {
-        var _a = this, _parent = _a._parent, _parents = _a._parents;
-        this._parent = null;
-        this._parents = null;
-        this.unsubscribe();
-        this.closed = false;
-        this.isStopped = false;
-        this._parent = _parent;
-        this._parents = _parents;
-        this._parentSubscription = null;
-        return this;
-    };
-    return Subscriber;
-}(Subscription_1.Subscription));
-exports.Subscriber = Subscriber;
-var SafeSubscriber = (function (_super) {
-    __extends(SafeSubscriber, _super);
-    function SafeSubscriber(_parentSubscriber, observerOrNext, error, complete) {
-        var _this = _super.call(this) || this;
-        _this._parentSubscriber = _parentSubscriber;
-        var next;
-        var context = _this;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            next = observerOrNext;
-        }
-        else if (observerOrNext) {
-            next = observerOrNext.next;
-            error = observerOrNext.error;
-            complete = observerOrNext.complete;
-            if (observerOrNext !== Observer_1.empty) {
-                context = Object.create(observerOrNext);
-                if (isFunction_1.isFunction(context.unsubscribe)) {
-                    _this.add(context.unsubscribe.bind(context));
-                }
-                context.unsubscribe = _this.unsubscribe.bind(_this);
-            }
-        }
-        _this._context = context;
-        _this._next = next;
-        _this._error = error;
-        _this._complete = complete;
-        return _this;
-    }
-    SafeSubscriber.prototype.next = function (value) {
-        if (!this.isStopped && this._next) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                this.__tryOrUnsub(this._next, value);
-            }
-            else if (this.__tryOrSetError(_parentSubscriber, this._next, value)) {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            var useDeprecatedSynchronousErrorHandling = config_1.config.useDeprecatedSynchronousErrorHandling;
-            if (this._error) {
-                if (!useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(this._error, err);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, this._error, err);
-                    this.unsubscribe();
-                }
-            }
-            else if (!_parentSubscriber.syncErrorThrowable) {
-                this.unsubscribe();
-                if (useDeprecatedSynchronousErrorHandling) {
-                    throw err;
-                }
-                hostReportError_1.hostReportError(err);
-            }
-            else {
-                if (useDeprecatedSynchronousErrorHandling) {
-                    _parentSubscriber.syncErrorValue = err;
-                    _parentSubscriber.syncErrorThrown = true;
-                }
-                else {
-                    hostReportError_1.hostReportError(err);
-                }
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.complete = function () {
-        var _this = this;
-        if (!this.isStopped) {
-            var _parentSubscriber = this._parentSubscriber;
-            if (this._complete) {
-                var wrappedComplete = function () { return _this._complete.call(_this._context); };
-                if (!config_1.config.useDeprecatedSynchronousErrorHandling || !_parentSubscriber.syncErrorThrowable) {
-                    this.__tryOrUnsub(wrappedComplete);
-                    this.unsubscribe();
-                }
-                else {
-                    this.__tryOrSetError(_parentSubscriber, wrappedComplete);
-                    this.unsubscribe();
-                }
-            }
-            else {
-                this.unsubscribe();
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrUnsub = function (fn, value) {
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            this.unsubscribe();
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                throw err;
-            }
-            else {
-                hostReportError_1.hostReportError(err);
-            }
-        }
-    };
-    SafeSubscriber.prototype.__tryOrSetError = function (parent, fn, value) {
-        if (!config_1.config.useDeprecatedSynchronousErrorHandling) {
-            throw new Error('bad call');
-        }
-        try {
-            fn.call(this._context, value);
-        }
-        catch (err) {
-            if (config_1.config.useDeprecatedSynchronousErrorHandling) {
-                parent.syncErrorValue = err;
-                parent.syncErrorThrown = true;
-                return true;
-            }
-            else {
-                hostReportError_1.hostReportError(err);
-                return true;
-            }
-        }
-        return false;
-    };
-    SafeSubscriber.prototype._unsubscribe = function () {
-        var _parentSubscriber = this._parentSubscriber;
-        this._context = null;
-        this._parentSubscriber = null;
-        _parentSubscriber.unsubscribe();
-    };
-    return SafeSubscriber;
-}(Subscriber));
-exports.SafeSubscriber = SafeSubscriber;
-
-},{"../internal/symbol/rxSubscriber":192,"./Observer":33,"./Subscription":40,"./config":41,"./util/hostReportError":201,"./util/isFunction":206}],40:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("./util/isArray");
-var isObject_1 = require("./util/isObject");
-var isFunction_1 = require("./util/isFunction");
-var tryCatch_1 = require("./util/tryCatch");
-var errorObject_1 = require("./util/errorObject");
-var UnsubscriptionError_1 = require("./util/UnsubscriptionError");
-var Subscription = (function () {
-    function Subscription(unsubscribe) {
-        this.closed = false;
-        this._parent = null;
-        this._parents = null;
-        this._subscriptions = null;
-        if (unsubscribe) {
-            this._unsubscribe = unsubscribe;
-        }
-    }
-    Subscription.prototype.unsubscribe = function () {
-        var hasErrors = false;
-        var errors;
-        if (this.closed) {
-            return;
-        }
-        var _a = this, _parent = _a._parent, _parents = _a._parents, _unsubscribe = _a._unsubscribe, _subscriptions = _a._subscriptions;
-        this.closed = true;
-        this._parent = null;
-        this._parents = null;
-        this._subscriptions = null;
-        var index = -1;
-        var len = _parents ? _parents.length : 0;
-        while (_parent) {
-            _parent.remove(this);
-            _parent = ++index < len && _parents[index] || null;
-        }
-        if (isFunction_1.isFunction(_unsubscribe)) {
-            var trial = tryCatch_1.tryCatch(_unsubscribe).call(this);
-            if (trial === errorObject_1.errorObject) {
-                hasErrors = true;
-                errors = errors || (errorObject_1.errorObject.e instanceof UnsubscriptionError_1.UnsubscriptionError ?
-                    flattenUnsubscriptionErrors(errorObject_1.errorObject.e.errors) : [errorObject_1.errorObject.e]);
-            }
-        }
-        if (isArray_1.isArray(_subscriptions)) {
-            index = -1;
-            len = _subscriptions.length;
-            while (++index < len) {
-                var sub = _subscriptions[index];
-                if (isObject_1.isObject(sub)) {
-                    var trial = tryCatch_1.tryCatch(sub.unsubscribe).call(sub);
-                    if (trial === errorObject_1.errorObject) {
-                        hasErrors = true;
-                        errors = errors || [];
-                        var err = errorObject_1.errorObject.e;
-                        if (err instanceof UnsubscriptionError_1.UnsubscriptionError) {
-                            errors = errors.concat(flattenUnsubscriptionErrors(err.errors));
-                        }
-                        else {
-                            errors.push(err);
-                        }
-                    }
-                }
-            }
-        }
-        if (hasErrors) {
-            throw new UnsubscriptionError_1.UnsubscriptionError(errors);
-        }
-    };
-    Subscription.prototype.add = function (teardown) {
-        if (!teardown || (teardown === Subscription.EMPTY)) {
-            return Subscription.EMPTY;
-        }
-        if (teardown === this) {
-            return this;
-        }
-        var subscription = teardown;
-        switch (typeof teardown) {
-            case 'function':
-                subscription = new Subscription(teardown);
-            case 'object':
-                if (subscription.closed || typeof subscription.unsubscribe !== 'function') {
-                    return subscription;
-                }
-                else if (this.closed) {
-                    subscription.unsubscribe();
-                    return subscription;
-                }
-                else if (typeof subscription._addParent !== 'function') {
-                    var tmp = subscription;
-                    subscription = new Subscription();
-                    subscription._subscriptions = [tmp];
-                }
-                break;
-            default:
-                throw new Error('unrecognized teardown ' + teardown + ' added to Subscription.');
-        }
-        var subscriptions = this._subscriptions || (this._subscriptions = []);
-        subscriptions.push(subscription);
-        subscription._addParent(this);
-        return subscription;
-    };
-    Subscription.prototype.remove = function (subscription) {
-        var subscriptions = this._subscriptions;
-        if (subscriptions) {
-            var subscriptionIndex = subscriptions.indexOf(subscription);
-            if (subscriptionIndex !== -1) {
-                subscriptions.splice(subscriptionIndex, 1);
-            }
-        }
-    };
-    Subscription.prototype._addParent = function (parent) {
-        var _a = this, _parent = _a._parent, _parents = _a._parents;
-        if (!_parent || _parent === parent) {
-            this._parent = parent;
-        }
-        else if (!_parents) {
-            this._parents = [parent];
-        }
-        else if (_parents.indexOf(parent) === -1) {
-            _parents.push(parent);
-        }
-    };
-    Subscription.EMPTY = (function (empty) {
-        empty.closed = true;
-        return empty;
-    }(new Subscription()));
-    return Subscription;
-}());
-exports.Subscription = Subscription;
-function flattenUnsubscriptionErrors(errors) {
-    return errors.reduce(function (errs, err) { return errs.concat((err instanceof UnsubscriptionError_1.UnsubscriptionError) ? err.errors : err); }, []);
-}
-
-},{"./util/UnsubscriptionError":198,"./util/errorObject":200,"./util/isArray":203,"./util/isFunction":206,"./util/isObject":210,"./util/tryCatch":224}],41:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var _enable_super_gross_mode_that_will_cause_bad_things = false;
-exports.config = {
-    Promise: undefined,
-    set useDeprecatedSynchronousErrorHandling(value) {
-        if (value) {
-            var error = new Error();
-            console.warn('DEPRECATED! RxJS was set to use deprecated synchronous error handling behavior by code at: \n' + error.stack);
-        }
-        else if (_enable_super_gross_mode_that_will_cause_bad_things) {
-            console.log('RxJS: Back to a better error behavior. Thank you. <3');
-        }
-        _enable_super_gross_mode_that_will_cause_bad_things = value;
-    },
-    get useDeprecatedSynchronousErrorHandling() {
-        return _enable_super_gross_mode_that_will_cause_bad_things;
-    },
-};
-
-},{}],42:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var Observable_1 = require("../Observable");
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-var refCount_1 = require("../operators/refCount");
-var ConnectableObservable = (function (_super) {
-    __extends(ConnectableObservable, _super);
-    function ConnectableObservable(source, subjectFactory) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subjectFactory = subjectFactory;
-        _this._refCount = 0;
-        _this._isComplete = false;
-        return _this;
-    }
-    ConnectableObservable.prototype._subscribe = function (subscriber) {
-        return this.getSubject().subscribe(subscriber);
-    };
-    ConnectableObservable.prototype.getSubject = function () {
-        var subject = this._subject;
-        if (!subject || subject.isStopped) {
-            this._subject = this.subjectFactory();
-        }
-        return this._subject;
-    };
-    ConnectableObservable.prototype.connect = function () {
-        var connection = this._connection;
-        if (!connection) {
-            this._isComplete = false;
-            connection = this._connection = new Subscription_1.Subscription();
-            connection.add(this.source
-                .subscribe(new ConnectableSubscriber(this.getSubject(), this)));
-            if (connection.closed) {
-                this._connection = null;
-                connection = Subscription_1.Subscription.EMPTY;
-            }
-            else {
-                this._connection = connection;
-            }
-        }
-        return connection;
-    };
-    ConnectableObservable.prototype.refCount = function () {
-        return refCount_1.refCount()(this);
-    };
-    return ConnectableObservable;
-}(Observable_1.Observable));
-exports.ConnectableObservable = ConnectableObservable;
-var connectableProto = ConnectableObservable.prototype;
-exports.connectableObservableDescriptor = {
-    operator: { value: null },
-    _refCount: { value: 0, writable: true },
-    _subject: { value: null, writable: true },
-    _connection: { value: null, writable: true },
-    _subscribe: { value: connectableProto._subscribe },
-    _isComplete: { value: connectableProto._isComplete, writable: true },
-    getSubject: { value: connectableProto.getSubject },
-    connect: { value: connectableProto.connect },
-    refCount: { value: connectableProto.refCount }
-};
-var ConnectableSubscriber = (function (_super) {
-    __extends(ConnectableSubscriber, _super);
-    function ConnectableSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    ConnectableSubscriber.prototype._error = function (err) {
-        this._unsubscribe();
-        _super.prototype._error.call(this, err);
-    };
-    ConnectableSubscriber.prototype._complete = function () {
-        this.connectable._isComplete = true;
-        this._unsubscribe();
-        _super.prototype._complete.call(this);
-    };
-    ConnectableSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (connectable) {
-            this.connectable = null;
-            var connection = connectable._connection;
-            connectable._refCount = 0;
-            connectable._subject = null;
-            connectable._connection = null;
-            if (connection) {
-                connection.unsubscribe();
-            }
-        }
-    };
-    return ConnectableSubscriber;
-}(Subject_1.SubjectSubscriber));
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Observable":32,"../Subject":37,"../Subscriber":39,"../Subscription":40,"../operators/refCount":134}],43:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var asap_1 = require("../scheduler/asap");
-var isNumeric_1 = require("../util/isNumeric");
-var SubscribeOnObservable = (function (_super) {
-    __extends(SubscribeOnObservable, _super);
-    function SubscribeOnObservable(source, delayTime, scheduler) {
-        if (delayTime === void 0) { delayTime = 0; }
-        if (scheduler === void 0) { scheduler = asap_1.asap; }
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.delayTime = delayTime;
-        _this.scheduler = scheduler;
-        if (!isNumeric_1.isNumeric(delayTime) || delayTime < 0) {
-            _this.delayTime = 0;
-        }
-        if (!scheduler || typeof scheduler.schedule !== 'function') {
-            _this.scheduler = asap_1.asap;
-        }
-        return _this;
-    }
-    SubscribeOnObservable.create = function (source, delay, scheduler) {
-        if (delay === void 0) { delay = 0; }
-        if (scheduler === void 0) { scheduler = asap_1.asap; }
-        return new SubscribeOnObservable(source, delay, scheduler);
-    };
-    SubscribeOnObservable.dispatch = function (arg) {
-        var source = arg.source, subscriber = arg.subscriber;
-        return this.add(source.subscribe(subscriber));
-    };
-    SubscribeOnObservable.prototype._subscribe = function (subscriber) {
-        var delay = this.delayTime;
-        var source = this.source;
-        var scheduler = this.scheduler;
-        return scheduler.schedule(SubscribeOnObservable.dispatch, delay, {
-            source: source, subscriber: subscriber
-        });
-    };
-    return SubscribeOnObservable;
-}(Observable_1.Observable));
-exports.SubscribeOnObservable = SubscribeOnObservable;
-
-},{"../Observable":32,"../scheduler/asap":187,"../util/isNumeric":209}],44:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var AsyncSubject_1 = require("../AsyncSubject");
-var map_1 = require("../operators/map");
-var canReportError_1 = require("../util/canReportError");
-var isArray_1 = require("../util/isArray");
-var isScheduler_1 = require("../util/isScheduler");
-function bindCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler_1.isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var context = this;
-        var subject;
-        var params = {
-            context: context,
-            subject: subject,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-        };
-        return new Observable_1.Observable(function (subscriber) {
-            if (!scheduler) {
-                if (!subject) {
-                    subject = new AsyncSubject_1.AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError_1.canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                var state = {
-                    args: args, subscriber: subscriber, params: params,
-                };
-                return scheduler.schedule(dispatch, 0, state);
-            }
-        });
-    };
-}
-exports.bindCallback = bindCallback;
-function dispatch(state) {
-    var _this = this;
-    var self = this;
-    var args = state.args, subscriber = state.subscriber, params = state.params;
-    var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject_1.AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-            _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            subject.error(err);
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(state) {
-    var value = state.value, subject = state.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(state) {
-    var err = state.err, subject = state.subject;
-    subject.error(err);
-}
-
-},{"../AsyncSubject":28,"../Observable":32,"../operators/map":112,"../util/canReportError":199,"../util/isArray":203,"../util/isScheduler":213}],45:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var AsyncSubject_1 = require("../AsyncSubject");
-var map_1 = require("../operators/map");
-var canReportError_1 = require("../util/canReportError");
-var isScheduler_1 = require("../util/isScheduler");
-var isArray_1 = require("../util/isArray");
-function bindNodeCallback(callbackFunc, resultSelector, scheduler) {
-    if (resultSelector) {
-        if (isScheduler_1.isScheduler(resultSelector)) {
-            scheduler = resultSelector;
-        }
-        else {
-            return function () {
-                var args = [];
-                for (var _i = 0; _i < arguments.length; _i++) {
-                    args[_i] = arguments[_i];
-                }
-                return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-            };
-        }
-    }
-    return function () {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        var params = {
-            subject: undefined,
-            args: args,
-            callbackFunc: callbackFunc,
-            scheduler: scheduler,
-            context: this,
-        };
-        return new Observable_1.Observable(function (subscriber) {
-            var context = params.context;
-            var subject = params.subject;
-            if (!scheduler) {
-                if (!subject) {
-                    subject = params.subject = new AsyncSubject_1.AsyncSubject();
-                    var handler = function () {
-                        var innerArgs = [];
-                        for (var _i = 0; _i < arguments.length; _i++) {
-                            innerArgs[_i] = arguments[_i];
-                        }
-                        var err = innerArgs.shift();
-                        if (err) {
-                            subject.error(err);
-                            return;
-                        }
-                        subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs);
-                        subject.complete();
-                    };
-                    try {
-                        callbackFunc.apply(context, args.concat([handler]));
-                    }
-                    catch (err) {
-                        if (canReportError_1.canReportError(subject)) {
-                            subject.error(err);
-                        }
-                        else {
-                            console.warn(err);
-                        }
-                    }
-                }
-                return subject.subscribe(subscriber);
-            }
-            else {
-                return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context });
-            }
-        });
-    };
-}
-exports.bindNodeCallback = bindNodeCallback;
-function dispatch(state) {
-    var _this = this;
-    var params = state.params, subscriber = state.subscriber, context = state.context;
-    var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler;
-    var subject = params.subject;
-    if (!subject) {
-        subject = params.subject = new AsyncSubject_1.AsyncSubject();
-        var handler = function () {
-            var innerArgs = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                innerArgs[_i] = arguments[_i];
-            }
-            var err = innerArgs.shift();
-            if (err) {
-                _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-            }
-            else {
-                var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs;
-                _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject }));
-            }
-        };
-        try {
-            callbackFunc.apply(context, args.concat([handler]));
-        }
-        catch (err) {
-            this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject }));
-        }
-    }
-    this.add(subject.subscribe(subscriber));
-}
-function dispatchNext(arg) {
-    var value = arg.value, subject = arg.subject;
-    subject.next(value);
-    subject.complete();
-}
-function dispatchError(arg) {
-    var err = arg.err, subject = arg.subject;
-    subject.error(err);
-}
-
-},{"../AsyncSubject":28,"../Observable":32,"../operators/map":112,"../util/canReportError":199,"../util/isArray":203,"../util/isScheduler":213}],46:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isScheduler_1 = require("../util/isScheduler");
-var isArray_1 = require("../util/isArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var fromArray_1 = require("./fromArray");
-var NONE = {};
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = null;
-    var scheduler = null;
-    if (isScheduler_1.isScheduler(observables[observables.length - 1])) {
-        scheduler = observables.pop();
-    }
-    if (typeof observables[observables.length - 1] === 'function') {
-        resultSelector = observables.pop();
-    }
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0];
-    }
-    return fromArray_1.fromArray(observables, scheduler).lift(new CombineLatestOperator(resultSelector));
-}
-exports.combineLatest = combineLatest;
-var CombineLatestOperator = (function () {
-    function CombineLatestOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    CombineLatestOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector));
-    };
-    return CombineLatestOperator;
-}());
-exports.CombineLatestOperator = CombineLatestOperator;
-var CombineLatestSubscriber = (function (_super) {
-    __extends(CombineLatestSubscriber, _super);
-    function CombineLatestSubscriber(destination, resultSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.resultSelector = resultSelector;
-        _this.active = 0;
-        _this.values = [];
-        _this.observables = [];
-        return _this;
-    }
-    CombineLatestSubscriber.prototype._next = function (observable) {
-        this.values.push(NONE);
-        this.observables.push(observable);
-    };
-    CombineLatestSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            this.active = len;
-            this.toRespond = len;
-            for (var i = 0; i < len; i++) {
-                var observable = observables[i];
-                this.add(subscribeToResult_1.subscribeToResult(this, observable, observable, i));
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyComplete = function (unused) {
-        if ((this.active -= 1) === 0) {
-            this.destination.complete();
-        }
-    };
-    CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var values = this.values;
-        var oldVal = values[outerIndex];
-        var toRespond = !this.toRespond
-            ? 0
-            : oldVal === NONE ? --this.toRespond : this.toRespond;
-        values[outerIndex] = innerValue;
-        if (toRespond === 0) {
-            if (this.resultSelector) {
-                this._tryResultSelector(values);
-            }
-            else {
-                this.destination.next(values.slice());
-            }
-        }
-    };
-    CombineLatestSubscriber.prototype._tryResultSelector = function (values) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, values);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return CombineLatestSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.CombineLatestSubscriber = CombineLatestSubscriber;
-
-},{"../OuterSubscriber":34,"../util/isArray":203,"../util/isScheduler":213,"../util/subscribeToResult":222,"./fromArray":52}],47:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isScheduler_1 = require("../util/isScheduler");
-var of_1 = require("./of");
-var from_1 = require("./from");
-var concatAll_1 = require("../operators/concatAll");
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    if (observables.length === 1 || (observables.length === 2 && isScheduler_1.isScheduler(observables[1]))) {
-        return from_1.from(observables[0]);
-    }
-    return concatAll_1.concatAll()(of_1.of.apply(void 0, observables));
-}
-exports.concat = concat;
-
-},{"../operators/concatAll":84,"../util/isScheduler":213,"./from":51,"./of":63}],48:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var empty_1 = require("./empty");
-function defer(observableFactory) {
-    return new Observable_1.Observable(function (subscriber) {
-        var input;
-        try {
-            input = observableFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = input ? from_1.from(input) : empty_1.empty();
-        return source.subscribe(subscriber);
-    });
-}
-exports.defer = defer;
-
-},{"../Observable":32,"./empty":49,"./from":51}],49:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-exports.EMPTY = new Observable_1.Observable(function (subscriber) { return subscriber.complete(); });
-function empty(scheduler) {
-    return scheduler ? emptyScheduled(scheduler) : exports.EMPTY;
-}
-exports.empty = empty;
-function emptyScheduled(scheduler) {
-    return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); });
-}
-exports.emptyScheduled = emptyScheduled;
-
-},{"../Observable":32}],50:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var empty_1 = require("./empty");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var map_1 = require("../operators/map");
-function forkJoin() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    var resultSelector;
-    if (typeof sources[sources.length - 1] === 'function') {
-        resultSelector = sources.pop();
-    }
-    if (sources.length === 1 && isArray_1.isArray(sources[0])) {
-        sources = sources[0];
-    }
-    if (sources.length === 0) {
-        return empty_1.EMPTY;
-    }
-    if (resultSelector) {
-        return forkJoin(sources).pipe(map_1.map(function (args) { return resultSelector.apply(void 0, args); }));
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        return new ForkJoinSubscriber(subscriber, sources);
-    });
-}
-exports.forkJoin = forkJoin;
-var ForkJoinSubscriber = (function (_super) {
-    __extends(ForkJoinSubscriber, _super);
-    function ForkJoinSubscriber(destination, sources) {
-        var _this = _super.call(this, destination) || this;
-        _this.sources = sources;
-        _this.completed = 0;
-        _this.haveValues = 0;
-        var len = sources.length;
-        _this.values = new Array(len);
-        for (var i = 0; i < len; i++) {
-            var source = sources[i];
-            var innerSubscription = subscribeToResult_1.subscribeToResult(_this, source, null, i);
-            if (innerSubscription) {
-                _this.add(innerSubscription);
-            }
-        }
-        return _this;
-    }
-    ForkJoinSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        if (!innerSub._hasValue) {
-            innerSub._hasValue = true;
-            this.haveValues++;
-        }
-    };
-    ForkJoinSubscriber.prototype.notifyComplete = function (innerSub) {
-        var _a = this, destination = _a.destination, haveValues = _a.haveValues, values = _a.values;
-        var len = values.length;
-        if (!innerSub._hasValue) {
-            destination.complete();
-            return;
-        }
-        this.completed++;
-        if (this.completed !== len) {
-            return;
-        }
-        if (haveValues === len) {
-            destination.next(values);
-        }
-        destination.complete();
-    };
-    return ForkJoinSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../Observable":32,"../OuterSubscriber":34,"../operators/map":112,"../util/isArray":203,"../util/subscribeToResult":222,"./empty":49}],51:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isPromise_1 = require("../util/isPromise");
-var isArrayLike_1 = require("../util/isArrayLike");
-var isInteropObservable_1 = require("../util/isInteropObservable");
-var isIterable_1 = require("../util/isIterable");
-var fromArray_1 = require("./fromArray");
-var fromPromise_1 = require("./fromPromise");
-var fromIterable_1 = require("./fromIterable");
-var fromObservable_1 = require("./fromObservable");
-var subscribeTo_1 = require("../util/subscribeTo");
-function from(input, scheduler) {
-    if (!scheduler) {
-        if (input instanceof Observable_1.Observable) {
-            return input;
-        }
-        return new Observable_1.Observable(subscribeTo_1.subscribeTo(input));
-    }
-    if (input != null) {
-        if (isInteropObservable_1.isInteropObservable(input)) {
-            return fromObservable_1.fromObservable(input, scheduler);
-        }
-        else if (isPromise_1.isPromise(input)) {
-            return fromPromise_1.fromPromise(input, scheduler);
-        }
-        else if (isArrayLike_1.isArrayLike(input)) {
-            return fromArray_1.fromArray(input, scheduler);
-        }
-        else if (isIterable_1.isIterable(input) || typeof input === 'string') {
-            return fromIterable_1.fromIterable(input, scheduler);
-        }
-    }
-    throw new TypeError((input !== null && typeof input || input) + ' is not observable');
-}
-exports.from = from;
-
-},{"../Observable":32,"../util/isArrayLike":204,"../util/isInteropObservable":207,"../util/isIterable":208,"../util/isPromise":212,"../util/subscribeTo":217,"./fromArray":52,"./fromIterable":55,"./fromObservable":56,"./fromPromise":57}],52:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var subscribeToArray_1 = require("../util/subscribeToArray");
-function fromArray(input, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToArray_1.subscribeToArray(input));
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) {
-            var sub = new Subscription_1.Subscription();
-            var i = 0;
-            sub.add(scheduler.schedule(function () {
-                if (i === input.length) {
-                    subscriber.complete();
-                    return;
-                }
-                subscriber.next(input[i++]);
-                if (!subscriber.closed) {
-                    sub.add(this.schedule());
-                }
-            }));
-            return sub;
-        });
-    }
-}
-exports.fromArray = fromArray;
-
-},{"../Observable":32,"../Subscription":40,"../util/subscribeToArray":218}],53:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var isFunction_1 = require("../util/isFunction");
-var map_1 = require("../operators/map");
-var toString = Object.prototype.toString;
-function fromEvent(target, eventName, options, resultSelector) {
-    if (isFunction_1.isFunction(options)) {
-        resultSelector = options;
-        options = undefined;
-    }
-    if (resultSelector) {
-        return fromEvent(target, eventName, options).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        function handler(e) {
-            if (arguments.length > 1) {
-                subscriber.next(Array.prototype.slice.call(arguments));
-            }
-            else {
-                subscriber.next(e);
-            }
-        }
-        setupSubscription(target, eventName, handler, subscriber, options);
-    });
-}
-exports.fromEvent = fromEvent;
-function setupSubscription(sourceObj, eventName, handler, subscriber, options) {
-    var unsubscribe;
-    if (isEventTarget(sourceObj)) {
-        var source_1 = sourceObj;
-        sourceObj.addEventListener(eventName, handler, options);
-        unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); };
-    }
-    else if (isJQueryStyleEventEmitter(sourceObj)) {
-        var source_2 = sourceObj;
-        sourceObj.on(eventName, handler);
-        unsubscribe = function () { return source_2.off(eventName, handler); };
-    }
-    else if (isNodeStyleEventEmitter(sourceObj)) {
-        var source_3 = sourceObj;
-        sourceObj.addListener(eventName, handler);
-        unsubscribe = function () { return source_3.removeListener(eventName, handler); };
-    }
-    else if (sourceObj && sourceObj.length) {
-        for (var i = 0, len = sourceObj.length; i < len; i++) {
-            setupSubscription(sourceObj[i], eventName, handler, subscriber, options);
-        }
-    }
-    else {
-        throw new TypeError('Invalid event target');
-    }
-    subscriber.add(unsubscribe);
-}
-function isNodeStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function';
-}
-function isJQueryStyleEventEmitter(sourceObj) {
-    return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function';
-}
-function isEventTarget(sourceObj) {
-    return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function';
-}
-
-},{"../Observable":32,"../operators/map":112,"../util/isArray":203,"../util/isFunction":206}],54:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isArray_1 = require("../util/isArray");
-var isFunction_1 = require("../util/isFunction");
-var map_1 = require("../operators/map");
-function fromEventPattern(addHandler, removeHandler, resultSelector) {
-    if (resultSelector) {
-        return fromEventPattern(addHandler, removeHandler).pipe(map_1.map(function (args) { return isArray_1.isArray(args) ? resultSelector.apply(void 0, args) : resultSelector(args); }));
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var handler = function () {
-            var e = [];
-            for (var _i = 0; _i < arguments.length; _i++) {
-                e[_i] = arguments[_i];
-            }
-            return subscriber.next(e.length === 1 ? e[0] : e);
-        };
-        var retValue;
-        try {
-            retValue = addHandler(handler);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!isFunction_1.isFunction(removeHandler)) {
-            return undefined;
-        }
-        return function () { return removeHandler(handler, retValue); };
-    });
-}
-exports.fromEventPattern = fromEventPattern;
-
-},{"../Observable":32,"../operators/map":112,"../util/isArray":203,"../util/isFunction":206}],55:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var iterator_1 = require("../symbol/iterator");
-var subscribeToIterable_1 = require("../util/subscribeToIterable");
-function fromIterable(input, scheduler) {
-    if (!input) {
-        throw new Error('Iterable cannot be null');
-    }
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToIterable_1.subscribeToIterable(input));
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) {
-            var sub = new Subscription_1.Subscription();
-            var iterator;
-            sub.add(function () {
-                if (iterator && typeof iterator.return === 'function') {
-                    iterator.return();
-                }
-            });
-            sub.add(scheduler.schedule(function () {
-                iterator = input[iterator_1.iterator]();
-                sub.add(scheduler.schedule(function () {
-                    if (subscriber.closed) {
-                        return;
-                    }
-                    var value;
-                    var done;
-                    try {
-                        var result = iterator.next();
-                        value = result.value;
-                        done = result.done;
-                    }
-                    catch (err) {
-                        subscriber.error(err);
-                        return;
-                    }
-                    if (done) {
-                        subscriber.complete();
-                    }
-                    else {
-                        subscriber.next(value);
-                        this.schedule();
-                    }
-                }));
-            }));
-            return sub;
-        });
-    }
-}
-exports.fromIterable = fromIterable;
-
-},{"../Observable":32,"../Subscription":40,"../symbol/iterator":190,"../util/subscribeToIterable":219}],56:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var observable_1 = require("../symbol/observable");
-var subscribeToObservable_1 = require("../util/subscribeToObservable");
-function fromObservable(input, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToObservable_1.subscribeToObservable(input));
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) {
-            var sub = new Subscription_1.Subscription();
-            sub.add(scheduler.schedule(function () {
-                var observable = input[observable_1.observable]();
-                sub.add(observable.subscribe({
-                    next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); },
-                    error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); },
-                    complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); },
-                }));
-            }));
-            return sub;
-        });
-    }
-}
-exports.fromObservable = fromObservable;
-
-},{"../Observable":32,"../Subscription":40,"../symbol/observable":191,"../util/subscribeToObservable":220}],57:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-var subscribeToPromise_1 = require("../util/subscribeToPromise");
-function fromPromise(input, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(subscribeToPromise_1.subscribeToPromise(input));
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) {
-            var sub = new Subscription_1.Subscription();
-            sub.add(scheduler.schedule(function () { return input.then(function (value) {
-                sub.add(scheduler.schedule(function () {
-                    subscriber.next(value);
-                    sub.add(scheduler.schedule(function () { return subscriber.complete(); }));
-                }));
-            }, function (err) {
-                sub.add(scheduler.schedule(function () { return subscriber.error(err); }));
-            }); }));
-            return sub;
-        });
-    }
-}
-exports.fromPromise = fromPromise;
-
-},{"../Observable":32,"../Subscription":40,"../util/subscribeToPromise":221}],58:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var identity_1 = require("../util/identity");
-var isScheduler_1 = require("../util/isScheduler");
-function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) {
-    var resultSelector;
-    var initialState;
-    if (arguments.length == 1) {
-        var options = initialStateOrOptions;
-        initialState = options.initialState;
-        condition = options.condition;
-        iterate = options.iterate;
-        resultSelector = options.resultSelector || identity_1.identity;
-        scheduler = options.scheduler;
-    }
-    else if (resultSelectorOrObservable === undefined || isScheduler_1.isScheduler(resultSelectorOrObservable)) {
-        initialState = initialStateOrOptions;
-        resultSelector = identity_1.identity;
-        scheduler = resultSelectorOrObservable;
-    }
-    else {
-        initialState = initialStateOrOptions;
-        resultSelector = resultSelectorOrObservable;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var state = initialState;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                subscriber: subscriber,
-                iterate: iterate,
-                condition: condition,
-                resultSelector: resultSelector,
-                state: state
-            });
-        }
-        do {
-            if (condition) {
-                var conditionResult = void 0;
-                try {
-                    conditionResult = condition(state);
-                }
-                catch (err) {
-                    subscriber.error(err);
-                    return undefined;
-                }
-                if (!conditionResult) {
-                    subscriber.complete();
-                    break;
-                }
-            }
-            var value = void 0;
-            try {
-                value = resultSelector(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-            subscriber.next(value);
-            if (subscriber.closed) {
-                break;
-            }
-            try {
-                state = iterate(state);
-            }
-            catch (err) {
-                subscriber.error(err);
-                return undefined;
-            }
-        } while (true);
-        return undefined;
-    });
-}
-exports.generate = generate;
-function dispatch(state) {
-    var subscriber = state.subscriber, condition = state.condition;
-    if (subscriber.closed) {
-        return undefined;
-    }
-    if (state.needIterate) {
-        try {
-            state.state = state.iterate(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-    }
-    else {
-        state.needIterate = true;
-    }
-    if (condition) {
-        var conditionResult = void 0;
-        try {
-            conditionResult = condition(state.state);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        if (!conditionResult) {
-            subscriber.complete();
-            return undefined;
-        }
-        if (subscriber.closed) {
-            return undefined;
-        }
-    }
-    var value;
-    try {
-        value = state.resultSelector(state.state);
-    }
-    catch (err) {
-        subscriber.error(err);
-        return undefined;
-    }
-    if (subscriber.closed) {
-        return undefined;
-    }
-    subscriber.next(value);
-    if (subscriber.closed) {
-        return undefined;
-    }
-    return this.schedule(state);
-}
-
-},{"../Observable":32,"../util/identity":202,"../util/isScheduler":213}],59:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var defer_1 = require("./defer");
-var empty_1 = require("./empty");
-function iif(condition, trueResult, falseResult) {
-    if (trueResult === void 0) { trueResult = empty_1.EMPTY; }
-    if (falseResult === void 0) { falseResult = empty_1.EMPTY; }
-    return defer_1.defer(function () { return condition() ? trueResult : falseResult; });
-}
-exports.iif = iif;
-
-},{"./defer":48,"./empty":49}],60:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var async_1 = require("../scheduler/async");
-var isNumeric_1 = require("../util/isNumeric");
-function interval(period, scheduler) {
-    if (period === void 0) { period = 0; }
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    if (!isNumeric_1.isNumeric(period) || period < 0) {
-        period = 0;
-    }
-    if (!scheduler || typeof scheduler.schedule !== 'function') {
-        scheduler = async_1.async;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period }));
-        return subscriber;
-    });
-}
-exports.interval = interval;
-function dispatch(state) {
-    var subscriber = state.subscriber, counter = state.counter, period = state.period;
-    subscriber.next(counter);
-    this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period);
-}
-
-},{"../Observable":32,"../scheduler/async":188,"../util/isNumeric":209}],61:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var isScheduler_1 = require("../util/isScheduler");
-var mergeAll_1 = require("../operators/mergeAll");
-var fromArray_1 = require("./fromArray");
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var concurrent = Number.POSITIVE_INFINITY;
-    var scheduler = null;
-    var last = observables[observables.length - 1];
-    if (isScheduler_1.isScheduler(last)) {
-        scheduler = observables.pop();
-        if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') {
-            concurrent = observables.pop();
-        }
-    }
-    else if (typeof last === 'number') {
-        concurrent = observables.pop();
-    }
-    if (scheduler === null && observables.length === 1 && observables[0] instanceof Observable_1.Observable) {
-        return observables[0];
-    }
-    return mergeAll_1.mergeAll(concurrent)(fromArray_1.fromArray(observables, scheduler));
-}
-exports.merge = merge;
-
-},{"../Observable":32,"../operators/mergeAll":117,"../util/isScheduler":213,"./fromArray":52}],62:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var noop_1 = require("../util/noop");
-exports.NEVER = new Observable_1.Observable(noop_1.noop);
-function never() {
-    return exports.NEVER;
-}
-exports.never = never;
-
-},{"../Observable":32,"../util/noop":214}],63:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isScheduler_1 = require("../util/isScheduler");
-var fromArray_1 = require("./fromArray");
-var empty_1 = require("./empty");
-var scalar_1 = require("./scalar");
-function of() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    var scheduler = args[args.length - 1];
-    if (isScheduler_1.isScheduler(scheduler)) {
-        args.pop();
-    }
-    else {
-        scheduler = undefined;
-    }
-    switch (args.length) {
-        case 0:
-            return empty_1.empty(scheduler);
-        case 1:
-            return scheduler ? fromArray_1.fromArray(args, scheduler) : scalar_1.scalar(args[0]);
-        default:
-            return fromArray_1.fromArray(args, scheduler);
-    }
-}
-exports.of = of;
-
-},{"../util/isScheduler":213,"./empty":49,"./fromArray":52,"./scalar":68}],64:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var isArray_1 = require("../util/isArray");
-var empty_1 = require("./empty");
-function onErrorResumeNext() {
-    var sources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        sources[_i] = arguments[_i];
-    }
-    if (sources.length === 0) {
-        return empty_1.EMPTY;
-    }
-    var first = sources[0], remainder = sources.slice(1);
-    if (sources.length === 1 && isArray_1.isArray(first)) {
-        return onErrorResumeNext.apply(void 0, first);
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); };
-        return from_1.from(first).subscribe({
-            next: function (value) { subscriber.next(value); },
-            error: subNext,
-            complete: subNext,
-        });
-    });
-}
-exports.onErrorResumeNext = onErrorResumeNext;
-
-},{"../Observable":32,"../util/isArray":203,"./empty":49,"./from":51}],65:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var Subscription_1 = require("../Subscription");
-function pairs(obj, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            for (var i = 0; i < keys.length && !subscriber.closed; i++) {
-                var key = keys[i];
-                if (obj.hasOwnProperty(key)) {
-                    subscriber.next([key, obj[key]]);
-                }
-            }
-            subscriber.complete();
-        });
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) {
-            var keys = Object.keys(obj);
-            var subscription = new Subscription_1.Subscription();
-            subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj }));
-            return subscription;
-        });
-    }
-}
-exports.pairs = pairs;
-function dispatch(state) {
-    var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj;
-    if (!subscriber.closed) {
-        if (index < keys.length) {
-            var key = keys[index];
-            subscriber.next([key, obj[key]]);
-            subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj }));
-        }
-        else {
-            subscriber.complete();
-        }
-    }
-}
-exports.dispatch = dispatch;
-
-},{"../Observable":32,"../Subscription":40}],66:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var fromArray_1 = require("./fromArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    if (observables.length === 1) {
-        if (isArray_1.isArray(observables[0])) {
-            observables = observables[0];
-        }
-        else {
-            return observables[0];
-        }
-    }
-    return fromArray_1.fromArray(observables, undefined).lift(new RaceOperator());
-}
-exports.race = race;
-var RaceOperator = (function () {
-    function RaceOperator() {
-    }
-    RaceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RaceSubscriber(subscriber));
-    };
-    return RaceOperator;
-}());
-exports.RaceOperator = RaceOperator;
-var RaceSubscriber = (function (_super) {
-    __extends(RaceSubscriber, _super);
-    function RaceSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasFirst = false;
-        _this.observables = [];
-        _this.subscriptions = [];
-        return _this;
-    }
-    RaceSubscriber.prototype._next = function (observable) {
-        this.observables.push(observable);
-    };
-    RaceSubscriber.prototype._complete = function () {
-        var observables = this.observables;
-        var len = observables.length;
-        if (len === 0) {
-            this.destination.complete();
-        }
-        else {
-            for (var i = 0; i < len && !this.hasFirst; i++) {
-                var observable = observables[i];
-                var subscription = subscribeToResult_1.subscribeToResult(this, observable, observable, i);
-                if (this.subscriptions) {
-                    this.subscriptions.push(subscription);
-                }
-                this.add(subscription);
-            }
-            this.observables = null;
-        }
-    };
-    RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (!this.hasFirst) {
-            this.hasFirst = true;
-            for (var i = 0; i < this.subscriptions.length; i++) {
-                if (i !== outerIndex) {
-                    var subscription = this.subscriptions[i];
-                    subscription.unsubscribe();
-                    this.remove(subscription);
-                }
-            }
-            this.subscriptions = null;
-        }
-        this.destination.next(innerValue);
-    };
-    return RaceSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.RaceSubscriber = RaceSubscriber;
-
-},{"../OuterSubscriber":34,"../util/isArray":203,"../util/subscribeToResult":222,"./fromArray":52}],67:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function range(start, count, scheduler) {
-    if (start === void 0) { start = 0; }
-    if (count === void 0) { count = 0; }
-    return new Observable_1.Observable(function (subscriber) {
-        var index = 0;
-        var current = start;
-        if (scheduler) {
-            return scheduler.schedule(dispatch, 0, {
-                index: index, count: count, start: start, subscriber: subscriber
-            });
-        }
-        else {
-            do {
-                if (index++ >= count) {
-                    subscriber.complete();
-                    break;
-                }
-                subscriber.next(current++);
-                if (subscriber.closed) {
-                    break;
-                }
-            } while (true);
-        }
-        return undefined;
-    });
-}
-exports.range = range;
-function dispatch(state) {
-    var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber;
-    if (index >= count) {
-        subscriber.complete();
-        return;
-    }
-    subscriber.next(start);
-    if (subscriber.closed) {
-        return;
-    }
-    state.index = index + 1;
-    state.start = start + 1;
-    this.schedule(state);
-}
-exports.dispatch = dispatch;
-
-},{"../Observable":32}],68:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function scalar(value) {
-    var result = new Observable_1.Observable(function (subscriber) {
-        subscriber.next(value);
-        subscriber.complete();
-    });
-    result._isScalar = true;
-    result.value = value;
-    return result;
-}
-exports.scalar = scalar;
-
-},{"../Observable":32}],69:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function throwError(error, scheduler) {
-    if (!scheduler) {
-        return new Observable_1.Observable(function (subscriber) { return subscriber.error(error); });
-    }
-    else {
-        return new Observable_1.Observable(function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); });
-    }
-}
-exports.throwError = throwError;
-function dispatch(_a) {
-    var error = _a.error, subscriber = _a.subscriber;
-    subscriber.error(error);
-}
-
-},{"../Observable":32}],70:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var async_1 = require("../scheduler/async");
-var isNumeric_1 = require("../util/isNumeric");
-var isScheduler_1 = require("../util/isScheduler");
-function timer(dueTime, periodOrScheduler, scheduler) {
-    if (dueTime === void 0) { dueTime = 0; }
-    var period = -1;
-    if (isNumeric_1.isNumeric(periodOrScheduler)) {
-        period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler);
-    }
-    else if (isScheduler_1.isScheduler(periodOrScheduler)) {
-        scheduler = periodOrScheduler;
-    }
-    if (!isScheduler_1.isScheduler(scheduler)) {
-        scheduler = async_1.async;
-    }
-    return new Observable_1.Observable(function (subscriber) {
-        var due = isNumeric_1.isNumeric(dueTime)
-            ? dueTime
-            : (+dueTime - scheduler.now());
-        return scheduler.schedule(dispatch, due, {
-            index: 0, period: period, subscriber: subscriber
-        });
-    });
-}
-exports.timer = timer;
-function dispatch(state) {
-    var index = state.index, period = state.period, subscriber = state.subscriber;
-    subscriber.next(index);
-    if (subscriber.closed) {
-        return;
-    }
-    else if (period === -1) {
-        return subscriber.complete();
-    }
-    state.index = index + 1;
-    this.schedule(state, period);
-}
-
-},{"../Observable":32,"../scheduler/async":188,"../util/isNumeric":209,"../util/isScheduler":213}],71:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var from_1 = require("./from");
-var empty_1 = require("./empty");
-function using(resourceFactory, observableFactory) {
-    return new Observable_1.Observable(function (subscriber) {
-        var resource;
-        try {
-            resource = resourceFactory();
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var result;
-        try {
-            result = observableFactory(resource);
-        }
-        catch (err) {
-            subscriber.error(err);
-            return undefined;
-        }
-        var source = result ? from_1.from(result) : empty_1.EMPTY;
-        var subscription = source.subscribe(subscriber);
-        return function () {
-            subscription.unsubscribe();
-            if (resource) {
-                resource.unsubscribe();
-            }
-        };
-    });
-}
-exports.using = using;
-
-},{"../Observable":32,"./empty":49,"./from":51}],72:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var fromArray_1 = require("./fromArray");
-var isArray_1 = require("../util/isArray");
-var Subscriber_1 = require("../Subscriber");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var iterator_1 = require("../../internal/symbol/iterator");
-function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var resultSelector = observables[observables.length - 1];
-    if (typeof resultSelector === 'function') {
-        observables.pop();
-    }
-    return fromArray_1.fromArray(observables, undefined).lift(new ZipOperator(resultSelector));
-}
-exports.zip = zip;
-var ZipOperator = (function () {
-    function ZipOperator(resultSelector) {
-        this.resultSelector = resultSelector;
-    }
-    ZipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector));
-    };
-    return ZipOperator;
-}());
-exports.ZipOperator = ZipOperator;
-var ZipSubscriber = (function (_super) {
-    __extends(ZipSubscriber, _super);
-    function ZipSubscriber(destination, resultSelector, values) {
-        if (values === void 0) { values = Object.create(null); }
-        var _this = _super.call(this, destination) || this;
-        _this.iterators = [];
-        _this.active = 0;
-        _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null;
-        _this.values = values;
-        return _this;
-    }
-    ZipSubscriber.prototype._next = function (value) {
-        var iterators = this.iterators;
-        if (isArray_1.isArray(value)) {
-            iterators.push(new StaticArrayIterator(value));
-        }
-        else if (typeof value[iterator_1.iterator] === 'function') {
-            iterators.push(new StaticIterator(value[iterator_1.iterator]()));
-        }
-        else {
-            iterators.push(new ZipBufferIterator(this.destination, this, value));
-        }
-    };
-    ZipSubscriber.prototype._complete = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        this.unsubscribe();
-        if (len === 0) {
-            this.destination.complete();
-            return;
-        }
-        this.active = len;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (iterator.stillUnsubscribed) {
-                var destination = this.destination;
-                destination.add(iterator.subscribe(iterator, i));
-            }
-            else {
-                this.active--;
-            }
-        }
-    };
-    ZipSubscriber.prototype.notifyInactive = function () {
-        this.active--;
-        if (this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    ZipSubscriber.prototype.checkIterators = function () {
-        var iterators = this.iterators;
-        var len = iterators.length;
-        var destination = this.destination;
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) {
-                return;
-            }
-        }
-        var shouldComplete = false;
-        var args = [];
-        for (var i = 0; i < len; i++) {
-            var iterator = iterators[i];
-            var result = iterator.next();
-            if (iterator.hasCompleted()) {
-                shouldComplete = true;
-            }
-            if (result.done) {
-                destination.complete();
-                return;
-            }
-            args.push(result.value);
-        }
-        if (this.resultSelector) {
-            this._tryresultSelector(args);
-        }
-        else {
-            destination.next(args);
-        }
-        if (shouldComplete) {
-            destination.complete();
-        }
-    };
-    ZipSubscriber.prototype._tryresultSelector = function (args) {
-        var result;
-        try {
-            result = this.resultSelector.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return ZipSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ZipSubscriber = ZipSubscriber;
-var StaticIterator = (function () {
-    function StaticIterator(iterator) {
-        this.iterator = iterator;
-        this.nextResult = iterator.next();
-    }
-    StaticIterator.prototype.hasValue = function () {
-        return true;
-    };
-    StaticIterator.prototype.next = function () {
-        var result = this.nextResult;
-        this.nextResult = this.iterator.next();
-        return result;
-    };
-    StaticIterator.prototype.hasCompleted = function () {
-        var nextResult = this.nextResult;
-        return nextResult && nextResult.done;
-    };
-    return StaticIterator;
-}());
-var StaticArrayIterator = (function () {
-    function StaticArrayIterator(array) {
-        this.array = array;
-        this.index = 0;
-        this.length = 0;
-        this.length = array.length;
-    }
-    StaticArrayIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    StaticArrayIterator.prototype.next = function (value) {
-        var i = this.index++;
-        var array = this.array;
-        return i < this.length ? { value: array[i], done: false } : { value: null, done: true };
-    };
-    StaticArrayIterator.prototype.hasValue = function () {
-        return this.array.length > this.index;
-    };
-    StaticArrayIterator.prototype.hasCompleted = function () {
-        return this.array.length === this.index;
-    };
-    return StaticArrayIterator;
-}());
-var ZipBufferIterator = (function (_super) {
-    __extends(ZipBufferIterator, _super);
-    function ZipBufferIterator(destination, parent, observable) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        _this.observable = observable;
-        _this.stillUnsubscribed = true;
-        _this.buffer = [];
-        _this.isComplete = false;
-        return _this;
-    }
-    ZipBufferIterator.prototype[iterator_1.iterator] = function () {
-        return this;
-    };
-    ZipBufferIterator.prototype.next = function () {
-        var buffer = this.buffer;
-        if (buffer.length === 0 && this.isComplete) {
-            return { value: null, done: true };
-        }
-        else {
-            return { value: buffer.shift(), done: false };
-        }
-    };
-    ZipBufferIterator.prototype.hasValue = function () {
-        return this.buffer.length > 0;
-    };
-    ZipBufferIterator.prototype.hasCompleted = function () {
-        return this.buffer.length === 0 && this.isComplete;
-    };
-    ZipBufferIterator.prototype.notifyComplete = function () {
-        if (this.buffer.length > 0) {
-            this.isComplete = true;
-            this.parent.notifyInactive();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.buffer.push(innerValue);
-        this.parent.checkIterators();
-    };
-    ZipBufferIterator.prototype.subscribe = function (value, index) {
-        return subscribeToResult_1.subscribeToResult(this, this.observable, this, index);
-    };
-    return ZipBufferIterator;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../../internal/symbol/iterator":190,"../OuterSubscriber":34,"../Subscriber":39,"../util/isArray":203,"../util/subscribeToResult":222,"./fromArray":52}],73:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function audit(durationSelector) {
-    return function auditOperatorFunction(source) {
-        return source.lift(new AuditOperator(durationSelector));
-    };
-}
-exports.audit = audit;
-var AuditOperator = (function () {
-    function AuditOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    AuditOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector));
-    };
-    return AuditOperator;
-}());
-var AuditSubscriber = (function (_super) {
-    __extends(AuditSubscriber, _super);
-    function AuditSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        return _this;
-    }
-    AuditSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-        if (!this.throttled) {
-            var duration = tryCatch_1.tryCatch(this.durationSelector)(value);
-            if (duration === errorObject_1.errorObject) {
-                this.destination.error(errorObject_1.errorObject.e);
-            }
-            else {
-                var innerSubscription = subscribeToResult_1.subscribeToResult(this, duration);
-                if (!innerSubscription || innerSubscription.closed) {
-                    this.clearThrottle();
-                }
-                else {
-                    this.add(this.throttled = innerSubscription);
-                }
-            }
-        }
-    };
-    AuditSubscriber.prototype.clearThrottle = function () {
-        var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled;
-        if (throttled) {
-            this.remove(throttled);
-            this.throttled = null;
-            throttled.unsubscribe();
-        }
-        if (hasValue) {
-            this.value = null;
-            this.hasValue = false;
-            this.destination.next(value);
-        }
-    };
-    AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) {
-        this.clearThrottle();
-    };
-    AuditSubscriber.prototype.notifyComplete = function () {
-        this.clearThrottle();
-    };
-    return AuditSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],74:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var audit_1 = require("./audit");
-var timer_1 = require("../observable/timer");
-function auditTime(duration, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return audit_1.audit(function () { return timer_1.timer(duration, scheduler); });
-}
-exports.auditTime = auditTime;
-
-},{"../observable/timer":70,"../scheduler/async":188,"./audit":73}],75:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function buffer(closingNotifier) {
-    return function bufferOperatorFunction(source) {
-        return source.lift(new BufferOperator(closingNotifier));
-    };
-}
-exports.buffer = buffer;
-var BufferOperator = (function () {
-    function BufferOperator(closingNotifier) {
-        this.closingNotifier = closingNotifier;
-    }
-    BufferOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier));
-    };
-    return BufferOperator;
-}());
-var BufferSubscriber = (function (_super) {
-    __extends(BufferSubscriber, _super);
-    function BufferSubscriber(destination, closingNotifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.buffer = [];
-        _this.add(subscribeToResult_1.subscribeToResult(_this, closingNotifier));
-        return _this;
-    }
-    BufferSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var buffer = this.buffer;
-        this.buffer = [];
-        this.destination.next(buffer);
-    };
-    return BufferSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],76:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function bufferCount(bufferSize, startBufferEvery) {
-    if (startBufferEvery === void 0) { startBufferEvery = null; }
-    return function bufferCountOperatorFunction(source) {
-        return source.lift(new BufferCountOperator(bufferSize, startBufferEvery));
-    };
-}
-exports.bufferCount = bufferCount;
-var BufferCountOperator = (function () {
-    function BufferCountOperator(bufferSize, startBufferEvery) {
-        this.bufferSize = bufferSize;
-        this.startBufferEvery = startBufferEvery;
-        if (!startBufferEvery || bufferSize === startBufferEvery) {
-            this.subscriberClass = BufferCountSubscriber;
-        }
-        else {
-            this.subscriberClass = BufferSkipCountSubscriber;
-        }
-    }
-    BufferCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery));
-    };
-    return BufferCountOperator;
-}());
-var BufferCountSubscriber = (function (_super) {
-    __extends(BufferCountSubscriber, _super);
-    function BufferCountSubscriber(destination, bufferSize) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.buffer = [];
-        return _this;
-    }
-    BufferCountSubscriber.prototype._next = function (value) {
-        var buffer = this.buffer;
-        buffer.push(value);
-        if (buffer.length == this.bufferSize) {
-            this.destination.next(buffer);
-            this.buffer = [];
-        }
-    };
-    BufferCountSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer.length > 0) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferCountSubscriber;
-}(Subscriber_1.Subscriber));
-var BufferSkipCountSubscriber = (function (_super) {
-    __extends(BufferSkipCountSubscriber, _super);
-    function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferSize = bufferSize;
-        _this.startBufferEvery = startBufferEvery;
-        _this.buffers = [];
-        _this.count = 0;
-        return _this;
-    }
-    BufferSkipCountSubscriber.prototype._next = function (value) {
-        var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count;
-        this.count++;
-        if (count % startBufferEvery === 0) {
-            buffers.push([]);
-        }
-        for (var i = buffers.length; i--;) {
-            var buffer = buffers[i];
-            buffer.push(value);
-            if (buffer.length === bufferSize) {
-                buffers.splice(i, 1);
-                this.destination.next(buffer);
-            }
-        }
-    };
-    BufferSkipCountSubscriber.prototype._complete = function () {
-        var _a = this, buffers = _a.buffers, destination = _a.destination;
-        while (buffers.length > 0) {
-            var buffer = buffers.shift();
-            if (buffer.length > 0) {
-                destination.next(buffer);
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    return BufferSkipCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],77:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var Subscriber_1 = require("../Subscriber");
-var isScheduler_1 = require("../util/isScheduler");
-function bufferTime(bufferTimeSpan) {
-    var length = arguments.length;
-    var scheduler = async_1.async;
-    if (isScheduler_1.isScheduler(arguments[arguments.length - 1])) {
-        scheduler = arguments[arguments.length - 1];
-        length--;
-    }
-    var bufferCreationInterval = null;
-    if (length >= 2) {
-        bufferCreationInterval = arguments[1];
-    }
-    var maxBufferSize = Number.POSITIVE_INFINITY;
-    if (length >= 3) {
-        maxBufferSize = arguments[2];
-    }
-    return function bufferTimeOperatorFunction(source) {
-        return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler));
-    };
-}
-exports.bufferTime = bufferTime;
-var BufferTimeOperator = (function () {
-    function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        this.bufferTimeSpan = bufferTimeSpan;
-        this.bufferCreationInterval = bufferCreationInterval;
-        this.maxBufferSize = maxBufferSize;
-        this.scheduler = scheduler;
-    }
-    BufferTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler));
-    };
-    return BufferTimeOperator;
-}());
-var Context = (function () {
-    function Context() {
-        this.buffer = [];
-    }
-    return Context;
-}());
-var BufferTimeSubscriber = (function (_super) {
-    __extends(BufferTimeSubscriber, _super);
-    function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.bufferTimeSpan = bufferTimeSpan;
-        _this.bufferCreationInterval = bufferCreationInterval;
-        _this.maxBufferSize = maxBufferSize;
-        _this.scheduler = scheduler;
-        _this.contexts = [];
-        var context = _this.openContext();
-        _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0;
-        if (_this.timespanOnly) {
-            var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-        else {
-            var closeState = { subscriber: _this, context: context };
-            var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState));
-        }
-        return _this;
-    }
-    BufferTimeSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        var filledBufferContext;
-        for (var i = 0; i < len; i++) {
-            var context_1 = contexts[i];
-            var buffer = context_1.buffer;
-            buffer.push(value);
-            if (buffer.length == this.maxBufferSize) {
-                filledBufferContext = context_1;
-            }
-        }
-        if (filledBufferContext) {
-            this.onBufferFull(filledBufferContext);
-        }
-    };
-    BufferTimeSubscriber.prototype._error = function (err) {
-        this.contexts.length = 0;
-        _super.prototype._error.call(this, err);
-    };
-    BufferTimeSubscriber.prototype._complete = function () {
-        var _a = this, contexts = _a.contexts, destination = _a.destination;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            destination.next(context_2.buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferTimeSubscriber.prototype._unsubscribe = function () {
-        this.contexts = null;
-    };
-    BufferTimeSubscriber.prototype.onBufferFull = function (context) {
-        this.closeContext(context);
-        var closeAction = context.closeAction;
-        closeAction.unsubscribe();
-        this.remove(closeAction);
-        if (!this.closed && this.timespanOnly) {
-            context = this.openContext();
-            var bufferTimeSpan = this.bufferTimeSpan;
-            var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan };
-            this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState));
-        }
-    };
-    BufferTimeSubscriber.prototype.openContext = function () {
-        var context = new Context();
-        this.contexts.push(context);
-        return context;
-    };
-    BufferTimeSubscriber.prototype.closeContext = function (context) {
-        this.destination.next(context.buffer);
-        var contexts = this.contexts;
-        var spliceIndex = contexts ? contexts.indexOf(context) : -1;
-        if (spliceIndex >= 0) {
-            contexts.splice(contexts.indexOf(context), 1);
-        }
-    };
-    return BufferTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchBufferTimeSpanOnly(state) {
-    var subscriber = state.subscriber;
-    var prevContext = state.context;
-    if (prevContext) {
-        subscriber.closeContext(prevContext);
-    }
-    if (!subscriber.closed) {
-        state.context = subscriber.openContext();
-        state.context.closeAction = this.schedule(state, state.bufferTimeSpan);
-    }
-}
-function dispatchBufferCreation(state) {
-    var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler;
-    var context = subscriber.openContext();
-    var action = this;
-    if (!subscriber.closed) {
-        subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context }));
-        action.schedule(state, bufferCreationInterval);
-    }
-}
-function dispatchBufferClose(arg) {
-    var subscriber = arg.subscriber, context = arg.context;
-    subscriber.closeContext(context);
-}
-
-},{"../Subscriber":39,"../scheduler/async":188,"../util/isScheduler":213}],78:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-function bufferToggle(openings, closingSelector) {
-    return function bufferToggleOperatorFunction(source) {
-        return source.lift(new BufferToggleOperator(openings, closingSelector));
-    };
-}
-exports.bufferToggle = bufferToggle;
-var BufferToggleOperator = (function () {
-    function BufferToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    BufferToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return BufferToggleOperator;
-}());
-var BufferToggleSubscriber = (function (_super) {
-    __extends(BufferToggleSubscriber, _super);
-    function BufferToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(subscribeToResult_1.subscribeToResult(_this, openings));
-        return _this;
-    }
-    BufferToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        var len = contexts.length;
-        for (var i = 0; i < len; i++) {
-            contexts[i].buffer.push(value);
-        }
-    };
-    BufferToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_1 = contexts.shift();
-            context_1.subscription.unsubscribe();
-            context_1.buffer = null;
-            context_1.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._error.call(this, err);
-    };
-    BufferToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        while (contexts.length > 0) {
-            var context_2 = contexts.shift();
-            this.destination.next(context_2.buffer);
-            context_2.subscription.unsubscribe();
-            context_2.buffer = null;
-            context_2.subscription = null;
-        }
-        this.contexts = null;
-        _super.prototype._complete.call(this);
-    };
-    BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue);
-    };
-    BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.closeBuffer(innerSub.context);
-    };
-    BufferToggleSubscriber.prototype.openBuffer = function (value) {
-        try {
-            var closingSelector = this.closingSelector;
-            var closingNotifier = closingSelector.call(this, value);
-            if (closingNotifier) {
-                this.trySubscribe(closingNotifier);
-            }
-        }
-        catch (err) {
-            this._error(err);
-        }
-    };
-    BufferToggleSubscriber.prototype.closeBuffer = function (context) {
-        var contexts = this.contexts;
-        if (contexts && context) {
-            var buffer = context.buffer, subscription = context.subscription;
-            this.destination.next(buffer);
-            contexts.splice(contexts.indexOf(context), 1);
-            this.remove(subscription);
-            subscription.unsubscribe();
-        }
-    };
-    BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) {
-        var contexts = this.contexts;
-        var buffer = [];
-        var subscription = new Subscription_1.Subscription();
-        var context = { buffer: buffer, subscription: subscription };
-        contexts.push(context);
-        var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context);
-        if (!innerSubscription || innerSubscription.closed) {
-            this.closeBuffer(context);
-        }
-        else {
-            innerSubscription.context = context;
-            this.add(innerSubscription);
-            subscription.add(innerSubscription);
-        }
-    };
-    return BufferToggleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../Subscription":40,"../util/subscribeToResult":222}],79:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function bufferWhen(closingSelector) {
-    return function (source) {
-        return source.lift(new BufferWhenOperator(closingSelector));
-    };
-}
-exports.bufferWhen = bufferWhen;
-var BufferWhenOperator = (function () {
-    function BufferWhenOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    BufferWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector));
-    };
-    return BufferWhenOperator;
-}());
-var BufferWhenSubscriber = (function (_super) {
-    __extends(BufferWhenSubscriber, _super);
-    function BufferWhenSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.closingSelector = closingSelector;
-        _this.subscribing = false;
-        _this.openBuffer();
-        return _this;
-    }
-    BufferWhenSubscriber.prototype._next = function (value) {
-        this.buffer.push(value);
-    };
-    BufferWhenSubscriber.prototype._complete = function () {
-        var buffer = this.buffer;
-        if (buffer) {
-            this.destination.next(buffer);
-        }
-        _super.prototype._complete.call(this);
-    };
-    BufferWhenSubscriber.prototype._unsubscribe = function () {
-        this.buffer = null;
-        this.subscribing = false;
-    };
-    BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openBuffer();
-    };
-    BufferWhenSubscriber.prototype.notifyComplete = function () {
-        if (this.subscribing) {
-            this.complete();
-        }
-        else {
-            this.openBuffer();
-        }
-    };
-    BufferWhenSubscriber.prototype.openBuffer = function () {
-        var closingSubscription = this.closingSubscription;
-        if (closingSubscription) {
-            this.remove(closingSubscription);
-            closingSubscription.unsubscribe();
-        }
-        var buffer = this.buffer;
-        if (this.buffer) {
-            this.destination.next(buffer);
-        }
-        this.buffer = [];
-        var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)();
-        if (closingNotifier === errorObject_1.errorObject) {
-            this.error(errorObject_1.errorObject.e);
-        }
-        else {
-            closingSubscription = new Subscription_1.Subscription();
-            this.closingSubscription = closingSubscription;
-            this.add(closingSubscription);
-            this.subscribing = true;
-            closingSubscription.add(subscribeToResult_1.subscribeToResult(this, closingNotifier));
-            this.subscribing = false;
-        }
-    };
-    return BufferWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../Subscription":40,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],80:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function catchError(selector) {
-    return function catchErrorOperatorFunction(source) {
-        var operator = new CatchOperator(selector);
-        var caught = source.lift(operator);
-        return (operator.caught = caught);
-    };
-}
-exports.catchError = catchError;
-var CatchOperator = (function () {
-    function CatchOperator(selector) {
-        this.selector = selector;
-    }
-    CatchOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught));
-    };
-    return CatchOperator;
-}());
-var CatchSubscriber = (function (_super) {
-    __extends(CatchSubscriber, _super);
-    function CatchSubscriber(destination, selector, caught) {
-        var _this = _super.call(this, destination) || this;
-        _this.selector = selector;
-        _this.caught = caught;
-        return _this;
-    }
-    CatchSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var result = void 0;
-            try {
-                result = this.selector(err, this.caught);
-            }
-            catch (err2) {
-                _super.prototype.error.call(this, err2);
-                return;
-            }
-            this._unsubscribeAndRecycle();
-            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-            this.add(innerSubscriber);
-            subscribeToResult_1.subscribeToResult(this, result, undefined, undefined, innerSubscriber);
-        }
-    };
-    return CatchSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../util/subscribeToResult":222}],81:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var combineLatest_1 = require("../observable/combineLatest");
-function combineAll(project) {
-    return function (source) { return source.lift(new combineLatest_1.CombineLatestOperator(project)); };
-}
-exports.combineAll = combineAll;
-
-},{"../observable/combineLatest":46}],82:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var combineLatest_1 = require("../observable/combineLatest");
-var from_1 = require("../observable/from");
-var none = {};
-function combineLatest() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    var project = null;
-    if (typeof observables[observables.length - 1] === 'function') {
-        project = observables.pop();
-    }
-    if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-        observables = observables[0].slice();
-    }
-    return function (source) { return source.lift.call(from_1.from([source].concat(observables)), new combineLatest_1.CombineLatestOperator(project)); };
-}
-exports.combineLatest = combineLatest;
-
-},{"../observable/combineLatest":46,"../observable/from":51,"../util/isArray":203}],83:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concat_1 = require("../observable/concat");
-function concat() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(concat_1.concat.apply(void 0, [source].concat(observables))); };
-}
-exports.concat = concat;
-
-},{"../observable/concat":47}],84:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeAll_1 = require("./mergeAll");
-function concatAll() {
-    return mergeAll_1.mergeAll(1);
-}
-exports.concatAll = concatAll;
-
-},{"./mergeAll":117}],85:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-function concatMap(project, resultSelector) {
-    return mergeMap_1.mergeMap(project, resultSelector, 1);
-}
-exports.concatMap = concatMap;
-
-},{"./mergeMap":118}],86:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var concatMap_1 = require("./concatMap");
-function concatMapTo(innerObservable, resultSelector) {
-    return concatMap_1.concatMap(function () { return innerObservable; }, resultSelector);
-}
-exports.concatMapTo = concatMapTo;
-
-},{"./concatMap":85}],87:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function count(predicate) {
-    return function (source) { return source.lift(new CountOperator(predicate, source)); };
-}
-exports.count = count;
-var CountOperator = (function () {
-    function CountOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    CountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source));
-    };
-    return CountOperator;
-}());
-var CountSubscriber = (function (_super) {
-    __extends(CountSubscriber, _super);
-    function CountSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.count = 0;
-        _this.index = 0;
-        return _this;
-    }
-    CountSubscriber.prototype._next = function (value) {
-        if (this.predicate) {
-            this._tryPredicate(value);
-        }
-        else {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._tryPredicate = function (value) {
-        var result;
-        try {
-            result = this.predicate(value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.count++;
-        }
-    };
-    CountSubscriber.prototype._complete = function () {
-        this.destination.next(this.count);
-        this.destination.complete();
-    };
-    return CountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],88:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function debounce(durationSelector) {
-    return function (source) { return source.lift(new DebounceOperator(durationSelector)); };
-}
-exports.debounce = debounce;
-var DebounceOperator = (function () {
-    function DebounceOperator(durationSelector) {
-        this.durationSelector = durationSelector;
-    }
-    DebounceOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector));
-    };
-    return DebounceOperator;
-}());
-var DebounceSubscriber = (function (_super) {
-    __extends(DebounceSubscriber, _super);
-    function DebounceSubscriber(destination, durationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.durationSelector = durationSelector;
-        _this.hasValue = false;
-        _this.durationSubscription = null;
-        return _this;
-    }
-    DebounceSubscriber.prototype._next = function (value) {
-        try {
-            var result = this.durationSelector.call(this, value);
-            if (result) {
-                this._tryNext(value, result);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DebounceSubscriber.prototype._complete = function () {
-        this.emitValue();
-        this.destination.complete();
-    };
-    DebounceSubscriber.prototype._tryNext = function (value, duration) {
-        var subscription = this.durationSubscription;
-        this.value = value;
-        this.hasValue = true;
-        if (subscription) {
-            subscription.unsubscribe();
-            this.remove(subscription);
-        }
-        subscription = subscribeToResult_1.subscribeToResult(this, duration);
-        if (subscription && !subscription.closed) {
-            this.add(this.durationSubscription = subscription);
-        }
-    };
-    DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    DebounceSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            var value = this.value;
-            var subscription = this.durationSubscription;
-            if (subscription) {
-                this.durationSubscription = null;
-                subscription.unsubscribe();
-                this.remove(subscription);
-            }
-            this.value = null;
-            this.hasValue = false;
-            _super.prototype._next.call(this, value);
-        }
-    };
-    return DebounceSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],89:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-function debounceTime(dueTime, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); };
-}
-exports.debounceTime = debounceTime;
-var DebounceTimeOperator = (function () {
-    function DebounceTimeOperator(dueTime, scheduler) {
-        this.dueTime = dueTime;
-        this.scheduler = scheduler;
-    }
-    DebounceTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler));
-    };
-    return DebounceTimeOperator;
-}());
-var DebounceTimeSubscriber = (function (_super) {
-    __extends(DebounceTimeSubscriber, _super);
-    function DebounceTimeSubscriber(destination, dueTime, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.dueTime = dueTime;
-        _this.scheduler = scheduler;
-        _this.debouncedSubscription = null;
-        _this.lastValue = null;
-        _this.hasValue = false;
-        return _this;
-    }
-    DebounceTimeSubscriber.prototype._next = function (value) {
-        this.clearDebounce();
-        this.lastValue = value;
-        this.hasValue = true;
-        this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this));
-    };
-    DebounceTimeSubscriber.prototype._complete = function () {
-        this.debouncedNext();
-        this.destination.complete();
-    };
-    DebounceTimeSubscriber.prototype.debouncedNext = function () {
-        this.clearDebounce();
-        if (this.hasValue) {
-            var lastValue = this.lastValue;
-            this.lastValue = null;
-            this.hasValue = false;
-            this.destination.next(lastValue);
-        }
-    };
-    DebounceTimeSubscriber.prototype.clearDebounce = function () {
-        var debouncedSubscription = this.debouncedSubscription;
-        if (debouncedSubscription !== null) {
-            this.remove(debouncedSubscription);
-            debouncedSubscription.unsubscribe();
-            this.debouncedSubscription = null;
-        }
-    };
-    return DebounceTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(subscriber) {
-    subscriber.debouncedNext();
-}
-
-},{"../Subscriber":39,"../scheduler/async":188}],90:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function defaultIfEmpty(defaultValue) {
-    if (defaultValue === void 0) { defaultValue = null; }
-    return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); };
-}
-exports.defaultIfEmpty = defaultIfEmpty;
-var DefaultIfEmptyOperator = (function () {
-    function DefaultIfEmptyOperator(defaultValue) {
-        this.defaultValue = defaultValue;
-    }
-    DefaultIfEmptyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue));
-    };
-    return DefaultIfEmptyOperator;
-}());
-var DefaultIfEmptySubscriber = (function (_super) {
-    __extends(DefaultIfEmptySubscriber, _super);
-    function DefaultIfEmptySubscriber(destination, defaultValue) {
-        var _this = _super.call(this, destination) || this;
-        _this.defaultValue = defaultValue;
-        _this.isEmpty = true;
-        return _this;
-    }
-    DefaultIfEmptySubscriber.prototype._next = function (value) {
-        this.isEmpty = false;
-        this.destination.next(value);
-    };
-    DefaultIfEmptySubscriber.prototype._complete = function () {
-        if (this.isEmpty) {
-            this.destination.next(this.defaultValue);
-        }
-        this.destination.complete();
-    };
-    return DefaultIfEmptySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],91:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var isDate_1 = require("../util/isDate");
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function delay(delay, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    var absoluteDelay = isDate_1.isDate(delay);
-    var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay);
-    return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); };
-}
-exports.delay = delay;
-var DelayOperator = (function () {
-    function DelayOperator(delay, scheduler) {
-        this.delay = delay;
-        this.scheduler = scheduler;
-    }
-    DelayOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler));
-    };
-    return DelayOperator;
-}());
-var DelaySubscriber = (function (_super) {
-    __extends(DelaySubscriber, _super);
-    function DelaySubscriber(destination, delay, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.delay = delay;
-        _this.scheduler = scheduler;
-        _this.queue = [];
-        _this.active = false;
-        _this.errored = false;
-        return _this;
-    }
-    DelaySubscriber.dispatch = function (state) {
-        var source = state.source;
-        var queue = source.queue;
-        var scheduler = state.scheduler;
-        var destination = state.destination;
-        while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) {
-            queue.shift().notification.observe(destination);
-        }
-        if (queue.length > 0) {
-            var delay_1 = Math.max(0, queue[0].time - scheduler.now());
-            this.schedule(state, delay_1);
-        }
-        else {
-            this.unsubscribe();
-            source.active = false;
-        }
-    };
-    DelaySubscriber.prototype._schedule = function (scheduler) {
-        this.active = true;
-        var destination = this.destination;
-        destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, {
-            source: this, destination: this.destination, scheduler: scheduler
-        }));
-    };
-    DelaySubscriber.prototype.scheduleNotification = function (notification) {
-        if (this.errored === true) {
-            return;
-        }
-        var scheduler = this.scheduler;
-        var message = new DelayMessage(scheduler.now() + this.delay, notification);
-        this.queue.push(message);
-        if (this.active === false) {
-            this._schedule(scheduler);
-        }
-    };
-    DelaySubscriber.prototype._next = function (value) {
-        this.scheduleNotification(Notification_1.Notification.createNext(value));
-    };
-    DelaySubscriber.prototype._error = function (err) {
-        this.errored = true;
-        this.queue = [];
-        this.destination.error(err);
-        this.unsubscribe();
-    };
-    DelaySubscriber.prototype._complete = function () {
-        this.scheduleNotification(Notification_1.Notification.createComplete());
-        this.unsubscribe();
-    };
-    return DelaySubscriber;
-}(Subscriber_1.Subscriber));
-var DelayMessage = (function () {
-    function DelayMessage(time, notification) {
-        this.time = time;
-        this.notification = notification;
-    }
-    return DelayMessage;
-}());
-
-},{"../Notification":31,"../Subscriber":39,"../scheduler/async":188,"../util/isDate":205}],92:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Observable_1 = require("../Observable");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function delayWhen(delayDurationSelector, subscriptionDelay) {
-    if (subscriptionDelay) {
-        return function (source) {
-            return new SubscriptionDelayObservable(source, subscriptionDelay)
-                .lift(new DelayWhenOperator(delayDurationSelector));
-        };
-    }
-    return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); };
-}
-exports.delayWhen = delayWhen;
-var DelayWhenOperator = (function () {
-    function DelayWhenOperator(delayDurationSelector) {
-        this.delayDurationSelector = delayDurationSelector;
-    }
-    DelayWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector));
-    };
-    return DelayWhenOperator;
-}());
-var DelayWhenSubscriber = (function (_super) {
-    __extends(DelayWhenSubscriber, _super);
-    function DelayWhenSubscriber(destination, delayDurationSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.delayDurationSelector = delayDurationSelector;
-        _this.completed = false;
-        _this.delayNotifierSubscriptions = [];
-        _this.index = 0;
-        return _this;
-    }
-    DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(outerValue);
-        this.removeSubscription(innerSub);
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        var value = this.removeSubscription(innerSub);
-        if (value) {
-            this.destination.next(value);
-        }
-        this.tryComplete();
-    };
-    DelayWhenSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        try {
-            var delayNotifier = this.delayDurationSelector(value, index);
-            if (delayNotifier) {
-                this.tryDelay(delayNotifier, value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    DelayWhenSubscriber.prototype._complete = function () {
-        this.completed = true;
-        this.tryComplete();
-        this.unsubscribe();
-    };
-    DelayWhenSubscriber.prototype.removeSubscription = function (subscription) {
-        subscription.unsubscribe();
-        var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription);
-        if (subscriptionIdx !== -1) {
-            this.delayNotifierSubscriptions.splice(subscriptionIdx, 1);
-        }
-        return subscription.outerValue;
-    };
-    DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) {
-        var notifierSubscription = subscribeToResult_1.subscribeToResult(this, delayNotifier, value);
-        if (notifierSubscription && !notifierSubscription.closed) {
-            var destination = this.destination;
-            destination.add(notifierSubscription);
-            this.delayNotifierSubscriptions.push(notifierSubscription);
-        }
-    };
-    DelayWhenSubscriber.prototype.tryComplete = function () {
-        if (this.completed && this.delayNotifierSubscriptions.length === 0) {
-            this.destination.complete();
-        }
-    };
-    return DelayWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-var SubscriptionDelayObservable = (function (_super) {
-    __extends(SubscriptionDelayObservable, _super);
-    function SubscriptionDelayObservable(source, subscriptionDelay) {
-        var _this = _super.call(this) || this;
-        _this.source = source;
-        _this.subscriptionDelay = subscriptionDelay;
-        return _this;
-    }
-    SubscriptionDelayObservable.prototype._subscribe = function (subscriber) {
-        this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source));
-    };
-    return SubscriptionDelayObservable;
-}(Observable_1.Observable));
-var SubscriptionDelaySubscriber = (function (_super) {
-    __extends(SubscriptionDelaySubscriber, _super);
-    function SubscriptionDelaySubscriber(parent, source) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        _this.source = source;
-        _this.sourceSubscribed = false;
-        return _this;
-    }
-    SubscriptionDelaySubscriber.prototype._next = function (unused) {
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype._error = function (err) {
-        this.unsubscribe();
-        this.parent.error(err);
-    };
-    SubscriptionDelaySubscriber.prototype._complete = function () {
-        this.unsubscribe();
-        this.subscribeToSource();
-    };
-    SubscriptionDelaySubscriber.prototype.subscribeToSource = function () {
-        if (!this.sourceSubscribed) {
-            this.sourceSubscribed = true;
-            this.unsubscribe();
-            this.source.subscribe(this.parent);
-        }
-    };
-    return SubscriptionDelaySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Observable":32,"../OuterSubscriber":34,"../Subscriber":39,"../util/subscribeToResult":222}],93:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function dematerialize() {
-    return function dematerializeOperatorFunction(source) {
-        return source.lift(new DeMaterializeOperator());
-    };
-}
-exports.dematerialize = dematerialize;
-var DeMaterializeOperator = (function () {
-    function DeMaterializeOperator() {
-    }
-    DeMaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DeMaterializeSubscriber(subscriber));
-    };
-    return DeMaterializeOperator;
-}());
-var DeMaterializeSubscriber = (function (_super) {
-    __extends(DeMaterializeSubscriber, _super);
-    function DeMaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    DeMaterializeSubscriber.prototype._next = function (value) {
-        value.observe(this.destination);
-    };
-    return DeMaterializeSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],94:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function distinct(keySelector, flushes) {
-    return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); };
-}
-exports.distinct = distinct;
-var DistinctOperator = (function () {
-    function DistinctOperator(keySelector, flushes) {
-        this.keySelector = keySelector;
-        this.flushes = flushes;
-    }
-    DistinctOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes));
-    };
-    return DistinctOperator;
-}());
-var DistinctSubscriber = (function (_super) {
-    __extends(DistinctSubscriber, _super);
-    function DistinctSubscriber(destination, keySelector, flushes) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.values = new Set();
-        if (flushes) {
-            _this.add(subscribeToResult_1.subscribeToResult(_this, flushes));
-        }
-        return _this;
-    }
-    DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values.clear();
-    };
-    DistinctSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    DistinctSubscriber.prototype._next = function (value) {
-        if (this.keySelector) {
-            this._useKeySelector(value);
-        }
-        else {
-            this._finalizeNext(value, value);
-        }
-    };
-    DistinctSubscriber.prototype._useKeySelector = function (value) {
-        var key;
-        var destination = this.destination;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this._finalizeNext(key, value);
-    };
-    DistinctSubscriber.prototype._finalizeNext = function (key, value) {
-        var values = this.values;
-        if (!values.has(key)) {
-            values.add(key);
-            this.destination.next(value);
-        }
-    };
-    return DistinctSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.DistinctSubscriber = DistinctSubscriber;
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],95:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-function distinctUntilChanged(compare, keySelector) {
-    return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); };
-}
-exports.distinctUntilChanged = distinctUntilChanged;
-var DistinctUntilChangedOperator = (function () {
-    function DistinctUntilChangedOperator(compare, keySelector) {
-        this.compare = compare;
-        this.keySelector = keySelector;
-    }
-    DistinctUntilChangedOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector));
-    };
-    return DistinctUntilChangedOperator;
-}());
-var DistinctUntilChangedSubscriber = (function (_super) {
-    __extends(DistinctUntilChangedSubscriber, _super);
-    function DistinctUntilChangedSubscriber(destination, compare, keySelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.hasKey = false;
-        if (typeof compare === 'function') {
-            _this.compare = compare;
-        }
-        return _this;
-    }
-    DistinctUntilChangedSubscriber.prototype.compare = function (x, y) {
-        return x === y;
-    };
-    DistinctUntilChangedSubscriber.prototype._next = function (value) {
-        var keySelector = this.keySelector;
-        var key = value;
-        if (keySelector) {
-            key = tryCatch_1.tryCatch(this.keySelector)(value);
-            if (key === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
-        }
-        var result = false;
-        if (this.hasKey) {
-            result = tryCatch_1.tryCatch(this.compare)(this.key, key);
-            if (result === errorObject_1.errorObject) {
-                return this.destination.error(errorObject_1.errorObject.e);
-            }
-        }
-        else {
-            this.hasKey = true;
-        }
-        if (Boolean(result) === false) {
-            this.key = key;
-            this.destination.next(value);
-        }
-    };
-    return DistinctUntilChangedSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../util/errorObject":200,"../util/tryCatch":224}],96:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var distinctUntilChanged_1 = require("./distinctUntilChanged");
-function distinctUntilKeyChanged(key, compare) {
-    return distinctUntilChanged_1.distinctUntilChanged(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; });
-}
-exports.distinctUntilKeyChanged = distinctUntilKeyChanged;
-
-},{"./distinctUntilChanged":95}],97:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var filter_1 = require("./filter");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var take_1 = require("./take");
-function elementAt(index, defaultValue) {
-    if (index < 0) {
-        throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError();
-    }
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(filter_1.filter(function (v, i) { return i === index; }), take_1.take(1), hasDefaultValue
-        ? defaultIfEmpty_1.defaultIfEmpty(defaultValue)
-        : throwIfEmpty_1.throwIfEmpty(function () { return new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError(); })); };
-}
-exports.elementAt = elementAt;
-
-},{"../util/ArgumentOutOfRangeError":193,"./defaultIfEmpty":90,"./filter":103,"./take":155,"./throwIfEmpty":162}],98:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var fromArray_1 = require("../observable/fromArray");
-var scalar_1 = require("../observable/scalar");
-var empty_1 = require("../observable/empty");
-var concat_1 = require("../observable/concat");
-var isScheduler_1 = require("../util/isScheduler");
-function endWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    return function (source) {
-        var scheduler = array[array.length - 1];
-        if (isScheduler_1.isScheduler(scheduler)) {
-            array.pop();
-        }
-        else {
-            scheduler = null;
-        }
-        var len = array.length;
-        if (len === 1 && !scheduler) {
-            return concat_1.concat(source, scalar_1.scalar(array[0]));
-        }
-        else if (len > 0) {
-            return concat_1.concat(source, fromArray_1.fromArray(array, scheduler));
-        }
-        else {
-            return concat_1.concat(source, empty_1.empty(scheduler));
-        }
-    };
-}
-exports.endWith = endWith;
-
-},{"../observable/concat":47,"../observable/empty":49,"../observable/fromArray":52,"../observable/scalar":68,"../util/isScheduler":213}],99:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function every(predicate, thisArg) {
-    return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); };
-}
-exports.every = every;
-var EveryOperator = (function () {
-    function EveryOperator(predicate, thisArg, source) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-        this.source = source;
-    }
-    EveryOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source));
-    };
-    return EveryOperator;
-}());
-var EverySubscriber = (function (_super) {
-    __extends(EverySubscriber, _super);
-    function EverySubscriber(destination, predicate, thisArg, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.source = source;
-        _this.index = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    EverySubscriber.prototype.notifyComplete = function (everyValueMatch) {
-        this.destination.next(everyValueMatch);
-        this.destination.complete();
-    };
-    EverySubscriber.prototype._next = function (value) {
-        var result = false;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.index++, this.source);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (!result) {
-            this.notifyComplete(false);
-        }
-    };
-    EverySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return EverySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],100:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function exhaust() {
-    return function (source) { return source.lift(new SwitchFirstOperator()); };
-}
-exports.exhaust = exhaust;
-var SwitchFirstOperator = (function () {
-    function SwitchFirstOperator() {
-    }
-    SwitchFirstOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchFirstSubscriber(subscriber));
-    };
-    return SwitchFirstOperator;
-}());
-var SwitchFirstSubscriber = (function (_super) {
-    __extends(SwitchFirstSubscriber, _super);
-    function SwitchFirstSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasCompleted = false;
-        _this.hasSubscription = false;
-        return _this;
-    }
-    SwitchFirstSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.hasSubscription = true;
-            this.add(subscribeToResult_1.subscribeToResult(this, value));
-        }
-    };
-    SwitchFirstSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-    };
-    SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return SwitchFirstSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],101:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function exhaustMap(project, resultSelector) {
-    if (resultSelector) {
-        return function (source) { return source.pipe(exhaustMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) {
-        return source.lift(new ExhauseMapOperator(project));
-    };
-}
-exports.exhaustMap = exhaustMap;
-var ExhauseMapOperator = (function () {
-    function ExhauseMapOperator(project) {
-        this.project = project;
-    }
-    ExhauseMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project));
-    };
-    return ExhauseMapOperator;
-}());
-var ExhaustMapSubscriber = (function (_super) {
-    __extends(ExhaustMapSubscriber, _super);
-    function ExhaustMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.hasSubscription = false;
-        _this.hasCompleted = false;
-        _this.index = 0;
-        return _this;
-    }
-    ExhaustMapSubscriber.prototype._next = function (value) {
-        if (!this.hasSubscription) {
-            this.tryNext(value);
-        }
-    };
-    ExhaustMapSubscriber.prototype.tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.hasSubscription = true;
-        this._innerSub(result, value, index);
-    };
-    ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        subscribeToResult_1.subscribeToResult(this, result, value, index, innerSubscriber);
-    };
-    ExhaustMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (!this.hasSubscription) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    ExhaustMapSubscriber.prototype.notifyError = function (err) {
-        this.destination.error(err);
-    };
-    ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.hasSubscription = false;
-        if (this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return ExhaustMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/subscribeToResult":222,"./map":112}],102:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function expand(project, concurrent, scheduler) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (scheduler === void 0) { scheduler = undefined; }
-    concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent;
-    return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); };
-}
-exports.expand = expand;
-var ExpandOperator = (function () {
-    function ExpandOperator(project, concurrent, scheduler) {
-        this.project = project;
-        this.concurrent = concurrent;
-        this.scheduler = scheduler;
-    }
-    ExpandOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler));
-    };
-    return ExpandOperator;
-}());
-exports.ExpandOperator = ExpandOperator;
-var ExpandSubscriber = (function (_super) {
-    __extends(ExpandSubscriber, _super);
-    function ExpandSubscriber(destination, project, concurrent, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.scheduler = scheduler;
-        _this.index = 0;
-        _this.active = 0;
-        _this.hasCompleted = false;
-        if (concurrent < Number.POSITIVE_INFINITY) {
-            _this.buffer = [];
-        }
-        return _this;
-    }
-    ExpandSubscriber.dispatch = function (arg) {
-        var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index;
-        subscriber.subscribeToProjection(result, value, index);
-    };
-    ExpandSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (destination.closed) {
-            this._complete();
-            return;
-        }
-        var index = this.index++;
-        if (this.active < this.concurrent) {
-            destination.next(value);
-            var result = tryCatch_1.tryCatch(this.project)(value, index);
-            if (result === errorObject_1.errorObject) {
-                destination.error(errorObject_1.errorObject.e);
-            }
-            else if (!this.scheduler) {
-                this.subscribeToProjection(result, value, index);
-            }
-            else {
-                var state = { subscriber: this, result: result, value: value, index: index };
-                var destination_1 = this.destination;
-                destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state));
-            }
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) {
-        this.active++;
-        var destination = this.destination;
-        destination.add(subscribeToResult_1.subscribeToResult(this, result, value, index));
-    };
-    ExpandSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this._next(innerValue);
-    };
-    ExpandSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer && buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        if (this.hasCompleted && this.active === 0) {
-            this.destination.complete();
-        }
-    };
-    return ExpandSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.ExpandSubscriber = ExpandSubscriber;
-
-},{"../OuterSubscriber":34,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],103:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function filter(predicate, thisArg) {
-    return function filterOperatorFunction(source) {
-        return source.lift(new FilterOperator(predicate, thisArg));
-    };
-}
-exports.filter = filter;
-var FilterOperator = (function () {
-    function FilterOperator(predicate, thisArg) {
-        this.predicate = predicate;
-        this.thisArg = thisArg;
-    }
-    FilterOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg));
-    };
-    return FilterOperator;
-}());
-var FilterSubscriber = (function (_super) {
-    __extends(FilterSubscriber, _super);
-    function FilterSubscriber(destination, predicate, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.thisArg = thisArg;
-        _this.count = 0;
-        return _this;
-    }
-    FilterSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.predicate.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        if (result) {
-            this.destination.next(value);
-        }
-    };
-    return FilterSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],104:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-function finalize(callback) {
-    return function (source) { return source.lift(new FinallyOperator(callback)); };
-}
-exports.finalize = finalize;
-var FinallyOperator = (function () {
-    function FinallyOperator(callback) {
-        this.callback = callback;
-    }
-    FinallyOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new FinallySubscriber(subscriber, this.callback));
-    };
-    return FinallyOperator;
-}());
-var FinallySubscriber = (function (_super) {
-    __extends(FinallySubscriber, _super);
-    function FinallySubscriber(destination, callback) {
-        var _this = _super.call(this, destination) || this;
-        _this.add(new Subscription_1.Subscription(callback));
-        return _this;
-    }
-    return FinallySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../Subscription":40}],105:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function find(predicate, thisArg) {
-    if (typeof predicate !== 'function') {
-        throw new TypeError('predicate is not a function');
-    }
-    return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); };
-}
-exports.find = find;
-var FindValueOperator = (function () {
-    function FindValueOperator(predicate, source, yieldIndex, thisArg) {
-        this.predicate = predicate;
-        this.source = source;
-        this.yieldIndex = yieldIndex;
-        this.thisArg = thisArg;
-    }
-    FindValueOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg));
-    };
-    return FindValueOperator;
-}());
-exports.FindValueOperator = FindValueOperator;
-var FindValueSubscriber = (function (_super) {
-    __extends(FindValueSubscriber, _super);
-    function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.yieldIndex = yieldIndex;
-        _this.thisArg = thisArg;
-        _this.index = 0;
-        return _this;
-    }
-    FindValueSubscriber.prototype.notifyComplete = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-        this.unsubscribe();
-    };
-    FindValueSubscriber.prototype._next = function (value) {
-        var _a = this, predicate = _a.predicate, thisArg = _a.thisArg;
-        var index = this.index++;
-        try {
-            var result = predicate.call(thisArg || this, value, index, this.source);
-            if (result) {
-                this.notifyComplete(this.yieldIndex ? index : value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    FindValueSubscriber.prototype._complete = function () {
-        this.notifyComplete(this.yieldIndex ? -1 : undefined);
-    };
-    return FindValueSubscriber;
-}(Subscriber_1.Subscriber));
-exports.FindValueSubscriber = FindValueSubscriber;
-
-},{"../Subscriber":39}],106:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var find_1 = require("../operators/find");
-function findIndex(predicate, thisArg) {
-    return function (source) { return source.lift(new find_1.FindValueOperator(predicate, source, true, thisArg)); };
-}
-exports.findIndex = findIndex;
-
-},{"../operators/find":105}],107:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var filter_1 = require("./filter");
-var take_1 = require("./take");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var identity_1 = require("../util/identity");
-function first(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, take_1.take(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
-}
-exports.first = first;
-
-},{"../util/EmptyError":194,"../util/identity":202,"./defaultIfEmpty":90,"./filter":103,"./take":155,"./throwIfEmpty":162}],108:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subscription_1 = require("../Subscription");
-var Observable_1 = require("../Observable");
-var Subject_1 = require("../Subject");
-function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) {
-    return function (source) {
-        return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector));
-    };
-}
-exports.groupBy = groupBy;
-var GroupByOperator = (function () {
-    function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) {
-        this.keySelector = keySelector;
-        this.elementSelector = elementSelector;
-        this.durationSelector = durationSelector;
-        this.subjectSelector = subjectSelector;
-    }
-    GroupByOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector));
-    };
-    return GroupByOperator;
-}());
-var GroupBySubscriber = (function (_super) {
-    __extends(GroupBySubscriber, _super);
-    function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.keySelector = keySelector;
-        _this.elementSelector = elementSelector;
-        _this.durationSelector = durationSelector;
-        _this.subjectSelector = subjectSelector;
-        _this.groups = null;
-        _this.attemptedToUnsubscribe = false;
-        _this.count = 0;
-        return _this;
-    }
-    GroupBySubscriber.prototype._next = function (value) {
-        var key;
-        try {
-            key = this.keySelector(value);
-        }
-        catch (err) {
-            this.error(err);
-            return;
-        }
-        this._group(value, key);
-    };
-    GroupBySubscriber.prototype._group = function (value, key) {
-        var groups = this.groups;
-        if (!groups) {
-            groups = this.groups = new Map();
-        }
-        var group = groups.get(key);
-        var element;
-        if (this.elementSelector) {
-            try {
-                element = this.elementSelector(value);
-            }
-            catch (err) {
-                this.error(err);
-            }
-        }
-        else {
-            element = value;
-        }
-        if (!group) {
-            group = (this.subjectSelector ? this.subjectSelector() : new Subject_1.Subject());
-            groups.set(key, group);
-            var groupedObservable = new GroupedObservable(key, group, this);
-            this.destination.next(groupedObservable);
-            if (this.durationSelector) {
-                var duration = void 0;
-                try {
-                    duration = this.durationSelector(new GroupedObservable(key, group));
-                }
-                catch (err) {
-                    this.error(err);
-                    return;
-                }
-                this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this)));
-            }
-        }
-        if (!group.closed) {
-            group.next(element);
-        }
-    };
-    GroupBySubscriber.prototype._error = function (err) {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.error(err);
-            });
-            groups.clear();
-        }
-        this.destination.error(err);
-    };
-    GroupBySubscriber.prototype._complete = function () {
-        var groups = this.groups;
-        if (groups) {
-            groups.forEach(function (group, key) {
-                group.complete();
-            });
-            groups.clear();
-        }
-        this.destination.complete();
-    };
-    GroupBySubscriber.prototype.removeGroup = function (key) {
-        this.groups.delete(key);
-    };
-    GroupBySubscriber.prototype.unsubscribe = function () {
-        if (!this.closed) {
-            this.attemptedToUnsubscribe = true;
-            if (this.count === 0) {
-                _super.prototype.unsubscribe.call(this);
-            }
-        }
-    };
-    return GroupBySubscriber;
-}(Subscriber_1.Subscriber));
-var GroupDurationSubscriber = (function (_super) {
-    __extends(GroupDurationSubscriber, _super);
-    function GroupDurationSubscriber(key, group, parent) {
-        var _this = _super.call(this, group) || this;
-        _this.key = key;
-        _this.group = group;
-        _this.parent = parent;
-        return _this;
-    }
-    GroupDurationSubscriber.prototype._next = function (value) {
-        this.complete();
-    };
-    GroupDurationSubscriber.prototype._unsubscribe = function () {
-        var _a = this, parent = _a.parent, key = _a.key;
-        this.key = this.parent = null;
-        if (parent) {
-            parent.removeGroup(key);
-        }
-    };
-    return GroupDurationSubscriber;
-}(Subscriber_1.Subscriber));
-var GroupedObservable = (function (_super) {
-    __extends(GroupedObservable, _super);
-    function GroupedObservable(key, groupSubject, refCountSubscription) {
-        var _this = _super.call(this) || this;
-        _this.key = key;
-        _this.groupSubject = groupSubject;
-        _this.refCountSubscription = refCountSubscription;
-        return _this;
-    }
-    GroupedObservable.prototype._subscribe = function (subscriber) {
-        var subscription = new Subscription_1.Subscription();
-        var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject;
-        if (refCountSubscription && !refCountSubscription.closed) {
-            subscription.add(new InnerRefCountSubscription(refCountSubscription));
-        }
-        subscription.add(groupSubject.subscribe(subscriber));
-        return subscription;
-    };
-    return GroupedObservable;
-}(Observable_1.Observable));
-exports.GroupedObservable = GroupedObservable;
-var InnerRefCountSubscription = (function (_super) {
-    __extends(InnerRefCountSubscription, _super);
-    function InnerRefCountSubscription(parent) {
-        var _this = _super.call(this) || this;
-        _this.parent = parent;
-        parent.count++;
-        return _this;
-    }
-    InnerRefCountSubscription.prototype.unsubscribe = function () {
-        var parent = this.parent;
-        if (!parent.closed && !this.closed) {
-            _super.prototype.unsubscribe.call(this);
-            parent.count -= 1;
-            if (parent.count === 0 && parent.attemptedToUnsubscribe) {
-                parent.unsubscribe();
-            }
-        }
-    };
-    return InnerRefCountSubscription;
-}(Subscription_1.Subscription));
-
-},{"../Observable":32,"../Subject":37,"../Subscriber":39,"../Subscription":40}],109:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function ignoreElements() {
-    return function ignoreElementsOperatorFunction(source) {
-        return source.lift(new IgnoreElementsOperator());
-    };
-}
-exports.ignoreElements = ignoreElements;
-var IgnoreElementsOperator = (function () {
-    function IgnoreElementsOperator() {
-    }
-    IgnoreElementsOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new IgnoreElementsSubscriber(subscriber));
-    };
-    return IgnoreElementsOperator;
-}());
-var IgnoreElementsSubscriber = (function (_super) {
-    __extends(IgnoreElementsSubscriber, _super);
-    function IgnoreElementsSubscriber() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    IgnoreElementsSubscriber.prototype._next = function (unused) {
-    };
-    return IgnoreElementsSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],110:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function isEmpty() {
-    return function (source) { return source.lift(new IsEmptyOperator()); };
-}
-exports.isEmpty = isEmpty;
-var IsEmptyOperator = (function () {
-    function IsEmptyOperator() {
-    }
-    IsEmptyOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new IsEmptySubscriber(observer));
-    };
-    return IsEmptyOperator;
-}());
-var IsEmptySubscriber = (function (_super) {
-    __extends(IsEmptySubscriber, _super);
-    function IsEmptySubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) {
-        var destination = this.destination;
-        destination.next(isEmpty);
-        destination.complete();
-    };
-    IsEmptySubscriber.prototype._next = function (value) {
-        this.notifyComplete(false);
-    };
-    IsEmptySubscriber.prototype._complete = function () {
-        this.notifyComplete(true);
-    };
-    return IsEmptySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],111:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EmptyError_1 = require("../util/EmptyError");
-var filter_1 = require("./filter");
-var takeLast_1 = require("./takeLast");
-var throwIfEmpty_1 = require("./throwIfEmpty");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var identity_1 = require("../util/identity");
-function last(predicate, defaultValue) {
-    var hasDefaultValue = arguments.length >= 2;
-    return function (source) { return source.pipe(predicate ? filter_1.filter(function (v, i) { return predicate(v, i, source); }) : identity_1.identity, takeLast_1.takeLast(1), hasDefaultValue ? defaultIfEmpty_1.defaultIfEmpty(defaultValue) : throwIfEmpty_1.throwIfEmpty(function () { return new EmptyError_1.EmptyError(); })); };
-}
-exports.last = last;
-
-},{"../util/EmptyError":194,"../util/identity":202,"./defaultIfEmpty":90,"./filter":103,"./takeLast":156,"./throwIfEmpty":162}],112:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function map(project, thisArg) {
-    return function mapOperation(source) {
-        if (typeof project !== 'function') {
-            throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
-        }
-        return source.lift(new MapOperator(project, thisArg));
-    };
-}
-exports.map = map;
-var MapOperator = (function () {
-    function MapOperator(project, thisArg) {
-        this.project = project;
-        this.thisArg = thisArg;
-    }
-    MapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapSubscriber(subscriber, this.project, this.thisArg));
-    };
-    return MapOperator;
-}());
-exports.MapOperator = MapOperator;
-var MapSubscriber = (function (_super) {
-    __extends(MapSubscriber, _super);
-    function MapSubscriber(destination, project, thisArg) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.count = 0;
-        _this.thisArg = thisArg || _this;
-        return _this;
-    }
-    MapSubscriber.prototype._next = function (value) {
-        var result;
-        try {
-            result = this.project.call(this.thisArg, value, this.count++);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return MapSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],113:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function mapTo(value) {
-    return function (source) { return source.lift(new MapToOperator(value)); };
-}
-exports.mapTo = mapTo;
-var MapToOperator = (function () {
-    function MapToOperator(value) {
-        this.value = value;
-    }
-    MapToOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MapToSubscriber(subscriber, this.value));
-    };
-    return MapToOperator;
-}());
-var MapToSubscriber = (function (_super) {
-    __extends(MapToSubscriber, _super);
-    function MapToSubscriber(destination, value) {
-        var _this = _super.call(this, destination) || this;
-        _this.value = value;
-        return _this;
-    }
-    MapToSubscriber.prototype._next = function (x) {
-        this.destination.next(this.value);
-    };
-    return MapToSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],114:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function materialize() {
-    return function materializeOperatorFunction(source) {
-        return source.lift(new MaterializeOperator());
-    };
-}
-exports.materialize = materialize;
-var MaterializeOperator = (function () {
-    function MaterializeOperator() {
-    }
-    MaterializeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MaterializeSubscriber(subscriber));
-    };
-    return MaterializeOperator;
-}());
-var MaterializeSubscriber = (function (_super) {
-    __extends(MaterializeSubscriber, _super);
-    function MaterializeSubscriber(destination) {
-        return _super.call(this, destination) || this;
-    }
-    MaterializeSubscriber.prototype._next = function (value) {
-        this.destination.next(Notification_1.Notification.createNext(value));
-    };
-    MaterializeSubscriber.prototype._error = function (err) {
-        var destination = this.destination;
-        destination.next(Notification_1.Notification.createError(err));
-        destination.complete();
-    };
-    MaterializeSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        destination.next(Notification_1.Notification.createComplete());
-        destination.complete();
-    };
-    return MaterializeSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Notification":31,"../Subscriber":39}],115:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function max(comparer) {
-    var max = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) > 0 ? x : y; }
-        : function (x, y) { return x > y ? x : y; };
-    return reduce_1.reduce(max);
-}
-exports.max = max;
-
-},{"./reduce":133}],116:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var merge_1 = require("../observable/merge");
-function merge() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function (source) { return source.lift.call(merge_1.merge.apply(void 0, [source].concat(observables))); };
-}
-exports.merge = merge;
-
-},{"../observable/merge":61}],117:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-var identity_1 = require("../util/identity");
-function mergeAll(concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return mergeMap_1.mergeMap(identity_1.identity, concurrent);
-}
-exports.mergeAll = mergeAll;
-
-},{"../util/identity":202,"./mergeMap":118}],118:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function mergeMap(project, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(mergeMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); };
-    }
-    else if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); };
-}
-exports.mergeMap = mergeMap;
-var MergeMapOperator = (function () {
-    function MergeMapOperator(project, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        this.project = project;
-        this.concurrent = concurrent;
-    }
-    MergeMapOperator.prototype.call = function (observer, source) {
-        return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent));
-    };
-    return MergeMapOperator;
-}());
-exports.MergeMapOperator = MergeMapOperator;
-var MergeMapSubscriber = (function (_super) {
-    __extends(MergeMapSubscriber, _super);
-    function MergeMapSubscriber(destination, project, concurrent) {
-        if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.concurrent = concurrent;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeMapSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            this._tryNext(value);
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeMapSubscriber.prototype._tryNext = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.active++;
-        this._innerSub(result, value, index);
-    };
-    MergeMapSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        subscribeToResult_1.subscribeToResult(this, ish, value, index, innerSubscriber);
-    };
-    MergeMapSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    MergeMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        this.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            this.destination.complete();
-        }
-    };
-    return MergeMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeMapSubscriber = MergeMapSubscriber;
-
-},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/subscribeToResult":222,"./map":112}],119:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var mergeMap_1 = require("./mergeMap");
-function mergeMapTo(innerObservable, resultSelector, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    if (typeof resultSelector === 'function') {
-        return mergeMap_1.mergeMap(function () { return innerObservable; }, resultSelector, concurrent);
-    }
-    if (typeof resultSelector === 'number') {
-        concurrent = resultSelector;
-    }
-    return mergeMap_1.mergeMap(function () { return innerObservable; }, concurrent);
-}
-exports.mergeMapTo = mergeMapTo;
-
-},{"./mergeMap":118}],120:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-function mergeScan(accumulator, seed, concurrent) {
-    if (concurrent === void 0) { concurrent = Number.POSITIVE_INFINITY; }
-    return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); };
-}
-exports.mergeScan = mergeScan;
-var MergeScanOperator = (function () {
-    function MergeScanOperator(accumulator, seed, concurrent) {
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.concurrent = concurrent;
-    }
-    MergeScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent));
-    };
-    return MergeScanOperator;
-}());
-exports.MergeScanOperator = MergeScanOperator;
-var MergeScanSubscriber = (function (_super) {
-    __extends(MergeScanSubscriber, _super);
-    function MergeScanSubscriber(destination, accumulator, acc, concurrent) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this.acc = acc;
-        _this.concurrent = concurrent;
-        _this.hasValue = false;
-        _this.hasCompleted = false;
-        _this.buffer = [];
-        _this.active = 0;
-        _this.index = 0;
-        return _this;
-    }
-    MergeScanSubscriber.prototype._next = function (value) {
-        if (this.active < this.concurrent) {
-            var index = this.index++;
-            var ish = tryCatch_1.tryCatch(this.accumulator)(this.acc, value);
-            var destination = this.destination;
-            if (ish === errorObject_1.errorObject) {
-                destination.error(errorObject_1.errorObject.e);
-            }
-            else {
-                this.active++;
-                this._innerSub(ish, value, index);
-            }
-        }
-        else {
-            this.buffer.push(value);
-        }
-    };
-    MergeScanSubscriber.prototype._innerSub = function (ish, value, index) {
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        subscribeToResult_1.subscribeToResult(this, ish, value, index, innerSubscriber);
-    };
-    MergeScanSubscriber.prototype._complete = function () {
-        this.hasCompleted = true;
-        if (this.active === 0 && this.buffer.length === 0) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-        this.unsubscribe();
-    };
-    MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var destination = this.destination;
-        this.acc = innerValue;
-        this.hasValue = true;
-        destination.next(innerValue);
-    };
-    MergeScanSubscriber.prototype.notifyComplete = function (innerSub) {
-        var buffer = this.buffer;
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.active--;
-        if (buffer.length > 0) {
-            this._next(buffer.shift());
-        }
-        else if (this.active === 0 && this.hasCompleted) {
-            if (this.hasValue === false) {
-                this.destination.next(this.acc);
-            }
-            this.destination.complete();
-        }
-    };
-    return MergeScanSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-exports.MergeScanSubscriber = MergeScanSubscriber;
-
-},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],121:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function min(comparer) {
-    var min = (typeof comparer === 'function')
-        ? function (x, y) { return comparer(x, y) < 0 ? x : y; }
-        : function (x, y) { return x < y ? x : y; };
-    return reduce_1.reduce(min);
-}
-exports.min = min;
-
-},{"./reduce":133}],122:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ConnectableObservable_1 = require("../observable/ConnectableObservable");
-function multicast(subjectOrSubjectFactory, selector) {
-    return function multicastOperatorFunction(source) {
-        var subjectFactory;
-        if (typeof subjectOrSubjectFactory === 'function') {
-            subjectFactory = subjectOrSubjectFactory;
-        }
-        else {
-            subjectFactory = function subjectFactory() {
-                return subjectOrSubjectFactory;
-            };
-        }
-        if (typeof selector === 'function') {
-            return source.lift(new MulticastOperator(subjectFactory, selector));
-        }
-        var connectable = Object.create(source, ConnectableObservable_1.connectableObservableDescriptor);
-        connectable.source = source;
-        connectable.subjectFactory = subjectFactory;
-        return connectable;
-    };
-}
-exports.multicast = multicast;
-var MulticastOperator = (function () {
-    function MulticastOperator(subjectFactory, selector) {
-        this.subjectFactory = subjectFactory;
-        this.selector = selector;
-    }
-    MulticastOperator.prototype.call = function (subscriber, source) {
-        var selector = this.selector;
-        var subject = this.subjectFactory();
-        var subscription = selector(subject).subscribe(subscriber);
-        subscription.add(source.subscribe(subject));
-        return subscription;
-    };
-    return MulticastOperator;
-}());
-exports.MulticastOperator = MulticastOperator;
-
-},{"../observable/ConnectableObservable":42}],123:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Notification_1 = require("../Notification");
-function observeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return function observeOnOperatorFunction(source) {
-        return source.lift(new ObserveOnOperator(scheduler, delay));
-    };
-}
-exports.observeOn = observeOn;
-var ObserveOnOperator = (function () {
-    function ObserveOnOperator(scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    ObserveOnOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay));
-    };
-    return ObserveOnOperator;
-}());
-exports.ObserveOnOperator = ObserveOnOperator;
-var ObserveOnSubscriber = (function (_super) {
-    __extends(ObserveOnSubscriber, _super);
-    function ObserveOnSubscriber(destination, scheduler, delay) {
-        if (delay === void 0) { delay = 0; }
-        var _this = _super.call(this, destination) || this;
-        _this.scheduler = scheduler;
-        _this.delay = delay;
-        return _this;
-    }
-    ObserveOnSubscriber.dispatch = function (arg) {
-        var notification = arg.notification, destination = arg.destination;
-        notification.observe(destination);
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype.scheduleMessage = function (notification) {
-        var destination = this.destination;
-        destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination)));
-    };
-    ObserveOnSubscriber.prototype._next = function (value) {
-        this.scheduleMessage(Notification_1.Notification.createNext(value));
-    };
-    ObserveOnSubscriber.prototype._error = function (err) {
-        this.scheduleMessage(Notification_1.Notification.createError(err));
-        this.unsubscribe();
-    };
-    ObserveOnSubscriber.prototype._complete = function () {
-        this.scheduleMessage(Notification_1.Notification.createComplete());
-        this.unsubscribe();
-    };
-    return ObserveOnSubscriber;
-}(Subscriber_1.Subscriber));
-exports.ObserveOnSubscriber = ObserveOnSubscriber;
-var ObserveOnMessage = (function () {
-    function ObserveOnMessage(notification, destination) {
-        this.notification = notification;
-        this.destination = destination;
-    }
-    return ObserveOnMessage;
-}());
-exports.ObserveOnMessage = ObserveOnMessage;
-
-},{"../Notification":31,"../Subscriber":39}],124:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var from_1 = require("../observable/from");
-var isArray_1 = require("../util/isArray");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function onErrorResumeNext() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); };
-}
-exports.onErrorResumeNext = onErrorResumeNext;
-function onErrorResumeNextStatic() {
-    var nextSources = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        nextSources[_i] = arguments[_i];
-    }
-    var source = null;
-    if (nextSources.length === 1 && isArray_1.isArray(nextSources[0])) {
-        nextSources = nextSources[0];
-    }
-    source = nextSources.shift();
-    return from_1.from(source, null).lift(new OnErrorResumeNextOperator(nextSources));
-}
-exports.onErrorResumeNextStatic = onErrorResumeNextStatic;
-var OnErrorResumeNextOperator = (function () {
-    function OnErrorResumeNextOperator(nextSources) {
-        this.nextSources = nextSources;
-    }
-    OnErrorResumeNextOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources));
-    };
-    return OnErrorResumeNextOperator;
-}());
-var OnErrorResumeNextSubscriber = (function (_super) {
-    __extends(OnErrorResumeNextSubscriber, _super);
-    function OnErrorResumeNextSubscriber(destination, nextSources) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.nextSources = nextSources;
-        return _this;
-    }
-    OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.subscribeToNextSource();
-    };
-    OnErrorResumeNextSubscriber.prototype._error = function (err) {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype._complete = function () {
-        this.subscribeToNextSource();
-        this.unsubscribe();
-    };
-    OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () {
-        var next = this.nextSources.shift();
-        if (next) {
-            var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-            var destination = this.destination;
-            destination.add(innerSubscriber);
-            subscribeToResult_1.subscribeToResult(this, next, undefined, undefined, innerSubscriber);
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    return OnErrorResumeNextSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/isArray":203,"../util/subscribeToResult":222}],125:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function pairwise() {
-    return function (source) { return source.lift(new PairwiseOperator()); };
-}
-exports.pairwise = pairwise;
-var PairwiseOperator = (function () {
-    function PairwiseOperator() {
-    }
-    PairwiseOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new PairwiseSubscriber(subscriber));
-    };
-    return PairwiseOperator;
-}());
-var PairwiseSubscriber = (function (_super) {
-    __extends(PairwiseSubscriber, _super);
-    function PairwiseSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasPrev = false;
-        return _this;
-    }
-    PairwiseSubscriber.prototype._next = function (value) {
-        if (this.hasPrev) {
-            this.destination.next([this.prev, value]);
-        }
-        else {
-            this.hasPrev = true;
-        }
-        this.prev = value;
-    };
-    return PairwiseSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],126:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var not_1 = require("../util/not");
-var filter_1 = require("./filter");
-function partition(predicate, thisArg) {
-    return function (source) { return [
-        filter_1.filter(predicate, thisArg)(source),
-        filter_1.filter(not_1.not(predicate, thisArg))(source)
-    ]; };
-}
-exports.partition = partition;
-
-},{"../util/not":215,"./filter":103}],127:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var map_1 = require("./map");
-function pluck() {
-    var properties = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        properties[_i] = arguments[_i];
-    }
-    var length = properties.length;
-    if (length === 0) {
-        throw new Error('list of properties cannot be empty.');
-    }
-    return function (source) { return map_1.map(plucker(properties, length))(source); };
-}
-exports.pluck = pluck;
-function plucker(props, length) {
-    var mapper = function (x) {
-        var currentProp = x;
-        for (var i = 0; i < length; i++) {
-            var p = currentProp[props[i]];
-            if (typeof p !== 'undefined') {
-                currentProp = p;
-            }
-            else {
-                return undefined;
-            }
-        }
-        return currentProp;
-    };
-    return mapper;
-}
-
-},{"./map":112}],128:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var multicast_1 = require("./multicast");
-function publish(selector) {
-    return selector ?
-        multicast_1.multicast(function () { return new Subject_1.Subject(); }, selector) :
-        multicast_1.multicast(new Subject_1.Subject());
-}
-exports.publish = publish;
-
-},{"../Subject":37,"./multicast":122}],129:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var BehaviorSubject_1 = require("../BehaviorSubject");
-var multicast_1 = require("./multicast");
-function publishBehavior(value) {
-    return function (source) { return multicast_1.multicast(new BehaviorSubject_1.BehaviorSubject(value))(source); };
-}
-exports.publishBehavior = publishBehavior;
-
-},{"../BehaviorSubject":29,"./multicast":122}],130:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncSubject_1 = require("../AsyncSubject");
-var multicast_1 = require("./multicast");
-function publishLast() {
-    return function (source) { return multicast_1.multicast(new AsyncSubject_1.AsyncSubject())(source); };
-}
-exports.publishLast = publishLast;
-
-},{"../AsyncSubject":28,"./multicast":122}],131:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ReplaySubject_1 = require("../ReplaySubject");
-var multicast_1 = require("./multicast");
-function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) {
-    if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') {
-        scheduler = selectorOrScheduler;
-    }
-    var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined;
-    var subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
-    return function (source) { return multicast_1.multicast(function () { return subject; }, selector)(source); };
-}
-exports.publishReplay = publishReplay;
-
-},{"../ReplaySubject":35,"./multicast":122}],132:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("../util/isArray");
-var race_1 = require("../observable/race");
-function race() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function raceOperatorFunction(source) {
-        if (observables.length === 1 && isArray_1.isArray(observables[0])) {
-            observables = observables[0];
-        }
-        return source.lift.call(race_1.race.apply(void 0, [source].concat(observables)));
-    };
-}
-exports.race = race;
-
-},{"../observable/race":66,"../util/isArray":203}],133:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var scan_1 = require("./scan");
-var takeLast_1 = require("./takeLast");
-var defaultIfEmpty_1 = require("./defaultIfEmpty");
-var pipe_1 = require("../util/pipe");
-function reduce(accumulator, seed) {
-    if (arguments.length >= 2) {
-        return function reduceOperatorFunctionWithSeed(source) {
-            return pipe_1.pipe(scan_1.scan(accumulator, seed), takeLast_1.takeLast(1), defaultIfEmpty_1.defaultIfEmpty(seed))(source);
-        };
-    }
-    return function reduceOperatorFunction(source) {
-        return pipe_1.pipe(scan_1.scan(function (acc, value, index) { return accumulator(acc, value, index + 1); }), takeLast_1.takeLast(1))(source);
-    };
-}
-exports.reduce = reduce;
-
-},{"../util/pipe":216,"./defaultIfEmpty":90,"./scan":141,"./takeLast":156}],134:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function refCount() {
-    return function refCountOperatorFunction(source) {
-        return source.lift(new RefCountOperator(source));
-    };
-}
-exports.refCount = refCount;
-var RefCountOperator = (function () {
-    function RefCountOperator(connectable) {
-        this.connectable = connectable;
-    }
-    RefCountOperator.prototype.call = function (subscriber, source) {
-        var connectable = this.connectable;
-        connectable._refCount++;
-        var refCounter = new RefCountSubscriber(subscriber, connectable);
-        var subscription = source.subscribe(refCounter);
-        if (!refCounter.closed) {
-            refCounter.connection = connectable.connect();
-        }
-        return subscription;
-    };
-    return RefCountOperator;
-}());
-var RefCountSubscriber = (function (_super) {
-    __extends(RefCountSubscriber, _super);
-    function RefCountSubscriber(destination, connectable) {
-        var _this = _super.call(this, destination) || this;
-        _this.connectable = connectable;
-        return _this;
-    }
-    RefCountSubscriber.prototype._unsubscribe = function () {
-        var connectable = this.connectable;
-        if (!connectable) {
-            this.connection = null;
-            return;
-        }
-        this.connectable = null;
-        var refCount = connectable._refCount;
-        if (refCount <= 0) {
-            this.connection = null;
-            return;
-        }
-        connectable._refCount = refCount - 1;
-        if (refCount > 1) {
-            this.connection = null;
-            return;
-        }
-        var connection = this.connection;
-        var sharedConnection = connectable._connection;
-        this.connection = null;
-        if (sharedConnection && (!connection || sharedConnection === connection)) {
-            sharedConnection.unsubscribe();
-        }
-    };
-    return RefCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],135:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var empty_1 = require("../observable/empty");
-function repeat(count) {
-    if (count === void 0) { count = -1; }
-    return function (source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else if (count < 0) {
-            return source.lift(new RepeatOperator(-1, source));
-        }
-        else {
-            return source.lift(new RepeatOperator(count - 1, source));
-        }
-    };
-}
-exports.repeat = repeat;
-var RepeatOperator = (function () {
-    function RepeatOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RepeatOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source));
-    };
-    return RepeatOperator;
-}());
-var RepeatSubscriber = (function (_super) {
-    __extends(RepeatSubscriber, _super);
-    function RepeatSubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RepeatSubscriber.prototype.complete = function () {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.complete.call(this);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RepeatSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../observable/empty":49}],136:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function repeatWhen(notifier) {
-    return function (source) { return source.lift(new RepeatWhenOperator(notifier)); };
-}
-exports.repeatWhen = repeatWhen;
-var RepeatWhenOperator = (function () {
-    function RepeatWhenOperator(notifier) {
-        this.notifier = notifier;
-    }
-    RepeatWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source));
-    };
-    return RepeatWhenOperator;
-}());
-var RepeatWhenSubscriber = (function (_super) {
-    __extends(RepeatWhenSubscriber, _super);
-    function RepeatWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        _this.sourceIsBeingSubscribedTo = true;
-        return _this;
-    }
-    RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.sourceIsBeingSubscribedTo = true;
-        this.source.subscribe(this);
-    };
-    RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) {
-        if (this.sourceIsBeingSubscribedTo === false) {
-            return _super.prototype.complete.call(this);
-        }
-    };
-    RepeatWhenSubscriber.prototype.complete = function () {
-        this.sourceIsBeingSubscribedTo = false;
-        if (!this.isStopped) {
-            if (!this.retries) {
-                this.subscribeToRetries();
-            }
-            if (!this.retriesSubscription || this.retriesSubscription.closed) {
-                return _super.prototype.complete.call(this);
-            }
-            this._unsubscribeAndRecycle();
-            this.notifications.next();
-        }
-    };
-    RepeatWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription;
-        if (notifications) {
-            notifications.unsubscribe();
-            this.notifications = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        _super.prototype._unsubscribeAndRecycle.call(this);
-        this._unsubscribe = _unsubscribe;
-        return this;
-    };
-    RepeatWhenSubscriber.prototype.subscribeToRetries = function () {
-        this.notifications = new Subject_1.Subject();
-        var retries = tryCatch_1.tryCatch(this.notifier)(this.notifications);
-        if (retries === errorObject_1.errorObject) {
-            return _super.prototype.complete.call(this);
-        }
-        this.retries = retries;
-        this.retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
-    };
-    return RepeatWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../Subject":37,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],137:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function retry(count) {
-    if (count === void 0) { count = -1; }
-    return function (source) { return source.lift(new RetryOperator(count, source)); };
-}
-exports.retry = retry;
-var RetryOperator = (function () {
-    function RetryOperator(count, source) {
-        this.count = count;
-        this.source = source;
-    }
-    RetryOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source));
-    };
-    return RetryOperator;
-}());
-var RetrySubscriber = (function (_super) {
-    __extends(RetrySubscriber, _super);
-    function RetrySubscriber(destination, count, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.count = count;
-        _this.source = source;
-        return _this;
-    }
-    RetrySubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var _a = this, source = _a.source, count = _a.count;
-            if (count === 0) {
-                return _super.prototype.error.call(this, err);
-            }
-            else if (count > -1) {
-                this.count = count - 1;
-            }
-            source.subscribe(this._unsubscribeAndRecycle());
-        }
-    };
-    return RetrySubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],138:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function retryWhen(notifier) {
-    return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); };
-}
-exports.retryWhen = retryWhen;
-var RetryWhenOperator = (function () {
-    function RetryWhenOperator(notifier, source) {
-        this.notifier = notifier;
-        this.source = source;
-    }
-    RetryWhenOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source));
-    };
-    return RetryWhenOperator;
-}());
-var RetryWhenSubscriber = (function (_super) {
-    __extends(RetryWhenSubscriber, _super);
-    function RetryWhenSubscriber(destination, notifier, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.notifier = notifier;
-        _this.source = source;
-        return _this;
-    }
-    RetryWhenSubscriber.prototype.error = function (err) {
-        if (!this.isStopped) {
-            var errors = this.errors;
-            var retries = this.retries;
-            var retriesSubscription = this.retriesSubscription;
-            if (!retries) {
-                errors = new Subject_1.Subject();
-                retries = tryCatch_1.tryCatch(this.notifier)(errors);
-                if (retries === errorObject_1.errorObject) {
-                    return _super.prototype.error.call(this, errorObject_1.errorObject.e);
-                }
-                retriesSubscription = subscribeToResult_1.subscribeToResult(this, retries);
-            }
-            else {
-                this.errors = null;
-                this.retriesSubscription = null;
-            }
-            this._unsubscribeAndRecycle();
-            this.errors = errors;
-            this.retries = retries;
-            this.retriesSubscription = retriesSubscription;
-            errors.next(err);
-        }
-    };
-    RetryWhenSubscriber.prototype._unsubscribe = function () {
-        var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription;
-        if (errors) {
-            errors.unsubscribe();
-            this.errors = null;
-        }
-        if (retriesSubscription) {
-            retriesSubscription.unsubscribe();
-            this.retriesSubscription = null;
-        }
-        this.retries = null;
-    };
-    RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        var _unsubscribe = this._unsubscribe;
-        this._unsubscribe = null;
-        this._unsubscribeAndRecycle();
-        this._unsubscribe = _unsubscribe;
-        this.source.subscribe(this);
-    };
-    return RetryWhenSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../Subject":37,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],139:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function sample(notifier) {
-    return function (source) { return source.lift(new SampleOperator(notifier)); };
-}
-exports.sample = sample;
-var SampleOperator = (function () {
-    function SampleOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SampleOperator.prototype.call = function (subscriber, source) {
-        var sampleSubscriber = new SampleSubscriber(subscriber);
-        var subscription = source.subscribe(sampleSubscriber);
-        subscription.add(subscribeToResult_1.subscribeToResult(sampleSubscriber, this.notifier));
-        return subscription;
-    };
-    return SampleOperator;
-}());
-var SampleSubscriber = (function (_super) {
-    __extends(SampleSubscriber, _super);
-    function SampleSubscriber() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this.hasValue = false;
-        return _this;
-    }
-    SampleSubscriber.prototype._next = function (value) {
-        this.value = value;
-        this.hasValue = true;
-    };
-    SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.notifyComplete = function () {
-        this.emitValue();
-    };
-    SampleSubscriber.prototype.emitValue = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.value);
-        }
-    };
-    return SampleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],140:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-function sampleTime(period, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); };
-}
-exports.sampleTime = sampleTime;
-var SampleTimeOperator = (function () {
-    function SampleTimeOperator(period, scheduler) {
-        this.period = period;
-        this.scheduler = scheduler;
-    }
-    SampleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler));
-    };
-    return SampleTimeOperator;
-}());
-var SampleTimeSubscriber = (function (_super) {
-    __extends(SampleTimeSubscriber, _super);
-    function SampleTimeSubscriber(destination, period, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.period = period;
-        _this.scheduler = scheduler;
-        _this.hasValue = false;
-        _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period }));
-        return _this;
-    }
-    SampleTimeSubscriber.prototype._next = function (value) {
-        this.lastValue = value;
-        this.hasValue = true;
-    };
-    SampleTimeSubscriber.prototype.notifyNext = function () {
-        if (this.hasValue) {
-            this.hasValue = false;
-            this.destination.next(this.lastValue);
-        }
-    };
-    return SampleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNotification(state) {
-    var subscriber = state.subscriber, period = state.period;
-    subscriber.notifyNext();
-    this.schedule(state, period);
-}
-
-},{"../Subscriber":39,"../scheduler/async":188}],141:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function scan(accumulator, seed) {
-    var hasSeed = false;
-    if (arguments.length >= 2) {
-        hasSeed = true;
-    }
-    return function scanOperatorFunction(source) {
-        return source.lift(new ScanOperator(accumulator, seed, hasSeed));
-    };
-}
-exports.scan = scan;
-var ScanOperator = (function () {
-    function ScanOperator(accumulator, seed, hasSeed) {
-        if (hasSeed === void 0) { hasSeed = false; }
-        this.accumulator = accumulator;
-        this.seed = seed;
-        this.hasSeed = hasSeed;
-    }
-    ScanOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed));
-    };
-    return ScanOperator;
-}());
-var ScanSubscriber = (function (_super) {
-    __extends(ScanSubscriber, _super);
-    function ScanSubscriber(destination, accumulator, _seed, hasSeed) {
-        var _this = _super.call(this, destination) || this;
-        _this.accumulator = accumulator;
-        _this._seed = _seed;
-        _this.hasSeed = hasSeed;
-        _this.index = 0;
-        return _this;
-    }
-    Object.defineProperty(ScanSubscriber.prototype, "seed", {
-        get: function () {
-            return this._seed;
-        },
-        set: function (value) {
-            this.hasSeed = true;
-            this._seed = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ScanSubscriber.prototype._next = function (value) {
-        if (!this.hasSeed) {
-            this.seed = value;
-            this.destination.next(value);
-        }
-        else {
-            return this._tryNext(value);
-        }
-    };
-    ScanSubscriber.prototype._tryNext = function (value) {
-        var index = this.index++;
-        var result;
-        try {
-            result = this.accumulator(this.seed, value, index);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-        this.seed = result;
-        this.destination.next(result);
-    };
-    return ScanSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],142:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-function sequenceEqual(compareTo, comparor) {
-    return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparor)); };
-}
-exports.sequenceEqual = sequenceEqual;
-var SequenceEqualOperator = (function () {
-    function SequenceEqualOperator(compareTo, comparor) {
-        this.compareTo = compareTo;
-        this.comparor = comparor;
-    }
-    SequenceEqualOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparor));
-    };
-    return SequenceEqualOperator;
-}());
-exports.SequenceEqualOperator = SequenceEqualOperator;
-var SequenceEqualSubscriber = (function (_super) {
-    __extends(SequenceEqualSubscriber, _super);
-    function SequenceEqualSubscriber(destination, compareTo, comparor) {
-        var _this = _super.call(this, destination) || this;
-        _this.compareTo = compareTo;
-        _this.comparor = comparor;
-        _this._a = [];
-        _this._b = [];
-        _this._oneComplete = false;
-        _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this)));
-        return _this;
-    }
-    SequenceEqualSubscriber.prototype._next = function (value) {
-        if (this._oneComplete && this._b.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._a.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype._complete = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-        this.unsubscribe();
-    };
-    SequenceEqualSubscriber.prototype.checkValues = function () {
-        var _c = this, _a = _c._a, _b = _c._b, comparor = _c.comparor;
-        while (_a.length > 0 && _b.length > 0) {
-            var a = _a.shift();
-            var b = _b.shift();
-            var areEqual = false;
-            if (comparor) {
-                areEqual = tryCatch_1.tryCatch(comparor)(a, b);
-                if (areEqual === errorObject_1.errorObject) {
-                    this.destination.error(errorObject_1.errorObject.e);
-                }
-            }
-            else {
-                areEqual = a === b;
-            }
-            if (!areEqual) {
-                this.emit(false);
-            }
-        }
-    };
-    SequenceEqualSubscriber.prototype.emit = function (value) {
-        var destination = this.destination;
-        destination.next(value);
-        destination.complete();
-    };
-    SequenceEqualSubscriber.prototype.nextB = function (value) {
-        if (this._oneComplete && this._a.length === 0) {
-            this.emit(false);
-        }
-        else {
-            this._b.push(value);
-            this.checkValues();
-        }
-    };
-    SequenceEqualSubscriber.prototype.completeB = function () {
-        if (this._oneComplete) {
-            this.emit(this._a.length === 0 && this._b.length === 0);
-        }
-        else {
-            this._oneComplete = true;
-        }
-    };
-    return SequenceEqualSubscriber;
-}(Subscriber_1.Subscriber));
-exports.SequenceEqualSubscriber = SequenceEqualSubscriber;
-var SequenceEqualCompareToSubscriber = (function (_super) {
-    __extends(SequenceEqualCompareToSubscriber, _super);
-    function SequenceEqualCompareToSubscriber(destination, parent) {
-        var _this = _super.call(this, destination) || this;
-        _this.parent = parent;
-        return _this;
-    }
-    SequenceEqualCompareToSubscriber.prototype._next = function (value) {
-        this.parent.nextB(value);
-    };
-    SequenceEqualCompareToSubscriber.prototype._error = function (err) {
-        this.parent.error(err);
-        this.unsubscribe();
-    };
-    SequenceEqualCompareToSubscriber.prototype._complete = function () {
-        this.parent.completeB();
-        this.unsubscribe();
-    };
-    return SequenceEqualCompareToSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../util/errorObject":200,"../util/tryCatch":224}],143:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var multicast_1 = require("./multicast");
-var refCount_1 = require("./refCount");
-var Subject_1 = require("../Subject");
-function shareSubjectFactory() {
-    return new Subject_1.Subject();
-}
-function share() {
-    return function (source) { return refCount_1.refCount()(multicast_1.multicast(shareSubjectFactory)(source)); };
-}
-exports.share = share;
-
-},{"../Subject":37,"./multicast":122,"./refCount":134}],144:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ReplaySubject_1 = require("../ReplaySubject");
-function shareReplay(bufferSize, windowTime, scheduler) {
-    if (bufferSize === void 0) { bufferSize = Number.POSITIVE_INFINITY; }
-    if (windowTime === void 0) { windowTime = Number.POSITIVE_INFINITY; }
-    return function (source) { return source.lift(shareReplayOperator(bufferSize, windowTime, scheduler)); };
-}
-exports.shareReplay = shareReplay;
-function shareReplayOperator(bufferSize, windowTime, scheduler) {
-    var subject;
-    var refCount = 0;
-    var subscription;
-    var hasError = false;
-    var isComplete = false;
-    return function shareReplayOperation(source) {
-        refCount++;
-        if (!subject || hasError) {
-            hasError = false;
-            subject = new ReplaySubject_1.ReplaySubject(bufferSize, windowTime, scheduler);
-            subscription = source.subscribe({
-                next: function (value) { subject.next(value); },
-                error: function (err) {
-                    hasError = true;
-                    subject.error(err);
-                },
-                complete: function () {
-                    isComplete = true;
-                    subject.complete();
-                },
-            });
-        }
-        var innerSub = subject.subscribe(this);
-        return function () {
-            refCount--;
-            innerSub.unsubscribe();
-            if (subscription && refCount === 0 && isComplete) {
-                subscription.unsubscribe();
-            }
-        };
-    };
-}
-
-},{"../ReplaySubject":35}],145:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var EmptyError_1 = require("../util/EmptyError");
-function single(predicate) {
-    return function (source) { return source.lift(new SingleOperator(predicate, source)); };
-}
-exports.single = single;
-var SingleOperator = (function () {
-    function SingleOperator(predicate, source) {
-        this.predicate = predicate;
-        this.source = source;
-    }
-    SingleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source));
-    };
-    return SingleOperator;
-}());
-var SingleSubscriber = (function (_super) {
-    __extends(SingleSubscriber, _super);
-    function SingleSubscriber(destination, predicate, source) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.source = source;
-        _this.seenValue = false;
-        _this.index = 0;
-        return _this;
-    }
-    SingleSubscriber.prototype.applySingleValue = function (value) {
-        if (this.seenValue) {
-            this.destination.error('Sequence contains more than one element');
-        }
-        else {
-            this.seenValue = true;
-            this.singleValue = value;
-        }
-    };
-    SingleSubscriber.prototype._next = function (value) {
-        var index = this.index++;
-        if (this.predicate) {
-            this.tryNext(value, index);
-        }
-        else {
-            this.applySingleValue(value);
-        }
-    };
-    SingleSubscriber.prototype.tryNext = function (value, index) {
-        try {
-            if (this.predicate(value, index, this.source)) {
-                this.applySingleValue(value);
-            }
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    SingleSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        if (this.index > 0) {
-            destination.next(this.seenValue ? this.singleValue : undefined);
-            destination.complete();
-        }
-        else {
-            destination.error(new EmptyError_1.EmptyError);
-        }
-    };
-    return SingleSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../util/EmptyError":194}],146:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function skip(count) {
-    return function (source) { return source.lift(new SkipOperator(count)); };
-}
-exports.skip = skip;
-var SkipOperator = (function () {
-    function SkipOperator(total) {
-        this.total = total;
-    }
-    SkipOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipSubscriber(subscriber, this.total));
-    };
-    return SkipOperator;
-}());
-var SkipSubscriber = (function (_super) {
-    __extends(SkipSubscriber, _super);
-    function SkipSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    SkipSubscriber.prototype._next = function (x) {
-        if (++this.count > this.total) {
-            this.destination.next(x);
-        }
-    };
-    return SkipSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],147:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-function skipLast(count) {
-    return function (source) { return source.lift(new SkipLastOperator(count)); };
-}
-exports.skipLast = skipLast;
-var SkipLastOperator = (function () {
-    function SkipLastOperator(_skipCount) {
-        this._skipCount = _skipCount;
-        if (this._skipCount < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    SkipLastOperator.prototype.call = function (subscriber, source) {
-        if (this._skipCount === 0) {
-            return source.subscribe(new Subscriber_1.Subscriber(subscriber));
-        }
-        else {
-            return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount));
-        }
-    };
-    return SkipLastOperator;
-}());
-var SkipLastSubscriber = (function (_super) {
-    __extends(SkipLastSubscriber, _super);
-    function SkipLastSubscriber(destination, _skipCount) {
-        var _this = _super.call(this, destination) || this;
-        _this._skipCount = _skipCount;
-        _this._count = 0;
-        _this._ring = new Array(_skipCount);
-        return _this;
-    }
-    SkipLastSubscriber.prototype._next = function (value) {
-        var skipCount = this._skipCount;
-        var count = this._count++;
-        if (count < skipCount) {
-            this._ring[count] = value;
-        }
-        else {
-            var currentIndex = count % skipCount;
-            var ring = this._ring;
-            var oldValue = ring[currentIndex];
-            ring[currentIndex] = value;
-            this.destination.next(oldValue);
-        }
-    };
-    return SkipLastSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../util/ArgumentOutOfRangeError":193}],148:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function skipUntil(notifier) {
-    return function (source) { return source.lift(new SkipUntilOperator(notifier)); };
-}
-exports.skipUntil = skipUntil;
-var SkipUntilOperator = (function () {
-    function SkipUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    SkipUntilOperator.prototype.call = function (destination, source) {
-        return source.subscribe(new SkipUntilSubscriber(destination, this.notifier));
-    };
-    return SkipUntilOperator;
-}());
-var SkipUntilSubscriber = (function (_super) {
-    __extends(SkipUntilSubscriber, _super);
-    function SkipUntilSubscriber(destination, notifier) {
-        var _this = _super.call(this, destination) || this;
-        _this.hasValue = false;
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(_this, undefined, undefined);
-        _this.add(innerSubscriber);
-        _this.innerSubscription = innerSubscriber;
-        subscribeToResult_1.subscribeToResult(_this, notifier, undefined, undefined, innerSubscriber);
-        return _this;
-    }
-    SkipUntilSubscriber.prototype._next = function (value) {
-        if (this.hasValue) {
-            _super.prototype._next.call(this, value);
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.hasValue = true;
-        if (this.innerSubscription) {
-            this.innerSubscription.unsubscribe();
-        }
-    };
-    SkipUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return SkipUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../util/subscribeToResult":222}],149:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function skipWhile(predicate) {
-    return function (source) { return source.lift(new SkipWhileOperator(predicate)); };
-}
-exports.skipWhile = skipWhile;
-var SkipWhileOperator = (function () {
-    function SkipWhileOperator(predicate) {
-        this.predicate = predicate;
-    }
-    SkipWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate));
-    };
-    return SkipWhileOperator;
-}());
-var SkipWhileSubscriber = (function (_super) {
-    __extends(SkipWhileSubscriber, _super);
-    function SkipWhileSubscriber(destination, predicate) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.skipping = true;
-        _this.index = 0;
-        return _this;
-    }
-    SkipWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        if (this.skipping) {
-            this.tryCallPredicate(value);
-        }
-        if (!this.skipping) {
-            destination.next(value);
-        }
-    };
-    SkipWhileSubscriber.prototype.tryCallPredicate = function (value) {
-        try {
-            var result = this.predicate(value, this.index++);
-            this.skipping = Boolean(result);
-        }
-        catch (err) {
-            this.destination.error(err);
-        }
-    };
-    return SkipWhileSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],150:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var fromArray_1 = require("../observable/fromArray");
-var scalar_1 = require("../observable/scalar");
-var empty_1 = require("../observable/empty");
-var concat_1 = require("../observable/concat");
-var isScheduler_1 = require("../util/isScheduler");
-function startWith() {
-    var array = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        array[_i] = arguments[_i];
-    }
-    return function (source) {
-        var scheduler = array[array.length - 1];
-        if (isScheduler_1.isScheduler(scheduler)) {
-            array.pop();
-        }
-        else {
-            scheduler = null;
-        }
-        var len = array.length;
-        if (len === 1 && !scheduler) {
-            return concat_1.concat(scalar_1.scalar(array[0]), source);
-        }
-        else if (len > 0) {
-            return concat_1.concat(fromArray_1.fromArray(array, scheduler), source);
-        }
-        else {
-            return concat_1.concat(empty_1.empty(scheduler), source);
-        }
-    };
-}
-exports.startWith = startWith;
-
-},{"../observable/concat":47,"../observable/empty":49,"../observable/fromArray":52,"../observable/scalar":68,"../util/isScheduler":213}],151:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var SubscribeOnObservable_1 = require("../observable/SubscribeOnObservable");
-function subscribeOn(scheduler, delay) {
-    if (delay === void 0) { delay = 0; }
-    return function subscribeOnOperatorFunction(source) {
-        return source.lift(new SubscribeOnOperator(scheduler, delay));
-    };
-}
-exports.subscribeOn = subscribeOn;
-var SubscribeOnOperator = (function () {
-    function SubscribeOnOperator(scheduler, delay) {
-        this.scheduler = scheduler;
-        this.delay = delay;
-    }
-    SubscribeOnOperator.prototype.call = function (subscriber, source) {
-        return new SubscribeOnObservable_1.SubscribeOnObservable(source, this.delay, this.scheduler).subscribe(subscriber);
-    };
-    return SubscribeOnOperator;
-}());
-
-},{"../observable/SubscribeOnObservable":43}],152:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var switchMap_1 = require("./switchMap");
-var identity_1 = require("../util/identity");
-function switchAll() {
-    return switchMap_1.switchMap(identity_1.identity);
-}
-exports.switchAll = switchAll;
-
-},{"../util/identity":202,"./switchMap":153}],153:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-var map_1 = require("./map");
-var from_1 = require("../observable/from");
-function switchMap(project, resultSelector) {
-    if (typeof resultSelector === 'function') {
-        return function (source) { return source.pipe(switchMap(function (a, i) { return from_1.from(project(a, i)).pipe(map_1.map(function (b, ii) { return resultSelector(a, b, i, ii); })); })); };
-    }
-    return function (source) { return source.lift(new SwitchMapOperator(project)); };
-}
-exports.switchMap = switchMap;
-var SwitchMapOperator = (function () {
-    function SwitchMapOperator(project) {
-        this.project = project;
-    }
-    SwitchMapOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new SwitchMapSubscriber(subscriber, this.project));
-    };
-    return SwitchMapOperator;
-}());
-var SwitchMapSubscriber = (function (_super) {
-    __extends(SwitchMapSubscriber, _super);
-    function SwitchMapSubscriber(destination, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.project = project;
-        _this.index = 0;
-        return _this;
-    }
-    SwitchMapSubscriber.prototype._next = function (value) {
-        var result;
-        var index = this.index++;
-        try {
-            result = this.project(value, index);
-        }
-        catch (error) {
-            this.destination.error(error);
-            return;
-        }
-        this._innerSub(result, value, index);
-    };
-    SwitchMapSubscriber.prototype._innerSub = function (result, value, index) {
-        var innerSubscription = this.innerSubscription;
-        if (innerSubscription) {
-            innerSubscription.unsubscribe();
-        }
-        var innerSubscriber = new InnerSubscriber_1.InnerSubscriber(this, undefined, undefined);
-        var destination = this.destination;
-        destination.add(innerSubscriber);
-        this.innerSubscription = subscribeToResult_1.subscribeToResult(this, result, value, index, innerSubscriber);
-    };
-    SwitchMapSubscriber.prototype._complete = function () {
-        var innerSubscription = this.innerSubscription;
-        if (!innerSubscription || innerSubscription.closed) {
-            _super.prototype._complete.call(this);
-        }
-        this.unsubscribe();
-    };
-    SwitchMapSubscriber.prototype._unsubscribe = function () {
-        this.innerSubscription = null;
-    };
-    SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) {
-        var destination = this.destination;
-        destination.remove(innerSub);
-        this.innerSubscription = null;
-        if (this.isStopped) {
-            _super.prototype._complete.call(this);
-        }
-    };
-    SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.destination.next(innerValue);
-    };
-    return SwitchMapSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../InnerSubscriber":30,"../OuterSubscriber":34,"../observable/from":51,"../util/subscribeToResult":222,"./map":112}],154:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var switchMap_1 = require("./switchMap");
-function switchMapTo(innerObservable, resultSelector) {
-    return resultSelector ? switchMap_1.switchMap(function () { return innerObservable; }, resultSelector) : switchMap_1.switchMap(function () { return innerObservable; });
-}
-exports.switchMapTo = switchMapTo;
-
-},{"./switchMap":153}],155:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var empty_1 = require("../observable/empty");
-function take(count) {
-    return function (source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else {
-            return source.lift(new TakeOperator(count));
-        }
-    };
-}
-exports.take = take;
-var TakeOperator = (function () {
-    function TakeOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeSubscriber(subscriber, this.total));
-    };
-    return TakeOperator;
-}());
-var TakeSubscriber = (function (_super) {
-    __extends(TakeSubscriber, _super);
-    function TakeSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.count = 0;
-        return _this;
-    }
-    TakeSubscriber.prototype._next = function (value) {
-        var total = this.total;
-        var count = ++this.count;
-        if (count <= total) {
-            this.destination.next(value);
-            if (count === total) {
-                this.destination.complete();
-                this.unsubscribe();
-            }
-        }
-    };
-    return TakeSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../observable/empty":49,"../util/ArgumentOutOfRangeError":193}],156:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var ArgumentOutOfRangeError_1 = require("../util/ArgumentOutOfRangeError");
-var empty_1 = require("../observable/empty");
-function takeLast(count) {
-    return function takeLastOperatorFunction(source) {
-        if (count === 0) {
-            return empty_1.empty();
-        }
-        else {
-            return source.lift(new TakeLastOperator(count));
-        }
-    };
-}
-exports.takeLast = takeLast;
-var TakeLastOperator = (function () {
-    function TakeLastOperator(total) {
-        this.total = total;
-        if (this.total < 0) {
-            throw new ArgumentOutOfRangeError_1.ArgumentOutOfRangeError;
-        }
-    }
-    TakeLastOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeLastSubscriber(subscriber, this.total));
-    };
-    return TakeLastOperator;
-}());
-var TakeLastSubscriber = (function (_super) {
-    __extends(TakeLastSubscriber, _super);
-    function TakeLastSubscriber(destination, total) {
-        var _this = _super.call(this, destination) || this;
-        _this.total = total;
-        _this.ring = new Array();
-        _this.count = 0;
-        return _this;
-    }
-    TakeLastSubscriber.prototype._next = function (value) {
-        var ring = this.ring;
-        var total = this.total;
-        var count = this.count++;
-        if (ring.length < total) {
-            ring.push(value);
-        }
-        else {
-            var index = count % total;
-            ring[index] = value;
-        }
-    };
-    TakeLastSubscriber.prototype._complete = function () {
-        var destination = this.destination;
-        var count = this.count;
-        if (count > 0) {
-            var total = this.count >= this.total ? this.total : this.count;
-            var ring = this.ring;
-            for (var i = 0; i < total; i++) {
-                var idx = (count++) % total;
-                destination.next(ring[idx]);
-            }
-        }
-        destination.complete();
-    };
-    return TakeLastSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../observable/empty":49,"../util/ArgumentOutOfRangeError":193}],157:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function takeUntil(notifier) {
-    return function (source) { return source.lift(new TakeUntilOperator(notifier)); };
-}
-exports.takeUntil = takeUntil;
-var TakeUntilOperator = (function () {
-    function TakeUntilOperator(notifier) {
-        this.notifier = notifier;
-    }
-    TakeUntilOperator.prototype.call = function (subscriber, source) {
-        var takeUntilSubscriber = new TakeUntilSubscriber(subscriber);
-        var notifierSubscription = subscribeToResult_1.subscribeToResult(takeUntilSubscriber, this.notifier);
-        if (notifierSubscription && !takeUntilSubscriber.seenValue) {
-            takeUntilSubscriber.add(notifierSubscription);
-            return source.subscribe(takeUntilSubscriber);
-        }
-        return takeUntilSubscriber;
-    };
-    return TakeUntilOperator;
-}());
-var TakeUntilSubscriber = (function (_super) {
-    __extends(TakeUntilSubscriber, _super);
-    function TakeUntilSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.seenValue = false;
-        return _this;
-    }
-    TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.seenValue = true;
-        this.complete();
-    };
-    TakeUntilSubscriber.prototype.notifyComplete = function () {
-    };
-    return TakeUntilSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],158:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function takeWhile(predicate) {
-    return function (source) { return source.lift(new TakeWhileOperator(predicate)); };
-}
-exports.takeWhile = takeWhile;
-var TakeWhileOperator = (function () {
-    function TakeWhileOperator(predicate) {
-        this.predicate = predicate;
-    }
-    TakeWhileOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate));
-    };
-    return TakeWhileOperator;
-}());
-var TakeWhileSubscriber = (function (_super) {
-    __extends(TakeWhileSubscriber, _super);
-    function TakeWhileSubscriber(destination, predicate) {
-        var _this = _super.call(this, destination) || this;
-        _this.predicate = predicate;
-        _this.index = 0;
-        return _this;
-    }
-    TakeWhileSubscriber.prototype._next = function (value) {
-        var destination = this.destination;
-        var result;
-        try {
-            result = this.predicate(value, this.index++);
-        }
-        catch (err) {
-            destination.error(err);
-            return;
-        }
-        this.nextOrComplete(value, result);
-    };
-    TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) {
-        var destination = this.destination;
-        if (Boolean(predicateResult)) {
-            destination.next(value);
-        }
-        else {
-            destination.complete();
-        }
-    };
-    return TakeWhileSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39}],159:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var noop_1 = require("../util/noop");
-var isFunction_1 = require("../util/isFunction");
-function tap(nextOrObserver, error, complete) {
-    return function tapOperatorFunction(source) {
-        return source.lift(new DoOperator(nextOrObserver, error, complete));
-    };
-}
-exports.tap = tap;
-var DoOperator = (function () {
-    function DoOperator(nextOrObserver, error, complete) {
-        this.nextOrObserver = nextOrObserver;
-        this.error = error;
-        this.complete = complete;
-    }
-    DoOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete));
-    };
-    return DoOperator;
-}());
-var TapSubscriber = (function (_super) {
-    __extends(TapSubscriber, _super);
-    function TapSubscriber(destination, observerOrNext, error, complete) {
-        var _this = _super.call(this, destination) || this;
-        _this._tapNext = noop_1.noop;
-        _this._tapError = noop_1.noop;
-        _this._tapComplete = noop_1.noop;
-        _this._tapError = error || noop_1.noop;
-        _this._tapComplete = complete || noop_1.noop;
-        if (isFunction_1.isFunction(observerOrNext)) {
-            _this._context = _this;
-            _this._tapNext = observerOrNext;
-        }
-        else if (observerOrNext) {
-            _this._context = observerOrNext;
-            _this._tapNext = observerOrNext.next || noop_1.noop;
-            _this._tapError = observerOrNext.error || noop_1.noop;
-            _this._tapComplete = observerOrNext.complete || noop_1.noop;
-        }
-        return _this;
-    }
-    TapSubscriber.prototype._next = function (value) {
-        try {
-            this._tapNext.call(this._context, value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(value);
-    };
-    TapSubscriber.prototype._error = function (err) {
-        try {
-            this._tapError.call(this._context, err);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.error(err);
-    };
-    TapSubscriber.prototype._complete = function () {
-        try {
-            this._tapComplete.call(this._context);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        return this.destination.complete();
-    };
-    return TapSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subscriber":39,"../util/isFunction":206,"../util/noop":214}],160:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-exports.defaultThrottleConfig = {
-    leading: true,
-    trailing: false
-};
-function throttle(durationSelector, config) {
-    if (config === void 0) { config = exports.defaultThrottleConfig; }
-    return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); };
-}
-exports.throttle = throttle;
-var ThrottleOperator = (function () {
-    function ThrottleOperator(durationSelector, leading, trailing) {
-        this.durationSelector = durationSelector;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing));
-    };
-    return ThrottleOperator;
-}());
-var ThrottleSubscriber = (function (_super) {
-    __extends(ThrottleSubscriber, _super);
-    function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.durationSelector = durationSelector;
-        _this._leading = _leading;
-        _this._trailing = _trailing;
-        _this._hasValue = false;
-        return _this;
-    }
-    ThrottleSubscriber.prototype._next = function (value) {
-        this._hasValue = true;
-        this._sendValue = value;
-        if (!this._throttled) {
-            if (this._leading) {
-                this.send();
-            }
-            else {
-                this.throttle(value);
-            }
-        }
-    };
-    ThrottleSubscriber.prototype.send = function () {
-        var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue;
-        if (_hasValue) {
-            this.destination.next(_sendValue);
-            this.throttle(_sendValue);
-        }
-        this._hasValue = false;
-        this._sendValue = null;
-    };
-    ThrottleSubscriber.prototype.throttle = function (value) {
-        var duration = this.tryDurationSelector(value);
-        if (duration) {
-            this.add(this._throttled = subscribeToResult_1.subscribeToResult(this, duration));
-        }
-    };
-    ThrottleSubscriber.prototype.tryDurationSelector = function (value) {
-        try {
-            return this.durationSelector(value);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return null;
-        }
-    };
-    ThrottleSubscriber.prototype.throttlingDone = function () {
-        var _a = this, _throttled = _a._throttled, _trailing = _a._trailing;
-        if (_throttled) {
-            _throttled.unsubscribe();
-        }
-        this._throttled = null;
-        if (_trailing) {
-            this.send();
-        }
-    };
-    ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.throttlingDone();
-    };
-    ThrottleSubscriber.prototype.notifyComplete = function () {
-        this.throttlingDone();
-    };
-    return ThrottleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],161:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var async_1 = require("../scheduler/async");
-var throttle_1 = require("./throttle");
-function throttleTime(duration, scheduler, config) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    if (config === void 0) { config = throttle_1.defaultThrottleConfig; }
-    return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); };
-}
-exports.throttleTime = throttleTime;
-var ThrottleTimeOperator = (function () {
-    function ThrottleTimeOperator(duration, scheduler, leading, trailing) {
-        this.duration = duration;
-        this.scheduler = scheduler;
-        this.leading = leading;
-        this.trailing = trailing;
-    }
-    ThrottleTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing));
-    };
-    return ThrottleTimeOperator;
-}());
-var ThrottleTimeSubscriber = (function (_super) {
-    __extends(ThrottleTimeSubscriber, _super);
-    function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) {
-        var _this = _super.call(this, destination) || this;
-        _this.duration = duration;
-        _this.scheduler = scheduler;
-        _this.leading = leading;
-        _this.trailing = trailing;
-        _this._hasTrailingValue = false;
-        _this._trailingValue = null;
-        return _this;
-    }
-    ThrottleTimeSubscriber.prototype._next = function (value) {
-        if (this.throttled) {
-            if (this.trailing) {
-                this._trailingValue = value;
-                this._hasTrailingValue = true;
-            }
-        }
-        else {
-            this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this }));
-            if (this.leading) {
-                this.destination.next(value);
-            }
-        }
-    };
-    ThrottleTimeSubscriber.prototype._complete = function () {
-        if (this._hasTrailingValue) {
-            this.destination.next(this._trailingValue);
-            this.destination.complete();
-        }
-        else {
-            this.destination.complete();
-        }
-    };
-    ThrottleTimeSubscriber.prototype.clearThrottle = function () {
-        var throttled = this.throttled;
-        if (throttled) {
-            if (this.trailing && this._hasTrailingValue) {
-                this.destination.next(this._trailingValue);
-                this._trailingValue = null;
-                this._hasTrailingValue = false;
-            }
-            throttled.unsubscribe();
-            this.remove(throttled);
-            this.throttled = null;
-        }
-    };
-    return ThrottleTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchNext(arg) {
-    var subscriber = arg.subscriber;
-    subscriber.clearThrottle();
-}
-
-},{"../Subscriber":39,"../scheduler/async":188,"./throttle":160}],162:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var tap_1 = require("./tap");
-var EmptyError_1 = require("../util/EmptyError");
-exports.throwIfEmpty = function (errorFactory) {
-    if (errorFactory === void 0) { errorFactory = defaultErrorFactory; }
-    return tap_1.tap({
-        hasValue: false,
-        next: function () { this.hasValue = true; },
-        complete: function () {
-            if (!this.hasValue) {
-                throw errorFactory();
-            }
-        }
-    });
-};
-function defaultErrorFactory() {
-    return new EmptyError_1.EmptyError();
-}
-
-},{"../util/EmptyError":194,"./tap":159}],163:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var scan_1 = require("./scan");
-var defer_1 = require("../observable/defer");
-var map_1 = require("./map");
-function timeInterval(scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) { return defer_1.defer(function () {
-        return source.pipe(scan_1.scan(function (_a, value) {
-            var current = _a.current;
-            return ({ value: value, current: scheduler.now(), last: current });
-        }, { current: scheduler.now(), value: undefined, last: undefined }), map_1.map(function (_a) {
-            var current = _a.current, last = _a.last, value = _a.value;
-            return new TimeInterval(value, current - last);
-        }));
-    }); };
-}
-exports.timeInterval = timeInterval;
-var TimeInterval = (function () {
-    function TimeInterval(value, interval) {
-        this.value = value;
-        this.interval = interval;
-    }
-    return TimeInterval;
-}());
-exports.TimeInterval = TimeInterval;
-
-},{"../observable/defer":48,"../scheduler/async":188,"./map":112,"./scan":141}],164:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var TimeoutError_1 = require("../util/TimeoutError");
-var timeoutWith_1 = require("./timeoutWith");
-var throwError_1 = require("../observable/throwError");
-function timeout(due, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return timeoutWith_1.timeoutWith(due, throwError_1.throwError(new TimeoutError_1.TimeoutError()), scheduler);
-}
-exports.timeout = timeout;
-
-},{"../observable/throwError":69,"../scheduler/async":188,"../util/TimeoutError":197,"./timeoutWith":165}],165:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var isDate_1 = require("../util/isDate");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function timeoutWith(due, withObservable, scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return function (source) {
-        var absoluteTimeout = isDate_1.isDate(due);
-        var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due);
-        return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler));
-    };
-}
-exports.timeoutWith = timeoutWith;
-var TimeoutWithOperator = (function () {
-    function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) {
-        this.waitFor = waitFor;
-        this.absoluteTimeout = absoluteTimeout;
-        this.withObservable = withObservable;
-        this.scheduler = scheduler;
-    }
-    TimeoutWithOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler));
-    };
-    return TimeoutWithOperator;
-}());
-var TimeoutWithSubscriber = (function (_super) {
-    __extends(TimeoutWithSubscriber, _super);
-    function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.absoluteTimeout = absoluteTimeout;
-        _this.waitFor = waitFor;
-        _this.withObservable = withObservable;
-        _this.scheduler = scheduler;
-        _this.action = null;
-        _this.scheduleTimeout();
-        return _this;
-    }
-    TimeoutWithSubscriber.dispatchTimeout = function (subscriber) {
-        var withObservable = subscriber.withObservable;
-        subscriber._unsubscribeAndRecycle();
-        subscriber.add(subscribeToResult_1.subscribeToResult(subscriber, withObservable));
-    };
-    TimeoutWithSubscriber.prototype.scheduleTimeout = function () {
-        var action = this.action;
-        if (action) {
-            this.action = action.schedule(this, this.waitFor);
-        }
-        else {
-            this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this));
-        }
-    };
-    TimeoutWithSubscriber.prototype._next = function (value) {
-        if (!this.absoluteTimeout) {
-            this.scheduleTimeout();
-        }
-        _super.prototype._next.call(this, value);
-    };
-    TimeoutWithSubscriber.prototype._unsubscribe = function () {
-        this.action = null;
-        this.scheduler = null;
-        this.withObservable = null;
-    };
-    return TimeoutWithSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../scheduler/async":188,"../util/isDate":205,"../util/subscribeToResult":222}],166:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var async_1 = require("../scheduler/async");
-var map_1 = require("./map");
-function timestamp(scheduler) {
-    if (scheduler === void 0) { scheduler = async_1.async; }
-    return map_1.map(function (value) { return new Timestamp(value, scheduler.now()); });
-}
-exports.timestamp = timestamp;
-var Timestamp = (function () {
-    function Timestamp(value, timestamp) {
-        this.value = value;
-        this.timestamp = timestamp;
-    }
-    return Timestamp;
-}());
-exports.Timestamp = Timestamp;
-
-},{"../scheduler/async":188,"./map":112}],167:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var reduce_1 = require("./reduce");
-function toArrayReducer(arr, item, index) {
-    if (index === 0) {
-        return [item];
-    }
-    arr.push(item);
-    return arr;
-}
-function toArray() {
-    return reduce_1.reduce(toArrayReducer, []);
-}
-exports.toArray = toArray;
-
-},{"./reduce":133}],168:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function window(windowBoundaries) {
-    return function windowOperatorFunction(source) {
-        return source.lift(new WindowOperator(windowBoundaries));
-    };
-}
-exports.window = window;
-var WindowOperator = (function () {
-    function WindowOperator(windowBoundaries) {
-        this.windowBoundaries = windowBoundaries;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        var windowSubscriber = new WindowSubscriber(subscriber);
-        var sourceSubscription = source.subscribe(windowSubscriber);
-        if (!sourceSubscription.closed) {
-            windowSubscriber.add(subscribeToResult_1.subscribeToResult(windowSubscriber, this.windowBoundaries));
-        }
-        return sourceSubscription;
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = (function (_super) {
-    __extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination) {
-        var _this = _super.call(this, destination) || this;
-        _this.window = new Subject_1.Subject();
-        destination.next(_this.window);
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow();
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this._complete();
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-    };
-    WindowSubscriber.prototype._unsubscribe = function () {
-        this.window = null;
-    };
-    WindowSubscriber.prototype.openWindow = function () {
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var destination = this.destination;
-        var newWindow = this.window = new Subject_1.Subject();
-        destination.next(newWindow);
-    };
-    return WindowSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../Subject":37,"../util/subscribeToResult":222}],169:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var Subject_1 = require("../Subject");
-function windowCount(windowSize, startWindowEvery) {
-    if (startWindowEvery === void 0) { startWindowEvery = 0; }
-    return function windowCountOperatorFunction(source) {
-        return source.lift(new WindowCountOperator(windowSize, startWindowEvery));
-    };
-}
-exports.windowCount = windowCount;
-var WindowCountOperator = (function () {
-    function WindowCountOperator(windowSize, startWindowEvery) {
-        this.windowSize = windowSize;
-        this.startWindowEvery = startWindowEvery;
-    }
-    WindowCountOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery));
-    };
-    return WindowCountOperator;
-}());
-var WindowCountSubscriber = (function (_super) {
-    __extends(WindowCountSubscriber, _super);
-    function WindowCountSubscriber(destination, windowSize, startWindowEvery) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowSize = windowSize;
-        _this.startWindowEvery = startWindowEvery;
-        _this.windows = [new Subject_1.Subject()];
-        _this.count = 0;
-        destination.next(_this.windows[0]);
-        return _this;
-    }
-    WindowCountSubscriber.prototype._next = function (value) {
-        var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize;
-        var destination = this.destination;
-        var windowSize = this.windowSize;
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len && !this.closed; i++) {
-            windows[i].next(value);
-        }
-        var c = this.count - windowSize + 1;
-        if (c >= 0 && c % startWindowEvery === 0 && !this.closed) {
-            windows.shift().complete();
-        }
-        if (++this.count % startWindowEvery === 0 && !this.closed) {
-            var window_1 = new Subject_1.Subject();
-            windows.push(window_1);
-            destination.next(window_1);
-        }
-    };
-    WindowCountSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().error(err);
-            }
-        }
-        this.destination.error(err);
-    };
-    WindowCountSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        if (windows) {
-            while (windows.length > 0 && !this.closed) {
-                windows.shift().complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowCountSubscriber.prototype._unsubscribe = function () {
-        this.count = 0;
-        this.windows = null;
-    };
-    return WindowCountSubscriber;
-}(Subscriber_1.Subscriber));
-
-},{"../Subject":37,"../Subscriber":39}],170:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var async_1 = require("../scheduler/async");
-var Subscriber_1 = require("../Subscriber");
-var isNumeric_1 = require("../util/isNumeric");
-var isScheduler_1 = require("../util/isScheduler");
-function windowTime(windowTimeSpan) {
-    var scheduler = async_1.async;
-    var windowCreationInterval = null;
-    var maxWindowSize = Number.POSITIVE_INFINITY;
-    if (isScheduler_1.isScheduler(arguments[3])) {
-        scheduler = arguments[3];
-    }
-    if (isScheduler_1.isScheduler(arguments[2])) {
-        scheduler = arguments[2];
-    }
-    else if (isNumeric_1.isNumeric(arguments[2])) {
-        maxWindowSize = arguments[2];
-    }
-    if (isScheduler_1.isScheduler(arguments[1])) {
-        scheduler = arguments[1];
-    }
-    else if (isNumeric_1.isNumeric(arguments[1])) {
-        windowCreationInterval = arguments[1];
-    }
-    return function windowTimeOperatorFunction(source) {
-        return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler));
-    };
-}
-exports.windowTime = windowTime;
-var WindowTimeOperator = (function () {
-    function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        this.windowTimeSpan = windowTimeSpan;
-        this.windowCreationInterval = windowCreationInterval;
-        this.maxWindowSize = maxWindowSize;
-        this.scheduler = scheduler;
-    }
-    WindowTimeOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler));
-    };
-    return WindowTimeOperator;
-}());
-var CountedSubject = (function (_super) {
-    __extends(CountedSubject, _super);
-    function CountedSubject() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this._numberOfNextedValues = 0;
-        return _this;
-    }
-    CountedSubject.prototype.next = function (value) {
-        this._numberOfNextedValues++;
-        _super.prototype.next.call(this, value);
-    };
-    Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", {
-        get: function () {
-            return this._numberOfNextedValues;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return CountedSubject;
-}(Subject_1.Subject));
-var WindowTimeSubscriber = (function (_super) {
-    __extends(WindowTimeSubscriber, _super);
-    function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.windowTimeSpan = windowTimeSpan;
-        _this.windowCreationInterval = windowCreationInterval;
-        _this.maxWindowSize = maxWindowSize;
-        _this.scheduler = scheduler;
-        _this.windows = [];
-        var window = _this.openWindow();
-        if (windowCreationInterval !== null && windowCreationInterval >= 0) {
-            var closeState = { subscriber: _this, window: window, context: null };
-            var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler };
-            _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState));
-            _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState));
-        }
-        else {
-            var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan };
-            _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState));
-        }
-        return _this;
-    }
-    WindowTimeSubscriber.prototype._next = function (value) {
-        var windows = this.windows;
-        var len = windows.length;
-        for (var i = 0; i < len; i++) {
-            var window_1 = windows[i];
-            if (!window_1.closed) {
-                window_1.next(value);
-                if (window_1.numberOfNextedValues >= this.maxWindowSize) {
-                    this.closeWindow(window_1);
-                }
-            }
-        }
-    };
-    WindowTimeSubscriber.prototype._error = function (err) {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            windows.shift().error(err);
-        }
-        this.destination.error(err);
-    };
-    WindowTimeSubscriber.prototype._complete = function () {
-        var windows = this.windows;
-        while (windows.length > 0) {
-            var window_2 = windows.shift();
-            if (!window_2.closed) {
-                window_2.complete();
-            }
-        }
-        this.destination.complete();
-    };
-    WindowTimeSubscriber.prototype.openWindow = function () {
-        var window = new CountedSubject();
-        this.windows.push(window);
-        var destination = this.destination;
-        destination.next(window);
-        return window;
-    };
-    WindowTimeSubscriber.prototype.closeWindow = function (window) {
-        window.complete();
-        var windows = this.windows;
-        windows.splice(windows.indexOf(window), 1);
-    };
-    return WindowTimeSubscriber;
-}(Subscriber_1.Subscriber));
-function dispatchWindowTimeSpanOnly(state) {
-    var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window;
-    if (window) {
-        subscriber.closeWindow(window);
-    }
-    state.window = subscriber.openWindow();
-    this.schedule(state, windowTimeSpan);
-}
-function dispatchWindowCreation(state) {
-    var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval;
-    var window = subscriber.openWindow();
-    var action = this;
-    var context = { action: action, subscription: null };
-    var timeSpanState = { subscriber: subscriber, window: window, context: context };
-    context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState);
-    action.add(context.subscription);
-    action.schedule(state, windowCreationInterval);
-}
-function dispatchWindowClose(state) {
-    var subscriber = state.subscriber, window = state.window, context = state.context;
-    if (context && context.action && context.subscription) {
-        context.action.remove(context.subscription);
-    }
-    subscriber.closeWindow(window);
-}
-
-},{"../Subject":37,"../Subscriber":39,"../scheduler/async":188,"../util/isNumeric":209,"../util/isScheduler":213}],171:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var Subscription_1 = require("../Subscription");
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function windowToggle(openings, closingSelector) {
-    return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); };
-}
-exports.windowToggle = windowToggle;
-var WindowToggleOperator = (function () {
-    function WindowToggleOperator(openings, closingSelector) {
-        this.openings = openings;
-        this.closingSelector = closingSelector;
-    }
-    WindowToggleOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector));
-    };
-    return WindowToggleOperator;
-}());
-var WindowToggleSubscriber = (function (_super) {
-    __extends(WindowToggleSubscriber, _super);
-    function WindowToggleSubscriber(destination, openings, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.openings = openings;
-        _this.closingSelector = closingSelector;
-        _this.contexts = [];
-        _this.add(_this.openSubscription = subscribeToResult_1.subscribeToResult(_this, openings, openings));
-        return _this;
-    }
-    WindowToggleSubscriber.prototype._next = function (value) {
-        var contexts = this.contexts;
-        if (contexts) {
-            var len = contexts.length;
-            for (var i = 0; i < len; i++) {
-                contexts[i].window.next(value);
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype._error = function (err) {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_1 = contexts[index];
-                context_1.window.error(err);
-                context_1.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._error.call(this, err);
-    };
-    WindowToggleSubscriber.prototype._complete = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_2 = contexts[index];
-                context_2.window.complete();
-                context_2.subscription.unsubscribe();
-            }
-        }
-        _super.prototype._complete.call(this);
-    };
-    WindowToggleSubscriber.prototype._unsubscribe = function () {
-        var contexts = this.contexts;
-        this.contexts = null;
-        if (contexts) {
-            var len = contexts.length;
-            var index = -1;
-            while (++index < len) {
-                var context_3 = contexts[index];
-                context_3.window.unsubscribe();
-                context_3.subscription.unsubscribe();
-            }
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        if (outerValue === this.openings) {
-            var closingSelector = this.closingSelector;
-            var closingNotifier = tryCatch_1.tryCatch(closingSelector)(innerValue);
-            if (closingNotifier === errorObject_1.errorObject) {
-                return this.error(errorObject_1.errorObject.e);
-            }
-            else {
-                var window_1 = new Subject_1.Subject();
-                var subscription = new Subscription_1.Subscription();
-                var context_4 = { window: window_1, subscription: subscription };
-                this.contexts.push(context_4);
-                var innerSubscription = subscribeToResult_1.subscribeToResult(this, closingNotifier, context_4);
-                if (innerSubscription.closed) {
-                    this.closeWindow(this.contexts.length - 1);
-                }
-                else {
-                    innerSubscription.context = context_4;
-                    subscription.add(innerSubscription);
-                }
-                this.destination.next(window_1);
-            }
-        }
-        else {
-            this.closeWindow(this.contexts.indexOf(outerValue));
-        }
-    };
-    WindowToggleSubscriber.prototype.notifyError = function (err) {
-        this.error(err);
-    };
-    WindowToggleSubscriber.prototype.notifyComplete = function (inner) {
-        if (inner !== this.openSubscription) {
-            this.closeWindow(this.contexts.indexOf(inner.context));
-        }
-    };
-    WindowToggleSubscriber.prototype.closeWindow = function (index) {
-        if (index === -1) {
-            return;
-        }
-        var contexts = this.contexts;
-        var context = contexts[index];
-        var window = context.window, subscription = context.subscription;
-        contexts.splice(index, 1);
-        window.complete();
-        subscription.unsubscribe();
-    };
-    return WindowToggleSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../Subject":37,"../Subscription":40,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],172:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subject_1 = require("../Subject");
-var tryCatch_1 = require("../util/tryCatch");
-var errorObject_1 = require("../util/errorObject");
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function windowWhen(closingSelector) {
-    return function windowWhenOperatorFunction(source) {
-        return source.lift(new WindowOperator(closingSelector));
-    };
-}
-exports.windowWhen = windowWhen;
-var WindowOperator = (function () {
-    function WindowOperator(closingSelector) {
-        this.closingSelector = closingSelector;
-    }
-    WindowOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector));
-    };
-    return WindowOperator;
-}());
-var WindowSubscriber = (function (_super) {
-    __extends(WindowSubscriber, _super);
-    function WindowSubscriber(destination, closingSelector) {
-        var _this = _super.call(this, destination) || this;
-        _this.destination = destination;
-        _this.closingSelector = closingSelector;
-        _this.openWindow();
-        return _this;
-    }
-    WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype.notifyError = function (error, innerSub) {
-        this._error(error);
-    };
-    WindowSubscriber.prototype.notifyComplete = function (innerSub) {
-        this.openWindow(innerSub);
-    };
-    WindowSubscriber.prototype._next = function (value) {
-        this.window.next(value);
-    };
-    WindowSubscriber.prototype._error = function (err) {
-        this.window.error(err);
-        this.destination.error(err);
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype._complete = function () {
-        this.window.complete();
-        this.destination.complete();
-        this.unsubscribeClosingNotification();
-    };
-    WindowSubscriber.prototype.unsubscribeClosingNotification = function () {
-        if (this.closingNotification) {
-            this.closingNotification.unsubscribe();
-        }
-    };
-    WindowSubscriber.prototype.openWindow = function (innerSub) {
-        if (innerSub === void 0) { innerSub = null; }
-        if (innerSub) {
-            this.remove(innerSub);
-            innerSub.unsubscribe();
-        }
-        var prevWindow = this.window;
-        if (prevWindow) {
-            prevWindow.complete();
-        }
-        var window = this.window = new Subject_1.Subject();
-        this.destination.next(window);
-        var closingNotifier = tryCatch_1.tryCatch(this.closingSelector)();
-        if (closingNotifier === errorObject_1.errorObject) {
-            var err = errorObject_1.errorObject.e;
-            this.destination.error(err);
-            this.window.error(err);
-        }
-        else {
-            this.add(this.closingNotification = subscribeToResult_1.subscribeToResult(this, closingNotifier));
-        }
-    };
-    return WindowSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../Subject":37,"../util/errorObject":200,"../util/subscribeToResult":222,"../util/tryCatch":224}],173:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var OuterSubscriber_1 = require("../OuterSubscriber");
-var subscribeToResult_1 = require("../util/subscribeToResult");
-function withLatestFrom() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    return function (source) {
-        var project;
-        if (typeof args[args.length - 1] === 'function') {
-            project = args.pop();
-        }
-        var observables = args;
-        return source.lift(new WithLatestFromOperator(observables, project));
-    };
-}
-exports.withLatestFrom = withLatestFrom;
-var WithLatestFromOperator = (function () {
-    function WithLatestFromOperator(observables, project) {
-        this.observables = observables;
-        this.project = project;
-    }
-    WithLatestFromOperator.prototype.call = function (subscriber, source) {
-        return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project));
-    };
-    return WithLatestFromOperator;
-}());
-var WithLatestFromSubscriber = (function (_super) {
-    __extends(WithLatestFromSubscriber, _super);
-    function WithLatestFromSubscriber(destination, observables, project) {
-        var _this = _super.call(this, destination) || this;
-        _this.observables = observables;
-        _this.project = project;
-        _this.toRespond = [];
-        var len = observables.length;
-        _this.values = new Array(len);
-        for (var i = 0; i < len; i++) {
-            _this.toRespond.push(i);
-        }
-        for (var i = 0; i < len; i++) {
-            var observable = observables[i];
-            _this.add(subscribeToResult_1.subscribeToResult(_this, observable, observable, i));
-        }
-        return _this;
-    }
-    WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) {
-        this.values[outerIndex] = innerValue;
-        var toRespond = this.toRespond;
-        if (toRespond.length > 0) {
-            var found = toRespond.indexOf(outerIndex);
-            if (found !== -1) {
-                toRespond.splice(found, 1);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype.notifyComplete = function () {
-    };
-    WithLatestFromSubscriber.prototype._next = function (value) {
-        if (this.toRespond.length === 0) {
-            var args = [value].concat(this.values);
-            if (this.project) {
-                this._tryProject(args);
-            }
-            else {
-                this.destination.next(args);
-            }
-        }
-    };
-    WithLatestFromSubscriber.prototype._tryProject = function (args) {
-        var result;
-        try {
-            result = this.project.apply(this, args);
-        }
-        catch (err) {
-            this.destination.error(err);
-            return;
-        }
-        this.destination.next(result);
-    };
-    return WithLatestFromSubscriber;
-}(OuterSubscriber_1.OuterSubscriber));
-
-},{"../OuterSubscriber":34,"../util/subscribeToResult":222}],174:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var zip_1 = require("../observable/zip");
-function zip() {
-    var observables = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        observables[_i] = arguments[_i];
-    }
-    return function zipOperatorFunction(source) {
-        return source.lift.call(zip_1.zip.apply(void 0, [source].concat(observables)));
-    };
-}
-exports.zip = zip;
-
-},{"../observable/zip":72}],175:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var zip_1 = require("../observable/zip");
-function zipAll(project) {
-    return function (source) { return source.lift(new zip_1.ZipOperator(project)); };
-}
-exports.zipAll = zipAll;
-
-},{"../observable/zip":72}],176:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscription_1 = require("../Subscription");
-var Action = (function (_super) {
-    __extends(Action, _super);
-    function Action(scheduler, work) {
-        return _super.call(this) || this;
-    }
-    Action.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        return this;
-    };
-    return Action;
-}(Subscription_1.Subscription));
-exports.Action = Action;
-
-},{"../Subscription":40}],177:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AnimationFrameAction = (function (_super) {
-    __extends(AnimationFrameAction, _super);
-    function AnimationFrameAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); }));
-    };
-    AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            cancelAnimationFrame(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AnimationFrameAction;
-}(AsyncAction_1.AsyncAction));
-exports.AnimationFrameAction = AnimationFrameAction;
-
-},{"./AsyncAction":181}],178:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var AnimationFrameScheduler = (function (_super) {
-    __extends(AnimationFrameScheduler, _super);
-    function AnimationFrameScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AnimationFrameScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AnimationFrameScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.AnimationFrameScheduler = AnimationFrameScheduler;
-
-},{"./AsyncScheduler":182}],179:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Immediate_1 = require("../util/Immediate");
-var AsyncAction_1 = require("./AsyncAction");
-var AsapAction = (function (_super) {
-    __extends(AsapAction, _super);
-    function AsapAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && delay > 0) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        scheduler.actions.push(this);
-        return scheduler.scheduled || (scheduler.scheduled = Immediate_1.Immediate.setImmediate(scheduler.flush.bind(scheduler, null)));
-    };
-    AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay);
-        }
-        if (scheduler.actions.length === 0) {
-            Immediate_1.Immediate.clearImmediate(id);
-            scheduler.scheduled = undefined;
-        }
-        return undefined;
-    };
-    return AsapAction;
-}(AsyncAction_1.AsyncAction));
-exports.AsapAction = AsapAction;
-
-},{"../util/Immediate":195,"./AsyncAction":181}],180:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var AsapScheduler = (function (_super) {
-    __extends(AsapScheduler, _super);
-    function AsapScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AsapScheduler.prototype.flush = function (action) {
-        this.active = true;
-        this.scheduled = undefined;
-        var actions = this.actions;
-        var error;
-        var index = -1;
-        var count = actions.length;
-        action = action || actions.shift();
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (++index < count && (action = actions.shift()));
-        this.active = false;
-        if (error) {
-            while (++index < count && (action = actions.shift())) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsapScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.AsapScheduler = AsapScheduler;
-
-},{"./AsyncScheduler":182}],181:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Action_1 = require("./Action");
-var AsyncAction = (function (_super) {
-    __extends(AsyncAction, _super);
-    function AsyncAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.pending = false;
-        return _this;
-    }
-    AsyncAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (this.closed) {
-            return this;
-        }
-        this.state = state;
-        var id = this.id;
-        var scheduler = this.scheduler;
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, delay);
-        }
-        this.pending = true;
-        this.delay = delay;
-        this.id = this.id || this.requestAsyncId(scheduler, this.id, delay);
-        return this;
-    };
-    AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return setInterval(scheduler.flush.bind(scheduler, this), delay);
-    };
-    AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay !== null && this.delay === delay && this.pending === false) {
-            return id;
-        }
-        clearInterval(id);
-    };
-    AsyncAction.prototype.execute = function (state, delay) {
-        if (this.closed) {
-            return new Error('executing a cancelled action');
-        }
-        this.pending = false;
-        var error = this._execute(state, delay);
-        if (error) {
-            return error;
-        }
-        else if (this.pending === false && this.id != null) {
-            this.id = this.recycleAsyncId(this.scheduler, this.id, null);
-        }
-    };
-    AsyncAction.prototype._execute = function (state, delay) {
-        var errored = false;
-        var errorValue = undefined;
-        try {
-            this.work(state);
-        }
-        catch (e) {
-            errored = true;
-            errorValue = !!e && e || new Error(e);
-        }
-        if (errored) {
-            this.unsubscribe();
-            return errorValue;
-        }
-    };
-    AsyncAction.prototype._unsubscribe = function () {
-        var id = this.id;
-        var scheduler = this.scheduler;
-        var actions = scheduler.actions;
-        var index = actions.indexOf(this);
-        this.work = null;
-        this.state = null;
-        this.pending = false;
-        this.scheduler = null;
-        if (index !== -1) {
-            actions.splice(index, 1);
-        }
-        if (id != null) {
-            this.id = this.recycleAsyncId(scheduler, id, null);
-        }
-        this.delay = null;
-    };
-    return AsyncAction;
-}(Action_1.Action));
-exports.AsyncAction = AsyncAction;
-
-},{"./Action":176}],182:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Scheduler_1 = require("../Scheduler");
-var AsyncScheduler = (function (_super) {
-    __extends(AsyncScheduler, _super);
-    function AsyncScheduler(SchedulerAction, now) {
-        if (now === void 0) { now = Scheduler_1.Scheduler.now; }
-        var _this = _super.call(this, SchedulerAction, function () {
-            if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) {
-                return AsyncScheduler.delegate.now();
-            }
-            else {
-                return now();
-            }
-        }) || this;
-        _this.actions = [];
-        _this.active = false;
-        _this.scheduled = undefined;
-        return _this;
-    }
-    AsyncScheduler.prototype.schedule = function (work, delay, state) {
-        if (delay === void 0) { delay = 0; }
-        if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) {
-            return AsyncScheduler.delegate.schedule(work, delay, state);
-        }
-        else {
-            return _super.prototype.schedule.call(this, work, delay, state);
-        }
-    };
-    AsyncScheduler.prototype.flush = function (action) {
-        var actions = this.actions;
-        if (this.active) {
-            actions.push(action);
-            return;
-        }
-        var error;
-        this.active = true;
-        do {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        } while (action = actions.shift());
-        this.active = false;
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    return AsyncScheduler;
-}(Scheduler_1.Scheduler));
-exports.AsyncScheduler = AsyncScheduler;
-
-},{"../Scheduler":36}],183:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var QueueAction = (function (_super) {
-    __extends(QueueAction, _super);
-    function QueueAction(scheduler, work) {
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        return _this;
-    }
-    QueueAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (delay > 0) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.delay = delay;
-        this.state = state;
-        this.scheduler.flush(this);
-        return this;
-    };
-    QueueAction.prototype.execute = function (state, delay) {
-        return (delay > 0 || this.closed) ?
-            _super.prototype.execute.call(this, state, delay) :
-            this._execute(state, delay);
-    };
-    QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) {
-            return _super.prototype.requestAsyncId.call(this, scheduler, id, delay);
-        }
-        return scheduler.flush(this);
-    };
-    return QueueAction;
-}(AsyncAction_1.AsyncAction));
-exports.QueueAction = QueueAction;
-
-},{"./AsyncAction":181}],184:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var QueueScheduler = (function (_super) {
-    __extends(QueueScheduler, _super);
-    function QueueScheduler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return QueueScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.QueueScheduler = QueueScheduler;
-
-},{"./AsyncScheduler":182}],185:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AsyncScheduler_1 = require("./AsyncScheduler");
-var VirtualTimeScheduler = (function (_super) {
-    __extends(VirtualTimeScheduler, _super);
-    function VirtualTimeScheduler(SchedulerAction, maxFrames) {
-        if (SchedulerAction === void 0) { SchedulerAction = VirtualAction; }
-        if (maxFrames === void 0) { maxFrames = Number.POSITIVE_INFINITY; }
-        var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this;
-        _this.maxFrames = maxFrames;
-        _this.frame = 0;
-        _this.index = -1;
-        return _this;
-    }
-    VirtualTimeScheduler.prototype.flush = function () {
-        var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
-        var error, action;
-        while ((action = actions.shift()) && (this.frame = action.delay) <= maxFrames) {
-            if (error = action.execute(action.state, action.delay)) {
-                break;
-            }
-        }
-        if (error) {
-            while (action = actions.shift()) {
-                action.unsubscribe();
-            }
-            throw error;
-        }
-    };
-    VirtualTimeScheduler.frameTimeFactor = 10;
-    return VirtualTimeScheduler;
-}(AsyncScheduler_1.AsyncScheduler));
-exports.VirtualTimeScheduler = VirtualTimeScheduler;
-var VirtualAction = (function (_super) {
-    __extends(VirtualAction, _super);
-    function VirtualAction(scheduler, work, index) {
-        if (index === void 0) { index = scheduler.index += 1; }
-        var _this = _super.call(this, scheduler, work) || this;
-        _this.scheduler = scheduler;
-        _this.work = work;
-        _this.index = index;
-        _this.active = true;
-        _this.index = scheduler.index = index;
-        return _this;
-    }
-    VirtualAction.prototype.schedule = function (state, delay) {
-        if (delay === void 0) { delay = 0; }
-        if (!this.id) {
-            return _super.prototype.schedule.call(this, state, delay);
-        }
-        this.active = false;
-        var action = new VirtualAction(this.scheduler, this.work);
-        this.add(action);
-        return action.schedule(state, delay);
-    };
-    VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        this.delay = scheduler.frame + delay;
-        var actions = scheduler.actions;
-        actions.push(this);
-        actions.sort(VirtualAction.sortActions);
-        return true;
-    };
-    VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) {
-        if (delay === void 0) { delay = 0; }
-        return undefined;
-    };
-    VirtualAction.prototype._execute = function (state, delay) {
-        if (this.active === true) {
-            return _super.prototype._execute.call(this, state, delay);
-        }
-    };
-    VirtualAction.sortActions = function (a, b) {
-        if (a.delay === b.delay) {
-            if (a.index === b.index) {
-                return 0;
-            }
-            else if (a.index > b.index) {
-                return 1;
-            }
-            else {
-                return -1;
-            }
-        }
-        else if (a.delay > b.delay) {
-            return 1;
-        }
-        else {
-            return -1;
-        }
-    };
-    return VirtualAction;
-}(AsyncAction_1.AsyncAction));
-exports.VirtualAction = VirtualAction;
-
-},{"./AsyncAction":181,"./AsyncScheduler":182}],186:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AnimationFrameAction_1 = require("./AnimationFrameAction");
-var AnimationFrameScheduler_1 = require("./AnimationFrameScheduler");
-exports.animationFrame = new AnimationFrameScheduler_1.AnimationFrameScheduler(AnimationFrameAction_1.AnimationFrameAction);
-
-},{"./AnimationFrameAction":177,"./AnimationFrameScheduler":178}],187:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsapAction_1 = require("./AsapAction");
-var AsapScheduler_1 = require("./AsapScheduler");
-exports.asap = new AsapScheduler_1.AsapScheduler(AsapAction_1.AsapAction);
-
-},{"./AsapAction":179,"./AsapScheduler":180}],188:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AsyncAction_1 = require("./AsyncAction");
-var AsyncScheduler_1 = require("./AsyncScheduler");
-exports.async = new AsyncScheduler_1.AsyncScheduler(AsyncAction_1.AsyncAction);
-
-},{"./AsyncAction":181,"./AsyncScheduler":182}],189:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var QueueAction_1 = require("./QueueAction");
-var QueueScheduler_1 = require("./QueueScheduler");
-exports.queue = new QueueScheduler_1.QueueScheduler(QueueAction_1.QueueAction);
-
-},{"./QueueAction":183,"./QueueScheduler":184}],190:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function getSymbolIterator() {
-    if (typeof Symbol !== 'function' || !Symbol.iterator) {
-        return '@@iterator';
-    }
-    return Symbol.iterator;
-}
-exports.getSymbolIterator = getSymbolIterator;
-exports.iterator = getSymbolIterator();
-exports.$$iterator = exports.iterator;
-
-},{}],191:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.observable = typeof Symbol === 'function' && Symbol.observable || '@@observable';
-
-},{}],192:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.rxSubscriber = typeof Symbol === 'function'
-    ? Symbol('rxSubscriber')
-    : '@@rxSubscriber_' + Math.random();
-exports.$$rxSubscriber = exports.rxSubscriber;
-
-},{}],193:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function ArgumentOutOfRangeErrorImpl() {
-    Error.call(this);
-    this.message = 'argument out of range';
-    this.name = 'ArgumentOutOfRangeError';
-    return this;
-}
-ArgumentOutOfRangeErrorImpl.prototype = Object.create(Error.prototype);
-exports.ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl;
-
-},{}],194:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function EmptyErrorImpl() {
-    Error.call(this);
-    this.message = 'no elements in sequence';
-    this.name = 'EmptyError';
-    return this;
-}
-EmptyErrorImpl.prototype = Object.create(Error.prototype);
-exports.EmptyError = EmptyErrorImpl;
-
-},{}],195:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var nextHandle = 1;
-var tasksByHandle = {};
-function runIfPresent(handle) {
-    var cb = tasksByHandle[handle];
-    if (cb) {
-        cb();
-    }
-}
-exports.Immediate = {
-    setImmediate: function (cb) {
-        var handle = nextHandle++;
-        tasksByHandle[handle] = cb;
-        Promise.resolve().then(function () { return runIfPresent(handle); });
-        return handle;
-    },
-    clearImmediate: function (handle) {
-        delete tasksByHandle[handle];
-    },
-};
-
-},{}],196:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function ObjectUnsubscribedErrorImpl() {
-    Error.call(this);
-    this.message = 'object unsubscribed';
-    this.name = 'ObjectUnsubscribedError';
-    return this;
-}
-ObjectUnsubscribedErrorImpl.prototype = Object.create(Error.prototype);
-exports.ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl;
-
-},{}],197:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function TimeoutErrorImpl() {
-    Error.call(this);
-    this.message = 'Timeout has occurred';
-    this.name = 'TimeoutError';
-    return this;
-}
-TimeoutErrorImpl.prototype = Object.create(Error.prototype);
-exports.TimeoutError = TimeoutErrorImpl;
-
-},{}],198:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function UnsubscriptionErrorImpl(errors) {
-    Error.call(this);
-    this.message = errors ?
-        errors.length + " errors occurred during unsubscription:\n" + errors.map(function (err, i) { return i + 1 + ") " + err.toString(); }).join('\n  ') : '';
-    this.name = 'UnsubscriptionError';
-    this.errors = errors;
-    return this;
-}
-UnsubscriptionErrorImpl.prototype = Object.create(Error.prototype);
-exports.UnsubscriptionError = UnsubscriptionErrorImpl;
-
-},{}],199:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-function canReportError(observer) {
-    while (observer) {
-        var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped;
-        if (closed_1 || isStopped) {
-            return false;
-        }
-        else if (destination && destination instanceof Subscriber_1.Subscriber) {
-            observer = destination;
-        }
-        else {
-            observer = null;
-        }
-    }
-    return true;
-}
-exports.canReportError = canReportError;
-
-},{"../Subscriber":39}],200:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.errorObject = { e: {} };
-
-},{}],201:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function hostReportError(err) {
-    setTimeout(function () { throw err; });
-}
-exports.hostReportError = hostReportError;
-
-},{}],202:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function identity(x) {
-    return x;
-}
-exports.identity = identity;
-
-},{}],203:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isArray = Array.isArray || (function (x) { return x && typeof x.length === 'number'; });
-
-},{}],204:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; });
-
-},{}],205:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isDate(value) {
-    return value instanceof Date && !isNaN(+value);
-}
-exports.isDate = isDate;
-
-},{}],206:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isFunction(x) {
-    return typeof x === 'function';
-}
-exports.isFunction = isFunction;
-
-},{}],207:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var observable_1 = require("../symbol/observable");
-function isInteropObservable(input) {
-    return input && typeof input[observable_1.observable] === 'function';
-}
-exports.isInteropObservable = isInteropObservable;
-
-},{"../symbol/observable":191}],208:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var iterator_1 = require("../symbol/iterator");
-function isIterable(input) {
-    return input && typeof input[iterator_1.iterator] === 'function';
-}
-exports.isIterable = isIterable;
-
-},{"../symbol/iterator":190}],209:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var isArray_1 = require("./isArray");
-function isNumeric(val) {
-    return !isArray_1.isArray(val) && (val - parseFloat(val) + 1) >= 0;
-}
-exports.isNumeric = isNumeric;
-
-},{"./isArray":203}],210:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isObject(x) {
-    return x != null && typeof x === 'object';
-}
-exports.isObject = isObject;
-
-},{}],211:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-function isObservable(obj) {
-    return !!obj && (obj instanceof Observable_1.Observable || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function'));
-}
-exports.isObservable = isObservable;
-
-},{"../Observable":32}],212:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isPromise(value) {
-    return value && typeof value.subscribe !== 'function' && typeof value.then === 'function';
-}
-exports.isPromise = isPromise;
-
-},{}],213:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isScheduler(value) {
-    return value && typeof value.schedule === 'function';
-}
-exports.isScheduler = isScheduler;
-
-},{}],214:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function noop() { }
-exports.noop = noop;
-
-},{}],215:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function not(pred, thisArg) {
-    function notPred() {
-        return !(notPred.pred.apply(notPred.thisArg, arguments));
-    }
-    notPred.pred = pred;
-    notPred.thisArg = thisArg;
-    return notPred;
-}
-exports.not = not;
-
-},{}],216:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var noop_1 = require("./noop");
-function pipe() {
-    var fns = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        fns[_i] = arguments[_i];
-    }
-    return pipeFromArray(fns);
-}
-exports.pipe = pipe;
-function pipeFromArray(fns) {
-    if (!fns) {
-        return noop_1.noop;
-    }
-    if (fns.length === 1) {
-        return fns[0];
-    }
-    return function piped(input) {
-        return fns.reduce(function (prev, fn) { return fn(prev); }, input);
-    };
-}
-exports.pipeFromArray = pipeFromArray;
-
-},{"./noop":214}],217:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Observable_1 = require("../Observable");
-var subscribeToArray_1 = require("./subscribeToArray");
-var subscribeToPromise_1 = require("./subscribeToPromise");
-var subscribeToIterable_1 = require("./subscribeToIterable");
-var subscribeToObservable_1 = require("./subscribeToObservable");
-var isArrayLike_1 = require("./isArrayLike");
-var isPromise_1 = require("./isPromise");
-var isObject_1 = require("./isObject");
-var iterator_1 = require("../symbol/iterator");
-var observable_1 = require("../symbol/observable");
-exports.subscribeTo = function (result) {
-    if (result instanceof Observable_1.Observable) {
-        return function (subscriber) {
-            if (result._isScalar) {
-                subscriber.next(result.value);
-                subscriber.complete();
-                return undefined;
-            }
-            else {
-                return result.subscribe(subscriber);
-            }
-        };
-    }
-    else if (result && typeof result[observable_1.observable] === 'function') {
-        return subscribeToObservable_1.subscribeToObservable(result);
-    }
-    else if (isArrayLike_1.isArrayLike(result)) {
-        return subscribeToArray_1.subscribeToArray(result);
-    }
-    else if (isPromise_1.isPromise(result)) {
-        return subscribeToPromise_1.subscribeToPromise(result);
-    }
-    else if (result && typeof result[iterator_1.iterator] === 'function') {
-        return subscribeToIterable_1.subscribeToIterable(result);
-    }
-    else {
-        var value = isObject_1.isObject(result) ? 'an invalid object' : "'" + result + "'";
-        var msg = "You provided " + value + " where a stream was expected."
-            + ' You can provide an Observable, Promise, Array, or Iterable.';
-        throw new TypeError(msg);
-    }
-};
-
-},{"../Observable":32,"../symbol/iterator":190,"../symbol/observable":191,"./isArrayLike":204,"./isObject":210,"./isPromise":212,"./subscribeToArray":218,"./subscribeToIterable":219,"./subscribeToObservable":220,"./subscribeToPromise":221}],218:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.subscribeToArray = function (array) { return function (subscriber) {
-    for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) {
-        subscriber.next(array[i]);
-    }
-    if (!subscriber.closed) {
-        subscriber.complete();
-    }
-}; };
-
-},{}],219:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var iterator_1 = require("../symbol/iterator");
-exports.subscribeToIterable = function (iterable) { return function (subscriber) {
-    var iterator = iterable[iterator_1.iterator]();
-    do {
-        var item = iterator.next();
-        if (item.done) {
-            subscriber.complete();
-            break;
-        }
-        subscriber.next(item.value);
-        if (subscriber.closed) {
-            break;
-        }
-    } while (true);
-    if (typeof iterator.return === 'function') {
-        subscriber.add(function () {
-            if (iterator.return) {
-                iterator.return();
-            }
-        });
-    }
-    return subscriber;
-}; };
-
-},{"../symbol/iterator":190}],220:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var observable_1 = require("../symbol/observable");
-exports.subscribeToObservable = function (obj) { return function (subscriber) {
-    var obs = obj[observable_1.observable]();
-    if (typeof obs.subscribe !== 'function') {
-        throw new TypeError('Provided object does not correctly implement Symbol.observable');
-    }
-    else {
-        return obs.subscribe(subscriber);
-    }
-}; };
-
-},{"../symbol/observable":191}],221:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var hostReportError_1 = require("./hostReportError");
-exports.subscribeToPromise = function (promise) { return function (subscriber) {
-    promise.then(function (value) {
-        if (!subscriber.closed) {
-            subscriber.next(value);
-            subscriber.complete();
-        }
-    }, function (err) { return subscriber.error(err); })
-        .then(null, hostReportError_1.hostReportError);
-    return subscriber;
-}; };
-
-},{"./hostReportError":201}],222:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var InnerSubscriber_1 = require("../InnerSubscriber");
-var subscribeTo_1 = require("./subscribeTo");
-function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) {
-    if (destination === void 0) { destination = new InnerSubscriber_1.InnerSubscriber(outerSubscriber, outerValue, outerIndex); }
-    if (destination.closed) {
-        return;
-    }
-    return subscribeTo_1.subscribeTo(result)(destination);
-}
-exports.subscribeToResult = subscribeToResult;
-
-},{"../InnerSubscriber":30,"./subscribeTo":217}],223:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Subscriber_1 = require("../Subscriber");
-var rxSubscriber_1 = require("../symbol/rxSubscriber");
-var Observer_1 = require("../Observer");
-function toSubscriber(nextOrObserver, error, complete) {
-    if (nextOrObserver) {
-        if (nextOrObserver instanceof Subscriber_1.Subscriber) {
-            return nextOrObserver;
-        }
-        if (nextOrObserver[rxSubscriber_1.rxSubscriber]) {
-            return nextOrObserver[rxSubscriber_1.rxSubscriber]();
-        }
-    }
-    if (!nextOrObserver && !error && !complete) {
-        return new Subscriber_1.Subscriber(Observer_1.empty);
-    }
-    return new Subscriber_1.Subscriber(nextOrObserver, error, complete);
-}
-exports.toSubscriber = toSubscriber;
-
-},{"../Observer":33,"../Subscriber":39,"../symbol/rxSubscriber":192}],224:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var errorObject_1 = require("./errorObject");
-var tryCatchTarget;
-function tryCatcher() {
-    try {
-        return tryCatchTarget.apply(this, arguments);
-    }
-    catch (e) {
-        errorObject_1.errorObject.e = e;
-        return errorObject_1.errorObject;
-    }
-}
-function tryCatch(fn) {
-    tryCatchTarget = fn;
-    return tryCatcher;
-}
-exports.tryCatch = tryCatch;
-
-},{"./errorObject":200}],225:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var audit_1 = require("../internal/operators/audit");
-exports.audit = audit_1.audit;
-var auditTime_1 = require("../internal/operators/auditTime");
-exports.auditTime = auditTime_1.auditTime;
-var buffer_1 = require("../internal/operators/buffer");
-exports.buffer = buffer_1.buffer;
-var bufferCount_1 = require("../internal/operators/bufferCount");
-exports.bufferCount = bufferCount_1.bufferCount;
-var bufferTime_1 = require("../internal/operators/bufferTime");
-exports.bufferTime = bufferTime_1.bufferTime;
-var bufferToggle_1 = require("../internal/operators/bufferToggle");
-exports.bufferToggle = bufferToggle_1.bufferToggle;
-var bufferWhen_1 = require("../internal/operators/bufferWhen");
-exports.bufferWhen = bufferWhen_1.bufferWhen;
-var catchError_1 = require("../internal/operators/catchError");
-exports.catchError = catchError_1.catchError;
-var combineAll_1 = require("../internal/operators/combineAll");
-exports.combineAll = combineAll_1.combineAll;
-var combineLatest_1 = require("../internal/operators/combineLatest");
-exports.combineLatest = combineLatest_1.combineLatest;
-var concat_1 = require("../internal/operators/concat");
-exports.concat = concat_1.concat;
-var concatAll_1 = require("../internal/operators/concatAll");
-exports.concatAll = concatAll_1.concatAll;
-var concatMap_1 = require("../internal/operators/concatMap");
-exports.concatMap = concatMap_1.concatMap;
-var concatMapTo_1 = require("../internal/operators/concatMapTo");
-exports.concatMapTo = concatMapTo_1.concatMapTo;
-var count_1 = require("../internal/operators/count");
-exports.count = count_1.count;
-var debounce_1 = require("../internal/operators/debounce");
-exports.debounce = debounce_1.debounce;
-var debounceTime_1 = require("../internal/operators/debounceTime");
-exports.debounceTime = debounceTime_1.debounceTime;
-var defaultIfEmpty_1 = require("../internal/operators/defaultIfEmpty");
-exports.defaultIfEmpty = defaultIfEmpty_1.defaultIfEmpty;
-var delay_1 = require("../internal/operators/delay");
-exports.delay = delay_1.delay;
-var delayWhen_1 = require("../internal/operators/delayWhen");
-exports.delayWhen = delayWhen_1.delayWhen;
-var dematerialize_1 = require("../internal/operators/dematerialize");
-exports.dematerialize = dematerialize_1.dematerialize;
-var distinct_1 = require("../internal/operators/distinct");
-exports.distinct = distinct_1.distinct;
-var distinctUntilChanged_1 = require("../internal/operators/distinctUntilChanged");
-exports.distinctUntilChanged = distinctUntilChanged_1.distinctUntilChanged;
-var distinctUntilKeyChanged_1 = require("../internal/operators/distinctUntilKeyChanged");
-exports.distinctUntilKeyChanged = distinctUntilKeyChanged_1.distinctUntilKeyChanged;
-var elementAt_1 = require("../internal/operators/elementAt");
-exports.elementAt = elementAt_1.elementAt;
-var endWith_1 = require("../internal/operators/endWith");
-exports.endWith = endWith_1.endWith;
-var every_1 = require("../internal/operators/every");
-exports.every = every_1.every;
-var exhaust_1 = require("../internal/operators/exhaust");
-exports.exhaust = exhaust_1.exhaust;
-var exhaustMap_1 = require("../internal/operators/exhaustMap");
-exports.exhaustMap = exhaustMap_1.exhaustMap;
-var expand_1 = require("../internal/operators/expand");
-exports.expand = expand_1.expand;
-var filter_1 = require("../internal/operators/filter");
-exports.filter = filter_1.filter;
-var finalize_1 = require("../internal/operators/finalize");
-exports.finalize = finalize_1.finalize;
-var find_1 = require("../internal/operators/find");
-exports.find = find_1.find;
-var findIndex_1 = require("../internal/operators/findIndex");
-exports.findIndex = findIndex_1.findIndex;
-var first_1 = require("../internal/operators/first");
-exports.first = first_1.first;
-var groupBy_1 = require("../internal/operators/groupBy");
-exports.groupBy = groupBy_1.groupBy;
-var ignoreElements_1 = require("../internal/operators/ignoreElements");
-exports.ignoreElements = ignoreElements_1.ignoreElements;
-var isEmpty_1 = require("../internal/operators/isEmpty");
-exports.isEmpty = isEmpty_1.isEmpty;
-var last_1 = require("../internal/operators/last");
-exports.last = last_1.last;
-var map_1 = require("../internal/operators/map");
-exports.map = map_1.map;
-var mapTo_1 = require("../internal/operators/mapTo");
-exports.mapTo = mapTo_1.mapTo;
-var materialize_1 = require("../internal/operators/materialize");
-exports.materialize = materialize_1.materialize;
-var max_1 = require("../internal/operators/max");
-exports.max = max_1.max;
-var merge_1 = require("../internal/operators/merge");
-exports.merge = merge_1.merge;
-var mergeAll_1 = require("../internal/operators/mergeAll");
-exports.mergeAll = mergeAll_1.mergeAll;
-var mergeMap_1 = require("../internal/operators/mergeMap");
-exports.mergeMap = mergeMap_1.mergeMap;
-var mergeMap_2 = require("../internal/operators/mergeMap");
-exports.flatMap = mergeMap_2.mergeMap;
-var mergeMapTo_1 = require("../internal/operators/mergeMapTo");
-exports.mergeMapTo = mergeMapTo_1.mergeMapTo;
-var mergeScan_1 = require("../internal/operators/mergeScan");
-exports.mergeScan = mergeScan_1.mergeScan;
-var min_1 = require("../internal/operators/min");
-exports.min = min_1.min;
-var multicast_1 = require("../internal/operators/multicast");
-exports.multicast = multicast_1.multicast;
-var observeOn_1 = require("../internal/operators/observeOn");
-exports.observeOn = observeOn_1.observeOn;
-var onErrorResumeNext_1 = require("../internal/operators/onErrorResumeNext");
-exports.onErrorResumeNext = onErrorResumeNext_1.onErrorResumeNext;
-var pairwise_1 = require("../internal/operators/pairwise");
-exports.pairwise = pairwise_1.pairwise;
-var partition_1 = require("../internal/operators/partition");
-exports.partition = partition_1.partition;
-var pluck_1 = require("../internal/operators/pluck");
-exports.pluck = pluck_1.pluck;
-var publish_1 = require("../internal/operators/publish");
-exports.publish = publish_1.publish;
-var publishBehavior_1 = require("../internal/operators/publishBehavior");
-exports.publishBehavior = publishBehavior_1.publishBehavior;
-var publishLast_1 = require("../internal/operators/publishLast");
-exports.publishLast = publishLast_1.publishLast;
-var publishReplay_1 = require("../internal/operators/publishReplay");
-exports.publishReplay = publishReplay_1.publishReplay;
-var race_1 = require("../internal/operators/race");
-exports.race = race_1.race;
-var reduce_1 = require("../internal/operators/reduce");
-exports.reduce = reduce_1.reduce;
-var repeat_1 = require("../internal/operators/repeat");
-exports.repeat = repeat_1.repeat;
-var repeatWhen_1 = require("../internal/operators/repeatWhen");
-exports.repeatWhen = repeatWhen_1.repeatWhen;
-var retry_1 = require("../internal/operators/retry");
-exports.retry = retry_1.retry;
-var retryWhen_1 = require("../internal/operators/retryWhen");
-exports.retryWhen = retryWhen_1.retryWhen;
-var refCount_1 = require("../internal/operators/refCount");
-exports.refCount = refCount_1.refCount;
-var sample_1 = require("../internal/operators/sample");
-exports.sample = sample_1.sample;
-var sampleTime_1 = require("../internal/operators/sampleTime");
-exports.sampleTime = sampleTime_1.sampleTime;
-var scan_1 = require("../internal/operators/scan");
-exports.scan = scan_1.scan;
-var sequenceEqual_1 = require("../internal/operators/sequenceEqual");
-exports.sequenceEqual = sequenceEqual_1.sequenceEqual;
-var share_1 = require("../internal/operators/share");
-exports.share = share_1.share;
-var shareReplay_1 = require("../internal/operators/shareReplay");
-exports.shareReplay = shareReplay_1.shareReplay;
-var single_1 = require("../internal/operators/single");
-exports.single = single_1.single;
-var skip_1 = require("../internal/operators/skip");
-exports.skip = skip_1.skip;
-var skipLast_1 = require("../internal/operators/skipLast");
-exports.skipLast = skipLast_1.skipLast;
-var skipUntil_1 = require("../internal/operators/skipUntil");
-exports.skipUntil = skipUntil_1.skipUntil;
-var skipWhile_1 = require("../internal/operators/skipWhile");
-exports.skipWhile = skipWhile_1.skipWhile;
-var startWith_1 = require("../internal/operators/startWith");
-exports.startWith = startWith_1.startWith;
-var subscribeOn_1 = require("../internal/operators/subscribeOn");
-exports.subscribeOn = subscribeOn_1.subscribeOn;
-var switchAll_1 = require("../internal/operators/switchAll");
-exports.switchAll = switchAll_1.switchAll;
-var switchMap_1 = require("../internal/operators/switchMap");
-exports.switchMap = switchMap_1.switchMap;
-var switchMapTo_1 = require("../internal/operators/switchMapTo");
-exports.switchMapTo = switchMapTo_1.switchMapTo;
-var take_1 = require("../internal/operators/take");
-exports.take = take_1.take;
-var takeLast_1 = require("../internal/operators/takeLast");
-exports.takeLast = takeLast_1.takeLast;
-var takeUntil_1 = require("../internal/operators/takeUntil");
-exports.takeUntil = takeUntil_1.takeUntil;
-var takeWhile_1 = require("../internal/operators/takeWhile");
-exports.takeWhile = takeWhile_1.takeWhile;
-var tap_1 = require("../internal/operators/tap");
-exports.tap = tap_1.tap;
-var throttle_1 = require("../internal/operators/throttle");
-exports.throttle = throttle_1.throttle;
-var throttleTime_1 = require("../internal/operators/throttleTime");
-exports.throttleTime = throttleTime_1.throttleTime;
-var throwIfEmpty_1 = require("../internal/operators/throwIfEmpty");
-exports.throwIfEmpty = throwIfEmpty_1.throwIfEmpty;
-var timeInterval_1 = require("../internal/operators/timeInterval");
-exports.timeInterval = timeInterval_1.timeInterval;
-var timeout_1 = require("../internal/operators/timeout");
-exports.timeout = timeout_1.timeout;
-var timeoutWith_1 = require("../internal/operators/timeoutWith");
-exports.timeoutWith = timeoutWith_1.timeoutWith;
-var timestamp_1 = require("../internal/operators/timestamp");
-exports.timestamp = timestamp_1.timestamp;
-var toArray_1 = require("../internal/operators/toArray");
-exports.toArray = toArray_1.toArray;
-var window_1 = require("../internal/operators/window");
-exports.window = window_1.window;
-var windowCount_1 = require("../internal/operators/windowCount");
-exports.windowCount = windowCount_1.windowCount;
-var windowTime_1 = require("../internal/operators/windowTime");
-exports.windowTime = windowTime_1.windowTime;
-var windowToggle_1 = require("../internal/operators/windowToggle");
-exports.windowToggle = windowToggle_1.windowToggle;
-var windowWhen_1 = require("../internal/operators/windowWhen");
-exports.windowWhen = windowWhen_1.windowWhen;
-var withLatestFrom_1 = require("../internal/operators/withLatestFrom");
-exports.withLatestFrom = withLatestFrom_1.withLatestFrom;
-var zip_1 = require("../internal/operators/zip");
-exports.zip = zip_1.zip;
-var zipAll_1 = require("../internal/operators/zipAll");
-exports.zipAll = zipAll_1.zipAll;
-
-},{"../internal/operators/audit":73,"../internal/operators/auditTime":74,"../internal/operators/buffer":75,"../internal/operators/bufferCount":76,"../internal/operators/bufferTime":77,"../internal/operators/bufferToggle":78,"../internal/operators/bufferWhen":79,"../internal/operators/catchError":80,"../internal/operators/combineAll":81,"../internal/operators/combineLatest":82,"../internal/operators/concat":83,"../internal/operators/concatAll":84,"../internal/operators/concatMap":85,"../internal/operators/concatMapTo":86,"../internal/operators/count":87,"../internal/operators/debounce":88,"../internal/operators/debounceTime":89,"../internal/operators/defaultIfEmpty":90,"../internal/operators/delay":91,"../internal/operators/delayWhen":92,"../internal/operators/dematerialize":93,"../internal/operators/distinct":94,"../internal/operators/distinctUntilChanged":95,"../internal/operators/distinctUntilKeyChanged":96,"../internal/operators/elementAt":97,"../internal/operators/endWith":98,"../internal/operators/every":99,"../internal/operators/exhaust":100,"../internal/operators/exhaustMap":101,"../internal/operators/expand":102,"../internal/operators/filter":103,"../internal/operators/finalize":104,"../internal/operators/find":105,"../internal/operators/findIndex":106,"../internal/operators/first":107,"../internal/operators/groupBy":108,"../internal/operators/ignoreElements":109,"../internal/operators/isEmpty":110,"../internal/operators/last":111,"../internal/operators/map":112,"../internal/operators/mapTo":113,"../internal/operators/materialize":114,"../internal/operators/max":115,"../internal/operators/merge":116,"../internal/operators/mergeAll":117,"../internal/operators/mergeMap":118,"../internal/operators/mergeMapTo":119,"../internal/operators/mergeScan":120,"../internal/operators/min":121,"../internal/operators/multicast":122,"../internal/operators/observeOn":123,"../internal/operators/onErrorResumeNext":124,"../internal/operators/pairwise":125,"../internal/operators/partition":126,"../internal/operators/pluck":127,"../internal/operators/publish":128,"../internal/operators/publishBehavior":129,"../internal/operators/publishLast":130,"../internal/operators/publishReplay":131,"../internal/operators/race":132,"../internal/operators/reduce":133,"../internal/operators/refCount":134,"../internal/operators/repeat":135,"../internal/operators/repeatWhen":136,"../internal/operators/retry":137,"../internal/operators/retryWhen":138,"../internal/operators/sample":139,"../internal/operators/sampleTime":140,"../internal/operators/scan":141,"../internal/operators/sequenceEqual":142,"../internal/operators/share":143,"../internal/operators/shareReplay":144,"../internal/operators/single":145,"../internal/operators/skip":146,"../internal/operators/skipLast":147,"../internal/operators/skipUntil":148,"../internal/operators/skipWhile":149,"../internal/operators/startWith":150,"../internal/operators/subscribeOn":151,"../internal/operators/switchAll":152,"../internal/operators/switchMap":153,"../internal/operators/switchMapTo":154,"../internal/operators/take":155,"../internal/operators/takeLast":156,"../internal/operators/takeUntil":157,"../internal/operators/takeWhile":158,"../internal/operators/tap":159,"../internal/operators/throttle":160,"../internal/operators/throttleTime":161,"../internal/operators/throwIfEmpty":162,"../internal/operators/timeInterval":163,"../internal/operators/timeout":164,"../internal/operators/timeoutWith":165,"../internal/operators/timestamp":166,"../internal/operators/toArray":167,"../internal/operators/window":168,"../internal/operators/windowCount":169,"../internal/operators/windowTime":170,"../internal/operators/windowToggle":171,"../internal/operators/windowWhen":172,"../internal/operators/withLatestFrom":173,"../internal/operators/zip":174,"../internal/operators/zipAll":175}],226:[function(require,module,exports){
-// threejs.org/license
-(function(l,ya){"object"===typeof exports&&"undefined"!==typeof module?ya(exports):"function"===typeof define&&define.amd?define(["exports"],ya):ya(l.THREE={})})(this,function(l){function ya(){}function z(a,b){this.x=a||0;this.y=b||0}function I(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}function fa(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._w=void 0!==d?d:1}function p(a,
-b,c){this.x=a||0;this.y=b||0;this.z=c||0}function ra(){this.elements=[1,0,0,0,1,0,0,0,1];0<arguments.length&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}function T(a,b,c,d,e,f,g,h,k,m){Object.defineProperty(this,"id",{value:Ef++});this.uuid=H.generateUUID();this.name="";this.image=void 0!==a?a:T.DEFAULT_IMAGE;this.mipmaps=[];this.mapping=void 0!==b?b:T.DEFAULT_MAPPING;this.wrapS=void 0!==c?c:1001;this.wrapT=void 0!==d?d:1001;this.magFilter=void 0!==
-e?e:1006;this.minFilter=void 0!==f?f:1008;this.anisotropy=void 0!==k?k:1;this.format=void 0!==g?g:1023;this.type=void 0!==h?h:1009;this.offset=new z(0,0);this.repeat=new z(1,1);this.center=new z(0,0);this.rotation=0;this.matrixAutoUpdate=!0;this.matrix=new ra;this.generateMipmaps=!0;this.premultiplyAlpha=!1;this.flipY=!0;this.unpackAlignment=4;this.encoding=void 0!==m?m:3E3;this.version=0;this.onUpdate=null}function V(a,b,c,d){this.x=a||0;this.y=b||0;this.z=c||0;this.w=void 0!==d?d:1}function fb(a,
-b,c){this.width=a;this.height=b;this.scissor=new V(0,0,a,b);this.scissorTest=!1;this.viewport=new V(0,0,a,b);c=c||{};void 0===c.minFilter&&(c.minFilter=1006);this.texture=new T(void 0,void 0,c.wrapS,c.wrapT,c.magFilter,c.minFilter,c.format,c.type,c.anisotropy,c.encoding);this.texture.generateMipmaps=void 0!==c.generateMipmaps?c.generateMipmaps:!0;this.depthBuffer=void 0!==c.depthBuffer?c.depthBuffer:!0;this.stencilBuffer=void 0!==c.stencilBuffer?c.stencilBuffer:!0;this.depthTexture=void 0!==c.depthTexture?
-c.depthTexture:null}function Gb(a,b,c){fb.call(this,a,b,c);this.activeMipMapLevel=this.activeCubeFace=0}function gb(a,b,c,d,e,f,g,h,k,m,q,n){T.call(this,null,f,g,h,k,m,d,e,q,n);this.image={data:a,width:b,height:c};this.magFilter=void 0!==k?k:1003;this.minFilter=void 0!==m?m:1003;this.flipY=this.generateMipmaps=!1;this.unpackAlignment=1}function Sa(a,b){this.min=void 0!==a?a:new p(Infinity,Infinity,Infinity);this.max=void 0!==b?b:new p(-Infinity,-Infinity,-Infinity)}function Da(a,b){this.center=void 0!==
-a?a:new p;this.radius=void 0!==b?b:0}function Ma(a,b){this.normal=void 0!==a?a:new p(1,0,0);this.constant=void 0!==b?b:0}function md(a,b,c,d,e,f){this.planes=[void 0!==a?a:new Ma,void 0!==b?b:new Ma,void 0!==c?c:new Ma,void 0!==d?d:new Ma,void 0!==e?e:new Ma,void 0!==f?f:new Ma]}function G(a,b,c){return void 0===b&&void 0===c?this.set(a):this.setRGB(a,b,c)}function Qd(){function a(e,f){!1!==c&&(d(e,f),b.requestAnimationFrame(a))}var b=null,c=!1,d=null;return{start:function(){!0!==c&&null!==d&&(b.requestAnimationFrame(a),
-c=!0)},stop:function(){c=!1},setAnimationLoop:function(a){d=a},setContext:function(a){b=a}}}function Ff(a){function b(b,c){var d=b.array,e=b.dynamic?a.DYNAMIC_DRAW:a.STATIC_DRAW,h=a.createBuffer();a.bindBuffer(c,h);a.bufferData(c,d,e);b.onUploadCallback();c=a.FLOAT;d instanceof Float32Array?c=a.FLOAT:d instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):d instanceof Uint16Array?c=a.UNSIGNED_SHORT:d instanceof Int16Array?c=a.SHORT:d instanceof
-Uint32Array?c=a.UNSIGNED_INT:d instanceof Int32Array?c=a.INT:d instanceof Int8Array?c=a.BYTE:d instanceof Uint8Array&&(c=a.UNSIGNED_BYTE);return{buffer:h,type:c,bytesPerElement:d.BYTES_PER_ELEMENT,version:b.version}}var c=new WeakMap;return{get:function(a){a.isInterleavedBufferAttribute&&(a=a.data);return c.get(a)},remove:function(b){b.isInterleavedBufferAttribute&&(b=b.data);var d=c.get(b);d&&(a.deleteBuffer(d.buffer),c.delete(b))},update:function(d,e){d.isInterleavedBufferAttribute&&(d=d.data);
-var f=c.get(d);if(void 0===f)c.set(d,b(d,e));else if(f.version<d.version){var g=d,h=g.array,k=g.updateRange;a.bindBuffer(e,f.buffer);!1===g.dynamic?a.bufferData(e,h,a.STATIC_DRAW):-1===k.count?a.bufferSubData(e,0,h):0===k.count?console.error("THREE.WebGLObjects.updateBuffer: dynamic THREE.BufferAttribute marked as needsUpdate but updateRange.count is 0, ensure you are using set methods or updating manually."):(a.bufferSubData(e,k.offset*h.BYTES_PER_ELEMENT,h.subarray(k.offset,k.offset+k.count)),k.count=
--1);f.version=d.version}}}}function hb(a,b,c,d){this._x=a||0;this._y=b||0;this._z=c||0;this._order=d||hb.DefaultOrder}function Rd(){this.mask=1}function D(){Object.defineProperty(this,"id",{value:Gf++});this.uuid=H.generateUUID();this.name="";this.type="Object3D";this.parent=null;this.children=[];this.up=D.DefaultUp.clone();var a=new p,b=new hb,c=new fa,d=new p(1,1,1);b.onChange(function(){c.setFromEuler(b,!1)});c.onChange(function(){b.setFromQuaternion(c,void 0,!1)});Object.defineProperties(this,
-{position:{enumerable:!0,value:a},rotation:{enumerable:!0,value:b},quaternion:{enumerable:!0,value:c},scale:{enumerable:!0,value:d},modelViewMatrix:{value:new I},normalMatrix:{value:new ra}});this.matrix=new I;this.matrixWorld=new I;this.matrixAutoUpdate=D.DefaultMatrixAutoUpdate;this.matrixWorldNeedsUpdate=!1;this.layers=new Rd;this.visible=!0;this.receiveShadow=this.castShadow=!1;this.frustumCulled=!0;this.renderOrder=0;this.userData={}}function Na(){D.call(this);this.type="Camera";this.matrixWorldInverse=
-new I;this.projectionMatrix=new I}function Hb(a,b,c,d,e,f){Na.call(this);this.type="OrthographicCamera";this.zoom=1;this.view=null;this.left=a;this.right=b;this.top=c;this.bottom=d;this.near=void 0!==e?e:.1;this.far=void 0!==f?f:2E3;this.updateProjectionMatrix()}function Ta(a,b,c,d,e,f){this.a=a;this.b=b;this.c=c;this.normal=d&&d.isVector3?d:new p;this.vertexNormals=Array.isArray(d)?d:[];this.color=e&&e.isColor?e:new G;this.vertexColors=Array.isArray(e)?e:[];this.materialIndex=void 0!==f?f:0}function R(){Object.defineProperty(this,
-"id",{value:Hf+=2});this.uuid=H.generateUUID();this.name="";this.type="Geometry";this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.lineDistancesNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.uvsNeedUpdate=this.verticesNeedUpdate=this.elementsNeedUpdate=!1}function Q(a,b,c){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");
-this.name="";this.array=a;this.itemSize=b;this.count=void 0!==a?a.length/b:0;this.normalized=!0===c;this.dynamic=!1;this.updateRange={offset:0,count:-1};this.version=0}function oc(a,b,c){Q.call(this,new Int8Array(a),b,c)}function pc(a,b,c){Q.call(this,new Uint8Array(a),b,c)}function qc(a,b,c){Q.call(this,new Uint8ClampedArray(a),b,c)}function rc(a,b,c){Q.call(this,new Int16Array(a),b,c)}function ib(a,b,c){Q.call(this,new Uint16Array(a),b,c)}function sc(a,b,c){Q.call(this,new Int32Array(a),b,c)}function jb(a,
-b,c){Q.call(this,new Uint32Array(a),b,c)}function A(a,b,c){Q.call(this,new Float32Array(a),b,c)}function tc(a,b,c){Q.call(this,new Float64Array(a),b,c)}function Ee(){this.vertices=[];this.normals=[];this.colors=[];this.uvs=[];this.uvs2=[];this.groups=[];this.morphTargets={};this.skinWeights=[];this.skinIndices=[];this.boundingSphere=this.boundingBox=null;this.groupsNeedUpdate=this.uvsNeedUpdate=this.colorsNeedUpdate=this.normalsNeedUpdate=this.verticesNeedUpdate=!1}function Fe(a){if(0===a.length)return-Infinity;
-for(var b=a[0],c=1,d=a.length;c<d;++c)a[c]>b&&(b=a[c]);return b}function C(){Object.defineProperty(this,"id",{value:If+=2});this.uuid=H.generateUUID();this.name="";this.type="BufferGeometry";this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.drawRange={start:0,count:Infinity};this.userData={}}function Ib(a,b,c,d,e,f){R.call(this);this.type="BoxGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,
-depthSegments:f};this.fromBufferGeometry(new kb(a,b,c,d,e,f));this.mergeVertices()}function kb(a,b,c,d,e,f){function g(a,b,c,d,e,f,g,l,N,O,Jf){var r=f/N,v=g/O,P=f/2,y=g/2,w=l/2;g=N+1;var E=O+1,x=f=0,B,z,A=new p;for(z=0;z<E;z++){var D=z*v-y;for(B=0;B<g;B++)A[a]=(B*r-P)*d,A[b]=D*e,A[c]=w,m.push(A.x,A.y,A.z),A[a]=0,A[b]=0,A[c]=0<l?1:-1,q.push(A.x,A.y,A.z),n.push(B/N),n.push(1-z/O),f+=1}for(z=0;z<O;z++)for(B=0;B<N;B++)a=t+B+g*(z+1),b=t+(B+1)+g*(z+1),c=t+(B+1)+g*z,k.push(t+B+g*z,a,c),k.push(a,b,c),x+=
-6;h.addGroup(u,x,Jf);u+=x;t+=f}C.call(this);this.type="BoxBufferGeometry";this.parameters={width:a,height:b,depth:c,widthSegments:d,heightSegments:e,depthSegments:f};var h=this;a=a||1;b=b||1;c=c||1;d=Math.floor(d)||1;e=Math.floor(e)||1;f=Math.floor(f)||1;var k=[],m=[],q=[],n=[],t=0,u=0;g("z","y","x",-1,-1,c,b,a,f,e,0);g("z","y","x",1,-1,c,b,-a,f,e,1);g("x","z","y",1,1,a,c,b,d,f,2);g("x","z","y",1,-1,a,c,-b,d,f,3);g("x","y","z",1,-1,a,b,c,d,e,4);g("x","y","z",-1,-1,a,b,-c,d,e,5);this.setIndex(k);this.addAttribute("position",
-new A(m,3));this.addAttribute("normal",new A(q,3));this.addAttribute("uv",new A(n,2))}function uc(a,b,c,d){R.call(this);this.type="PlaneGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};this.fromBufferGeometry(new lb(a,b,c,d));this.mergeVertices()}function lb(a,b,c,d){C.call(this);this.type="PlaneBufferGeometry";this.parameters={width:a,height:b,widthSegments:c,heightSegments:d};a=a||1;b=b||1;var e=a/2,f=b/2;c=Math.floor(c)||1;d=Math.floor(d)||1;var g=c+1,h=d+1,k=a/c,m=
-b/d,q=[],n=[],t=[],u=[];for(a=0;a<h;a++){var r=a*m-f;for(b=0;b<g;b++)n.push(b*k-e,-r,0),t.push(0,0,1),u.push(b/c),u.push(1-a/d)}for(a=0;a<d;a++)for(b=0;b<c;b++)e=b+g*(a+1),f=b+1+g*(a+1),h=b+1+g*a,q.push(b+g*a,e,h),q.push(e,f,h);this.setIndex(q);this.addAttribute("position",new A(n,3));this.addAttribute("normal",new A(t,3));this.addAttribute("uv",new A(u,2))}function J(){Object.defineProperty(this,"id",{value:Kf++});this.uuid=H.generateUUID();this.name="";this.type="Material";this.lights=this.fog=
-!0;this.blending=1;this.side=0;this.flatShading=!1;this.vertexColors=0;this.opacity=1;this.transparent=!1;this.blendSrc=204;this.blendDst=205;this.blendEquation=100;this.blendEquationAlpha=this.blendDstAlpha=this.blendSrcAlpha=null;this.depthFunc=3;this.depthWrite=this.depthTest=!0;this.clippingPlanes=null;this.clipShadows=this.clipIntersection=!1;this.shadowSide=null;this.colorWrite=!0;this.precision=null;this.polygonOffset=!1;this.polygonOffsetUnits=this.polygonOffsetFactor=0;this.dithering=!1;
-this.alphaTest=0;this.premultipliedAlpha=!1;this.overdraw=0;this.visible=!0;this.userData={};this.needsUpdate=!0}function da(a){J.call(this);this.type="MeshBasicMaterial";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.lights=
-this.morphTargets=this.skinning=!1;this.setValues(a)}function ta(a){J.call(this);this.type="ShaderMaterial";this.defines={};this.uniforms={};this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}";this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}";this.linewidth=1;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.clipping=this.lights=this.fog=!1;this.extensions=
-{derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1};this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]};this.index0AttributeName=void 0;this.uniformsNeedUpdate=!1;void 0!==a&&(void 0!==a.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(a))}function mb(a,b){this.origin=void 0!==a?a:new p;this.direction=void 0!==b?b:new p}function ja(a,b,c){this.a=void 0!==a?a:new p;this.b=void 0!==b?b:new p;this.c=
-void 0!==c?c:new p}function la(a,b){D.call(this);this.type="Mesh";this.geometry=void 0!==a?a:new C;this.material=void 0!==b?b:new da({color:16777215*Math.random()});this.drawMode=0;this.updateMorphTargets()}function Lf(a,b,c,d){function e(a,c){b.buffers.color.setClear(a.r,a.g,a.b,c,d)}var f=new G(0),g=0,h,k,m;return{getClearColor:function(){return f},setClearColor:function(a,b){f.set(a);g=void 0!==b?b:1;e(f,g)},getClearAlpha:function(){return g},setClearAlpha:function(a){g=a;e(f,g)},render:function(b,
-d,t,u){d=d.background;null===d?e(f,g):d&&d.isColor&&(e(d,1),u=!0);(a.autoClear||u)&&a.clear(a.autoClearColor,a.autoClearDepth,a.autoClearStencil);d&&d.isCubeTexture?(void 0===m&&(m=new la(new kb(1,1,1),new ta({uniforms:nb.cube.uniforms,vertexShader:nb.cube.vertexShader,fragmentShader:nb.cube.fragmentShader,side:1,depthTest:!0,depthWrite:!1,fog:!1})),m.geometry.removeAttribute("normal"),m.geometry.removeAttribute("uv"),m.onBeforeRender=function(a,b,c){this.matrixWorld.copyPosition(c.matrixWorld)},
-c.update(m)),m.material.uniforms.tCube.value=d,b.push(m,m.geometry,m.material,0,null)):d&&d.isTexture&&(void 0===h&&(h=new Hb(-1,1,1,-1,0,1),k=new la(new lb(2,2),new da({depthTest:!1,depthWrite:!1,fog:!1})),c.update(k)),k.material.map=d,a.renderBufferDirect(h,null,k.geometry,k.material,k,null))}}}function Mf(a,b,c,d){var e;this.setMode=function(a){e=a};this.render=function(b,d){a.drawArrays(e,b,d);c.update(d,e)};this.renderInstances=function(f,g,h){if(d.isWebGL2)var k=a;else if(k=b.get("ANGLE_instanced_arrays"),
-null===k){console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}k[d.isWebGL2?"drawArraysInstanced":"drawArraysInstancedANGLE"](e,g,h,f.maxInstancedCount);c.update(h,e,f.maxInstancedCount)}}function Nf(a,b,c){function d(b){if("highp"===b){if(0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.HIGH_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.HIGH_FLOAT).precision)return"highp";b="mediump"}return"mediump"===
-b&&0<a.getShaderPrecisionFormat(a.VERTEX_SHADER,a.MEDIUM_FLOAT).precision&&0<a.getShaderPrecisionFormat(a.FRAGMENT_SHADER,a.MEDIUM_FLOAT).precision?"mediump":"lowp"}var e,f="undefined"!==typeof WebGL2RenderingContext&&a instanceof WebGL2RenderingContext,g=void 0!==c.precision?c.precision:"highp",h=d(g);h!==g&&(console.warn("THREE.WebGLRenderer:",g,"not supported, using",h,"instead."),g=h);c=!0===c.logarithmicDepthBuffer;h=a.getParameter(a.MAX_TEXTURE_IMAGE_UNITS);var k=a.getParameter(a.MAX_VERTEX_TEXTURE_IMAGE_UNITS),
-m=a.getParameter(a.MAX_TEXTURE_SIZE),q=a.getParameter(a.MAX_CUBE_MAP_TEXTURE_SIZE),n=a.getParameter(a.MAX_VERTEX_ATTRIBS),t=a.getParameter(a.MAX_VERTEX_UNIFORM_VECTORS),u=a.getParameter(a.MAX_VARYING_VECTORS),r=a.getParameter(a.MAX_FRAGMENT_UNIFORM_VECTORS),l=0<k,y=f||!!b.get("OES_texture_float");return{isWebGL2:f,getMaxAnisotropy:function(){if(void 0!==e)return e;var c=b.get("EXT_texture_filter_anisotropic");return e=null!==c?a.getParameter(c.MAX_TEXTURE_MAX_ANISOTROPY_EXT):0},getMaxPrecision:d,
-precision:g,logarithmicDepthBuffer:c,maxTextures:h,maxVertexTextures:k,maxTextureSize:m,maxCubemapSize:q,maxAttributes:n,maxVertexUniforms:t,maxVaryings:u,maxFragmentUniforms:r,vertexTextures:l,floatFragmentTextures:y,floatVertexTextures:l&&y}}function Of(){function a(){m.value!==d&&(m.value=d,m.needsUpdate=0<e);c.numPlanes=e;c.numIntersection=0}function b(a,b,d,e){var f=null!==a?a.length:0,g=null;if(0!==f){g=m.value;if(!0!==e||null===g){e=d+4*f;b=b.matrixWorldInverse;k.getNormalMatrix(b);if(null===
-g||g.length<e)g=new Float32Array(e);for(e=0;e!==f;++e,d+=4)h.copy(a[e]).applyMatrix4(b,k),h.normal.toArray(g,d),g[d+3]=h.constant}m.value=g;m.needsUpdate=!0}c.numPlanes=f;return g}var c=this,d=null,e=0,f=!1,g=!1,h=new Ma,k=new ra,m={value:null,needsUpdate:!1};this.uniform=m;this.numIntersection=this.numPlanes=0;this.init=function(a,c,g){var h=0!==a.length||c||0!==e||f;f=c;d=b(a,g,0);e=a.length;return h};this.beginShadows=function(){g=!0;b(null)};this.endShadows=function(){g=!1;a()};this.setState=
-function(c,h,k,u,r,l){if(!f||null===c||0===c.length||g&&!k)g?b(null):a();else{k=g?0:e;var n=4*k,q=r.clippingState||null;m.value=q;q=b(c,u,n,l);for(c=0;c!==n;++c)q[c]=d[c];r.clippingState=q;this.numIntersection=h?this.numPlanes:0;this.numPlanes+=k}}}function Pf(a){var b={};return{get:function(c){if(void 0!==b[c])return b[c];switch(c){case "WEBGL_depth_texture":var d=a.getExtension("WEBGL_depth_texture")||a.getExtension("MOZ_WEBGL_depth_texture")||a.getExtension("WEBKIT_WEBGL_depth_texture");break;
-case "EXT_texture_filter_anisotropic":d=a.getExtension("EXT_texture_filter_anisotropic")||a.getExtension("MOZ_EXT_texture_filter_anisotropic")||a.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case "WEBGL_compressed_texture_s3tc":d=a.getExtension("WEBGL_compressed_texture_s3tc")||a.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case "WEBGL_compressed_texture_pvrtc":d=a.getExtension("WEBGL_compressed_texture_pvrtc")||a.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");
-break;default:d=a.getExtension(c)}null===d&&console.warn("THREE.WebGLRenderer: "+c+" extension not supported.");return b[c]=d}}}function Qf(a,b,c){function d(a){var h=a.target;a=e[h.id];null!==a.index&&b.remove(a.index);for(var g in a.attributes)b.remove(a.attributes[g]);h.removeEventListener("dispose",d);delete e[h.id];if(g=f[a.id])b.remove(g),delete f[a.id];c.memory.geometries--}var e={},f={};return{get:function(a,b){var f=e[b.id];if(f)return f;b.addEventListener("dispose",d);b.isBufferGeometry?
-f=b:b.isGeometry&&(void 0===b._bufferGeometry&&(b._bufferGeometry=(new C).setFromObject(a)),f=b._bufferGeometry);e[b.id]=f;c.memory.geometries++;return f},update:function(c){var d=c.index,e=c.attributes;null!==d&&b.update(d,a.ELEMENT_ARRAY_BUFFER);for(var f in e)b.update(e[f],a.ARRAY_BUFFER);c=c.morphAttributes;for(f in c){d=c[f];e=0;for(var g=d.length;e<g;e++)b.update(d[e],a.ARRAY_BUFFER)}},getWireframeAttribute:function(c){var d=f[c.id];if(d)return d;d=[];var e=c.index,g=c.attributes;if(null!==
-e){e=e.array;g=0;for(var q=e.length;g<q;g+=3){var n=e[g+0],t=e[g+1],u=e[g+2];d.push(n,t,t,u,u,n)}}else for(e=g.position.array,g=0,q=e.length/3-1;g<q;g+=3)n=g+0,t=g+1,u=g+2,d.push(n,t,t,u,u,n);d=new (65535<Fe(d)?jb:ib)(d,1);b.update(d,a.ELEMENT_ARRAY_BUFFER);return f[c.id]=d}}}function Rf(a,b,c,d){var e,f,g;this.setMode=function(a){e=a};this.setIndex=function(a){f=a.type;g=a.bytesPerElement};this.render=function(b,d){a.drawElements(e,d,f,b*g);c.update(d,e)};this.renderInstances=function(h,k,m){if(d.isWebGL2)var q=
-a;else if(q=b.get("ANGLE_instanced_arrays"),null===q){console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");return}q[d.isWebGL2?"drawElementsInstanced":"drawElementsInstancedANGLE"](e,m,f,k*g,h.maxInstancedCount);c.update(m,e,h.maxInstancedCount)}}function Sf(a){var b={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:b,programs:null,autoReset:!0,reset:function(){b.frame++;
-b.calls=0;b.triangles=0;b.points=0;b.lines=0},update:function(c,d,e){e=e||1;b.calls++;switch(d){case a.TRIANGLES:b.triangles+=c/3*e;break;case a.TRIANGLE_STRIP:case a.TRIANGLE_FAN:b.triangles+=e*(c-2);break;case a.LINES:b.lines+=c/2*e;break;case a.LINE_STRIP:b.lines+=e*(c-1);break;case a.LINE_LOOP:b.lines+=e*c;break;case a.POINTS:b.points+=e*c;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",d)}}}}function Tf(a,b){return Math.abs(b[1])-Math.abs(a[1])}function Uf(a){var b={},c=new Float32Array(8);
-return{update:function(d,e,f,g){var h=d.morphTargetInfluences,k=h.length;d=b[e.id];if(void 0===d){d=[];for(var m=0;m<k;m++)d[m]=[m,0];b[e.id]=d}var q=f.morphTargets&&e.morphAttributes.position;f=f.morphNormals&&e.morphAttributes.normal;for(m=0;m<k;m++){var n=d[m];0!==n[1]&&(q&&e.removeAttribute("morphTarget"+m),f&&e.removeAttribute("morphNormal"+m))}for(m=0;m<k;m++)n=d[m],n[0]=m,n[1]=h[m];d.sort(Tf);for(m=0;8>m;m++){if(n=d[m])if(h=n[0],k=n[1]){q&&e.addAttribute("morphTarget"+m,q[h]);f&&e.addAttribute("morphNormal"+
-m,f[h]);c[m]=k;continue}c[m]=0}g.getUniforms().setValue(a,"morphTargetInfluences",c)}}}function Vf(a,b){var c={};return{update:function(d){var e=b.render.frame,f=d.geometry,g=a.get(d,f);c[g.id]!==e&&(f.isGeometry&&g.updateFromObject(d),a.update(g),c[g.id]=e);return g},dispose:function(){c={}}}}function Ua(a,b,c,d,e,f,g,h,k,m){a=void 0!==a?a:[];T.call(this,a,void 0!==b?b:301,c,d,e,f,g,h,k,m);this.flipY=!1}function Jb(a,b,c){var d=a[0];if(0>=d||0<d)return a;var e=b*c,f=Ge[e];void 0===f&&(f=new Float32Array(e),
-Ge[e]=f);if(0!==b)for(d.toArray(f,0),d=1,e=0;d!==b;++d)e+=c,a[d].toArray(f,e);return f}function ea(a,b){if(a.length!==b.length)return!1;for(var c=0,d=a.length;c<d;c++)if(a[c]!==b[c])return!1;return!0}function qa(a,b){for(var c=0,d=b.length;c<d;c++)a[c]=b[c]}function He(a,b){var c=Ie[b];void 0===c&&(c=new Int32Array(b),Ie[b]=c);for(var d=0;d!==b;++d)c[d]=a.allocTextureUnit();return c}function Wf(a,b){var c=this.cache;c[0]!==b&&(a.uniform1f(this.addr,b),c[0]=b)}function Xf(a,b){var c=this.cache;c[0]!==
-b&&(a.uniform1i(this.addr,b),c[0]=b)}function Yf(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y)a.uniform2f(this.addr,b.x,b.y),c[0]=b.x,c[1]=b.y}else ea(c,b)||(a.uniform2fv(this.addr,b),qa(c,b))}function Zf(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z)a.uniform3f(this.addr,b.x,b.y,b.z),c[0]=b.x,c[1]=b.y,c[2]=b.z}else if(void 0!==b.r){if(c[0]!==b.r||c[1]!==b.g||c[2]!==b.b)a.uniform3f(this.addr,b.r,b.g,b.b),c[0]=b.r,c[1]=b.g,c[2]=b.b}else ea(c,b)||(a.uniform3fv(this.addr,
-b),qa(c,b))}function $f(a,b){var c=this.cache;if(void 0!==b.x){if(c[0]!==b.x||c[1]!==b.y||c[2]!==b.z||c[3]!==b.w)a.uniform4f(this.addr,b.x,b.y,b.z,b.w),c[0]=b.x,c[1]=b.y,c[2]=b.z,c[3]=b.w}else ea(c,b)||(a.uniform4fv(this.addr,b),qa(c,b))}function ag(a,b){var c=this.cache,d=b.elements;void 0===d?ea(c,b)||(a.uniformMatrix2fv(this.addr,!1,b),qa(c,b)):ea(c,d)||(Je.set(d),a.uniformMatrix2fv(this.addr,!1,Je),qa(c,d))}function bg(a,b){var c=this.cache,d=b.elements;void 0===d?ea(c,b)||(a.uniformMatrix3fv(this.addr,
-!1,b),qa(c,b)):ea(c,d)||(Ke.set(d),a.uniformMatrix3fv(this.addr,!1,Ke),qa(c,d))}function cg(a,b){var c=this.cache,d=b.elements;void 0===d?ea(c,b)||(a.uniformMatrix4fv(this.addr,!1,b),qa(c,b)):ea(c,d)||(Le.set(d),a.uniformMatrix4fv(this.addr,!1,Le),qa(c,d))}function dg(a,b,c){var d=this.cache,e=c.allocTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTexture2D(b||Me,e)}function eg(a,b,c){var d=this.cache,e=c.allocTextureUnit();d[0]!==e&&(a.uniform1i(this.addr,e),d[0]=e);c.setTextureCube(b||
-Ne,e)}function Oe(a,b){var c=this.cache;ea(c,b)||(a.uniform2iv(this.addr,b),qa(c,b))}function Pe(a,b){var c=this.cache;ea(c,b)||(a.uniform3iv(this.addr,b),qa(c,b))}function Qe(a,b){var c=this.cache;ea(c,b)||(a.uniform4iv(this.addr,b),qa(c,b))}function fg(a){switch(a){case 5126:return Wf;case 35664:return Yf;case 35665:return Zf;case 35666:return $f;case 35674:return ag;case 35675:return bg;case 35676:return cg;case 35678:case 36198:return dg;case 35680:return eg;case 5124:case 35670:return Xf;case 35667:case 35671:return Oe;
-case 35668:case 35672:return Pe;case 35669:case 35673:return Qe}}function gg(a,b){var c=this.cache;ea(c,b)||(a.uniform1fv(this.addr,b),qa(c,b))}function hg(a,b){var c=this.cache;ea(c,b)||(a.uniform1iv(this.addr,b),qa(c,b))}function ig(a,b){var c=this.cache;b=Jb(b,this.size,2);ea(c,b)||(a.uniform2fv(this.addr,b),this.updateCache(b))}function jg(a,b){var c=this.cache;b=Jb(b,this.size,3);ea(c,b)||(a.uniform3fv(this.addr,b),this.updateCache(b))}function kg(a,b){var c=this.cache;b=Jb(b,this.size,4);ea(c,
-b)||(a.uniform4fv(this.addr,b),this.updateCache(b))}function lg(a,b){var c=this.cache;b=Jb(b,this.size,4);ea(c,b)||(a.uniformMatrix2fv(this.addr,!1,b),this.updateCache(b))}function mg(a,b){var c=this.cache;b=Jb(b,this.size,9);ea(c,b)||(a.uniformMatrix3fv(this.addr,!1,b),this.updateCache(b))}function ng(a,b){var c=this.cache;b=Jb(b,this.size,16);ea(c,b)||(a.uniformMatrix4fv(this.addr,!1,b),this.updateCache(b))}function og(a,b,c){var d=this.cache,e=b.length,f=He(c,e);!1===ea(d,f)&&(a.uniform1iv(this.addr,
-f),qa(d,f));for(a=0;a!==e;++a)c.setTexture2D(b[a]||Me,f[a])}function pg(a,b,c){var d=this.cache,e=b.length,f=He(c,e);!1===ea(d,f)&&(a.uniform1iv(this.addr,f),qa(d,f));for(a=0;a!==e;++a)c.setTextureCube(b[a]||Ne,f[a])}function qg(a){switch(a){case 5126:return gg;case 35664:return ig;case 35665:return jg;case 35666:return kg;case 35674:return lg;case 35675:return mg;case 35676:return ng;case 35678:return og;case 35680:return pg;case 5124:case 35670:return hg;case 35667:case 35671:return Oe;case 35668:case 35672:return Pe;
-case 35669:case 35673:return Qe}}function rg(a,b,c){this.id=a;this.addr=c;this.cache=[];this.setValue=fg(b.type)}function Re(a,b,c){this.id=a;this.addr=c;this.cache=[];this.size=b.size;this.setValue=qg(b.type)}function Se(a){this.id=a;this.seq=[];this.map={}}function Za(a,b,c){this.seq=[];this.map={};this.renderer=c;c=a.getProgramParameter(b,a.ACTIVE_UNIFORMS);for(var d=0;d<c;++d){var e=a.getActiveUniform(b,d),f=a.getUniformLocation(b,e.name),g=this,h=e.name,k=h.length;for(Vd.lastIndex=0;;){var m=
-Vd.exec(h),q=Vd.lastIndex,n=m[1],t=m[3];"]"===m[2]&&(n|=0);if(void 0===t||"["===t&&q+2===k){h=g;e=void 0===t?new rg(n,e,f):new Re(n,e,f);h.seq.push(e);h.map[e.id]=e;break}else t=g.map[n],void 0===t&&(t=new Se(n),n=g,g=t,n.seq.push(g),n.map[g.id]=g),g=t}}}function sg(a){a=a.split("\n");for(var b=0;b<a.length;b++)a[b]=b+1+": "+a[b];return a.join("\n")}function Te(a,b,c){var d=a.createShader(b);a.shaderSource(d,c);a.compileShader(d);!1===a.getShaderParameter(d,a.COMPILE_STATUS)&&console.error("THREE.WebGLShader: Shader couldn't compile.");
-""!==a.getShaderInfoLog(d)&&console.warn("THREE.WebGLShader: gl.getShaderInfoLog()",b===a.VERTEX_SHADER?"vertex":"fragment",a.getShaderInfoLog(d),sg(c));return d}function Ue(a){switch(a){case 3E3:return["Linear","( value )"];case 3001:return["sRGB","( value )"];case 3002:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case 3007:return["Gamma","( value, float( GAMMA_FACTOR ) )"];default:throw Error("unsupported encoding: "+
-a);}}function Wd(a,b){b=Ue(b);return"vec4 "+a+"( vec4 value ) { return "+b[0]+"ToLinear"+b[1]+"; }"}function tg(a,b){b=Ue(b);return"vec4 "+a+"( vec4 value ) { return LinearTo"+b[0]+b[1]+"; }"}function ug(a,b){switch(b){case 1:b="Linear";break;case 2:b="Reinhard";break;case 3:b="Uncharted2";break;case 4:b="OptimizedCineon";break;default:throw Error("unsupported toneMapping: "+b);}return"vec3 "+a+"( vec3 color ) { return "+b+"ToneMapping( color ); }"}function vg(a,b,c){a=a||{};return[a.derivatives||
-b.envMapCubeUV||b.bumpMap||b.normalMap&&!b.objectSpaceNormalMap||b.flatShading?"#extension GL_OES_standard_derivatives : enable":"",(a.fragDepth||b.logarithmicDepthBuffer)&&c.get("EXT_frag_depth")?"#extension GL_EXT_frag_depth : enable":"",a.drawBuffers&&c.get("WEBGL_draw_buffers")?"#extension GL_EXT_draw_buffers : require":"",(a.shaderTextureLOD||b.envMap)&&c.get("EXT_shader_texture_lod")?"#extension GL_EXT_shader_texture_lod : enable":""].filter(vc).join("\n")}function wg(a){var b=[],c;for(c in a){var d=
-a[c];!1!==d&&b.push("#define "+c+" "+d)}return b.join("\n")}function vc(a){return""!==a}function Ve(a,b){return a.replace(/NUM_DIR_LIGHTS/g,b.numDirLights).replace(/NUM_SPOT_LIGHTS/g,b.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,b.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,b.numPointLights).replace(/NUM_HEMI_LIGHTS/g,b.numHemiLights)}function We(a,b){return a.replace(/NUM_CLIPPING_PLANES/g,b.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,b.numClippingPlanes-b.numClipIntersection)}function Xd(a){return a.replace(/^[ \t]*#include +<([\w\d./]+)>/gm,
-function(a,c){a=S[c];if(void 0===a)throw Error("Can not resolve #include <"+c+">");return Xd(a)})}function Xe(a){return a.replace(/#pragma unroll_loop[\s]+?for \( int i = (\d+); i < (\d+); i \+\+ \) \{([\s\S]+?)(?=\})\}/g,function(a,c,d,e){a="";for(c=parseInt(c);c<parseInt(d);c++)a+=e.replace(/\[ i \]/g,"[ "+c+" ]");return a})}function xg(a,b,c,d,e,f,g){var h=a.context,k=d.defines,m=e.vertexShader,q=e.fragmentShader,n="SHADOWMAP_TYPE_BASIC";1===f.shadowMapType?n="SHADOWMAP_TYPE_PCF":2===f.shadowMapType&&
-(n="SHADOWMAP_TYPE_PCF_SOFT");var t="ENVMAP_TYPE_CUBE",u="ENVMAP_MODE_REFLECTION",r="ENVMAP_BLENDING_MULTIPLY";if(f.envMap){switch(d.envMap.mapping){case 301:case 302:t="ENVMAP_TYPE_CUBE";break;case 306:case 307:t="ENVMAP_TYPE_CUBE_UV";break;case 303:case 304:t="ENVMAP_TYPE_EQUIREC";break;case 305:t="ENVMAP_TYPE_SPHERE"}switch(d.envMap.mapping){case 302:case 304:u="ENVMAP_MODE_REFRACTION"}switch(d.combine){case 0:r="ENVMAP_BLENDING_MULTIPLY";break;case 1:r="ENVMAP_BLENDING_MIX";break;case 2:r="ENVMAP_BLENDING_ADD"}}var l=
-0<a.gammaFactor?a.gammaFactor:1,y=g.isWebGL2?"":vg(d.extensions,f,b),p=wg(k),w=h.createProgram();d.isRawShaderMaterial?(k=[p].filter(vc).join("\n"),0<k.length&&(k+="\n"),b=[y,p].filter(vc).join("\n"),0<b.length&&(b+="\n")):(k=["precision "+f.precision+" float;","precision "+f.precision+" int;","#define SHADER_NAME "+e.name,p,f.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+l,"#define MAX_BONES "+f.maxBones,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp?"#define FOG_EXP2":
-"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+u:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.normalMap&&f.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",f.displacementMap&&f.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":
-"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.flatShading?"#define FLAT_SHADED":"",f.skinning?"#define USE_SKINNING":"",f.useVertexTexture?"#define BONE_TEXTURE":"",f.morphTargets?"#define USE_MORPHTARGETS":"",f.morphNormals&&!1===f.flatShading?"#define USE_MORPHNORMALS":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+
-n:"",f.sizeAttenuation?"#define USE_SIZEATTENUATION":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&(g.isWebGL2||b.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_COLOR","\tattribute vec3 color;",
-"#endif","#ifdef USE_MORPHTARGETS","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif",
-"#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(vc).join("\n"),b=[y,"precision "+f.precision+" float;","precision "+f.precision+" int;","#define SHADER_NAME "+e.name,p,f.alphaTest?"#define ALPHATEST "+f.alphaTest+(f.alphaTest%1?"":".0"):"","#define GAMMA_FACTOR "+l,f.useFog&&f.fog?"#define USE_FOG":"",f.useFog&&f.fogExp?"#define FOG_EXP2":"",f.map?"#define USE_MAP":"",f.envMap?"#define USE_ENVMAP":"",f.envMap?"#define "+t:"",f.envMap?"#define "+
-u:"",f.envMap?"#define "+r:"",f.lightMap?"#define USE_LIGHTMAP":"",f.aoMap?"#define USE_AOMAP":"",f.emissiveMap?"#define USE_EMISSIVEMAP":"",f.bumpMap?"#define USE_BUMPMAP":"",f.normalMap?"#define USE_NORMALMAP":"",f.normalMap&&f.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",f.specularMap?"#define USE_SPECULARMAP":"",f.roughnessMap?"#define USE_ROUGHNESSMAP":"",f.metalnessMap?"#define USE_METALNESSMAP":"",f.alphaMap?"#define USE_ALPHAMAP":"",f.vertexColors?"#define USE_COLOR":"",f.gradientMap?
-"#define USE_GRADIENTMAP":"",f.flatShading?"#define FLAT_SHADED":"",f.doubleSided?"#define DOUBLE_SIDED":"",f.flipSided?"#define FLIP_SIDED":"",f.shadowMapEnabled?"#define USE_SHADOWMAP":"",f.shadowMapEnabled?"#define "+n:"",f.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",f.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",f.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",f.logarithmicDepthBuffer&&(g.isWebGL2||b.get("EXT_frag_depth"))?"#define USE_LOGDEPTHBUF_EXT":"",f.envMap&&
-(g.isWebGL2||b.get("EXT_shader_texture_lod"))?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;",0!==f.toneMapping?"#define TONE_MAPPING":"",0!==f.toneMapping?S.tonemapping_pars_fragment:"",0!==f.toneMapping?ug("toneMapping",f.toneMapping):"",f.dithering?"#define DITHERING":"",f.outputEncoding||f.mapEncoding||f.envMapEncoding||f.emissiveMapEncoding?S.encodings_pars_fragment:"",f.mapEncoding?Wd("mapTexelToLinear",f.mapEncoding):"",f.envMapEncoding?Wd("envMapTexelToLinear",
-f.envMapEncoding):"",f.emissiveMapEncoding?Wd("emissiveMapTexelToLinear",f.emissiveMapEncoding):"",f.outputEncoding?tg("linearToOutputTexel",f.outputEncoding):"",f.depthPacking?"#define DEPTH_PACKING "+d.depthPacking:"","\n"].filter(vc).join("\n"));m=Xd(m);m=Ve(m,f);m=We(m,f);q=Xd(q);q=Ve(q,f);q=We(q,f);m=Xe(m);q=Xe(q);g.isWebGL2&&!d.isRawShaderMaterial&&(g=!1,n=/^\s*#version\s+300\s+es\s*\n/,d.isShaderMaterial&&null!==m.match(n)&&null!==q.match(n)&&(g=!0,m=m.replace(n,""),q=q.replace(n,"")),k="#version 300 es\n\n#define attribute in\n#define varying out\n#define texture2D texture\n"+
-k,b=["#version 300 es\n\n#define varying in",g?"":"out highp vec4 pc_fragColor;",g?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth\n#define texture2D texture\n#define textureCube texture\n#define texture2DProj textureProj\n#define texture2DLodEXT textureLod\n#define texture2DProjLodEXT textureProjLod\n#define textureCubeLodEXT textureLod\n#define texture2DGradEXT textureGrad\n#define texture2DProjGradEXT textureProjGrad\n#define textureCubeGradEXT textureGrad"].join("\n")+
-"\n"+b);q=b+q;m=Te(h,h.VERTEX_SHADER,k+m);q=Te(h,h.FRAGMENT_SHADER,q);h.attachShader(w,m);h.attachShader(w,q);void 0!==d.index0AttributeName?h.bindAttribLocation(w,0,d.index0AttributeName):!0===f.morphTargets&&h.bindAttribLocation(w,0,"position");h.linkProgram(w);f=h.getProgramInfoLog(w).trim();g=h.getShaderInfoLog(m).trim();n=h.getShaderInfoLog(q).trim();u=t=!0;if(!1===h.getProgramParameter(w,h.LINK_STATUS))t=!1,console.error("THREE.WebGLProgram: shader error: ",h.getError(),"gl.VALIDATE_STATUS",
-h.getProgramParameter(w,h.VALIDATE_STATUS),"gl.getProgramInfoLog",f,g,n);else if(""!==f)console.warn("THREE.WebGLProgram: gl.getProgramInfoLog()",f);else if(""===g||""===n)u=!1;u&&(this.diagnostics={runnable:t,material:d,programLog:f,vertexShader:{log:g,prefix:k},fragmentShader:{log:n,prefix:b}});h.deleteShader(m);h.deleteShader(q);var B;this.getUniforms=function(){void 0===B&&(B=new Za(h,w,a));return B};var E;this.getAttributes=function(){if(void 0===E){for(var a={},b=h.getProgramParameter(w,h.ACTIVE_ATTRIBUTES),
-c=0;c<b;c++){var d=h.getActiveAttrib(w,c).name;a[d]=h.getAttribLocation(w,d)}E=a}return E};this.destroy=function(){h.deleteProgram(w);this.program=void 0};Object.defineProperties(this,{uniforms:{get:function(){console.warn("THREE.WebGLProgram: .uniforms is now .getUniforms().");return this.getUniforms()}},attributes:{get:function(){console.warn("THREE.WebGLProgram: .attributes is now .getAttributes().");return this.getAttributes()}}});this.name=e.name;this.id=yg++;this.code=c;this.usedTimes=1;this.program=
-w;this.vertexShader=m;this.fragmentShader=q;return this}function zg(a,b,c){function d(a,b){if(a)a.isTexture?c=a.encoding:a.isWebGLRenderTarget&&(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),c=a.texture.encoding);else var c=3E3;3E3===c&&b&&(c=3007);return c}var e=[],f={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",
-MeshPhongMaterial:"phong",MeshToonMaterial:"phong",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},g="precision supportsVertexTextures map mapEncoding envMap envMapMode envMapEncoding lightMap aoMap emissiveMap emissiveMapEncoding bumpMap normalMap objectSpaceNormalMap displacementMap specularMap roughnessMap metalnessMap gradientMap alphaMap combine vertexColors fog useFog fogExp flatShading sizeAttenuation logarithmicDepthBuffer skinning maxBones useVertexTexture morphTargets morphNormals maxMorphTargets maxMorphNormals premultipliedAlpha numDirLights numPointLights numSpotLights numHemiLights numRectAreaLights shadowMapEnabled shadowMapType toneMapping physicallyCorrectLights alphaTest doubleSided flipSided numClippingPlanes numClipIntersection depthPacking dithering".split(" ");
-this.getParameters=function(b,e,g,q,n,t,u){var h=f[b.type];if(u.isSkinnedMesh){var k=u.skeleton.bones;if(c.floatVertexTextures)k=1024;else{var m=Math.min(Math.floor((c.maxVertexUniforms-20)/4),k.length);m<k.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+k.length+" bones. This GPU supports "+m+"."),k=0):k=m}}else k=0;m=c.precision;null!==b.precision&&(m=c.getMaxPrecision(b.precision),m!==b.precision&&console.warn("THREE.WebGLProgram.getParameters:",b.precision,"not supported, using",m,"instead."));
-var l=a.getRenderTarget();return{shaderID:h,precision:m,supportsVertexTextures:c.vertexTextures,outputEncoding:d(l?l.texture:null,a.gammaOutput),map:!!b.map,mapEncoding:d(b.map,a.gammaInput),envMap:!!b.envMap,envMapMode:b.envMap&&b.envMap.mapping,envMapEncoding:d(b.envMap,a.gammaInput),envMapCubeUV:!!b.envMap&&(306===b.envMap.mapping||307===b.envMap.mapping),lightMap:!!b.lightMap,aoMap:!!b.aoMap,emissiveMap:!!b.emissiveMap,emissiveMapEncoding:d(b.emissiveMap,a.gammaInput),bumpMap:!!b.bumpMap,normalMap:!!b.normalMap,
-objectSpaceNormalMap:1===b.normalMapType,displacementMap:!!b.displacementMap,roughnessMap:!!b.roughnessMap,metalnessMap:!!b.metalnessMap,specularMap:!!b.specularMap,alphaMap:!!b.alphaMap,gradientMap:!!b.gradientMap,combine:b.combine,vertexColors:b.vertexColors,fog:!!q,useFog:b.fog,fogExp:q&&q.isFogExp2,flatShading:b.flatShading,sizeAttenuation:b.sizeAttenuation,logarithmicDepthBuffer:c.logarithmicDepthBuffer,skinning:b.skinning&&0<k,maxBones:k,useVertexTexture:c.floatVertexTextures,morphTargets:b.morphTargets,
-morphNormals:b.morphNormals,maxMorphTargets:a.maxMorphTargets,maxMorphNormals:a.maxMorphNormals,numDirLights:e.directional.length,numPointLights:e.point.length,numSpotLights:e.spot.length,numRectAreaLights:e.rectArea.length,numHemiLights:e.hemi.length,numClippingPlanes:n,numClipIntersection:t,dithering:b.dithering,shadowMapEnabled:a.shadowMap.enabled&&u.receiveShadow&&0<g.length,shadowMapType:a.shadowMap.type,toneMapping:a.toneMapping,physicallyCorrectLights:a.physicallyCorrectLights,premultipliedAlpha:b.premultipliedAlpha,
-alphaTest:b.alphaTest,doubleSided:2===b.side,flipSided:1===b.side,depthPacking:void 0!==b.depthPacking?b.depthPacking:!1}};this.getProgramCode=function(b,c){var d=[];c.shaderID?d.push(c.shaderID):(d.push(b.fragmentShader),d.push(b.vertexShader));if(void 0!==b.defines)for(var e in b.defines)d.push(e),d.push(b.defines[e]);for(e=0;e<g.length;e++)d.push(c[g[e]]);d.push(b.onBeforeCompile.toString());d.push(a.gammaOutput);return d.join()};this.acquireProgram=function(d,f,g,q){for(var h,k=0,m=e.length;k<
-m;k++){var r=e[k];if(r.code===q){h=r;++h.usedTimes;break}}void 0===h&&(h=new xg(a,b,q,d,f,g,c),e.push(h));return h};this.releaseProgram=function(a){if(0===--a.usedTimes){var b=e.indexOf(a);e[b]=e[e.length-1];e.pop();a.destroy()}};this.programs=e}function Ag(){var a=new WeakMap;return{get:function(b){var c=a.get(b);void 0===c&&(c={},a.set(b,c));return c},remove:function(b){a.delete(b)},update:function(b,c,d){a.get(b)[c]=d},dispose:function(){a=new WeakMap}}}function Bg(a,b){return a.renderOrder!==
-b.renderOrder?a.renderOrder-b.renderOrder:a.program&&b.program&&a.program!==b.program?a.program.id-b.program.id:a.material.id!==b.material.id?a.material.id-b.material.id:a.z!==b.z?a.z-b.z:a.id-b.id}function Cg(a,b){return a.renderOrder!==b.renderOrder?a.renderOrder-b.renderOrder:a.z!==b.z?b.z-a.z:a.id-b.id}function Dg(){var a=[],b=0,c=[],d=[];return{opaque:c,transparent:d,init:function(){b=0;c.length=0;d.length=0},push:function(e,f,g,h,k){var m=a[b];void 0===m?(m={id:e.id,object:e,geometry:f,material:g,
-program:g.program,renderOrder:e.renderOrder,z:h,group:k},a[b]=m):(m.id=e.id,m.object=e,m.geometry=f,m.material=g,m.program=g.program,m.renderOrder=e.renderOrder,m.z=h,m.group=k);(!0===g.transparent?d:c).push(m);b++},sort:function(){1<c.length&&c.sort(Bg);1<d.length&&d.sort(Cg)}}}function Eg(){var a={};return{get:function(b,c){b=b.id+","+c.id;c=a[b];void 0===c&&(c=new Dg,a[b]=c);return c},dispose:function(){a={}}}}function Fg(){var a={};return{get:function(b){if(void 0!==a[b.id])return a[b.id];switch(b.type){case "DirectionalLight":var c=
-{direction:new p,color:new G,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new z};break;case "SpotLight":c={position:new p,direction:new p,color:new G,distance:0,coneCos:0,penumbraCos:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new z};break;case "PointLight":c={position:new p,color:new G,distance:0,decay:0,shadow:!1,shadowBias:0,shadowRadius:1,shadowMapSize:new z,shadowCameraNear:1,shadowCameraFar:1E3};break;case "HemisphereLight":c={direction:new p,skyColor:new G,groundColor:new G};
-break;case "RectAreaLight":c={color:new G,position:new p,halfWidth:new p,halfHeight:new p}}return a[b.id]=c}}}function Gg(){var a=new Fg,b={id:Hg++,hash:{stateID:-1,directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,shadowsLength:-1},ambient:[0,0,0],directional:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],point:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]},c=new p,d=new I,e=new I;return{setup:function(f,
-g,h){var k=0,m=0,q=0,n=0,t=0,u=0,r=0,l=0;h=h.matrixWorldInverse;for(var y=0,p=f.length;y<p;y++){var w=f[y],B=w.color,E=w.intensity,P=w.distance,N=w.shadow&&w.shadow.map?w.shadow.map.texture:null;if(w.isAmbientLight)k+=B.r*E,m+=B.g*E,q+=B.b*E;else if(w.isDirectionalLight){var O=a.get(w);O.color.copy(w.color).multiplyScalar(w.intensity);O.direction.setFromMatrixPosition(w.matrixWorld);c.setFromMatrixPosition(w.target.matrixWorld);O.direction.sub(c);O.direction.transformDirection(h);if(O.shadow=w.castShadow)B=
-w.shadow,O.shadowBias=B.bias,O.shadowRadius=B.radius,O.shadowMapSize=B.mapSize;b.directionalShadowMap[n]=N;b.directionalShadowMatrix[n]=w.shadow.matrix;b.directional[n]=O;n++}else if(w.isSpotLight){O=a.get(w);O.position.setFromMatrixPosition(w.matrixWorld);O.position.applyMatrix4(h);O.color.copy(B).multiplyScalar(E);O.distance=P;O.direction.setFromMatrixPosition(w.matrixWorld);c.setFromMatrixPosition(w.target.matrixWorld);O.direction.sub(c);O.direction.transformDirection(h);O.coneCos=Math.cos(w.angle);
-O.penumbraCos=Math.cos(w.angle*(1-w.penumbra));O.decay=0===w.distance?0:w.decay;if(O.shadow=w.castShadow)B=w.shadow,O.shadowBias=B.bias,O.shadowRadius=B.radius,O.shadowMapSize=B.mapSize;b.spotShadowMap[u]=N;b.spotShadowMatrix[u]=w.shadow.matrix;b.spot[u]=O;u++}else if(w.isRectAreaLight)O=a.get(w),O.color.copy(B).multiplyScalar(E),O.position.setFromMatrixPosition(w.matrixWorld),O.position.applyMatrix4(h),e.identity(),d.copy(w.matrixWorld),d.premultiply(h),e.extractRotation(d),O.halfWidth.set(.5*w.width,
-0,0),O.halfHeight.set(0,.5*w.height,0),O.halfWidth.applyMatrix4(e),O.halfHeight.applyMatrix4(e),b.rectArea[r]=O,r++;else if(w.isPointLight){O=a.get(w);O.position.setFromMatrixPosition(w.matrixWorld);O.position.applyMatrix4(h);O.color.copy(w.color).multiplyScalar(w.intensity);O.distance=w.distance;O.decay=0===w.distance?0:w.decay;if(O.shadow=w.castShadow)B=w.shadow,O.shadowBias=B.bias,O.shadowRadius=B.radius,O.shadowMapSize=B.mapSize,O.shadowCameraNear=B.camera.near,O.shadowCameraFar=B.camera.far;
-b.pointShadowMap[t]=N;b.pointShadowMatrix[t]=w.shadow.matrix;b.point[t]=O;t++}else w.isHemisphereLight&&(O=a.get(w),O.direction.setFromMatrixPosition(w.matrixWorld),O.direction.transformDirection(h),O.direction.normalize(),O.skyColor.copy(w.color).multiplyScalar(E),O.groundColor.copy(w.groundColor).multiplyScalar(E),b.hemi[l]=O,l++)}b.ambient[0]=k;b.ambient[1]=m;b.ambient[2]=q;b.directional.length=n;b.spot.length=u;b.rectArea.length=r;b.point.length=t;b.hemi.length=l;b.hash.stateID=b.id;b.hash.directionalLength=
-n;b.hash.pointLength=t;b.hash.spotLength=u;b.hash.rectAreaLength=r;b.hash.hemiLength=l;b.hash.shadowsLength=g.length},state:b}}function Ye(){var a=new Gg,b=[],c=[];return{init:function(){b.length=0;c.length=0},state:{lightsArray:b,shadowsArray:c,lights:a},setupLights:function(d){a.setup(b,c,d)},pushLight:function(a){b.push(a)},pushShadow:function(a){c.push(a)}}}function Ig(){var a={};return{get:function(b,c){if(void 0===a[b.id]){var d=new Ye;a[b.id]={};a[b.id][c.id]=d}else void 0===a[b.id][c.id]?
-(d=new Ye,a[b.id][c.id]=d):d=a[b.id][c.id];return d},dispose:function(){a={}}}}function $a(a){J.call(this);this.type="MeshDepthMaterial";this.depthPacking=3200;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.lights=this.fog=!1;this.setValues(a)}function ab(a){J.call(this);this.type="MeshDistanceMaterial";this.referencePosition=new p;this.nearDistance=1;this.farDistance=
-1E3;this.morphTargets=this.skinning=!1;this.displacementMap=this.alphaMap=this.map=null;this.displacementScale=1;this.displacementBias=0;this.lights=this.fog=!1;this.setValues(a)}function Ze(a,b,c){function d(b,c,d,e,f,g){var h=b.geometry;var k=n;var m=b.customDepthMaterial;d&&(k=t,m=b.customDistanceMaterial);m?k=m:(m=!1,c.morphTargets&&(h&&h.isBufferGeometry?m=h.morphAttributes&&h.morphAttributes.position&&0<h.morphAttributes.position.length:h&&h.isGeometry&&(m=h.morphTargets&&0<h.morphTargets.length)),
-b.isSkinnedMesh&&!1===c.skinning&&console.warn("THREE.WebGLShadowMap: THREE.SkinnedMesh with material.skinning set to false:",b),b=b.isSkinnedMesh&&c.skinning,h=0,m&&(h|=1),b&&(h|=2),k=k[h]);a.localClippingEnabled&&!0===c.clipShadows&&0!==c.clippingPlanes.length&&(h=k.uuid,m=c.uuid,b=u[h],void 0===b&&(b={},u[h]=b),h=b[m],void 0===h&&(h=k.clone(),b[m]=h),k=h);k.visible=c.visible;k.wireframe=c.wireframe;k.side=null!=c.shadowSide?c.shadowSide:r[c.side];k.clipShadows=c.clipShadows;k.clippingPlanes=c.clippingPlanes;
-k.clipIntersection=c.clipIntersection;k.wireframeLinewidth=c.wireframeLinewidth;k.linewidth=c.linewidth;d&&k.isMeshDistanceMaterial&&(k.referencePosition.copy(e),k.nearDistance=f,k.farDistance=g);return k}function e(c,g,h,k){if(!1!==c.visible){if(c.layers.test(g.layers)&&(c.isMesh||c.isLine||c.isPoints)&&c.castShadow&&(!c.frustumCulled||f.intersectsObject(c))){c.modelViewMatrix.multiplyMatrices(h.matrixWorldInverse,c.matrixWorld);var m=b.update(c),n=c.material;if(Array.isArray(n))for(var t=m.groups,
-u=0,r=t.length;u<r;u++){var l=t[u],P=n[l.materialIndex];P&&P.visible&&(P=d(c,P,k,q,h.near,h.far),a.renderBufferDirect(h,null,m,P,c,l))}else n.visible&&(P=d(c,n,k,q,h.near,h.far),a.renderBufferDirect(h,null,m,P,c,null))}c=c.children;m=0;for(n=c.length;m<n;m++)e(c[m],g,h,k)}}var f=new md,g=new I,h=new z,k=new z(c,c),m=new p,q=new p,n=Array(4),t=Array(4),u={},r={0:1,1:0,2:2},l=[new p(1,0,0),new p(-1,0,0),new p(0,0,1),new p(0,0,-1),new p(0,1,0),new p(0,-1,0)],y=[new p(0,1,0),new p(0,1,0),new p(0,1,0),
-new p(0,1,0),new p(0,0,1),new p(0,0,-1)],x=[new V,new V,new V,new V,new V,new V];for(c=0;4!==c;++c){var w=0!==(c&1),B=0!==(c&2),E=new $a({depthPacking:3201,morphTargets:w,skinning:B});n[c]=E;w=new ab({morphTargets:w,skinning:B});t[c]=w}var P=this;this.enabled=!1;this.autoUpdate=!0;this.needsUpdate=!1;this.type=1;this.render=function(b,c,d){if(!1!==P.enabled&&(!1!==P.autoUpdate||!1!==P.needsUpdate)&&0!==b.length){var n=a.state;n.disable(a.context.BLEND);n.buffers.color.setClear(1,1,1,1);n.buffers.depth.setTest(!0);
-n.setScissorTest(!1);for(var t,u=0,r=b.length;u<r;u++){var v=b[u];t=v.shadow;var p=v&&v.isPointLight;if(void 0===t)console.warn("THREE.WebGLShadowMap:",v,"has no shadow.");else{var w=t.camera;h.copy(t.mapSize);h.min(k);if(p){var N=h.x,E=h.y;x[0].set(2*N,E,N,E);x[1].set(0,E,N,E);x[2].set(3*N,E,N,E);x[3].set(N,E,N,E);x[4].set(3*N,0,N,E);x[5].set(N,0,N,E);h.x*=4;h.y*=2}null===t.map&&(t.map=new fb(h.x,h.y,{minFilter:1003,magFilter:1003,format:1023}),t.map.texture.name=v.name+".shadowMap",w.updateProjectionMatrix());
-t.isSpotLightShadow&&t.update(v);N=t.map;E=t.matrix;q.setFromMatrixPosition(v.matrixWorld);w.position.copy(q);p?(t=6,E.makeTranslation(-q.x,-q.y,-q.z)):(t=1,m.setFromMatrixPosition(v.target.matrixWorld),w.lookAt(m),w.updateMatrixWorld(),E.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),E.multiply(w.projectionMatrix),E.multiply(w.matrixWorldInverse));a.setRenderTarget(N);a.clear();for(v=0;v<t;v++)p&&(m.copy(w.position),m.add(l[v]),w.up.copy(y[v]),w.lookAt(m),w.updateMatrixWorld(),n.viewport(x[v])),g.multiplyMatrices(w.projectionMatrix,
-w.matrixWorldInverse),f.setFromMatrix(g),e(c,d,w,p)}}P.needsUpdate=!1}}}function Jg(a,b,c,d){function e(b,c,d){var e=new Uint8Array(4),f=a.createTexture();a.bindTexture(b,f);a.texParameteri(b,a.TEXTURE_MIN_FILTER,a.NEAREST);a.texParameteri(b,a.TEXTURE_MAG_FILTER,a.NEAREST);for(b=0;b<d;b++)a.texImage2D(c+b,0,a.RGBA,1,1,0,a.RGBA,a.UNSIGNED_BYTE,e);return f}function f(c,e){x[c]=1;0===w[c]&&(a.enableVertexAttribArray(c),w[c]=1);B[c]!==e&&((d.isWebGL2?a:b.get("ANGLE_instanced_arrays"))[d.isWebGL2?"vertexAttribDivisor":
-"vertexAttribDivisorANGLE"](c,e),B[c]=e)}function g(b){!0!==E[b]&&(a.enable(b),E[b]=!0)}function h(b){!1!==E[b]&&(a.disable(b),E[b]=!1)}function k(b,d,e,f,k,m,n,q){0!==b?g(a.BLEND):h(a.BLEND);if(5!==b){if(b!==O||q!==C)switch(b){case 2:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE,a.ONE,a.ONE)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.SRC_ALPHA,a.ONE));break;case 3:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.ZERO,a.ONE_MINUS_SRC_COLOR,
-a.ONE_MINUS_SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.ONE_MINUS_SRC_COLOR));break;case 4:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ZERO,a.SRC_COLOR,a.ZERO,a.SRC_ALPHA)):(a.blendEquation(a.FUNC_ADD),a.blendFunc(a.ZERO,a.SRC_COLOR));break;default:q?(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.ONE,a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA)):(a.blendEquationSeparate(a.FUNC_ADD,a.FUNC_ADD),a.blendFuncSeparate(a.SRC_ALPHA,
-a.ONE_MINUS_SRC_ALPHA,a.ONE,a.ONE_MINUS_SRC_ALPHA))}D=A=Ud=Td=Sd=z=null}else{k=k||d;m=m||e;n=n||f;if(d!==z||k!==Ud)a.blendEquationSeparate(c.convert(d),c.convert(k)),z=d,Ud=k;if(e!==Sd||f!==Td||m!==A||n!==D)a.blendFuncSeparate(c.convert(e),c.convert(f),c.convert(m),c.convert(n)),Sd=e,Td=f,A=m,D=n}O=b;C=q}function m(b){G!==b&&(b?a.frontFace(a.CW):a.frontFace(a.CCW),G=b)}function q(b){0!==b?(g(a.CULL_FACE),b!==K&&(1===b?a.cullFace(a.BACK):2===b?a.cullFace(a.FRONT):a.cullFace(a.FRONT_AND_BACK))):h(a.CULL_FACE);
-K=b}function n(b,c,d){if(b){if(g(a.POLYGON_OFFSET_FILL),R!==c||I!==d)a.polygonOffset(c,d),R=c,I=d}else h(a.POLYGON_OFFSET_FILL)}function t(b){void 0===b&&(b=a.TEXTURE0+J-1);Q!==b&&(a.activeTexture(b),Q=b)}var u=new function(){var b=!1,c=new V,d=null,e=new V(0,0,0,0);return{setMask:function(c){d===c||b||(a.colorMask(c,c,c,c),d=c)},setLocked:function(a){b=a},setClear:function(b,d,f,g,h){!0===h&&(b*=g,d*=g,f*=g);c.set(b,d,f,g);!1===e.equals(c)&&(a.clearColor(b,d,f,g),e.copy(c))},reset:function(){b=!1;
-d=null;e.set(-1,0,0,0)}}},r=new function(){var b=!1,c=null,d=null,e=null;return{setTest:function(b){b?g(a.DEPTH_TEST):h(a.DEPTH_TEST)},setMask:function(d){c===d||b||(a.depthMask(d),c=d)},setFunc:function(b){if(d!==b){if(b)switch(b){case 0:a.depthFunc(a.NEVER);break;case 1:a.depthFunc(a.ALWAYS);break;case 2:a.depthFunc(a.LESS);break;case 3:a.depthFunc(a.LEQUAL);break;case 4:a.depthFunc(a.EQUAL);break;case 5:a.depthFunc(a.GEQUAL);break;case 6:a.depthFunc(a.GREATER);break;case 7:a.depthFunc(a.NOTEQUAL);
-break;default:a.depthFunc(a.LEQUAL)}else a.depthFunc(a.LEQUAL);d=b}},setLocked:function(a){b=a},setClear:function(b){e!==b&&(a.clearDepth(b),e=b)},reset:function(){b=!1;e=d=c=null}}},l=new function(){var b=!1,c=null,d=null,e=null,f=null,k=null,m=null,n=null,q=null;return{setTest:function(b){b?g(a.STENCIL_TEST):h(a.STENCIL_TEST)},setMask:function(d){c===d||b||(a.stencilMask(d),c=d)},setFunc:function(b,c,g){if(d!==b||e!==c||f!==g)a.stencilFunc(b,c,g),d=b,e=c,f=g},setOp:function(b,c,d){if(k!==b||m!==
-c||n!==d)a.stencilOp(b,c,d),k=b,m=c,n=d},setLocked:function(a){b=a},setClear:function(b){q!==b&&(a.clearStencil(b),q=b)},reset:function(){b=!1;q=n=m=k=f=e=d=c=null}}},p=a.getParameter(a.MAX_VERTEX_ATTRIBS),x=new Uint8Array(p),w=new Uint8Array(p),B=new Uint8Array(p),E={},P=null,N=null,O=null,z=null,Sd=null,Td=null,Ud=null,A=null,D=null,C=!1,G=null,K=null,L=null,R=null,I=null,J=a.getParameter(a.MAX_COMBINED_TEXTURE_IMAGE_UNITS),H=!1;p=0;p=a.getParameter(a.VERSION);-1!==p.indexOf("WebGL")?(p=parseFloat(/^WebGL ([0-9])/.exec(p)[1]),
-H=1<=p):-1!==p.indexOf("OpenGL ES")&&(p=parseFloat(/^OpenGL ES ([0-9])/.exec(p)[1]),H=2<=p);var Q=null,S={},Y=new V,W=new V,M={};M[a.TEXTURE_2D]=e(a.TEXTURE_2D,a.TEXTURE_2D,1);M[a.TEXTURE_CUBE_MAP]=e(a.TEXTURE_CUBE_MAP,a.TEXTURE_CUBE_MAP_POSITIVE_X,6);u.setClear(0,0,0,1);r.setClear(1);l.setClear(0);g(a.DEPTH_TEST);r.setFunc(3);m(!1);q(1);g(a.CULL_FACE);g(a.BLEND);k(1);return{buffers:{color:u,depth:r,stencil:l},initAttributes:function(){for(var a=0,b=x.length;a<b;a++)x[a]=0},enableAttribute:function(a){f(a,
-0)},enableAttributeAndDivisor:f,disableUnusedAttributes:function(){for(var b=0,c=w.length;b!==c;++b)w[b]!==x[b]&&(a.disableVertexAttribArray(b),w[b]=0)},enable:g,disable:h,getCompressedTextureFormats:function(){if(null===P&&(P=[],b.get("WEBGL_compressed_texture_pvrtc")||b.get("WEBGL_compressed_texture_s3tc")||b.get("WEBGL_compressed_texture_etc1")||b.get("WEBGL_compressed_texture_astc")))for(var c=a.getParameter(a.COMPRESSED_TEXTURE_FORMATS),d=0;d<c.length;d++)P.push(c[d]);return P},useProgram:function(b){return N!==
-b?(a.useProgram(b),N=b,!0):!1},setBlending:k,setMaterial:function(b,c){2===b.side?h(a.CULL_FACE):g(a.CULL_FACE);var d=1===b.side;c&&(d=!d);m(d);1===b.blending&&!1===b.transparent?k(0):k(b.blending,b.blendEquation,b.blendSrc,b.blendDst,b.blendEquationAlpha,b.blendSrcAlpha,b.blendDstAlpha,b.premultipliedAlpha);r.setFunc(b.depthFunc);r.setTest(b.depthTest);r.setMask(b.depthWrite);u.setMask(b.colorWrite);n(b.polygonOffset,b.polygonOffsetFactor,b.polygonOffsetUnits)},setFlipSided:m,setCullFace:q,setLineWidth:function(b){b!==
-L&&(H&&a.lineWidth(b),L=b)},setPolygonOffset:n,setScissorTest:function(b){b?g(a.SCISSOR_TEST):h(a.SCISSOR_TEST)},activeTexture:t,bindTexture:function(b,c){null===Q&&t();var d=S[Q];void 0===d&&(d={type:void 0,texture:void 0},S[Q]=d);if(d.type!==b||d.texture!==c)a.bindTexture(b,c||M[b]),d.type=b,d.texture=c},compressedTexImage2D:function(){try{a.compressedTexImage2D.apply(a,arguments)}catch(U){console.error("THREE.WebGLState:",U)}},texImage2D:function(){try{a.texImage2D.apply(a,arguments)}catch(U){console.error("THREE.WebGLState:",
-U)}},scissor:function(b){!1===Y.equals(b)&&(a.scissor(b.x,b.y,b.z,b.w),Y.copy(b))},viewport:function(b){!1===W.equals(b)&&(a.viewport(b.x,b.y,b.z,b.w),W.copy(b))},reset:function(){for(var b=0;b<w.length;b++)1===w[b]&&(a.disableVertexAttribArray(b),w[b]=0);E={};Q=P=null;S={};K=G=O=N=null;u.reset();r.reset();l.reset()}}}function Kg(a,b,c,d,e,f,g){function h(a,b){if(a.width>b||a.height>b){if("data"in a){console.warn("THREE.WebGLRenderer: image in DataTexture is too big ("+a.width+"x"+a.height+").");
-return}b/=Math.max(a.width,a.height);var c=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");c.width=Math.floor(a.width*b);c.height=Math.floor(a.height*b);c.getContext("2d").drawImage(a,0,0,a.width,a.height,0,0,c.width,c.height);console.warn("THREE.WebGLRenderer: image is too big ("+a.width+"x"+a.height+"). Resized to "+c.width+"x"+c.height);return c}return a}function k(a){return H.isPowerOfTwo(a.width)&&H.isPowerOfTwo(a.height)}function m(a,b){return a.generateMipmaps&&b&&1003!==
-a.minFilter&&1006!==a.minFilter}function q(b,c,e,f){a.generateMipmap(b);d.get(c).__maxMipLevel=Math.log(Math.max(e,f))*Math.LOG2E}function n(b,c){if(!e.isWebGL2)return b;if(b===a.RGB){if(c===a.FLOAT)return a.RGB32F;if(c===a.HALF_FLOAT)return a.RGB16F;if(c===a.UNSIGNED_BYTE)return a.RGB8}if(b===a.RGBA){if(c===a.FLOAT)return a.RGBA32F;if(c===a.HALF_FLOAT)return a.RGBA16F;if(c===a.UNSIGNED_BYTE)return a.RGBA8}return b}function t(b){return 1003===b||1004===b||1005===b?a.NEAREST:a.LINEAR}function u(b){b=
-b.target;b.removeEventListener("dispose",u);a:{var c=d.get(b);if(b.image&&c.__image__webglTextureCube)a.deleteTexture(c.__image__webglTextureCube);else{if(void 0===c.__webglInit)break a;a.deleteTexture(c.__webglTexture)}d.remove(b)}b.isVideoTexture&&delete B[b.id];g.memory.textures--}function r(b){b=b.target;b.removeEventListener("dispose",r);var c=d.get(b),e=d.get(b.texture);if(b){void 0!==e.__webglTexture&&a.deleteTexture(e.__webglTexture);b.depthTexture&&b.depthTexture.dispose();if(b.isWebGLRenderTargetCube)for(e=
-0;6>e;e++)a.deleteFramebuffer(c.__webglFramebuffer[e]),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer[e]);else a.deleteFramebuffer(c.__webglFramebuffer),c.__webglDepthbuffer&&a.deleteRenderbuffer(c.__webglDepthbuffer);d.remove(b.texture);d.remove(b)}g.memory.textures--}function l(b,t){var r=d.get(b);if(b.isVideoTexture){var l=b.id,v=g.render.frame;B[l]!==v&&(B[l]=v,b.update())}if(0<b.version&&r.__version!==b.version)if(l=b.image,void 0===l)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");
-else if(!1===l.complete)console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete");else{void 0===r.__webglInit&&(r.__webglInit=!0,b.addEventListener("dispose",u),r.__webglTexture=a.createTexture(),g.memory.textures++);c.activeTexture(a.TEXTURE0+t);c.bindTexture(a.TEXTURE_2D,r.__webglTexture);a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);a.pixelStorei(a.UNPACK_PREMULTIPLY_ALPHA_WEBGL,b.premultiplyAlpha);a.pixelStorei(a.UNPACK_ALIGNMENT,b.unpackAlignment);t=h(b.image,e.maxTextureSize);
-(e.isWebGL2?0:1001!==b.wrapS||1001!==b.wrapT||1003!==b.minFilter&&1006!==b.minFilter)&&!1===k(t)&&(t instanceof HTMLImageElement||t instanceof HTMLCanvasElement||t instanceof ImageBitmap)&&(void 0===E&&(E=document.createElementNS("http://www.w3.org/1999/xhtml","canvas")),E.width=H.floorPowerOfTwo(t.width),E.height=H.floorPowerOfTwo(t.height),E.getContext("2d").drawImage(t,0,0,E.width,E.height),console.warn("THREE.WebGLRenderer: image is not power of two ("+t.width+"x"+t.height+"). Resized to "+E.width+
-"x"+E.height),t=E);l=k(t);v=f.convert(b.format);var w=f.convert(b.type),y=n(v,w);p(a.TEXTURE_2D,b,l);var P=b.mipmaps;if(b.isDepthTexture){y=a.DEPTH_COMPONENT;if(1015===b.type){if(!e.isWebGL2)throw Error("Float Depth Texture only supported in WebGL2.0");y=a.DEPTH_COMPONENT32F}else e.isWebGL2&&(y=a.DEPTH_COMPONENT16);1026===b.format&&y===a.DEPTH_COMPONENT&&1012!==b.type&&1014!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),b.type=
-1012,w=f.convert(b.type));1027===b.format&&(y=a.DEPTH_STENCIL,1020!==b.type&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),b.type=1020,w=f.convert(b.type)));c.texImage2D(a.TEXTURE_2D,0,y,t.width,t.height,0,v,w,null)}else if(b.isDataTexture)if(0<P.length&&l){for(var N=0,x=P.length;N<x;N++){var z=P[N];c.texImage2D(a.TEXTURE_2D,N,y,z.width,z.height,0,v,w,z.data)}b.generateMipmaps=!1;r.__maxMipLevel=P.length-1}else c.texImage2D(a.TEXTURE_2D,0,y,t.width,
-t.height,0,v,w,t.data),r.__maxMipLevel=0;else if(b.isCompressedTexture){N=0;for(x=P.length;N<x;N++)z=P[N],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(v)?c.compressedTexImage2D(a.TEXTURE_2D,N,y,z.width,z.height,0,z.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):c.texImage2D(a.TEXTURE_2D,N,y,z.width,z.height,0,v,w,z.data);r.__maxMipLevel=P.length-1}else if(0<P.length&&l){N=0;for(x=P.length;N<x;N++)z=
-P[N],c.texImage2D(a.TEXTURE_2D,N,y,v,w,z);b.generateMipmaps=!1;r.__maxMipLevel=P.length-1}else c.texImage2D(a.TEXTURE_2D,0,y,v,w,t),r.__maxMipLevel=0;m(b,l)&&q(a.TEXTURE_2D,b,t.width,t.height);r.__version=b.version;if(b.onUpdate)b.onUpdate(b);return}c.activeTexture(a.TEXTURE0+t);c.bindTexture(a.TEXTURE_2D,r.__webglTexture)}function p(c,g,h){h?(a.texParameteri(c,a.TEXTURE_WRAP_S,f.convert(g.wrapS)),a.texParameteri(c,a.TEXTURE_WRAP_T,f.convert(g.wrapT)),a.texParameteri(c,a.TEXTURE_MAG_FILTER,f.convert(g.magFilter)),
-a.texParameteri(c,a.TEXTURE_MIN_FILTER,f.convert(g.minFilter))):(a.texParameteri(c,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(c,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),1001===g.wrapS&&1001===g.wrapT||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),a.texParameteri(c,a.TEXTURE_MAG_FILTER,t(g.magFilter)),a.texParameteri(c,a.TEXTURE_MIN_FILTER,t(g.minFilter)),1003!==g.minFilter&&1006!==g.minFilter&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter."));
-!(h=b.get("EXT_texture_filter_anisotropic"))||1015===g.type&&null===b.get("OES_texture_float_linear")||1016===g.type&&null===(e.isWebGL2||b.get("OES_texture_half_float_linear"))||!(1<g.anisotropy||d.get(g).__currentAnisotropy)||(a.texParameterf(c,h.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(g.anisotropy,e.getMaxAnisotropy())),d.get(g).__currentAnisotropy=g.anisotropy)}function x(b,e,g,h){var k=f.convert(e.texture.format),m=f.convert(e.texture.type),q=n(k,m);c.texImage2D(h,0,q,e.width,e.height,0,k,m,null);
-a.bindFramebuffer(a.FRAMEBUFFER,b);a.framebufferTexture2D(a.FRAMEBUFFER,g,h,d.get(e.texture).__webglTexture,0);a.bindFramebuffer(a.FRAMEBUFFER,null)}function w(b,c){a.bindRenderbuffer(a.RENDERBUFFER,b);c.depthBuffer&&!c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_COMPONENT16,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.RENDERBUFFER,b)):c.depthBuffer&&c.stencilBuffer?(a.renderbufferStorage(a.RENDERBUFFER,a.DEPTH_STENCIL,c.width,c.height),a.framebufferRenderbuffer(a.FRAMEBUFFER,
-a.DEPTH_STENCIL_ATTACHMENT,a.RENDERBUFFER,b)):a.renderbufferStorage(a.RENDERBUFFER,a.RGBA4,c.width,c.height);a.bindRenderbuffer(a.RENDERBUFFER,null)}var B={},E;this.setTexture2D=l;this.setTextureCube=function(b,t){var r=d.get(b);if(6===b.image.length)if(0<b.version&&r.__version!==b.version){r.__image__webglTextureCube||(b.addEventListener("dispose",u),r.__image__webglTextureCube=a.createTexture(),g.memory.textures++);c.activeTexture(a.TEXTURE0+t);c.bindTexture(a.TEXTURE_CUBE_MAP,r.__image__webglTextureCube);
-a.pixelStorei(a.UNPACK_FLIP_Y_WEBGL,b.flipY);t=b&&b.isCompressedTexture;for(var l=b.image[0]&&b.image[0].isDataTexture,v=[],w=0;6>w;w++)v[w]=t||l?l?b.image[w].image:b.image[w]:h(b.image[w],e.maxCubemapSize);var y=v[0],E=k(y),P=f.convert(b.format),x=f.convert(b.type),N=n(P,x);p(a.TEXTURE_CUBE_MAP,b,E);for(w=0;6>w;w++)if(t)for(var B,z=v[w].mipmaps,A=0,D=z.length;A<D;A++)B=z[A],1023!==b.format&&1022!==b.format?-1<c.getCompressedTextureFormats().indexOf(P)?c.compressedTexImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+
-w,A,N,B.width,B.height,0,B.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+w,A,N,B.width,B.height,0,P,x,B.data);else l?c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+w,0,N,v[w].width,v[w].height,0,P,x,v[w].data):c.texImage2D(a.TEXTURE_CUBE_MAP_POSITIVE_X+w,0,N,P,x,v[w]);r.__maxMipLevel=t?z.length-1:0;m(b,E)&&q(a.TEXTURE_CUBE_MAP,b,y.width,y.height);r.__version=b.version;if(b.onUpdate)b.onUpdate(b)}else c.activeTexture(a.TEXTURE0+
-t),c.bindTexture(a.TEXTURE_CUBE_MAP,r.__image__webglTextureCube)};this.setTextureCubeDynamic=function(b,e){c.activeTexture(a.TEXTURE0+e);c.bindTexture(a.TEXTURE_CUBE_MAP,d.get(b).__webglTexture)};this.setupRenderTarget=function(b){var e=d.get(b),f=d.get(b.texture);b.addEventListener("dispose",r);f.__webglTexture=a.createTexture();g.memory.textures++;var h=!0===b.isWebGLRenderTargetCube,n=k(b);if(h){e.__webglFramebuffer=[];for(var t=0;6>t;t++)e.__webglFramebuffer[t]=a.createFramebuffer()}else e.__webglFramebuffer=
-a.createFramebuffer();if(h){c.bindTexture(a.TEXTURE_CUBE_MAP,f.__webglTexture);p(a.TEXTURE_CUBE_MAP,b.texture,n);for(t=0;6>t;t++)x(e.__webglFramebuffer[t],b,a.COLOR_ATTACHMENT0,a.TEXTURE_CUBE_MAP_POSITIVE_X+t);m(b.texture,n)&&q(a.TEXTURE_CUBE_MAP,b.texture,b.width,b.height);c.bindTexture(a.TEXTURE_CUBE_MAP,null)}else c.bindTexture(a.TEXTURE_2D,f.__webglTexture),p(a.TEXTURE_2D,b.texture,n),x(e.__webglFramebuffer,b,a.COLOR_ATTACHMENT0,a.TEXTURE_2D),m(b.texture,n)&&q(a.TEXTURE_2D,b.texture,b.width,b.height),
-c.bindTexture(a.TEXTURE_2D,null);if(b.depthBuffer){e=d.get(b);f=!0===b.isWebGLRenderTargetCube;if(b.depthTexture){if(f)throw Error("target.depthTexture not supported in Cube render targets");if(b&&b.isWebGLRenderTargetCube)throw Error("Depth Texture with cube render targets is not supported");a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer);if(!b.depthTexture||!b.depthTexture.isDepthTexture)throw Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");d.get(b.depthTexture).__webglTexture&&
-b.depthTexture.image.width===b.width&&b.depthTexture.image.height===b.height||(b.depthTexture.image.width=b.width,b.depthTexture.image.height=b.height,b.depthTexture.needsUpdate=!0);l(b.depthTexture,0);e=d.get(b.depthTexture).__webglTexture;if(1026===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_ATTACHMENT,a.TEXTURE_2D,e,0);else if(1027===b.depthTexture.format)a.framebufferTexture2D(a.FRAMEBUFFER,a.DEPTH_STENCIL_ATTACHMENT,a.TEXTURE_2D,e,0);else throw Error("Unknown depthTexture format");
-}else if(f)for(e.__webglDepthbuffer=[],f=0;6>f;f++)a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer[f]),e.__webglDepthbuffer[f]=a.createRenderbuffer(),w(e.__webglDepthbuffer[f],b);else a.bindFramebuffer(a.FRAMEBUFFER,e.__webglFramebuffer),e.__webglDepthbuffer=a.createRenderbuffer(),w(e.__webglDepthbuffer,b);a.bindFramebuffer(a.FRAMEBUFFER,null)}};this.updateRenderTargetMipmap=function(b){var e=b.texture,f=k(b);if(m(e,f)){f=b.isWebGLRenderTargetCube?a.TEXTURE_CUBE_MAP:a.TEXTURE_2D;var g=d.get(e).__webglTexture;
-c.bindTexture(f,g);q(f,e,b.width,b.height);c.bindTexture(f,null)}}}function $e(a,b,c){return{convert:function(d){if(1E3===d)return a.REPEAT;if(1001===d)return a.CLAMP_TO_EDGE;if(1002===d)return a.MIRRORED_REPEAT;if(1003===d)return a.NEAREST;if(1004===d)return a.NEAREST_MIPMAP_NEAREST;if(1005===d)return a.NEAREST_MIPMAP_LINEAR;if(1006===d)return a.LINEAR;if(1007===d)return a.LINEAR_MIPMAP_NEAREST;if(1008===d)return a.LINEAR_MIPMAP_LINEAR;if(1009===d)return a.UNSIGNED_BYTE;if(1017===d)return a.UNSIGNED_SHORT_4_4_4_4;
-if(1018===d)return a.UNSIGNED_SHORT_5_5_5_1;if(1019===d)return a.UNSIGNED_SHORT_5_6_5;if(1010===d)return a.BYTE;if(1011===d)return a.SHORT;if(1012===d)return a.UNSIGNED_SHORT;if(1013===d)return a.INT;if(1014===d)return a.UNSIGNED_INT;if(1015===d)return a.FLOAT;if(1016===d){if(c.isWebGL2)return a.HALF_FLOAT;var e=b.get("OES_texture_half_float");if(null!==e)return e.HALF_FLOAT_OES}if(1021===d)return a.ALPHA;if(1022===d)return a.RGB;if(1023===d)return a.RGBA;if(1024===d)return a.LUMINANCE;if(1025===
-d)return a.LUMINANCE_ALPHA;if(1026===d)return a.DEPTH_COMPONENT;if(1027===d)return a.DEPTH_STENCIL;if(100===d)return a.FUNC_ADD;if(101===d)return a.FUNC_SUBTRACT;if(102===d)return a.FUNC_REVERSE_SUBTRACT;if(200===d)return a.ZERO;if(201===d)return a.ONE;if(202===d)return a.SRC_COLOR;if(203===d)return a.ONE_MINUS_SRC_COLOR;if(204===d)return a.SRC_ALPHA;if(205===d)return a.ONE_MINUS_SRC_ALPHA;if(206===d)return a.DST_ALPHA;if(207===d)return a.ONE_MINUS_DST_ALPHA;if(208===d)return a.DST_COLOR;if(209===
-d)return a.ONE_MINUS_DST_COLOR;if(210===d)return a.SRC_ALPHA_SATURATE;if(33776===d||33777===d||33778===d||33779===d)if(e=b.get("WEBGL_compressed_texture_s3tc"),null!==e){if(33776===d)return e.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===d)return e.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===d)return e.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===d)return e.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===d||35841===d||35842===d||35843===d)if(e=b.get("WEBGL_compressed_texture_pvrtc"),null!==e){if(35840===d)return e.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;
-if(35841===d)return e.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===d)return e.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===d)return e.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===d&&(e=b.get("WEBGL_compressed_texture_etc1"),null!==e))return e.COMPRESSED_RGB_ETC1_WEBGL;if(37808===d||37809===d||37810===d||37811===d||37812===d||37813===d||37814===d||37815===d||37816===d||37817===d||37818===d||37819===d||37820===d||37821===d)if(e=b.get("WEBGL_compressed_texture_astc"),null!==e)return d;if(103===d||104===
-d){if(c.isWebGL2){if(103===d)return a.MIN;if(104===d)return a.MAX}e=b.get("EXT_blend_minmax");if(null!==e){if(103===d)return e.MIN_EXT;if(104===d)return e.MAX_EXT}}if(1020===d){if(c.isWebGL2)return a.UNSIGNED_INT_24_8;e=b.get("WEBGL_depth_texture");if(null!==e)return e.UNSIGNED_INT_24_8_WEBGL}return 0}}}function Kb(){D.call(this);this.type="Group"}function Z(a,b,c,d){Na.call(this);this.type="PerspectiveCamera";this.fov=void 0!==a?a:50;this.zoom=1;this.near=void 0!==c?c:.1;this.far=void 0!==d?d:2E3;
-this.focus=10;this.aspect=void 0!==b?b:1;this.view=null;this.filmGauge=35;this.filmOffset=0;this.updateProjectionMatrix()}function yc(a){Z.call(this);this.cameras=a||[]}function af(a){function b(){return null!==e&&!0===e.isPresenting}function c(){if(b()){var c=e.getEyeParameters("left"),f=c.renderWidth;c=c.renderHeight;x=a.getPixelRatio();y=a.getSize();a.setDrawingBufferSize(2*f,c,1);B.start()}else d.enabled&&(a.setDrawingBufferSize(y.width,y.height,x),B.stop())}var d=this,e=null,f=null,g=null,h=
-[],k=new I,m=new I;"undefined"!==typeof window&&"VRFrameData"in window&&(f=new window.VRFrameData,window.addEventListener("vrdisplaypresentchange",c,!1));var q=new I,n=new fa,t=new p,u=new Z;u.bounds=new V(0,0,.5,1);u.layers.enable(1);var r=new Z;r.bounds=new V(.5,0,.5,1);r.layers.enable(2);var l=new yc([u,r]);l.layers.enable(1);l.layers.enable(2);var y,x,w=[];this.enabled=!1;this.userHeight=1.6;this.getController=function(a){var b=h[a];void 0===b&&(b=new Kb,b.matrixAutoUpdate=!1,b.visible=!1,h[a]=
-b);return b};this.getDevice=function(){return e};this.setDevice=function(a){void 0!==a&&(e=a);B.setContext(a)};this.setPoseTarget=function(a){void 0!==a&&(g=a)};this.getCamera=function(a){if(null===e)return a.position.set(0,d.userHeight,0),a;e.depthNear=a.near;e.depthFar=a.far;e.getFrameData(f);var b=e.stageParameters;b?k.fromArray(b.sittingToStandingTransform):k.makeTranslation(0,d.userHeight,0);b=f.pose;var c=null!==g?g:a;c.matrix.copy(k);c.matrix.decompose(c.position,c.quaternion,c.scale);null!==
-b.orientation&&(n.fromArray(b.orientation),c.quaternion.multiply(n));null!==b.position&&(n.setFromRotationMatrix(k),t.fromArray(b.position),t.applyQuaternion(n),c.position.add(t));c.updateMatrixWorld();if(!1===e.isPresenting)return a;u.near=a.near;r.near=a.near;u.far=a.far;r.far=a.far;l.matrixWorld.copy(a.matrixWorld);l.matrixWorldInverse.copy(a.matrixWorldInverse);u.matrixWorldInverse.fromArray(f.leftViewMatrix);r.matrixWorldInverse.fromArray(f.rightViewMatrix);m.getInverse(k);u.matrixWorldInverse.multiply(m);
-r.matrixWorldInverse.multiply(m);a=c.parent;null!==a&&(q.getInverse(a.matrixWorld),u.matrixWorldInverse.multiply(q),r.matrixWorldInverse.multiply(q));u.matrixWorld.getInverse(u.matrixWorldInverse);r.matrixWorld.getInverse(r.matrixWorldInverse);u.projectionMatrix.fromArray(f.leftProjectionMatrix);r.projectionMatrix.fromArray(f.rightProjectionMatrix);l.projectionMatrix.copy(u.projectionMatrix);a=e.getLayers();a.length&&(a=a[0],null!==a.leftBounds&&4===a.leftBounds.length&&u.bounds.fromArray(a.leftBounds),
-null!==a.rightBounds&&4===a.rightBounds.length&&r.bounds.fromArray(a.rightBounds));a:for(a=0;a<h.length;a++){b=h[a];b:{c=a;for(var v=navigator.getGamepads&&navigator.getGamepads(),p=0,y=0,x=v.length;p<x;p++){var E=v[p];if(E&&("Daydream Controller"===E.id||"Gear VR Controller"===E.id||"Oculus Go Controller"===E.id||"OpenVR Gamepad"===E.id||E.id.startsWith("Oculus Touch")||E.id.startsWith("Spatial Controller"))){if(y===c){c=E;break b}y++}}c=void 0}if(void 0!==c&&void 0!==c.pose){if(null===c.pose)break a;
-v=c.pose;!1===v.hasPosition&&b.position.set(.2,-.6,-.05);null!==v.position&&b.position.fromArray(v.position);null!==v.orientation&&b.quaternion.fromArray(v.orientation);b.matrix.compose(b.position,b.quaternion,b.scale);b.matrix.premultiply(k);b.matrix.decompose(b.position,b.quaternion,b.scale);b.matrixWorldNeedsUpdate=!0;b.visible=!0;v="Daydream Controller"===c.id?0:1;w[a]!==c.buttons[v].pressed&&(w[a]=c.buttons[v].pressed,!0===w[a]?b.dispatchEvent({type:"selectstart"}):(b.dispatchEvent({type:"selectend"}),
-b.dispatchEvent({type:"select"})))}else b.visible=!1}return l};this.getStandingMatrix=function(){return k};this.isPresenting=b;var B=new Qd;this.setAnimationLoop=function(a){B.setAnimationLoop(a)};this.submitFrame=function(){b()&&e.submitFrame()};this.dispose=function(){"undefined"!==typeof window&&window.removeEventListener("vrdisplaypresentchange",c)}}function Lg(a){function b(){return null!==h&&null!==k}function c(a){var b=q[n.indexOf(a.inputSource)];b&&b.dispatchEvent({type:a.type})}function d(){a.setFramebuffer(null);
-p.stop()}function e(a,b){null===b?a.matrixWorld.copy(a.matrix):a.matrixWorld.multiplyMatrices(b.matrixWorld,a.matrix);a.matrixWorldInverse.getInverse(a.matrixWorld)}var f=a.context,g=null,h=null,k=null,m=null,q=[],n=[],t=new Z;t.layers.enable(1);t.viewport=new V;var u=new Z;u.layers.enable(2);u.viewport=new V;var r=new yc([t,u]);r.layers.enable(1);r.layers.enable(2);this.enabled=!1;this.getController=function(a){var b=q[a];void 0===b&&(b=new Kb,b.matrixAutoUpdate=!1,b.visible=!1,q[a]=b);return b};
-this.getDevice=function(){return g};this.setDevice=function(a){void 0!==a&&(g=a);a instanceof XRDevice&&f.setCompatibleXRDevice(a)};this.setSession=function(b,e){h=b;null!==h&&(h.addEventListener("select",c),h.addEventListener("selectstart",c),h.addEventListener("selectend",c),h.addEventListener("end",d),h.baseLayer=new XRWebGLLayer(h,f),h.requestFrameOfReference(e.frameOfReferenceType).then(function(b){k=b;a.setFramebuffer(h.baseLayer.framebuffer);p.setContext(h);p.start()}),n=h.getInputSources(),
-h.addEventListener("inputsourceschange",function(){n=h.getInputSources();console.log(n)}))};this.getCamera=function(a){if(b()){var c=a.parent,d=r.cameras;e(r,c);for(var f=0;f<d.length;f++)e(d[f],c);a.matrixWorld.copy(r.matrixWorld);a=a.children;f=0;for(c=a.length;f<c;f++)a[f].updateMatrixWorld(!0);return r}return a};this.isPresenting=b;var l=null,p=new Qd;p.setAnimationLoop(function(a,b){m=b.getDevicePose(k);if(null!==m)for(var c=h.baseLayer,d=b.views,e=0;e<d.length;e++){var f=d[e],g=c.getViewport(f),
-t=m.getViewMatrix(f),u=r.cameras[e];u.matrix.fromArray(t).getInverse(u.matrix);u.projectionMatrix.fromArray(f.projectionMatrix);u.viewport.set(g.x,g.y,g.width,g.height);0===e&&(r.matrix.copy(u.matrix),r.projectionMatrix.copy(u.projectionMatrix))}for(e=0;e<q.length;e++){c=q[e];if(d=n[e])if(d=b.getInputPose(d,k),null!==d){c.matrix.elements=d.pointerMatrix;c.matrix.decompose(c.position,c.rotation,c.scale);c.visible=!0;continue}c.visible=!1}l&&l(a)});this.setAnimationLoop=function(a){l=a};this.dispose=
-function(){};this.getStandingMatrix=function(){console.warn("THREE.WebXRManager: getStandingMatrix() is no longer needed.");return new THREE.Matrix4};this.submitFrame=function(){}}function Zd(a){var b;function c(){ha=new Pf(F);ua=new Nf(F,ha,a);ua.isWebGL2||(ha.get("WEBGL_depth_texture"),ha.get("OES_texture_float"),ha.get("OES_texture_half_float"),ha.get("OES_texture_half_float_linear"),ha.get("OES_standard_derivatives"),ha.get("OES_element_index_uint"),ha.get("ANGLE_instanced_arrays"));ha.get("OES_texture_float_linear");
-da=new $e(F,ha,ua);ba=new Jg(F,ha,da,ua);ba.scissor(wc.copy(fa).multiplyScalar(U));ba.viewport(T.copy(od).multiplyScalar(U));ca=new Sf(F);Ba=new Ag;ia=new Kg(F,ha,ba,Ba,ua,da,ca);pa=new Ff(F);ra=new Qf(F,pa,ca);ma=new Vf(ra,ca);va=new Uf(F);la=new zg(C,ha,ua);sa=new Eg;na=new Ig;ka=new Lf(C,ba,ma,N);xa=new Mf(F,ha,ca,ua);ya=new Rf(F,ha,ca,ua);ca.programs=la.programs;C.context=F;C.capabilities=ua;C.extensions=ha;C.properties=Ba;C.renderLists=sa;C.state=ba;C.info=ca}function d(a){a.preventDefault();
-console.log("THREE.WebGLRenderer: Context Lost.");G=!0}function e(){console.log("THREE.WebGLRenderer: Context Restored.");G=!1;c()}function f(a){a=a.target;a.removeEventListener("dispose",f);g(a);Ba.remove(a)}function g(a){var b=Ba.get(a).program;a.program=void 0;void 0!==b&&la.releaseProgram(b)}function h(a,b){a.render(function(a){C.renderBufferImmediate(a,b)})}function k(a,b,c){if(!1!==a.visible){if(a.layers.test(b.layers))if(a.isLight)D.pushLight(a),a.castShadow&&D.pushShadow(a);else if(a.isSprite){if(!a.frustumCulled||
-oa.intersectsSprite(a)){c&&bb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(xc);var d=ma.update(a),e=a.material;A.push(a,d,e,bb.z,null)}}else if(a.isImmediateRenderObject)c&&bb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(xc),A.push(a,null,a.material,bb.z,null);else if(a.isMesh||a.isLine||a.isPoints)if(a.isSkinnedMesh&&a.skeleton.update(),!a.frustumCulled||oa.intersectsObject(a))if(c&&bb.setFromMatrixPosition(a.matrixWorld).applyMatrix4(xc),d=ma.update(a),e=a.material,Array.isArray(e))for(var f=
-d.groups,g=0,h=f.length;g<h;g++){var m=f[g],n=e[m.materialIndex];n&&n.visible&&A.push(a,d,n,bb.z,m)}else e.visible&&A.push(a,d,e,bb.z,null);a=a.children;g=0;for(h=a.length;g<h;g++)k(a[g],b,c)}}function m(a,b,c,d){for(var e=0,f=a.length;e<f;e++){var g=a[e],h=g.object,k=g.geometry,m=void 0===d?g.material:d;g=g.group;if(c.isArrayCamera){W=c;for(var n=c.cameras,t=0,u=n.length;t<u;t++){var l=n[t];if(h.layers.test(l.layers)){if("viewport"in l)ba.viewport(T.copy(l.viewport));else{var r=l.bounds;ba.viewport(T.set(r.x*
-Z,r.y*M,r.z*Z,r.w*M).multiplyScalar(U))}q(h,b,l,k,m,g)}}}else W=null,q(h,b,c,k,m,g)}}function q(a,c,d,e,f,g){a.onBeforeRender(C,c,d,e,f,g);D=na.get(c,W||d);a.modelViewMatrix.multiplyMatrices(d.matrixWorldInverse,a.matrixWorld);a.normalMatrix.getNormalMatrix(a.modelViewMatrix);if(a.isImmediateRenderObject){ba.setMaterial(f);var k=t(d,c.fog,f,a);S=b=null;nd=!1;h(a,k)}else C.renderBufferDirect(d,c.fog,e,f,a,g);a.onAfterRender(C,c,d,e,f,g);D=na.get(c,W||d)}function n(a,b,c){var d=Ba.get(a),e=D.state.lights,
-h=d.lightsHash,k=e.state.hash;c=la.getParameters(a,e.state,D.state.shadowsArray,b,aa.numPlanes,aa.numIntersection,c);var m=la.getProgramCode(a,c),n=d.program,q=!0;if(void 0===n)a.addEventListener("dispose",f);else if(n.code!==m)g(a);else{if(h.stateID!==k.stateID||h.directionalLength!==k.directionalLength||h.pointLength!==k.pointLength||h.spotLength!==k.spotLength||h.rectAreaLength!==k.rectAreaLength||h.hemiLength!==k.hemiLength||h.shadowsLength!==k.shadowsLength)h.stateID=k.stateID,h.directionalLength=
-k.directionalLength,h.pointLength=k.pointLength,h.spotLength=k.spotLength,h.rectAreaLength=k.rectAreaLength,h.hemiLength=k.hemiLength,h.shadowsLength=k.shadowsLength;else if(void 0!==c.shaderID)return;q=!1}q&&(c.shaderID?(m=nb[c.shaderID],d.shader={name:a.type,uniforms:Aa.clone(m.uniforms),vertexShader:m.vertexShader,fragmentShader:m.fragmentShader}):d.shader={name:a.type,uniforms:a.uniforms,vertexShader:a.vertexShader,fragmentShader:a.fragmentShader},a.onBeforeCompile(d.shader,C),m=la.getProgramCode(a,
-c),n=la.acquireProgram(a,d.shader,c,m),d.program=n,a.program=n);c=n.getAttributes();if(a.morphTargets)for(m=a.numSupportedMorphTargets=0;m<C.maxMorphTargets;m++)0<=c["morphTarget"+m]&&a.numSupportedMorphTargets++;if(a.morphNormals)for(m=a.numSupportedMorphNormals=0;m<C.maxMorphNormals;m++)0<=c["morphNormal"+m]&&a.numSupportedMorphNormals++;c=d.shader.uniforms;if(!a.isShaderMaterial&&!a.isRawShaderMaterial||!0===a.clipping)d.numClippingPlanes=aa.numPlanes,d.numIntersection=aa.numIntersection,c.clippingPlanes=
-aa.uniform;d.fog=b;void 0===h&&(d.lightsHash=h={});h.stateID=k.stateID;h.directionalLength=k.directionalLength;h.pointLength=k.pointLength;h.spotLength=k.spotLength;h.rectAreaLength=k.rectAreaLength;h.hemiLength=k.hemiLength;h.shadowsLength=k.shadowsLength;a.lights&&(c.ambientLightColor.value=e.state.ambient,c.directionalLights.value=e.state.directional,c.spotLights.value=e.state.spot,c.rectAreaLights.value=e.state.rectArea,c.pointLights.value=e.state.point,c.hemisphereLights.value=e.state.hemi,c.directionalShadowMap.value=
-e.state.directionalShadowMap,c.directionalShadowMatrix.value=e.state.directionalShadowMatrix,c.spotShadowMap.value=e.state.spotShadowMap,c.spotShadowMatrix.value=e.state.spotShadowMatrix,c.pointShadowMap.value=e.state.pointShadowMap,c.pointShadowMatrix.value=e.state.pointShadowMatrix);a=d.program.getUniforms();a=Za.seqWithValue(a.seq,c);d.uniformsList=a}function t(a,b,c,d){X=0;var e=Ba.get(c),f=e.lightsHash,g=D.state.lights.state.hash;pd&&(Yd||a!==Y)&&aa.setState(c.clippingPlanes,c.clipIntersection,
-c.clipShadows,a,e,a===Y&&c.id===J);!1===c.needsUpdate&&(void 0===e.program?c.needsUpdate=!0:c.fog&&e.fog!==b?c.needsUpdate=!0:!c.lights||f.stateID===g.stateID&&f.directionalLength===g.directionalLength&&f.pointLength===g.pointLength&&f.spotLength===g.spotLength&&f.rectAreaLength===g.rectAreaLength&&f.hemiLength===g.hemiLength&&f.shadowsLength===g.shadowsLength?void 0===e.numClippingPlanes||e.numClippingPlanes===aa.numPlanes&&e.numIntersection===aa.numIntersection||(c.needsUpdate=!0):c.needsUpdate=
-!0);c.needsUpdate&&(n(c,b,d),c.needsUpdate=!1);var h=!1,k=!1,m=!1;f=e.program;g=f.getUniforms();var q=e.shader.uniforms;ba.useProgram(f.program)&&(m=k=h=!0);c.id!==J&&(J=c.id,k=!0);if(h||a!==Y){g.setValue(F,"projectionMatrix",a.projectionMatrix);ua.logarithmicDepthBuffer&&g.setValue(F,"logDepthBufFC",2/(Math.log(a.far+1)/Math.LN2));Y!==(W||a)&&(Y=W||a,m=k=!0);if(c.isShaderMaterial||c.isMeshPhongMaterial||c.isMeshStandardMaterial||c.envMap)h=g.map.cameraPosition,void 0!==h&&h.setValue(F,bb.setFromMatrixPosition(a.matrixWorld));
-(c.isMeshPhongMaterial||c.isMeshLambertMaterial||c.isMeshBasicMaterial||c.isMeshStandardMaterial||c.isShaderMaterial||c.skinning)&&g.setValue(F,"viewMatrix",a.matrixWorldInverse)}if(c.skinning&&(g.setOptional(F,d,"bindMatrix"),g.setOptional(F,d,"bindMatrixInverse"),a=d.skeleton))if(h=a.bones,ua.floatVertexTextures){if(void 0===a.boneTexture){h=Math.sqrt(4*h.length);h=H.ceilPowerOfTwo(h);h=Math.max(h,4);var t=new Float32Array(h*h*4);t.set(a.boneMatrices);var v=new gb(t,h,h,1023,1015);v.needsUpdate=
-!0;a.boneMatrices=t;a.boneTexture=v;a.boneTextureSize=h}g.setValue(F,"boneTexture",a.boneTexture);g.setValue(F,"boneTextureSize",a.boneTextureSize)}else g.setOptional(F,a,"boneMatrices");k&&(g.setValue(F,"toneMappingExposure",C.toneMappingExposure),g.setValue(F,"toneMappingWhitePoint",C.toneMappingWhitePoint),c.lights&&(k=m,q.ambientLightColor.needsUpdate=k,q.directionalLights.needsUpdate=k,q.pointLights.needsUpdate=k,q.spotLights.needsUpdate=k,q.rectAreaLights.needsUpdate=k,q.hemisphereLights.needsUpdate=
-k),b&&c.fog&&(q.fogColor.value=b.color,b.isFog?(q.fogNear.value=b.near,q.fogFar.value=b.far):b.isFogExp2&&(q.fogDensity.value=b.density)),c.isMeshBasicMaterial?u(q,c):c.isMeshLambertMaterial?(u(q,c),c.emissiveMap&&(q.emissiveMap.value=c.emissiveMap)):c.isMeshPhongMaterial?(u(q,c),c.isMeshToonMaterial?(r(q,c),c.gradientMap&&(q.gradientMap.value=c.gradientMap)):r(q,c)):c.isMeshStandardMaterial?(u(q,c),c.isMeshPhysicalMaterial?(l(q,c),q.reflectivity.value=c.reflectivity,q.clearCoat.value=c.clearCoat,
-q.clearCoatRoughness.value=c.clearCoatRoughness):l(q,c)):c.isMeshDepthMaterial?(u(q,c),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias)):c.isMeshDistanceMaterial?(u(q,c),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias),q.referencePosition.value.copy(c.referencePosition),q.nearDistance.value=c.nearDistance,
-q.farDistance.value=c.farDistance):c.isMeshNormalMaterial?(u(q,c),c.bumpMap&&(q.bumpMap.value=c.bumpMap,q.bumpScale.value=c.bumpScale,1===c.side&&(q.bumpScale.value*=-1)),c.normalMap&&(q.normalMap.value=c.normalMap,q.normalScale.value.copy(c.normalScale),1===c.side&&q.normalScale.value.negate()),c.displacementMap&&(q.displacementMap.value=c.displacementMap,q.displacementScale.value=c.displacementScale,q.displacementBias.value=c.displacementBias)):c.isLineBasicMaterial?(q.diffuse.value=c.color,q.opacity.value=
-c.opacity,c.isLineDashedMaterial&&(q.dashSize.value=c.dashSize,q.totalSize.value=c.dashSize+c.gapSize,q.scale.value=c.scale)):c.isPointsMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.size.value=c.size*U,q.scale.value=.5*M,q.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&c.map.updateMatrix(),q.uvTransform.value.copy(c.map.matrix))):c.isSpriteMaterial?(q.diffuse.value=c.color,q.opacity.value=c.opacity,q.rotation.value=c.rotation,q.map.value=c.map,null!==c.map&&(!0===c.map.matrixAutoUpdate&&
-c.map.updateMatrix(),q.uvTransform.value.copy(c.map.matrix))):c.isShadowMaterial&&(q.color.value=c.color,q.opacity.value=c.opacity),void 0!==q.ltc_1&&(q.ltc_1.value=K.LTC_1),void 0!==q.ltc_2&&(q.ltc_2.value=K.LTC_2),Za.upload(F,e.uniformsList,q,C));c.isShaderMaterial&&!0===c.uniformsNeedUpdate&&(Za.upload(F,e.uniformsList,q,C),c.uniformsNeedUpdate=!1);c.isSpriteMaterial&&g.setValue(F,"center",d.center);g.setValue(F,"modelViewMatrix",d.modelViewMatrix);g.setValue(F,"normalMatrix",d.normalMatrix);g.setValue(F,
-"modelMatrix",d.matrixWorld);return f}function u(a,b){a.opacity.value=b.opacity;b.color&&(a.diffuse.value=b.color);b.emissive&&a.emissive.value.copy(b.emissive).multiplyScalar(b.emissiveIntensity);b.map&&(a.map.value=b.map);b.alphaMap&&(a.alphaMap.value=b.alphaMap);b.specularMap&&(a.specularMap.value=b.specularMap);b.envMap&&(a.envMap.value=b.envMap,a.flipEnvMap.value=b.envMap&&b.envMap.isCubeTexture?-1:1,a.reflectivity.value=b.reflectivity,a.refractionRatio.value=b.refractionRatio,a.maxMipLevel.value=
-Ba.get(b.envMap).__maxMipLevel);b.lightMap&&(a.lightMap.value=b.lightMap,a.lightMapIntensity.value=b.lightMapIntensity);b.aoMap&&(a.aoMap.value=b.aoMap,a.aoMapIntensity.value=b.aoMapIntensity);if(b.map)var c=b.map;else b.specularMap?c=b.specularMap:b.displacementMap?c=b.displacementMap:b.normalMap?c=b.normalMap:b.bumpMap?c=b.bumpMap:b.roughnessMap?c=b.roughnessMap:b.metalnessMap?c=b.metalnessMap:b.alphaMap?c=b.alphaMap:b.emissiveMap&&(c=b.emissiveMap);void 0!==c&&(c.isWebGLRenderTarget&&(c=c.texture),
-!0===c.matrixAutoUpdate&&c.updateMatrix(),a.uvTransform.value.copy(c.matrix))}function r(a,b){a.specular.value=b.specular;a.shininess.value=Math.max(b.shininess,1E-4);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale),1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,
-a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias)}function l(a,b){a.roughness.value=b.roughness;a.metalness.value=b.metalness;b.roughnessMap&&(a.roughnessMap.value=b.roughnessMap);b.metalnessMap&&(a.metalnessMap.value=b.metalnessMap);b.emissiveMap&&(a.emissiveMap.value=b.emissiveMap);b.bumpMap&&(a.bumpMap.value=b.bumpMap,a.bumpScale.value=b.bumpScale,1===b.side&&(a.bumpScale.value*=-1));b.normalMap&&(a.normalMap.value=b.normalMap,a.normalScale.value.copy(b.normalScale),
-1===b.side&&a.normalScale.value.negate());b.displacementMap&&(a.displacementMap.value=b.displacementMap,a.displacementScale.value=b.displacementScale,a.displacementBias.value=b.displacementBias);b.envMap&&(a.envMapIntensity.value=b.envMapIntensity)}console.log("THREE.WebGLRenderer","95");a=a||{};var y=void 0!==a.canvas?a.canvas:document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),x=void 0!==a.context?a.context:null,w=void 0!==a.alpha?a.alpha:!1,B=void 0!==a.depth?a.depth:!0,E=void 0!==
-a.stencil?a.stencil:!0,P=void 0!==a.antialias?a.antialias:!1,N=void 0!==a.premultipliedAlpha?a.premultipliedAlpha:!0,O=void 0!==a.preserveDrawingBuffer?a.preserveDrawingBuffer:!1,z=void 0!==a.powerPreference?a.powerPreference:"default",A=null,D=null;this.domElement=y;this.context=null;this.sortObjects=this.autoClearStencil=this.autoClearDepth=this.autoClearColor=this.autoClear=!0;this.clippingPlanes=[];this.localClippingEnabled=!1;this.gammaFactor=2;this.physicallyCorrectLights=this.gammaOutput=this.gammaInput=
-!1;this.toneMappingWhitePoint=this.toneMappingExposure=this.toneMapping=1;this.maxMorphTargets=8;this.maxMorphNormals=4;var C=this,G=!1,L=null,R=null,Q=null,J=-1;var S=b=null;var nd=!1;var Y=null,W=null,T=new V,wc=new V,ea=null,X=0,Z=y.width,M=y.height,U=1,od=new V(0,0,Z,M),fa=new V(0,0,Z,M),qa=!1,oa=new md,aa=new Of,pd=!1,Yd=!1,xc=new I,bb=new p;try{w={alpha:w,depth:B,stencil:E,antialias:P,premultipliedAlpha:N,preserveDrawingBuffer:O,powerPreference:z};y.addEventListener("webglcontextlost",d,!1);
-y.addEventListener("webglcontextrestored",e,!1);var F=x||y.getContext("webgl",w)||y.getContext("experimental-webgl",w);if(null===F){if(null!==y.getContext("webgl"))throw Error("Error creating WebGL context with your selected attributes.");throw Error("Error creating WebGL context.");}void 0===F.getShaderPrecisionFormat&&(F.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(Mg){console.error("THREE.WebGLRenderer: "+Mg.message)}var ha,ua,ba,ca,Ba,ia,pa,ra,ma,la,sa,
-na,ka,va,xa,ya,da;c();var ja="xr"in navigator?new Lg(C):new af(C);this.vr=ja;var za=new Ze(C,ma,ua.maxTextureSize);this.shadowMap=za;this.getContext=function(){return F};this.getContextAttributes=function(){return F.getContextAttributes()};this.forceContextLoss=function(){var a=ha.get("WEBGL_lose_context");a&&a.loseContext()};this.forceContextRestore=function(){var a=ha.get("WEBGL_lose_context");a&&a.restoreContext()};this.getPixelRatio=function(){return U};this.setPixelRatio=function(a){void 0!==
-a&&(U=a,this.setSize(Z,M,!1))};this.getSize=function(){return{width:Z,height:M}};this.setSize=function(a,b,c){ja.isPresenting()?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(Z=a,M=b,y.width=a*U,y.height=b*U,!1!==c&&(y.style.width=a+"px",y.style.height=b+"px"),this.setViewport(0,0,a,b))};this.getDrawingBufferSize=function(){return{width:Z*U,height:M*U}};this.setDrawingBufferSize=function(a,b,c){Z=a;M=b;U=c;y.width=a*c;y.height=b*c;this.setViewport(0,0,a,b)};
-this.getCurrentViewport=function(){return T};this.setViewport=function(a,b,c,d){od.set(a,M-b-d,c,d);ba.viewport(T.copy(od).multiplyScalar(U))};this.setScissor=function(a,b,c,d){fa.set(a,M-b-d,c,d);ba.scissor(wc.copy(fa).multiplyScalar(U))};this.setScissorTest=function(a){ba.setScissorTest(qa=a)};this.getClearColor=function(){return ka.getClearColor()};this.setClearColor=function(){ka.setClearColor.apply(ka,arguments)};this.getClearAlpha=function(){return ka.getClearAlpha()};this.setClearAlpha=function(){ka.setClearAlpha.apply(ka,
-arguments)};this.clear=function(a,b,c){var d=0;if(void 0===a||a)d|=F.COLOR_BUFFER_BIT;if(void 0===b||b)d|=F.DEPTH_BUFFER_BIT;if(void 0===c||c)d|=F.STENCIL_BUFFER_BIT;F.clear(d)};this.clearColor=function(){this.clear(!0,!1,!1)};this.clearDepth=function(){this.clear(!1,!0,!1)};this.clearStencil=function(){this.clear(!1,!1,!0)};this.clearTarget=function(a,b,c,d){this.setRenderTarget(a);this.clear(b,c,d)};this.dispose=function(){y.removeEventListener("webglcontextlost",d,!1);y.removeEventListener("webglcontextrestored",
-e,!1);sa.dispose();na.dispose();Ba.dispose();ma.dispose();ja.dispose();ta.stop()};this.renderBufferImmediate=function(a,b){ba.initAttributes();var c=Ba.get(a);a.hasPositions&&!c.position&&(c.position=F.createBuffer());a.hasNormals&&!c.normal&&(c.normal=F.createBuffer());a.hasUvs&&!c.uv&&(c.uv=F.createBuffer());a.hasColors&&!c.color&&(c.color=F.createBuffer());b=b.getAttributes();a.hasPositions&&(F.bindBuffer(F.ARRAY_BUFFER,c.position),F.bufferData(F.ARRAY_BUFFER,a.positionArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.position),
-F.vertexAttribPointer(b.position,3,F.FLOAT,!1,0,0));a.hasNormals&&(F.bindBuffer(F.ARRAY_BUFFER,c.normal),F.bufferData(F.ARRAY_BUFFER,a.normalArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.normal),F.vertexAttribPointer(b.normal,3,F.FLOAT,!1,0,0));a.hasUvs&&(F.bindBuffer(F.ARRAY_BUFFER,c.uv),F.bufferData(F.ARRAY_BUFFER,a.uvArray,F.DYNAMIC_DRAW),ba.enableAttribute(b.uv),F.vertexAttribPointer(b.uv,2,F.FLOAT,!1,0,0));a.hasColors&&(F.bindBuffer(F.ARRAY_BUFFER,c.color),F.bufferData(F.ARRAY_BUFFER,a.colorArray,
-F.DYNAMIC_DRAW),ba.enableAttribute(b.color),F.vertexAttribPointer(b.color,3,F.FLOAT,!1,0,0));ba.disableUnusedAttributes();F.drawArrays(F.TRIANGLES,0,a.count);a.count=0};this.renderBufferDirect=function(a,c,d,e,f,g){var h=f.isMesh&&0>f.normalMatrix.determinant();ba.setMaterial(e,h);var k=t(a,c,e,f),m=!1;if(b!==d.id||S!==k.id||nd!==(!0===e.wireframe))b=d.id,S=k.id,nd=!0===e.wireframe,m=!0;f.morphTargetInfluences&&(va.update(f,d,e,k),m=!0);h=d.index;var q=d.attributes.position;c=1;!0===e.wireframe&&
-(h=ra.getWireframeAttribute(d),c=2);a=xa;if(null!==h){var n=pa.get(h);a=ya;a.setIndex(n)}if(m){if(d&&d.isInstancedBufferGeometry&!ua.isWebGL2&&null===ha.get("ANGLE_instanced_arrays"))console.error("THREE.WebGLRenderer.setupVertexAttributes: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");else{ba.initAttributes();m=d.attributes;k=k.getAttributes();var u=e.defaultAttributeValues;for(N in k){var l=k[N];if(0<=l){var r=m[N];if(void 0!==r){var v=r.normalized,
-p=r.itemSize,w=pa.get(r);if(void 0!==w){var y=w.buffer,E=w.type;w=w.bytesPerElement;if(r.isInterleavedBufferAttribute){var x=r.data,B=x.stride;r=r.offset;x&&x.isInstancedInterleavedBuffer?(ba.enableAttributeAndDivisor(l,x.meshPerAttribute),void 0===d.maxInstancedCount&&(d.maxInstancedCount=x.meshPerAttribute*x.count)):ba.enableAttribute(l);F.bindBuffer(F.ARRAY_BUFFER,y);F.vertexAttribPointer(l,p,E,v,B*w,r*w)}else r.isInstancedBufferAttribute?(ba.enableAttributeAndDivisor(l,r.meshPerAttribute),void 0===
-d.maxInstancedCount&&(d.maxInstancedCount=r.meshPerAttribute*r.count)):ba.enableAttribute(l),F.bindBuffer(F.ARRAY_BUFFER,y),F.vertexAttribPointer(l,p,E,v,0,0)}}else if(void 0!==u&&(v=u[N],void 0!==v))switch(v.length){case 2:F.vertexAttrib2fv(l,v);break;case 3:F.vertexAttrib3fv(l,v);break;case 4:F.vertexAttrib4fv(l,v);break;default:F.vertexAttrib1fv(l,v)}}}ba.disableUnusedAttributes()}null!==h&&F.bindBuffer(F.ELEMENT_ARRAY_BUFFER,n.buffer)}n=Infinity;null!==h?n=h.count:void 0!==q&&(n=q.count);h=d.drawRange.start*
-c;q=null!==g?g.start*c:0;var N=Math.max(h,q);g=Math.max(0,Math.min(n,h+d.drawRange.count*c,q+(null!==g?g.count*c:Infinity))-1-N+1);if(0!==g){if(f.isMesh)if(!0===e.wireframe)ba.setLineWidth(e.wireframeLinewidth*(null===R?U:1)),a.setMode(F.LINES);else switch(f.drawMode){case 0:a.setMode(F.TRIANGLES);break;case 1:a.setMode(F.TRIANGLE_STRIP);break;case 2:a.setMode(F.TRIANGLE_FAN)}else f.isLine?(e=e.linewidth,void 0===e&&(e=1),ba.setLineWidth(e*(null===R?U:1)),f.isLineSegments?a.setMode(F.LINES):f.isLineLoop?
-a.setMode(F.LINE_LOOP):a.setMode(F.LINE_STRIP)):f.isPoints?a.setMode(F.POINTS):f.isSprite&&a.setMode(F.TRIANGLES);d&&d.isInstancedBufferGeometry?0<d.maxInstancedCount&&a.renderInstances(d,N,g):a.render(N,g)}};this.compile=function(a,b){D=na.get(a,b);D.init();a.traverse(function(a){a.isLight&&(D.pushLight(a),a.castShadow&&D.pushShadow(a))});D.setupLights(b);a.traverse(function(b){if(b.material)if(Array.isArray(b.material))for(var c=0;c<b.material.length;c++)n(b.material[c],a.fog,b);else n(b.material,
-a.fog,b)})};var wa=null,ta=new Qd;ta.setAnimationLoop(function(a){ja.isPresenting()||wa&&wa(a)});"undefined"!==typeof window&&ta.setContext(window);this.setAnimationLoop=function(a){wa=a;ja.setAnimationLoop(a);ta.start()};this.render=function(a,c,d,e){if(!c||!c.isCamera)console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");else if(!G){S=b=null;nd=!1;J=-1;Y=null;!0===a.autoUpdate&&a.updateMatrixWorld();null===c.parent&&c.updateMatrixWorld();ja.enabled&&(c=ja.getCamera(c));
-D=na.get(a,c);D.init();a.onBeforeRender(C,a,c,d);xc.multiplyMatrices(c.projectionMatrix,c.matrixWorldInverse);oa.setFromMatrix(xc);Yd=this.localClippingEnabled;pd=aa.init(this.clippingPlanes,Yd,c);A=sa.get(a,c);A.init();k(a,c,C.sortObjects);!0===C.sortObjects&&A.sort();pd&&aa.beginShadows();za.render(D.state.shadowsArray,a,c);D.setupLights(c);pd&&aa.endShadows();this.info.autoReset&&this.info.reset();void 0===d&&(d=null);this.setRenderTarget(d);ka.render(A,a,c,e);e=A.opaque;var f=A.transparent;if(a.overrideMaterial){var g=
-a.overrideMaterial;e.length&&m(e,a,c,g);f.length&&m(f,a,c,g)}else e.length&&m(e,a,c),f.length&&m(f,a,c);d&&ia.updateRenderTargetMipmap(d);ba.buffers.depth.setTest(!0);ba.buffers.depth.setMask(!0);ba.buffers.color.setMask(!0);ba.setPolygonOffset(!1);a.onAfterRender(C,a,c);ja.enabled&&ja.submitFrame();D=A=null}};this.allocTextureUnit=function(){var a=X;a>=ua.maxTextures&&console.warn("THREE.WebGLRenderer: Trying to use "+a+" texture units while this GPU supports only "+ua.maxTextures);X+=1;return a};
-this.setTexture2D=function(){var a=!1;return function(b,c){b&&b.isWebGLRenderTarget&&(a||(console.warn("THREE.WebGLRenderer.setTexture2D: don't use render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);ia.setTexture2D(b,c)}}();this.setTexture=function(){var a=!1;return function(b,c){a||(console.warn("THREE.WebGLRenderer: .setTexture is deprecated, use setTexture2D instead."),a=!0);ia.setTexture2D(b,c)}}();this.setTextureCube=function(){var a=!1;return function(b,c){b&&
-b.isWebGLRenderTargetCube&&(a||(console.warn("THREE.WebGLRenderer.setTextureCube: don't use cube render targets as textures. Use their .texture property instead."),a=!0),b=b.texture);b&&b.isCubeTexture||Array.isArray(b.image)&&6===b.image.length?ia.setTextureCube(b,c):ia.setTextureCubeDynamic(b,c)}}();this.setFramebuffer=function(a){L=a};this.getRenderTarget=function(){return R};this.setRenderTarget=function(a){(R=a)&&void 0===Ba.get(a).__webglFramebuffer&&ia.setupRenderTarget(a);var b=L,c=!1;a?(b=
-Ba.get(a).__webglFramebuffer,a.isWebGLRenderTargetCube&&(b=b[a.activeCubeFace],c=!0),T.copy(a.viewport),wc.copy(a.scissor),ea=a.scissorTest):(T.copy(od).multiplyScalar(U),wc.copy(fa).multiplyScalar(U),ea=qa);Q!==b&&(F.bindFramebuffer(F.FRAMEBUFFER,b),Q=b);ba.viewport(T);ba.scissor(wc);ba.setScissorTest(ea);c&&(c=Ba.get(a.texture),F.framebufferTexture2D(F.FRAMEBUFFER,F.COLOR_ATTACHMENT0,F.TEXTURE_CUBE_MAP_POSITIVE_X+a.activeCubeFace,c.__webglTexture,a.activeMipMapLevel))};this.readRenderTargetPixels=
-function(a,b,c,d,e,f){if(a&&a.isWebGLRenderTarget){var g=Ba.get(a).__webglFramebuffer;if(g){var h=!1;g!==Q&&(F.bindFramebuffer(F.FRAMEBUFFER,g),h=!0);try{var k=a.texture,m=k.format,q=k.type;1023!==m&&da.convert(m)!==F.getParameter(F.IMPLEMENTATION_COLOR_READ_FORMAT)?console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format."):1009===q||da.convert(q)===F.getParameter(F.IMPLEMENTATION_COLOR_READ_TYPE)||1015===q&&(ua.isWebGL2||ha.get("OES_texture_float")||
-ha.get("WEBGL_color_buffer_float"))||1016===q&&(ua.isWebGL2?ha.get("EXT_color_buffer_float"):ha.get("EXT_color_buffer_half_float"))?F.checkFramebufferStatus(F.FRAMEBUFFER)===F.FRAMEBUFFER_COMPLETE?0<=b&&b<=a.width-d&&0<=c&&c<=a.height-e&&F.readPixels(b,c,d,e,da.convert(m),da.convert(q),f):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete."):console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.")}finally{h&&
-F.bindFramebuffer(F.FRAMEBUFFER,Q)}}}else console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.")};this.copyFramebufferToTexture=function(a,b,c){var d=b.image.width,e=b.image.height,f=da.convert(b.format);this.setTexture2D(b,0);F.copyTexImage2D(F.TEXTURE_2D,c||0,f,a.x,a.y,d,e,0)};this.copyTextureToTexture=function(a,b,c,d){var e=b.image.width,f=b.image.height,g=da.convert(c.format),h=da.convert(c.type);this.setTexture2D(c,0);b.isDataTexture?F.texSubImage2D(F.TEXTURE_2D,
-d||0,a.x,a.y,e,f,g,h,b.image.data):F.texSubImage2D(F.TEXTURE_2D,d||0,a.x,a.y,g,h,b.image)}}function Lb(a,b){this.name="";this.color=new G(a);this.density=void 0!==b?b:2.5E-4}function Mb(a,b,c){this.name="";this.color=new G(a);this.near=void 0!==b?b:1;this.far=void 0!==c?c:1E3}function qd(){D.call(this);this.type="Scene";this.overrideMaterial=this.fog=this.background=null;this.autoUpdate=!0}function ob(a,b){this.array=a;this.stride=b;this.count=void 0!==a?a.length/b:0;this.dynamic=!1;this.updateRange=
-{offset:0,count:-1};this.version=0}function zc(a,b,c,d){this.data=a;this.itemSize=b;this.offset=c;this.normalized=!0===d}function cb(a){J.call(this);this.type="SpriteMaterial";this.color=new G(16777215);this.map=null;this.rotation=0;this.lights=!1;this.transparent=!0;this.setValues(a)}function Ac(a){D.call(this);this.type="Sprite";if(void 0===Nb){Nb=new C;var b=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]);b=new ob(b,5);Nb.setIndex([0,1,2,0,2,3]);Nb.addAttribute("position",
-new zc(b,3,0,!1));Nb.addAttribute("uv",new zc(b,2,3,!1))}this.geometry=Nb;this.material=void 0!==a?a:new cb;this.center=new z(.5,.5)}function Bc(){D.call(this);this.type="LOD";Object.defineProperties(this,{levels:{enumerable:!0,value:[]}})}function Cc(a,b){a=a||[];this.bones=a.slice(0);this.boneMatrices=new Float32Array(16*this.bones.length);if(void 0===b)this.calculateInverses();else if(this.bones.length===b.length)this.boneInverses=b.slice(0);else for(console.warn("THREE.Skeleton boneInverses is the wrong length."),
-this.boneInverses=[],a=0,b=this.bones.length;a<b;a++)this.boneInverses.push(new I)}function rd(){D.call(this);this.type="Bone"}function sd(a,b){la.call(this,a,b);this.type="SkinnedMesh";this.bindMode="attached";this.bindMatrix=new I;this.bindMatrixInverse=new I;a=this.initBones();a=new Cc(a);this.bind(a,this.matrixWorld);this.normalizeSkinWeights()}function Y(a){J.call(this);this.type="LineBasicMaterial";this.color=new G(16777215);this.linewidth=1;this.linejoin=this.linecap="round";this.lights=!1;
-this.setValues(a)}function sa(a,b,c){1===c&&console.error("THREE.Line: parameter THREE.LinePieces no longer supported. Use THREE.LineSegments instead.");D.call(this);this.type="Line";this.geometry=void 0!==a?a:new C;this.material=void 0!==b?b:new Y({color:16777215*Math.random()})}function W(a,b){sa.call(this,a,b);this.type="LineSegments"}function td(a,b){sa.call(this,a,b);this.type="LineLoop"}function Ea(a){J.call(this);this.type="PointsMaterial";this.color=new G(16777215);this.map=null;this.size=
-1;this.sizeAttenuation=!0;this.lights=this.morphTargets=!1;this.setValues(a)}function Ob(a,b){D.call(this);this.type="Points";this.geometry=void 0!==a?a:new C;this.material=void 0!==b?b:new Ea({color:16777215*Math.random()})}function $d(a,b,c,d,e,f,g,h,k){T.call(this,a,b,c,d,e,f,g,h,k);this.generateMipmaps=!1}function Pb(a,b,c,d,e,f,g,h,k,m,q,n){T.call(this,null,f,g,h,k,m,d,e,q,n);this.image={width:b,height:c};this.mipmaps=a;this.generateMipmaps=this.flipY=!1}function Dc(a,b,c,d,e,f,g,h,k){T.call(this,
-a,b,c,d,e,f,g,h,k);this.needsUpdate=!0}function Ec(a,b,c,d,e,f,g,h,k,m){m=void 0!==m?m:1026;if(1026!==m&&1027!==m)throw Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===c&&1026===m&&(c=1012);void 0===c&&1027===m&&(c=1020);T.call(this,null,d,e,f,g,h,m,c,k);this.image={width:a,height:b};this.magFilter=void 0!==g?g:1003;this.minFilter=void 0!==h?h:1003;this.generateMipmaps=this.flipY=!1}function Qb(a){C.call(this);this.type="WireframeGeometry";var b=
-[],c,d,e,f=[0,0],g={},h=["a","b","c"];if(a&&a.isGeometry){var k=a.faces;var m=0;for(d=k.length;m<d;m++){var q=k[m];for(c=0;3>c;c++){var n=q[h[c]];var t=q[h[(c+1)%3]];f[0]=Math.min(n,t);f[1]=Math.max(n,t);n=f[0]+","+f[1];void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]})}}for(n in g)m=g[n],h=a.vertices[m.index1],b.push(h.x,h.y,h.z),h=a.vertices[m.index2],b.push(h.x,h.y,h.z)}else if(a&&a.isBufferGeometry)if(h=new p,null!==a.index){k=a.attributes.position;q=a.index;var u=a.groups;0===u.length&&(u=[{start:0,
-count:q.count,materialIndex:0}]);a=0;for(e=u.length;a<e;++a)for(m=u[a],c=m.start,d=m.count,m=c,d=c+d;m<d;m+=3)for(c=0;3>c;c++)n=q.getX(m+c),t=q.getX(m+(c+1)%3),f[0]=Math.min(n,t),f[1]=Math.max(n,t),n=f[0]+","+f[1],void 0===g[n]&&(g[n]={index1:f[0],index2:f[1]});for(n in g)m=g[n],h.fromBufferAttribute(k,m.index1),b.push(h.x,h.y,h.z),h.fromBufferAttribute(k,m.index2),b.push(h.x,h.y,h.z)}else for(k=a.attributes.position,m=0,d=k.count/3;m<d;m++)for(c=0;3>c;c++)g=3*m+c,h.fromBufferAttribute(k,g),b.push(h.x,
-h.y,h.z),g=3*m+(c+1)%3,h.fromBufferAttribute(k,g),b.push(h.x,h.y,h.z);this.addAttribute("position",new A(b,3))}function Fc(a,b,c){R.call(this);this.type="ParametricGeometry";this.parameters={func:a,slices:b,stacks:c};this.fromBufferGeometry(new Rb(a,b,c));this.mergeVertices()}function Rb(a,b,c){C.call(this);this.type="ParametricBufferGeometry";this.parameters={func:a,slices:b,stacks:c};var d=[],e=[],f=[],g=[],h=new p,k=new p,m=new p,q=new p,n=new p,t,u;3>a.length&&console.error("THREE.ParametricGeometry: Function must now modify a Vector3 as third parameter.");
-var r=b+1;for(t=0;t<=c;t++){var l=t/c;for(u=0;u<=b;u++){var y=u/b;a(y,l,k);e.push(k.x,k.y,k.z);0<=y-1E-5?(a(y-1E-5,l,m),q.subVectors(k,m)):(a(y+1E-5,l,m),q.subVectors(m,k));0<=l-1E-5?(a(y,l-1E-5,m),n.subVectors(k,m)):(a(y,l+1E-5,m),n.subVectors(m,k));h.crossVectors(q,n).normalize();f.push(h.x,h.y,h.z);g.push(y,l)}}for(t=0;t<c;t++)for(u=0;u<b;u++)a=t*r+u+1,h=(t+1)*r+u+1,k=(t+1)*r+u,d.push(t*r+u,a,k),d.push(a,h,k);this.setIndex(d);this.addAttribute("position",new A(e,3));this.addAttribute("normal",
-new A(f,3));this.addAttribute("uv",new A(g,2))}function Gc(a,b,c,d){R.call(this);this.type="PolyhedronGeometry";this.parameters={vertices:a,indices:b,radius:c,detail:d};this.fromBufferGeometry(new na(a,b,c,d));this.mergeVertices()}function na(a,b,c,d){function e(a){h.push(a.x,a.y,a.z)}function f(b,c){b*=3;c.x=a[b+0];c.y=a[b+1];c.z=a[b+2]}function g(a,b,c,d){0>d&&1===a.x&&(k[b]=a.x-1);0===c.x&&0===c.z&&(k[b]=d/2/Math.PI+.5)}C.call(this);this.type="PolyhedronBufferGeometry";this.parameters={vertices:a,
-indices:b,radius:c,detail:d};c=c||1;d=d||0;var h=[],k=[];(function(a){for(var c=new p,d=new p,g=new p,h=0;h<b.length;h+=3){f(b[h+0],c);f(b[h+1],d);f(b[h+2],g);var k,m,l=c,x=d,w=g,B=Math.pow(2,a),E=[];for(m=0;m<=B;m++){E[m]=[];var P=l.clone().lerp(w,m/B),N=x.clone().lerp(w,m/B),O=B-m;for(k=0;k<=O;k++)E[m][k]=0===k&&m===B?P:P.clone().lerp(N,k/O)}for(m=0;m<B;m++)for(k=0;k<2*(B-m)-1;k++)l=Math.floor(k/2),0===k%2?(e(E[m][l+1]),e(E[m+1][l]),e(E[m][l])):(e(E[m][l+1]),e(E[m+1][l+1]),e(E[m+1][l]))}})(d);(function(a){for(var b=
-new p,c=0;c<h.length;c+=3)b.x=h[c+0],b.y=h[c+1],b.z=h[c+2],b.normalize().multiplyScalar(a),h[c+0]=b.x,h[c+1]=b.y,h[c+2]=b.z})(c);(function(){for(var a=new p,b=0;b<h.length;b+=3)a.x=h[b+0],a.y=h[b+1],a.z=h[b+2],k.push(Math.atan2(a.z,-a.x)/2/Math.PI+.5,1-(Math.atan2(-a.y,Math.sqrt(a.x*a.x+a.z*a.z))/Math.PI+.5));a=new p;b=new p;for(var c=new p,d=new p,e=new z,f=new z,l=new z,y=0,x=0;y<h.length;y+=9,x+=6){a.set(h[y+0],h[y+1],h[y+2]);b.set(h[y+3],h[y+4],h[y+5]);c.set(h[y+6],h[y+7],h[y+8]);e.set(k[x+0],
-k[x+1]);f.set(k[x+2],k[x+3]);l.set(k[x+4],k[x+5]);d.copy(a).add(b).add(c).divideScalar(3);var w=Math.atan2(d.z,-d.x);g(e,x+0,a,w);g(f,x+2,b,w);g(l,x+4,c,w)}for(a=0;a<k.length;a+=6)b=k[a+0],c=k[a+2],d=k[a+4],e=Math.min(b,c,d),.9<Math.max(b,c,d)&&.1>e&&(.2>b&&(k[a+0]+=1),.2>c&&(k[a+2]+=1),.2>d&&(k[a+4]+=1))})();this.addAttribute("position",new A(h,3));this.addAttribute("normal",new A(h.slice(),3));this.addAttribute("uv",new A(k,2));0===d?this.computeVertexNormals():this.normalizeNormals()}function Hc(a,
-b){R.call(this);this.type="TetrahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Sb(a,b));this.mergeVertices()}function Sb(a,b){na.call(this,[1,1,1,-1,-1,1,-1,1,-1,1,-1,-1],[2,1,0,0,3,2,1,3,0,2,3,1],a,b);this.type="TetrahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Ic(a,b){R.call(this);this.type="OctahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new pb(a,b));this.mergeVertices()}function pb(a,b){na.call(this,[1,0,0,
--1,0,0,0,1,0,0,-1,0,0,0,1,0,0,-1],[0,2,4,0,4,3,0,3,5,0,5,2,1,2,5,1,5,3,1,3,4,1,4,2],a,b);this.type="OctahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Jc(a,b){R.call(this);this.type="IcosahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Tb(a,b));this.mergeVertices()}function Tb(a,b){var c=(1+Math.sqrt(5))/2;na.call(this,[-1,c,0,1,c,0,-1,-c,0,1,-c,0,0,-1,c,0,1,c,0,-1,-c,0,1,-c,c,0,-1,c,0,1,-c,0,-1,-c,0,1],[0,11,5,0,5,1,0,1,7,0,7,10,0,10,11,1,5,9,5,
-11,4,11,10,2,10,7,6,7,1,8,3,9,4,3,4,2,3,2,6,3,6,8,3,8,9,4,9,5,2,4,11,6,2,10,8,6,7,9,8,1],a,b);this.type="IcosahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Kc(a,b){R.call(this);this.type="DodecahedronGeometry";this.parameters={radius:a,detail:b};this.fromBufferGeometry(new Ub(a,b));this.mergeVertices()}function Ub(a,b){var c=(1+Math.sqrt(5))/2,d=1/c;na.call(this,[-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1,0,-d,-c,0,-d,c,0,d,-c,0,d,c,-d,-c,0,-d,c,0,d,-c,0,d,c,
-0,-c,0,-d,c,0,-d,-c,0,d,c,0,d],[3,11,7,3,7,15,3,15,13,7,19,17,7,17,6,7,6,15,17,4,8,17,8,10,17,10,6,8,0,16,8,16,2,8,2,10,0,12,1,0,1,18,0,18,16,6,10,2,6,2,13,6,13,15,2,16,18,2,18,3,2,3,13,18,1,9,18,9,11,18,11,3,4,14,12,4,12,0,4,0,8,11,9,5,11,5,19,11,19,7,19,5,14,19,14,4,19,4,17,1,12,14,1,14,5,1,5,9],a,b);this.type="DodecahedronBufferGeometry";this.parameters={radius:a,detail:b}}function Lc(a,b,c,d,e,f){R.call(this);this.type="TubeGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,
-closed:e};void 0!==f&&console.warn("THREE.TubeGeometry: taper has been removed.");a=new Vb(a,b,c,d,e);this.tangents=a.tangents;this.normals=a.normals;this.binormals=a.binormals;this.fromBufferGeometry(a);this.mergeVertices()}function Vb(a,b,c,d,e){function f(e){q=a.getPointAt(e/b,q);var f=g.normals[e];e=g.binormals[e];for(t=0;t<=d;t++){var m=t/d*Math.PI*2,n=Math.sin(m);m=-Math.cos(m);k.x=m*f.x+n*e.x;k.y=m*f.y+n*e.y;k.z=m*f.z+n*e.z;k.normalize();r.push(k.x,k.y,k.z);h.x=q.x+c*k.x;h.y=q.y+c*k.y;h.z=
-q.z+c*k.z;l.push(h.x,h.y,h.z)}}C.call(this);this.type="TubeBufferGeometry";this.parameters={path:a,tubularSegments:b,radius:c,radialSegments:d,closed:e};b=b||64;c=c||1;d=d||8;e=e||!1;var g=a.computeFrenetFrames(b,e);this.tangents=g.tangents;this.normals=g.normals;this.binormals=g.binormals;var h=new p,k=new p,m=new z,q=new p,n,t,l=[],r=[],v=[],y=[];for(n=0;n<b;n++)f(n);f(!1===e?b:0);for(n=0;n<=b;n++)for(t=0;t<=d;t++)m.x=n/b,m.y=t/d,v.push(m.x,m.y);(function(){for(t=1;t<=b;t++)for(n=1;n<=d;n++){var a=
-(d+1)*t+(n-1),c=(d+1)*t+n,e=(d+1)*(t-1)+n;y.push((d+1)*(t-1)+(n-1),a,e);y.push(a,c,e)}})();this.setIndex(y);this.addAttribute("position",new A(l,3));this.addAttribute("normal",new A(r,3));this.addAttribute("uv",new A(v,2))}function Mc(a,b,c,d,e,f,g){R.call(this);this.type="TorusKnotGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};void 0!==g&&console.warn("THREE.TorusKnotGeometry: heightScale has been deprecated. Use .scale( x, y, z ) instead.");this.fromBufferGeometry(new Wb(a,
-b,c,d,e,f));this.mergeVertices()}function Wb(a,b,c,d,e,f){function g(a,b,c,d,e){var f=Math.sin(a);b=c/b*a;c=Math.cos(b);e.x=d*(2+c)*.5*Math.cos(a);e.y=d*(2+c)*f*.5;e.z=d*Math.sin(b)*.5}C.call(this);this.type="TorusKnotBufferGeometry";this.parameters={radius:a,tube:b,tubularSegments:c,radialSegments:d,p:e,q:f};a=a||1;b=b||.4;c=Math.floor(c)||64;d=Math.floor(d)||8;e=e||2;f=f||3;var h=[],k=[],m=[],q=[],n,t=new p,l=new p,r=new p,v=new p,y=new p,x=new p,w=new p;for(n=0;n<=c;++n){var B=n/c*e*Math.PI*2;
-g(B,e,f,a,r);g(B+.01,e,f,a,v);x.subVectors(v,r);w.addVectors(v,r);y.crossVectors(x,w);w.crossVectors(y,x);y.normalize();w.normalize();for(B=0;B<=d;++B){var E=B/d*Math.PI*2,P=-b*Math.cos(E);E=b*Math.sin(E);t.x=r.x+(P*w.x+E*y.x);t.y=r.y+(P*w.y+E*y.y);t.z=r.z+(P*w.z+E*y.z);k.push(t.x,t.y,t.z);l.subVectors(t,r).normalize();m.push(l.x,l.y,l.z);q.push(n/c);q.push(B/d)}}for(B=1;B<=c;B++)for(n=1;n<=d;n++)a=(d+1)*B+(n-1),b=(d+1)*B+n,e=(d+1)*(B-1)+n,h.push((d+1)*(B-1)+(n-1),a,e),h.push(a,b,e);this.setIndex(h);
-this.addAttribute("position",new A(k,3));this.addAttribute("normal",new A(m,3));this.addAttribute("uv",new A(q,2))}function Nc(a,b,c,d,e){R.call(this);this.type="TorusGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};this.fromBufferGeometry(new Xb(a,b,c,d,e));this.mergeVertices()}function Xb(a,b,c,d,e){C.call(this);this.type="TorusBufferGeometry";this.parameters={radius:a,tube:b,radialSegments:c,tubularSegments:d,arc:e};a=a||1;b=b||.4;c=Math.floor(c)||8;d=Math.floor(d)||
-6;e=e||2*Math.PI;var f=[],g=[],h=[],k=[],m=new p,q=new p,n=new p,t,l;for(t=0;t<=c;t++)for(l=0;l<=d;l++){var r=l/d*e,v=t/c*Math.PI*2;q.x=(a+b*Math.cos(v))*Math.cos(r);q.y=(a+b*Math.cos(v))*Math.sin(r);q.z=b*Math.sin(v);g.push(q.x,q.y,q.z);m.x=a*Math.cos(r);m.y=a*Math.sin(r);n.subVectors(q,m).normalize();h.push(n.x,n.y,n.z);k.push(l/d);k.push(t/c)}for(t=1;t<=c;t++)for(l=1;l<=d;l++)a=(d+1)*(t-1)+l-1,b=(d+1)*(t-1)+l,e=(d+1)*t+l,f.push((d+1)*t+l-1,a,e),f.push(a,b,e);this.setIndex(f);this.addAttribute("position",
-new A(g,3));this.addAttribute("normal",new A(h,3));this.addAttribute("uv",new A(k,2))}function bf(a,b,c,d,e){for(var f,g=0,h=b,k=c-d;h<c;h+=d)g+=(a[k]-a[h])*(a[h+1]+a[k+1]),k=h;if(e===0<g)for(e=b;e<c;e+=d)f=cf(e,a[e],a[e+1],f);else for(e=c-d;e>=b;e-=d)f=cf(e,a[e],a[e+1],f);f&&qb(f,f.next)&&(Oc(f),f=f.next);return f}function Pc(a,b){if(!a)return a;b||(b=a);do{var c=!1;if(a.steiner||!qb(a,a.next)&&0!==ma(a.prev,a,a.next))a=a.next;else{Oc(a);a=b=a.prev;if(a===a.next)break;c=!0}}while(c||a!==b);return b}
-function Qc(a,b,c,d,e,f,g){if(a){if(!g&&f){var h=a,k=h;do null===k.z&&(k.z=ae(k.x,k.y,d,e,f)),k.prevZ=k.prev,k=k.nextZ=k.next;while(k!==h);k.prevZ.nextZ=null;k.prevZ=null;h=k;var m,q,n,t,l=1;do{k=h;var r=h=null;for(q=0;k;){q++;var v=k;for(m=n=0;m<l&&(n++,v=v.nextZ,v);m++);for(t=l;0<n||0<t&&v;)0!==n&&(0===t||!v||k.z<=v.z)?(m=k,k=k.nextZ,n--):(m=v,v=v.nextZ,t--),r?r.nextZ=m:h=m,m.prevZ=r,r=m;k=v}r.nextZ=null;l*=2}while(1<q)}for(h=a;a.prev!==a.next;){k=a.prev;v=a.next;if(f)a:{r=a;t=d;var p=e,x=f;q=r.prev;
-n=r;l=r.next;if(0<=ma(q,n,l))r=!1;else{var w=q.x>n.x?q.x>l.x?q.x:l.x:n.x>l.x?n.x:l.x,B=q.y>n.y?q.y>l.y?q.y:l.y:n.y>l.y?n.y:l.y;m=ae(q.x<n.x?q.x<l.x?q.x:l.x:n.x<l.x?n.x:l.x,q.y<n.y?q.y<l.y?q.y:l.y:n.y<l.y?n.y:l.y,t,p,x);t=ae(w,B,t,p,x);for(p=r.nextZ;p&&p.z<=t;){if(p!==r.prev&&p!==r.next&&ud(q.x,q.y,n.x,n.y,l.x,l.y,p.x,p.y)&&0<=ma(p.prev,p,p.next)){r=!1;break a}p=p.nextZ}for(p=r.prevZ;p&&p.z>=m;){if(p!==r.prev&&p!==r.next&&ud(q.x,q.y,n.x,n.y,l.x,l.y,p.x,p.y)&&0<=ma(p.prev,p,p.next)){r=!1;break a}p=
-p.prevZ}r=!0}}else a:if(r=a,q=r.prev,n=r,l=r.next,0<=ma(q,n,l))r=!1;else{for(m=r.next.next;m!==r.prev;){if(ud(q.x,q.y,n.x,n.y,l.x,l.y,m.x,m.y)&&0<=ma(m.prev,m,m.next)){r=!1;break a}m=m.next}r=!0}if(r)b.push(k.i/c),b.push(a.i/c),b.push(v.i/c),Oc(a),h=a=v.next;else if(a=v,a===h){if(!g)Qc(Pc(a),b,c,d,e,f,1);else if(1===g){g=b;h=c;k=a;do v=k.prev,r=k.next.next,!qb(v,r)&&df(v,k,k.next,r)&&Rc(v,r)&&Rc(r,v)&&(g.push(v.i/h),g.push(k.i/h),g.push(r.i/h),Oc(k),Oc(k.next),k=a=r),k=k.next;while(k!==a);a=k;Qc(a,
-b,c,d,e,f,2)}else if(2===g)a:{g=a;do{for(h=g.next.next;h!==g.prev;){if(k=g.i!==h.i){k=g;v=h;if(r=k.next.i!==v.i&&k.prev.i!==v.i){b:{r=k;do{if(r.i!==k.i&&r.next.i!==k.i&&r.i!==v.i&&r.next.i!==v.i&&df(r,r.next,k,v)){r=!0;break b}r=r.next}while(r!==k);r=!1}r=!r}if(r=r&&Rc(k,v)&&Rc(v,k)){r=k;q=!1;n=(k.x+v.x)/2;v=(k.y+v.y)/2;do r.y>v!==r.next.y>v&&r.next.y!==r.y&&n<(r.next.x-r.x)*(v-r.y)/(r.next.y-r.y)+r.x&&(q=!q),r=r.next;while(r!==k);r=q}k=r}if(k){a=ef(g,h);g=Pc(g,g.next);a=Pc(a,a.next);Qc(g,b,c,d,e,
-f);Qc(a,b,c,d,e,f);break a}h=h.next}g=g.next}while(g!==a)}break}}}}function Ng(a,b){return a.x-b.x}function Og(a,b){var c=b,d=a.x,e=a.y,f=-Infinity;do{if(e<=c.y&&e>=c.next.y&&c.next.y!==c.y){var g=c.x+(e-c.y)*(c.next.x-c.x)/(c.next.y-c.y);if(g<=d&&g>f){f=g;if(g===d){if(e===c.y)return c;if(e===c.next.y)return c.next}var h=c.x<c.next.x?c:c.next}}c=c.next}while(c!==b);if(!h)return null;if(d===f)return h.prev;b=h;g=h.x;var k=h.y,m=Infinity;for(c=h.next;c!==b;){if(d>=c.x&&c.x>=g&&d!==c.x&&ud(e<k?d:f,e,
-g,k,e<k?f:d,e,c.x,c.y)){var q=Math.abs(e-c.y)/(d-c.x);(q<m||q===m&&c.x>h.x)&&Rc(c,a)&&(h=c,m=q)}c=c.next}return h}function ae(a,b,c,d,e){a=32767*(a-c)*e;b=32767*(b-d)*e;a=(a|a<<8)&16711935;a=(a|a<<4)&252645135;a=(a|a<<2)&858993459;b=(b|b<<8)&16711935;b=(b|b<<4)&252645135;b=(b|b<<2)&858993459;return(a|a<<1)&1431655765|((b|b<<1)&1431655765)<<1}function Pg(a){var b=a,c=a;do b.x<c.x&&(c=b),b=b.next;while(b!==a);return c}function ud(a,b,c,d,e,f,g,h){return 0<=(e-g)*(b-h)-(a-g)*(f-h)&&0<=(a-g)*(d-h)-(c-
-g)*(b-h)&&0<=(c-g)*(f-h)-(e-g)*(d-h)}function ma(a,b,c){return(b.y-a.y)*(c.x-b.x)-(b.x-a.x)*(c.y-b.y)}function qb(a,b){return a.x===b.x&&a.y===b.y}function df(a,b,c,d){return qb(a,b)&&qb(c,d)||qb(a,d)&&qb(c,b)?!0:0<ma(a,b,c)!==0<ma(a,b,d)&&0<ma(c,d,a)!==0<ma(c,d,b)}function Rc(a,b){return 0>ma(a.prev,a,a.next)?0<=ma(a,b,a.next)&&0<=ma(a,a.prev,b):0>ma(a,b,a.prev)||0>ma(a,a.next,b)}function ef(a,b){var c=new be(a.i,a.x,a.y),d=new be(b.i,b.x,b.y),e=a.next,f=b.prev;a.next=b;b.prev=a;c.next=e;e.prev=
-c;d.next=c;c.prev=d;f.next=d;d.prev=f;return d}function cf(a,b,c,d){a=new be(a,b,c);d?(a.next=d.next,a.prev=d,d.next.prev=a,d.next=a):(a.prev=a,a.next=a);return a}function Oc(a){a.next.prev=a.prev;a.prev.next=a.next;a.prevZ&&(a.prevZ.nextZ=a.nextZ);a.nextZ&&(a.nextZ.prevZ=a.prevZ)}function be(a,b,c){this.i=a;this.x=b;this.y=c;this.nextZ=this.prevZ=this.z=this.next=this.prev=null;this.steiner=!1}function ff(a){var b=a.length;2<b&&a[b-1].equals(a[0])&&a.pop()}function gf(a,b){for(var c=0;c<b.length;c++)a.push(b[c].x),
-a.push(b[c].y)}function rb(a,b){R.call(this);this.type="ExtrudeGeometry";this.parameters={shapes:a,options:b};this.fromBufferGeometry(new Oa(a,b));this.mergeVertices()}function Oa(a,b){function c(a){function c(a,b,c){b||console.error("THREE.ExtrudeGeometry: vec does not exist");return b.clone().multiplyScalar(c).add(a)}function g(a,b,c){var d=a.x-b.x;var e=a.y-b.y;var f=c.x-a.x;var g=c.y-a.y,h=d*d+e*e;if(Math.abs(d*g-e*f)>Number.EPSILON){var k=Math.sqrt(h),m=Math.sqrt(f*f+g*g);h=b.x-e/k;b=b.y+d/k;
-g=((c.x-g/m-h)*g-(c.y+f/m-b)*f)/(d*g-e*f);f=h+d*g-a.x;d=b+e*g-a.y;e=f*f+d*d;if(2>=e)return new z(f,d);e=Math.sqrt(e/2)}else a=!1,d>Number.EPSILON?f>Number.EPSILON&&(a=!0):d<-Number.EPSILON?f<-Number.EPSILON&&(a=!0):Math.sign(e)===Math.sign(g)&&(a=!0),a?(f=-e,e=Math.sqrt(h)):(f=d,d=e,e=Math.sqrt(h/2));return new z(f/e,d/e)}function h(a,b){for(M=a.length;0<=--M;){var c=M;var f=M-1;0>f&&(f=a.length-1);var g,h=w+2*O;for(g=0;g<h;g++){var k=Z*g,m=Z*(g+1),q=b+f+k,n=b+f+m;m=b+c+m;r(b+c+k);r(q);r(m);r(q);
-r(n);r(m);k=e.length/3;k=D.generateSideWallUV(d,e,k-6,k-3,k-2,k-1);v(k[0]);v(k[1]);v(k[3]);v(k[1]);v(k[2]);v(k[3])}}}function k(a,b,c){y.push(a);y.push(b);y.push(c)}function l(a,b,c){r(a);r(b);r(c);a=e.length/3;a=D.generateTopUV(d,e,a-3,a-2,a-1);v(a[0]);v(a[1]);v(a[2])}function r(a){e.push(y[3*a]);e.push(y[3*a+1]);e.push(y[3*a+2])}function v(a){f.push(a.x);f.push(a.y)}var y=[],x=void 0!==b.curveSegments?b.curveSegments:12,w=void 0!==b.steps?b.steps:1,B=void 0!==b.depth?b.depth:100,E=void 0!==b.bevelEnabled?
-b.bevelEnabled:!0,P=void 0!==b.bevelThickness?b.bevelThickness:6,N=void 0!==b.bevelSize?b.bevelSize:P-2,O=void 0!==b.bevelSegments?b.bevelSegments:3,A=b.extrudePath,D=void 0!==b.UVGenerator?b.UVGenerator:Qg;void 0!==b.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),B=b.amount);var C=!1;if(A){var G=A.getSpacedPoints(w);C=!0;E=!1;var K=A.computeFrenetFrames(w,!1);var L=new p;var R=new p;var Q=new p}E||(N=P=O=0);var I;x=a.extractPoints(x);a=x.shape;var J=x.holes;
-if(!Va.isClockWise(a)){a=a.reverse();var H=0;for(I=J.length;H<I;H++){var S=J[H];Va.isClockWise(S)&&(J[H]=S.reverse())}}var Y=Va.triangulateShape(a,J),W=a;H=0;for(I=J.length;H<I;H++)S=J[H],a=a.concat(S);var T,Z=a.length,V,ea=Y.length;x=[];var M=0;var U=W.length;var X=U-1;for(T=M+1;M<U;M++,X++,T++)X===U&&(X=0),T===U&&(T=0),x[M]=g(W[M],W[X],W[T]);A=[];var fa=x.concat();H=0;for(I=J.length;H<I;H++){S=J[H];var ca=[];M=0;U=S.length;X=U-1;for(T=M+1;M<U;M++,X++,T++)X===U&&(X=0),T===U&&(T=0),ca[M]=g(S[M],S[X],
-S[T]);A.push(ca);fa=fa.concat(ca)}for(X=0;X<O;X++){U=X/O;var da=P*Math.cos(U*Math.PI/2);T=N*Math.sin(U*Math.PI/2);M=0;for(U=W.length;M<U;M++){var aa=c(W[M],x[M],T);k(aa.x,aa.y,-da)}H=0;for(I=J.length;H<I;H++)for(S=J[H],ca=A[H],M=0,U=S.length;M<U;M++)aa=c(S[M],ca[M],T),k(aa.x,aa.y,-da)}T=N;for(M=0;M<Z;M++)aa=E?c(a[M],fa[M],T):a[M],C?(R.copy(K.normals[0]).multiplyScalar(aa.x),L.copy(K.binormals[0]).multiplyScalar(aa.y),Q.copy(G[0]).add(R).add(L),k(Q.x,Q.y,Q.z)):k(aa.x,aa.y,0);for(U=1;U<=w;U++)for(M=
-0;M<Z;M++)aa=E?c(a[M],fa[M],T):a[M],C?(R.copy(K.normals[U]).multiplyScalar(aa.x),L.copy(K.binormals[U]).multiplyScalar(aa.y),Q.copy(G[U]).add(R).add(L),k(Q.x,Q.y,Q.z)):k(aa.x,aa.y,B/w*U);for(X=O-1;0<=X;X--){U=X/O;da=P*Math.cos(U*Math.PI/2);T=N*Math.sin(U*Math.PI/2);M=0;for(U=W.length;M<U;M++)aa=c(W[M],x[M],T),k(aa.x,aa.y,B+da);H=0;for(I=J.length;H<I;H++)for(S=J[H],ca=A[H],M=0,U=S.length;M<U;M++)aa=c(S[M],ca[M],T),C?k(aa.x,aa.y+G[w-1].y,G[w-1].x+da):k(aa.x,aa.y,B+da)}(function(){var a=e.length/3;if(E){var b=
-0*Z;for(M=0;M<ea;M++)V=Y[M],l(V[2]+b,V[1]+b,V[0]+b);b=Z*(w+2*O);for(M=0;M<ea;M++)V=Y[M],l(V[0]+b,V[1]+b,V[2]+b)}else{for(M=0;M<ea;M++)V=Y[M],l(V[2],V[1],V[0]);for(M=0;M<ea;M++)V=Y[M],l(V[0]+Z*w,V[1]+Z*w,V[2]+Z*w)}d.addGroup(a,e.length/3-a,0)})();(function(){var a=e.length/3,b=0;h(W,b);b+=W.length;H=0;for(I=J.length;H<I;H++)S=J[H],h(S,b),b+=S.length;d.addGroup(a,e.length/3-a,1)})()}C.call(this);this.type="ExtrudeBufferGeometry";this.parameters={shapes:a,options:b};a=Array.isArray(a)?a:[a];for(var d=
-this,e=[],f=[],g=0,h=a.length;g<h;g++)c(a[g]);this.addAttribute("position",new A(e,3));this.addAttribute("uv",new A(f,2));this.computeVertexNormals()}function hf(a,b,c){c.shapes=[];if(Array.isArray(a))for(var d=0,e=a.length;d<e;d++)c.shapes.push(a[d].uuid);else c.shapes.push(a.uuid);void 0!==b.extrudePath&&(c.options.extrudePath=b.extrudePath.toJSON());return c}function Sc(a,b){R.call(this);this.type="TextGeometry";this.parameters={text:a,parameters:b};this.fromBufferGeometry(new Yb(a,b));this.mergeVertices()}
-function Yb(a,b){b=b||{};var c=b.font;if(!c||!c.isFont)return console.error("THREE.TextGeometry: font parameter is not an instance of THREE.Font."),new R;a=c.generateShapes(a,b.size);b.depth=void 0!==b.height?b.height:50;void 0===b.bevelThickness&&(b.bevelThickness=10);void 0===b.bevelSize&&(b.bevelSize=8);void 0===b.bevelEnabled&&(b.bevelEnabled=!1);Oa.call(this,a,b);this.type="TextBufferGeometry"}function Tc(a,b,c,d,e,f,g){R.call(this);this.type="SphereGeometry";this.parameters={radius:a,widthSegments:b,
-heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};this.fromBufferGeometry(new sb(a,b,c,d,e,f,g));this.mergeVertices()}function sb(a,b,c,d,e,f,g){C.call(this);this.type="SphereBufferGeometry";this.parameters={radius:a,widthSegments:b,heightSegments:c,phiStart:d,phiLength:e,thetaStart:f,thetaLength:g};a=a||1;b=Math.max(3,Math.floor(b)||8);c=Math.max(2,Math.floor(c)||6);d=void 0!==d?d:0;e=void 0!==e?e:2*Math.PI;f=void 0!==f?f:0;g=void 0!==g?g:Math.PI;var h=f+g,k,m,q=0,n=[],l=new p,
-u=new p,r=[],v=[],y=[],x=[];for(m=0;m<=c;m++){var w=[],B=m/c;for(k=0;k<=b;k++){var E=k/b;l.x=-a*Math.cos(d+E*e)*Math.sin(f+B*g);l.y=a*Math.cos(f+B*g);l.z=a*Math.sin(d+E*e)*Math.sin(f+B*g);v.push(l.x,l.y,l.z);u.set(l.x,l.y,l.z).normalize();y.push(u.x,u.y,u.z);x.push(E,1-B);w.push(q++)}n.push(w)}for(m=0;m<c;m++)for(k=0;k<b;k++)a=n[m][k+1],d=n[m][k],e=n[m+1][k],g=n[m+1][k+1],(0!==m||0<f)&&r.push(a,d,g),(m!==c-1||h<Math.PI)&&r.push(d,e,g);this.setIndex(r);this.addAttribute("position",new A(v,3));this.addAttribute("normal",
-new A(y,3));this.addAttribute("uv",new A(x,2))}function Uc(a,b,c,d,e,f){R.call(this);this.type="RingGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};this.fromBufferGeometry(new Zb(a,b,c,d,e,f));this.mergeVertices()}function Zb(a,b,c,d,e,f){C.call(this);this.type="RingBufferGeometry";this.parameters={innerRadius:a,outerRadius:b,thetaSegments:c,phiSegments:d,thetaStart:e,thetaLength:f};a=a||.5;b=b||1;e=void 0!==e?e:0;f=void 0!==f?f:2*Math.PI;
-c=void 0!==c?Math.max(3,c):8;d=void 0!==d?Math.max(1,d):1;var g=[],h=[],k=[],m=[],q=a,n=(b-a)/d,l=new p,u=new z,r,v;for(r=0;r<=d;r++){for(v=0;v<=c;v++)a=e+v/c*f,l.x=q*Math.cos(a),l.y=q*Math.sin(a),h.push(l.x,l.y,l.z),k.push(0,0,1),u.x=(l.x/b+1)/2,u.y=(l.y/b+1)/2,m.push(u.x,u.y);q+=n}for(r=0;r<d;r++)for(b=r*(c+1),v=0;v<c;v++)a=v+b,e=a+c+1,f=a+c+2,q=a+1,g.push(a,e,q),g.push(e,f,q);this.setIndex(g);this.addAttribute("position",new A(h,3));this.addAttribute("normal",new A(k,3));this.addAttribute("uv",
-new A(m,2))}function Vc(a,b,c,d){R.call(this);this.type="LatheGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};this.fromBufferGeometry(new $b(a,b,c,d));this.mergeVertices()}function $b(a,b,c,d){C.call(this);this.type="LatheBufferGeometry";this.parameters={points:a,segments:b,phiStart:c,phiLength:d};b=Math.floor(b)||12;c=c||0;d=d||2*Math.PI;d=H.clamp(d,0,2*Math.PI);var e=[],f=[],g=[],h=1/b,k=new p,m=new z,q;for(q=0;q<=b;q++){var n=c+q*h*d;var l=Math.sin(n),u=Math.cos(n);for(n=
-0;n<=a.length-1;n++)k.x=a[n].x*l,k.y=a[n].y,k.z=a[n].x*u,f.push(k.x,k.y,k.z),m.x=q/b,m.y=n/(a.length-1),g.push(m.x,m.y)}for(q=0;q<b;q++)for(n=0;n<a.length-1;n++)c=n+q*a.length,h=c+a.length,k=c+a.length+1,m=c+1,e.push(c,h,m),e.push(h,k,m);this.setIndex(e);this.addAttribute("position",new A(f,3));this.addAttribute("uv",new A(g,2));this.computeVertexNormals();if(d===2*Math.PI)for(d=this.attributes.normal.array,e=new p,f=new p,g=new p,c=b*a.length*3,n=q=0;q<a.length;q++,n+=3)e.x=d[n+0],e.y=d[n+1],e.z=
-d[n+2],f.x=d[c+n+0],f.y=d[c+n+1],f.z=d[c+n+2],g.addVectors(e,f).normalize(),d[n+0]=d[c+n+0]=g.x,d[n+1]=d[c+n+1]=g.y,d[n+2]=d[c+n+2]=g.z}function tb(a,b){R.call(this);this.type="ShapeGeometry";"object"===typeof b&&(console.warn("THREE.ShapeGeometry: Options parameter has been removed."),b=b.curveSegments);this.parameters={shapes:a,curveSegments:b};this.fromBufferGeometry(new ub(a,b));this.mergeVertices()}function ub(a,b){function c(a){var c,h=e.length/3;a=a.extractPoints(b);var m=a.shape,q=a.holes;
-if(!1===Va.isClockWise(m))for(m=m.reverse(),a=0,c=q.length;a<c;a++){var l=q[a];!0===Va.isClockWise(l)&&(q[a]=l.reverse())}var p=Va.triangulateShape(m,q);a=0;for(c=q.length;a<c;a++)l=q[a],m=m.concat(l);a=0;for(c=m.length;a<c;a++)l=m[a],e.push(l.x,l.y,0),f.push(0,0,1),g.push(l.x,l.y);a=0;for(c=p.length;a<c;a++)m=p[a],d.push(m[0]+h,m[1]+h,m[2]+h),k+=3}C.call(this);this.type="ShapeBufferGeometry";this.parameters={shapes:a,curveSegments:b};b=b||12;var d=[],e=[],f=[],g=[],h=0,k=0;if(!1===Array.isArray(a))c(a);
-else for(var m=0;m<a.length;m++)c(a[m]),this.addGroup(h,k,m),h+=k,k=0;this.setIndex(d);this.addAttribute("position",new A(e,3));this.addAttribute("normal",new A(f,3));this.addAttribute("uv",new A(g,2))}function jf(a,b){b.shapes=[];if(Array.isArray(a))for(var c=0,d=a.length;c<d;c++)b.shapes.push(a[c].uuid);else b.shapes.push(a.uuid);return b}function ac(a,b){C.call(this);this.type="EdgesGeometry";this.parameters={thresholdAngle:b};var c=[];b=Math.cos(H.DEG2RAD*(void 0!==b?b:1));var d=[0,0],e={},f=
-["a","b","c"];if(a.isBufferGeometry){var g=new R;g.fromBufferGeometry(a)}else g=a.clone();g.mergeVertices();g.computeFaceNormals();a=g.vertices;g=g.faces;for(var h=0,k=g.length;h<k;h++)for(var m=g[h],q=0;3>q;q++){var n=m[f[q]];var l=m[f[(q+1)%3]];d[0]=Math.min(n,l);d[1]=Math.max(n,l);n=d[0]+","+d[1];void 0===e[n]?e[n]={index1:d[0],index2:d[1],face1:h,face2:void 0}:e[n].face2=h}for(n in e)if(d=e[n],void 0===d.face2||g[d.face1].normal.dot(g[d.face2].normal)<=b)f=a[d.index1],c.push(f.x,f.y,f.z),f=a[d.index2],
-c.push(f.x,f.y,f.z);this.addAttribute("position",new A(c,3))}function vb(a,b,c,d,e,f,g,h){R.call(this);this.type="CylinderGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};this.fromBufferGeometry(new Wa(a,b,c,d,e,f,g,h));this.mergeVertices()}function Wa(a,b,c,d,e,f,g,h){function k(c){var e,f=new z,k=new p,t=0,v=!0===c?a:b,w=!0===c?1:-1;var A=r;for(e=1;e<=d;e++)n.push(0,y*w,0),l.push(0,w,0),u.push(.5,.5),r++;var C=
-r;for(e=0;e<=d;e++){var D=e/d*h+g,H=Math.cos(D);D=Math.sin(D);k.x=v*D;k.y=y*w;k.z=v*H;n.push(k.x,k.y,k.z);l.push(0,w,0);f.x=.5*H+.5;f.y=.5*D*w+.5;u.push(f.x,f.y);r++}for(e=0;e<d;e++)f=A+e,k=C+e,!0===c?q.push(k,k+1,f):q.push(k+1,k,f),t+=3;m.addGroup(x,t,!0===c?1:2);x+=t}C.call(this);this.type="CylinderBufferGeometry";this.parameters={radiusTop:a,radiusBottom:b,height:c,radialSegments:d,heightSegments:e,openEnded:f,thetaStart:g,thetaLength:h};var m=this;a=void 0!==a?a:1;b=void 0!==b?b:1;c=c||1;d=Math.floor(d)||
-8;e=Math.floor(e)||1;f=void 0!==f?f:!1;g=void 0!==g?g:0;h=void 0!==h?h:2*Math.PI;var q=[],n=[],l=[],u=[],r=0,v=[],y=c/2,x=0;(function(){var f,k,t=new p,P=new p,N=0,z=(b-a)/c;for(k=0;k<=e;k++){var A=[],D=k/e,C=D*(b-a)+a;for(f=0;f<=d;f++){var H=f/d,G=H*h+g,K=Math.sin(G);G=Math.cos(G);P.x=C*K;P.y=-D*c+y;P.z=C*G;n.push(P.x,P.y,P.z);t.set(K,z,G).normalize();l.push(t.x,t.y,t.z);u.push(H,1-D);A.push(r++)}v.push(A)}for(f=0;f<d;f++)for(k=0;k<e;k++)t=v[k+1][f],P=v[k+1][f+1],z=v[k][f+1],q.push(v[k][f],t,z),
-q.push(t,P,z),N+=6;m.addGroup(x,N,0);x+=N})();!1===f&&(0<a&&k(!0),0<b&&k(!1));this.setIndex(q);this.addAttribute("position",new A(n,3));this.addAttribute("normal",new A(l,3));this.addAttribute("uv",new A(u,2))}function Wc(a,b,c,d,e,f,g){vb.call(this,0,a,b,c,d,e,f,g);this.type="ConeGeometry";this.parameters={radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Xc(a,b,c,d,e,f,g){Wa.call(this,0,a,b,c,d,e,f,g);this.type="ConeBufferGeometry";this.parameters=
-{radius:a,height:b,radialSegments:c,heightSegments:d,openEnded:e,thetaStart:f,thetaLength:g}}function Yc(a,b,c,d){R.call(this);this.type="CircleGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};this.fromBufferGeometry(new bc(a,b,c,d));this.mergeVertices()}function bc(a,b,c,d){C.call(this);this.type="CircleBufferGeometry";this.parameters={radius:a,segments:b,thetaStart:c,thetaLength:d};a=a||1;b=void 0!==b?Math.max(3,b):8;c=void 0!==c?c:0;d=void 0!==d?d:2*Math.PI;var e=[],f=
-[],g=[],h=[],k,m=new p,q=new z;f.push(0,0,0);g.push(0,0,1);h.push(.5,.5);var n=0;for(k=3;n<=b;n++,k+=3){var l=c+n/b*d;m.x=a*Math.cos(l);m.y=a*Math.sin(l);f.push(m.x,m.y,m.z);g.push(0,0,1);q.x=(f[k]/a+1)/2;q.y=(f[k+1]/a+1)/2;h.push(q.x,q.y)}for(k=1;k<=b;k++)e.push(k,k+1,0);this.setIndex(e);this.addAttribute("position",new A(f,3));this.addAttribute("normal",new A(g,3));this.addAttribute("uv",new A(h,2))}function wb(a){J.call(this);this.type="ShadowMaterial";this.color=new G(0);this.transparent=!0;this.setValues(a)}
-function cc(a){ta.call(this,a);this.type="RawShaderMaterial"}function Pa(a){J.call(this);this.defines={STANDARD:""};this.type="MeshStandardMaterial";this.color=new G(16777215);this.metalness=this.roughness=.5;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new z(1,1);this.displacementMap=null;this.displacementScale=
-1;this.displacementBias=0;this.envMap=this.alphaMap=this.metalnessMap=this.roughnessMap=null;this.envMapIntensity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function xb(a){Pa.call(this);this.defines={PHYSICAL:""};this.type="MeshPhysicalMaterial";this.reflectivity=.5;this.clearCoatRoughness=this.clearCoat=0;this.setValues(a)}function Fa(a){J.call(this);
-this.type="MeshPhongMaterial";this.color=new G(16777215);this.specular=new G(1118481);this.shininess=30;this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.bumpMap=this.emissiveMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new z(1,1);this.displacementMap=null;this.displacementScale=1;this.displacementBias=0;this.envMap=this.alphaMap=this.specularMap=null;this.combine=0;
-this.reflectivity=1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function yb(a){Fa.call(this);this.defines={TOON:""};this.type="MeshToonMaterial";this.gradientMap=null;this.setValues(a)}function zb(a){J.call(this);this.type="MeshNormalMaterial";this.bumpMap=null;this.bumpScale=1;this.normalMap=null;this.normalMapType=0;this.normalScale=new z(1,1);this.displacementMap=
-null;this.displacementScale=1;this.displacementBias=0;this.wireframe=!1;this.wireframeLinewidth=1;this.morphNormals=this.morphTargets=this.skinning=this.lights=this.fog=!1;this.setValues(a)}function Ab(a){J.call(this);this.type="MeshLambertMaterial";this.color=new G(16777215);this.lightMap=this.map=null;this.lightMapIntensity=1;this.aoMap=null;this.aoMapIntensity=1;this.emissive=new G(0);this.emissiveIntensity=1;this.envMap=this.alphaMap=this.specularMap=this.emissiveMap=null;this.combine=0;this.reflectivity=
-1;this.refractionRatio=.98;this.wireframe=!1;this.wireframeLinewidth=1;this.wireframeLinejoin=this.wireframeLinecap="round";this.morphNormals=this.morphTargets=this.skinning=!1;this.setValues(a)}function Bb(a){Y.call(this);this.type="LineDashedMaterial";this.scale=1;this.dashSize=3;this.gapSize=1;this.setValues(a)}function ce(a,b,c){var d=this,e=!1,f=0,g=0,h=void 0;this.onStart=void 0;this.onLoad=a;this.onProgress=b;this.onError=c;this.itemStart=function(a){g++;if(!1===e&&void 0!==d.onStart)d.onStart(a,
-f,g);e=!0};this.itemEnd=function(a){f++;if(void 0!==d.onProgress)d.onProgress(a,f,g);if(f===g&&(e=!1,void 0!==d.onLoad))d.onLoad()};this.itemError=function(a){if(void 0!==d.onError)d.onError(a)};this.resolveURL=function(a){return h?h(a):a};this.setURLModifier=function(a){h=a;return this}}function Ga(a){this.manager=void 0!==a?a:ka}function kf(a){this.manager=void 0!==a?a:ka;this._parser=null}function de(a){this.manager=void 0!==a?a:ka;this._parser=null}function Zc(a){this.manager=void 0!==a?a:ka}
-function ee(a){this.manager=void 0!==a?a:ka}function vd(a){this.manager=void 0!==a?a:ka}function L(){this.type="Curve";this.arcLengthDivisions=200}function za(a,b,c,d,e,f,g,h){L.call(this);this.type="EllipseCurve";this.aX=a||0;this.aY=b||0;this.xRadius=c||1;this.yRadius=d||1;this.aStartAngle=e||0;this.aEndAngle=f||2*Math.PI;this.aClockwise=g||!1;this.aRotation=h||0}function dc(a,b,c,d,e,f){za.call(this,a,b,c,c,d,e,f);this.type="ArcCurve"}function fe(){var a=0,b=0,c=0,d=0;return{initCatmullRom:function(e,
-f,g,h,k){e=k*(g-e);h=k*(h-f);a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},initNonuniformCatmullRom:function(e,f,g,h,k,m,q){e=((f-e)/k-(g-e)/(k+m)+(g-f)/m)*m;h=((g-f)/m-(h-f)/(m+q)+(h-g)/q)*m;a=f;b=e;c=-3*f+3*g-2*e-h;d=2*f-2*g+e+h},calc:function(e){var f=e*e;return a+b*e+c*f+d*f*e}}}function ca(a,b,c,d){L.call(this);this.type="CatmullRomCurve3";this.points=a||[];this.closed=b||!1;this.curveType=c||"centripetal";this.tension=d||.5}function lf(a,b,c,d,e){b=.5*(d-b);e=.5*(e-c);var f=a*a;return(2*c-2*d+b+e)*
-a*f+(-3*c+3*d-2*b-e)*f+b*a+c}function $c(a,b,c,d){var e=1-a;return e*e*b+2*(1-a)*a*c+a*a*d}function ad(a,b,c,d,e){var f=1-a,g=1-a;return f*f*f*b+3*g*g*a*c+3*(1-a)*a*a*d+a*a*a*e}function Ha(a,b,c,d){L.call(this);this.type="CubicBezierCurve";this.v0=a||new z;this.v1=b||new z;this.v2=c||new z;this.v3=d||new z}function Qa(a,b,c,d){L.call(this);this.type="CubicBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p;this.v3=d||new p}function va(a,b){L.call(this);this.type="LineCurve";this.v1=a||
-new z;this.v2=b||new z}function Ia(a,b){L.call(this);this.type="LineCurve3";this.v1=a||new p;this.v2=b||new p}function Ja(a,b,c){L.call(this);this.type="QuadraticBezierCurve";this.v0=a||new z;this.v1=b||new z;this.v2=c||new z}function Ra(a,b,c){L.call(this);this.type="QuadraticBezierCurve3";this.v0=a||new p;this.v1=b||new p;this.v2=c||new p}function Ka(a){L.call(this);this.type="SplineCurve";this.points=a||[]}function Xa(){L.call(this);this.type="CurvePath";this.curves=[];this.autoClose=!1}function La(a){Xa.call(this);
-this.type="Path";this.currentPoint=new z;a&&this.setFromPoints(a)}function db(a){La.call(this,a);this.uuid=H.generateUUID();this.type="Shape";this.holes=[]}function X(a,b){D.call(this);this.type="Light";this.color=new G(a);this.intensity=void 0!==b?b:1;this.receiveShadow=void 0}function wd(a,b,c){X.call(this,a,c);this.type="HemisphereLight";this.castShadow=void 0;this.position.copy(D.DefaultUp);this.updateMatrix();this.groundColor=new G(b)}function Cb(a){this.camera=a;this.bias=0;this.radius=1;this.mapSize=
-new z(512,512);this.map=null;this.matrix=new I}function xd(){Cb.call(this,new Z(50,1,.5,500))}function yd(a,b,c,d,e,f){X.call(this,a,b);this.type="SpotLight";this.position.copy(D.DefaultUp);this.updateMatrix();this.target=new D;Object.defineProperty(this,"power",{get:function(){return this.intensity*Math.PI},set:function(a){this.intensity=a/Math.PI}});this.distance=void 0!==c?c:0;this.angle=void 0!==d?d:Math.PI/3;this.penumbra=void 0!==e?e:0;this.decay=void 0!==f?f:1;this.shadow=new xd}function zd(a,
-b,c,d){X.call(this,a,b);this.type="PointLight";Object.defineProperty(this,"power",{get:function(){return 4*this.intensity*Math.PI},set:function(a){this.intensity=a/(4*Math.PI)}});this.distance=void 0!==c?c:0;this.decay=void 0!==d?d:1;this.shadow=new Cb(new Z(90,1,.5,500))}function Ad(){Cb.call(this,new Hb(-5,5,5,-5,.5,500))}function Bd(a,b){X.call(this,a,b);this.type="DirectionalLight";this.position.copy(D.DefaultUp);this.updateMatrix();this.target=new D;this.shadow=new Ad}function Cd(a,b){X.call(this,
-a,b);this.type="AmbientLight";this.castShadow=void 0}function Dd(a,b,c,d){X.call(this,a,b);this.type="RectAreaLight";this.width=void 0!==c?c:10;this.height=void 0!==d?d:10}function wa(a,b,c,d){this.parameterPositions=a;this._cachedIndex=0;this.resultBuffer=void 0!==d?d:new b.constructor(c);this.sampleValues=b;this.valueSize=c}function Ed(a,b,c,d){wa.call(this,a,b,c,d);this._offsetNext=this._weightNext=this._offsetPrev=this._weightPrev=-0}function bd(a,b,c,d){wa.call(this,a,b,c,d)}function Fd(a,b,
-c,d){wa.call(this,a,b,c,d)}function oa(a,b,c,d){if(void 0===a)throw Error("THREE.KeyframeTrack: track name is undefined");if(void 0===b||0===b.length)throw Error("THREE.KeyframeTrack: no keyframes in track named "+a);this.name=a;this.times=ia.convertArray(b,this.TimeBufferType);this.values=ia.convertArray(c,this.ValueBufferType);this.setInterpolation(d||this.DefaultInterpolation)}function Gd(a,b,c){oa.call(this,a,b,c)}function Hd(a,b,c,d){oa.call(this,a,b,c,d)}function ec(a,b,c,d){oa.call(this,a,
-b,c,d)}function Id(a,b,c,d){wa.call(this,a,b,c,d)}function cd(a,b,c,d){oa.call(this,a,b,c,d)}function Jd(a,b,c,d){oa.call(this,a,b,c,d)}function fc(a,b,c,d){oa.call(this,a,b,c,d)}function Ca(a,b,c){this.name=a;this.tracks=c;this.duration=void 0!==b?b:-1;this.uuid=H.generateUUID();0>this.duration&&this.resetDuration()}function Rg(a){switch(a.toLowerCase()){case "scalar":case "double":case "float":case "number":case "integer":return ec;case "vector":case "vector2":case "vector3":case "vector4":return fc;
-case "color":return Hd;case "quaternion":return cd;case "bool":case "boolean":return Gd;case "string":return Jd}throw Error("THREE.KeyframeTrack: Unsupported typeName: "+a);}function Sg(a){if(void 0===a.type)throw Error("THREE.KeyframeTrack: track type undefined, can not parse");var b=Rg(a.type);if(void 0===a.times){var c=[],d=[];ia.flattenJSON(a.keys,c,d,"value");a.times=c;a.values=d}return void 0!==b.parse?b.parse(a):new b(a.name,a.times,a.values,a.interpolation)}function Kd(a){this.manager=void 0!==
-a?a:ka;this.textures={}}function ge(a){this.manager=void 0!==a?a:ka}function gc(){}function he(a){"boolean"===typeof a&&(console.warn("THREE.JSONLoader: showStatus parameter has been removed from constructor."),a=void 0);this.manager=void 0!==a?a:ka;this.withCredentials=!1}function mf(a){this.manager=void 0!==a?a:ka;this.texturePath=""}function ie(a){"undefined"===typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported.");"undefined"===typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported.");
-this.manager=void 0!==a?a:ka;this.options=void 0}function je(){this.type="ShapePath";this.color=new G;this.subPaths=[];this.currentPath=null}function ke(a){this.type="Font";this.data=a}function nf(a){this.manager=void 0!==a?a:ka}function le(a){this.manager=void 0!==a?a:ka}function of(){this.type="StereoCamera";this.aspect=1;this.eyeSep=.064;this.cameraL=new Z;this.cameraL.layers.enable(1);this.cameraL.matrixAutoUpdate=!1;this.cameraR=new Z;this.cameraR.layers.enable(2);this.cameraR.matrixAutoUpdate=
-!1}function dd(a,b,c){D.call(this);this.type="CubeCamera";var d=new Z(90,1,a,b);d.up.set(0,-1,0);d.lookAt(new p(1,0,0));this.add(d);var e=new Z(90,1,a,b);e.up.set(0,-1,0);e.lookAt(new p(-1,0,0));this.add(e);var f=new Z(90,1,a,b);f.up.set(0,0,1);f.lookAt(new p(0,1,0));this.add(f);var g=new Z(90,1,a,b);g.up.set(0,0,-1);g.lookAt(new p(0,-1,0));this.add(g);var h=new Z(90,1,a,b);h.up.set(0,-1,0);h.lookAt(new p(0,0,1));this.add(h);var k=new Z(90,1,a,b);k.up.set(0,-1,0);k.lookAt(new p(0,0,-1));this.add(k);
-this.renderTarget=new Gb(c,c,{format:1022,magFilter:1006,minFilter:1006});this.renderTarget.texture.name="CubeCamera";this.update=function(a,b){null===this.parent&&this.updateMatrixWorld();var c=this.renderTarget,m=c.texture.generateMipmaps;c.texture.generateMipmaps=!1;c.activeCubeFace=0;a.render(b,d,c);c.activeCubeFace=1;a.render(b,e,c);c.activeCubeFace=2;a.render(b,f,c);c.activeCubeFace=3;a.render(b,g,c);c.activeCubeFace=4;a.render(b,h,c);c.texture.generateMipmaps=m;c.activeCubeFace=5;a.render(b,
-k,c);a.setRenderTarget(null)};this.clear=function(a,b,c,d){for(var e=this.renderTarget,f=0;6>f;f++)e.activeCubeFace=f,a.setRenderTarget(e),a.clear(b,c,d);a.setRenderTarget(null)}}function me(){D.call(this);this.type="AudioListener";this.context=ne.getContext();this.gain=this.context.createGain();this.gain.connect(this.context.destination);this.filter=null}function hc(a){D.call(this);this.type="Audio";this.context=a.context;this.gain=this.context.createGain();this.gain.connect(a.getInput());this.autoplay=
-!1;this.buffer=null;this.loop=!1;this.offset=this.startTime=0;this.playbackRate=1;this.isPlaying=!1;this.hasPlaybackControl=!0;this.sourceType="empty";this.filters=[]}function oe(a){hc.call(this,a);this.panner=this.context.createPanner();this.panner.connect(this.gain)}function pe(a,b){this.analyser=a.context.createAnalyser();this.analyser.fftSize=void 0!==b?b:2048;this.data=new Uint8Array(this.analyser.frequencyBinCount);a.getOutput().connect(this.analyser)}function qe(a,b,c){this.binding=a;this.valueSize=
-c;a=Float64Array;switch(b){case "quaternion":b=this._slerp;break;case "string":case "bool":a=Array;b=this._select;break;default:b=this._lerp}this.buffer=new a(4*c);this._mixBufferRegion=b;this.referenceCount=this.useCount=this.cumulativeWeight=0}function pf(a,b,c){c=c||pa.parseTrackName(b);this._targetGroup=a;this._bindings=a.subscribe_(b,c)}function pa(a,b,c){this.path=b;this.parsedPath=c||pa.parseTrackName(b);this.node=pa.findNode(a,this.parsedPath.nodeName)||a;this.rootNode=a}function qf(){this.uuid=
-H.generateUUID();this._objects=Array.prototype.slice.call(arguments);this.nCachedObjects_=0;var a={};this._indicesByUUID=a;for(var b=0,c=arguments.length;b!==c;++b)a[arguments[b].uuid]=b;this._paths=[];this._parsedPaths=[];this._bindings=[];this._bindingsIndicesByPath={};var d=this;this.stats={objects:{get total(){return d._objects.length},get inUse(){return this.total-d.nCachedObjects_}},get bindingsPerObject(){return d._bindings.length}}}function rf(a,b,c){this._mixer=a;this._clip=b;this._localRoot=
-c||null;a=b.tracks;b=a.length;c=Array(b);for(var d={endingStart:2400,endingEnd:2400},e=0;e!==b;++e){var f=a[e].createInterpolant(null);c[e]=f;f.settings=d}this._interpolantSettings=d;this._interpolants=c;this._propertyBindings=Array(b);this._weightInterpolant=this._timeScaleInterpolant=this._byClipCacheIndex=this._cacheIndex=null;this.loop=2201;this._loopCount=-1;this._startTime=null;this.time=0;this._effectiveWeight=this.weight=this._effectiveTimeScale=this.timeScale=1;this.repetitions=Infinity;
-this.paused=!1;this.enabled=!0;this.clampWhenFinished=!1;this.zeroSlopeAtEnd=this.zeroSlopeAtStart=!0}function re(a){this._root=a;this._initMemoryManager();this.time=this._accuIndex=0;this.timeScale=1}function Ld(a,b){"string"===typeof a&&(console.warn("THREE.Uniform: Type parameter is no longer needed."),a=b);this.value=a}function se(){C.call(this);this.type="InstancedBufferGeometry";this.maxInstancedCount=void 0}function te(a,b,c){ob.call(this,a,b);this.meshPerAttribute=c||1}function ue(a,b,c){Q.call(this,
-a,b);this.meshPerAttribute=c||1}function sf(a,b,c,d){this.ray=new mb(a,b);this.near=c||0;this.far=d||Infinity;this.params={Mesh:{},Line:{},LOD:{},Points:{threshold:1},Sprite:{}};Object.defineProperties(this.params,{PointCloud:{get:function(){console.warn("THREE.Raycaster: params.PointCloud has been renamed to params.Points.");return this.Points}}})}function tf(a,b){return a.distance-b.distance}function ve(a,b,c,d){if(!1!==a.visible&&(a.raycast(b,c),!0===d)){a=a.children;d=0;for(var e=a.length;d<e;d++)ve(a[d],
-b,c,!0)}}function uf(a){this.autoStart=void 0!==a?a:!0;this.elapsedTime=this.oldTime=this.startTime=0;this.running=!1}function vf(a,b,c){this.radius=void 0!==a?a:1;this.phi=void 0!==b?b:0;this.theta=void 0!==c?c:0;return this}function wf(a,b,c){this.radius=void 0!==a?a:1;this.theta=void 0!==b?b:0;this.y=void 0!==c?c:0;return this}function we(a,b){this.min=void 0!==a?a:new z(Infinity,Infinity);this.max=void 0!==b?b:new z(-Infinity,-Infinity)}function xe(a,b){this.start=void 0!==a?a:new p;this.end=
-void 0!==b?b:new p}function ed(a){D.call(this);this.material=a;this.render=function(){}}function fd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16711680;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&c.isGeometry?b=3*c.faces.length:c&&c.isBufferGeometry&&(b=c.attributes.normal.count);c=new C;b=new A(6*b,3);c.addAttribute("position",b);W.call(this,c,new Y({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function ic(a,b){D.call(this);this.light=a;this.light.updateMatrixWorld();
-this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new C;b=[0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,-1,0,1,0,0,0,0,1,1,0,0,0,0,-1,1];for(var c=0,d=1;32>c;c++,d++){var e=c/32*Math.PI*2,f=d/32*Math.PI*2;b.push(Math.cos(e),Math.sin(e),1,Math.cos(f),Math.sin(f),1)}a.addAttribute("position",new A(b,3));b=new Y({fog:!1});this.cone=new W(a,b);this.add(this.cone);this.update()}function xf(a){var b=[];a&&a.isBone&&b.push(a);for(var c=0;c<a.children.length;c++)b.push.apply(b,xf(a.children[c]));return b}
-function jc(a){for(var b=xf(a),c=new C,d=[],e=[],f=new G(0,0,1),g=new G(0,1,0),h=0;h<b.length;h++){var k=b[h];k.parent&&k.parent.isBone&&(d.push(0,0,0),d.push(0,0,0),e.push(f.r,f.g,f.b),e.push(g.r,g.g,g.b))}c.addAttribute("position",new A(d,3));c.addAttribute("color",new A(e,3));d=new Y({vertexColors:2,depthTest:!1,depthWrite:!1,transparent:!0});W.call(this,c,d);this.root=a;this.bones=b;this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1}function kc(a,b,c){this.light=a;this.light.updateMatrixWorld();
-this.color=c;a=new sb(b,4,2);b=new da({wireframe:!0,fog:!1});la.call(this,a,b);this.matrix=this.light.matrixWorld;this.matrixAutoUpdate=!1;this.update()}function lc(a,b){D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=b;a=new Y({fog:!1});b=new C;b.addAttribute("position",new Q(new Float32Array(15),3));this.line=new sa(b,a);this.add(this.line);this.update()}function mc(a,b,c){D.call(this);this.light=a;this.light.updateMatrixWorld();
-this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;a=new pb(b);a.rotateY(.5*Math.PI);this.material=new da({wireframe:!0,fog:!1});void 0===this.color&&(this.material.vertexColors=2);b=a.getAttribute("position");b=new Float32Array(3*b.count);a.addAttribute("color",new Q(b,3));this.add(new la(a,this.material));this.update()}function gd(a,b,c,d){a=a||10;b=b||10;c=new G(void 0!==c?c:4473924);d=new G(void 0!==d?d:8947848);var e=b/2,f=a/b,g=a/2;a=[];for(var h=[],k=0,m=0,q=-g;k<=b;k++,q+=f){a.push(-g,
-0,q,g,0,q);a.push(q,0,-g,q,0,g);var n=k===e?c:d;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3;n.toArray(h,m);m+=3}b=new C;b.addAttribute("position",new A(a,3));b.addAttribute("color",new A(h,3));c=new Y({vertexColors:2});W.call(this,b,c)}function Md(a,b,c,d,e,f){a=a||10;b=b||16;c=c||8;d=d||64;e=new G(void 0!==e?e:4473924);f=new G(void 0!==f?f:8947848);var g=[],h=[],k;for(k=0;k<=b;k++){var m=k/b*2*Math.PI;var q=Math.sin(m)*a;m=Math.cos(m)*a;g.push(0,0,0);g.push(q,0,m);var n=k&1?e:f;h.push(n.r,
-n.g,n.b);h.push(n.r,n.g,n.b)}for(k=0;k<=c;k++){n=k&1?e:f;var l=a-a/c*k;for(b=0;b<d;b++)m=b/d*2*Math.PI,q=Math.sin(m)*l,m=Math.cos(m)*l,g.push(q,0,m),h.push(n.r,n.g,n.b),m=(b+1)/d*2*Math.PI,q=Math.sin(m)*l,m=Math.cos(m)*l,g.push(q,0,m),h.push(n.r,n.g,n.b)}a=new C;a.addAttribute("position",new A(g,3));a.addAttribute("color",new A(h,3));g=new Y({vertexColors:2});W.call(this,a,g)}function hd(a,b,c,d){this.object=a;this.size=void 0!==b?b:1;a=void 0!==c?c:16776960;d=void 0!==d?d:1;b=0;(c=this.object.geometry)&&
-c.isGeometry?b=c.faces.length:console.warn("THREE.FaceNormalsHelper: only THREE.Geometry is supported. Use THREE.VertexNormalsHelper, instead.");c=new C;b=new A(6*b,3);c.addAttribute("position",b);W.call(this,c,new Y({color:a,linewidth:d}));this.matrixAutoUpdate=!1;this.update()}function nc(a,b,c){D.call(this);this.light=a;this.light.updateMatrixWorld();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.color=c;void 0===b&&(b=1);a=new C;a.addAttribute("position",new A([-b,b,0,b,b,0,b,-b,0,-b,
--b,0,-b,b,0],3));b=new Y({fog:!1});this.lightPlane=new sa(a,b);this.add(this.lightPlane);a=new C;a.addAttribute("position",new A([0,0,0,0,0,1],3));this.targetLine=new sa(a,b);this.add(this.targetLine);this.update()}function id(a){function b(a,b,d){c(a,d);c(b,d)}function c(a,b){f.push(0,0,0);g.push(b.r,b.g,b.b);void 0===h[a]&&(h[a]=[]);h[a].push(f.length/3-1)}var d=new C,e=new Y({color:16777215,vertexColors:1}),f=[],g=[],h={},k=new G(16755200),m=new G(16711680),q=new G(43775),n=new G(16777215),l=new G(3355443);
-b("n1","n2",k);b("n2","n4",k);b("n4","n3",k);b("n3","n1",k);b("f1","f2",k);b("f2","f4",k);b("f4","f3",k);b("f3","f1",k);b("n1","f1",k);b("n2","f2",k);b("n3","f3",k);b("n4","f4",k);b("p","n1",m);b("p","n2",m);b("p","n3",m);b("p","n4",m);b("u1","u2",q);b("u2","u3",q);b("u3","u1",q);b("c","t",n);b("p","c",l);b("cn1","cn2",l);b("cn3","cn4",l);b("cf1","cf2",l);b("cf3","cf4",l);d.addAttribute("position",new A(f,3));d.addAttribute("color",new A(g,3));W.call(this,d,e);this.camera=a;this.camera.updateProjectionMatrix&&
-this.camera.updateProjectionMatrix();this.matrix=a.matrixWorld;this.matrixAutoUpdate=!1;this.pointMap=h;this.update()}function Db(a,b){this.object=a;void 0===b&&(b=16776960);a=new Uint16Array([0,1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new Float32Array(24),d=new C;d.setIndex(new Q(a,1));d.addAttribute("position",new Q(c,3));W.call(this,d,new Y({color:b}));this.matrixAutoUpdate=!1;this.update()}function jd(a,b){this.type="Box3Helper";this.box=a;a=void 0!==b?b:16776960;b=new Uint16Array([0,
-1,1,2,2,3,3,0,4,5,5,6,6,7,7,4,0,4,1,5,2,6,3,7]);var c=new C;c.setIndex(new Q(b,1));c.addAttribute("position",new A([1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,-1,-1,1,-1,-1,-1,-1,1,-1,-1],3));W.call(this,c,new Y({color:a}));this.geometry.computeBoundingSphere()}function kd(a,b,c){this.type="PlaneHelper";this.plane=a;this.size=void 0===b?1:b;a=void 0!==c?c:16776960;b=new C;b.addAttribute("position",new A([1,-1,1,-1,1,1,-1,-1,1,1,1,1,-1,1,1,-1,-1,1,1,-1,1,1,1,1,0,0,1,0,0,0],3));b.computeBoundingSphere();sa.call(this,
-b,new Y({color:a}));b=new C;b.addAttribute("position",new A([1,1,1,-1,1,1,-1,-1,1,1,1,1,-1,-1,1,1,-1,1],3));b.computeBoundingSphere();this.add(new la(b,new da({color:a,opacity:.2,transparent:!0,depthWrite:!1})))}function Eb(a,b,c,d,e,f){D.call(this);void 0===d&&(d=16776960);void 0===c&&(c=1);void 0===e&&(e=.2*c);void 0===f&&(f=.2*e);void 0===Nd&&(Nd=new C,Nd.addAttribute("position",new A([0,0,0,0,1,0],3)),ye=new Wa(0,.5,1,5,1),ye.translate(0,-.5,0));this.position.copy(b);this.line=new sa(Nd,new Y({color:d}));
-this.line.matrixAutoUpdate=!1;this.add(this.line);this.cone=new la(ye,new da({color:d}));this.cone.matrixAutoUpdate=!1;this.add(this.cone);this.setDirection(a);this.setLength(c,e,f)}function ld(a){a=a||1;var b=[0,0,0,a,0,0,0,0,0,0,a,0,0,0,0,0,0,a];a=new C;a.addAttribute("position",new A(b,3));a.addAttribute("color",new A([1,0,0,1,.6,0,0,1,0,.6,1,0,0,0,1,0,.6,1],3));b=new Y({vertexColors:2});W.call(this,a,b)}function yf(a){console.warn("THREE.ClosedSplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");
-ca.call(this,a);this.type="catmullrom";this.closed=!0}function zf(a){console.warn("THREE.SplineCurve3 has been deprecated. Use THREE.CatmullRomCurve3 instead.");ca.call(this,a);this.type="catmullrom"}function ze(a){console.warn("THREE.Spline has been removed. Use THREE.CatmullRomCurve3 instead.");ca.call(this,a);this.type="catmullrom"}void 0===Number.EPSILON&&(Number.EPSILON=Math.pow(2,-52));void 0===Number.isInteger&&(Number.isInteger=function(a){return"number"===typeof a&&isFinite(a)&&Math.floor(a)===
-a});void 0===Math.sign&&(Math.sign=function(a){return 0>a?-1:0<a?1:+a});!1==="name"in Function.prototype&&Object.defineProperty(Function.prototype,"name",{get:function(){return this.toString().match(/^\s*function\s*([^\(\s]*)/)[1]}});void 0===Object.assign&&function(){Object.assign=function(a){if(void 0===a||null===a)throw new TypeError("Cannot convert undefined or null to object");for(var b=Object(a),c=1;c<arguments.length;c++){var d=arguments[c];if(void 0!==d&&null!==d)for(var e in d)Object.prototype.hasOwnProperty.call(d,
-e)&&(b[e]=d[e])}return b}}();Object.assign(ya.prototype,{addEventListener:function(a,b){void 0===this._listeners&&(this._listeners={});var c=this._listeners;void 0===c[a]&&(c[a]=[]);-1===c[a].indexOf(b)&&c[a].push(b)},hasEventListener:function(a,b){if(void 0===this._listeners)return!1;var c=this._listeners;return void 0!==c[a]&&-1!==c[a].indexOf(b)},removeEventListener:function(a,b){void 0!==this._listeners&&(a=this._listeners[a],void 0!==a&&(b=a.indexOf(b),-1!==b&&a.splice(b,1)))},dispatchEvent:function(a){if(void 0!==
-this._listeners){var b=this._listeners[a.type];if(void 0!==b){a.target=this;b=b.slice(0);for(var c=0,d=b.length;c<d;c++)b[c].call(this,a)}}}});var H={DEG2RAD:Math.PI/180,RAD2DEG:180/Math.PI,generateUUID:function(){for(var a=[],b=0;256>b;b++)a[b]=(16>b?"0":"")+b.toString(16);return function(){var b=4294967295*Math.random()|0,d=4294967295*Math.random()|0,e=4294967295*Math.random()|0,f=4294967295*Math.random()|0;return(a[b&255]+a[b>>8&255]+a[b>>16&255]+a[b>>24&255]+"-"+a[d&255]+a[d>>8&255]+"-"+a[d>>
-16&15|64]+a[d>>24&255]+"-"+a[e&63|128]+a[e>>8&255]+"-"+a[e>>16&255]+a[e>>24&255]+a[f&255]+a[f>>8&255]+a[f>>16&255]+a[f>>24&255]).toUpperCase()}}(),clamp:function(a,b,c){return Math.max(b,Math.min(c,a))},euclideanModulo:function(a,b){return(a%b+b)%b},mapLinear:function(a,b,c,d,e){return d+(a-b)*(e-d)/(c-b)},lerp:function(a,b,c){return(1-c)*a+c*b},smoothstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;a=(a-b)/(c-b);return a*a*(3-2*a)},smootherstep:function(a,b,c){if(a<=b)return 0;if(a>=c)return 1;
-a=(a-b)/(c-b);return a*a*a*(a*(6*a-15)+10)},randInt:function(a,b){return a+Math.floor(Math.random()*(b-a+1))},randFloat:function(a,b){return a+Math.random()*(b-a)},randFloatSpread:function(a){return a*(.5-Math.random())},degToRad:function(a){return a*H.DEG2RAD},radToDeg:function(a){return a*H.RAD2DEG},isPowerOfTwo:function(a){return 0===(a&a-1)&&0!==a},ceilPowerOfTwo:function(a){return Math.pow(2,Math.ceil(Math.log(a)/Math.LN2))},floorPowerOfTwo:function(a){return Math.pow(2,Math.floor(Math.log(a)/
-Math.LN2))}};Object.defineProperties(z.prototype,{width:{get:function(){return this.x},set:function(a){this.x=a}},height:{get:function(){return this.y},set:function(a){this.y=a}}});Object.assign(z.prototype,{isVector2:!0,set:function(a,b){this.x=a;this.y=b;return this},setScalar:function(a){this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;default:throw Error("index is out of range: "+
-a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y)},copy:function(a){this.x=a.x;this.y=a.y;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;return this},addScalar:function(a){this.x+=a;this.y+=a;return this},
-addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;return this},subScalar:function(a){this.x-=a;this.y-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;return this},multiply:function(a){this.x*=a.x;this.y*=
-a.y;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;return this},divide:function(a){this.x/=a.x;this.y/=a.y;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},applyMatrix3:function(a){var b=this.x,c=this.y;a=a.elements;this.x=a[0]*b+a[3]*c+a[6];this.y=a[1]*b+a[4]*c+a[7];return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);return this},clamp:function(a,
-b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));return this},clampScalar:function(){var a=new z,b=new z;return function(c,d){a.set(c,c);b.set(d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);return this},round:function(){this.x=
-Math.round(this.x);this.y=Math.round(this.y);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);return this},negate:function(){this.x=-this.x;this.y=-this.y;return this},dot:function(a){return this.x*a.x+this.y*a.y},cross:function(a){return this.x*a.y-this.y*a.x},lengthSq:function(){return this.x*this.x+this.y*this.y},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},manhattanLength:function(){return Math.abs(this.x)+
-Math.abs(this.y)},normalize:function(){return this.divideScalar(this.length()||1)},angle:function(){var a=Math.atan2(this.y,this.x);0>a&&(a+=2*Math.PI);return a},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x;a=this.y-a.y;return b*b+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-a.x)+Math.abs(this.y-a.y)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=
-(a.y-this.y)*b;return this},lerpVectors:function(a,b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);
-return this},rotateAround:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=this.x-a.x,e=this.y-a.y;this.x=d*c-e*b+a.x;this.y=d*b+e*c+a.y;return this}});Object.assign(I.prototype,{isMatrix4:!0,set:function(a,b,c,d,e,f,g,h,k,m,q,n,l,u,r,p){var t=this.elements;t[0]=a;t[4]=b;t[8]=c;t[12]=d;t[1]=e;t[5]=f;t[9]=g;t[13]=h;t[2]=k;t[6]=m;t[10]=q;t[14]=n;t[3]=l;t[7]=u;t[11]=r;t[15]=p;return this},identity:function(){this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);return this},clone:function(){return(new I).fromArray(this.elements)},
-copy:function(a){var b=this.elements;a=a.elements;b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];b[9]=a[9];b[10]=a[10];b[11]=a[11];b[12]=a[12];b[13]=a[13];b[14]=a[14];b[15]=a[15];return this},copyPosition:function(a){var b=this.elements;a=a.elements;b[12]=a[12];b[13]=a[13];b[14]=a[14];return this},extractBasis:function(a,b,c){a.setFromMatrixColumn(this,0);b.setFromMatrixColumn(this,1);c.setFromMatrixColumn(this,2);return this},makeBasis:function(a,b,c){this.set(a.x,
-b.x,c.x,0,a.y,b.y,c.y,0,a.z,b.z,c.z,0,0,0,0,1);return this},extractRotation:function(){var a=new p;return function(b){var c=this.elements,d=b.elements,e=1/a.setFromMatrixColumn(b,0).length(),f=1/a.setFromMatrixColumn(b,1).length();b=1/a.setFromMatrixColumn(b,2).length();c[0]=d[0]*e;c[1]=d[1]*e;c[2]=d[2]*e;c[3]=0;c[4]=d[4]*f;c[5]=d[5]*f;c[6]=d[6]*f;c[7]=0;c[8]=d[8]*b;c[9]=d[9]*b;c[10]=d[10]*b;c[11]=0;c[12]=0;c[13]=0;c[14]=0;c[15]=1;return this}}(),makeRotationFromEuler:function(a){a&&a.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");
-var b=this.elements,c=a.x,d=a.y,e=a.z,f=Math.cos(c);c=Math.sin(c);var g=Math.cos(d);d=Math.sin(d);var h=Math.cos(e);e=Math.sin(e);if("XYZ"===a.order){a=f*h;var k=f*e,m=c*h,q=c*e;b[0]=g*h;b[4]=-g*e;b[8]=d;b[1]=k+m*d;b[5]=a-q*d;b[9]=-c*g;b[2]=q-a*d;b[6]=m+k*d;b[10]=f*g}else"YXZ"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a+q*c,b[4]=m*c-k,b[8]=f*d,b[1]=f*e,b[5]=f*h,b[9]=-c,b[2]=k*c-m,b[6]=q+a*c,b[10]=f*g):"ZXY"===a.order?(a=g*h,k=g*e,m=d*h,q=d*e,b[0]=a-q*c,b[4]=-f*e,b[8]=m+k*c,b[1]=k+m*c,b[5]=f*h,b[9]=
-q-a*c,b[2]=-f*d,b[6]=c,b[10]=f*g):"ZYX"===a.order?(a=f*h,k=f*e,m=c*h,q=c*e,b[0]=g*h,b[4]=m*d-k,b[8]=a*d+q,b[1]=g*e,b[5]=q*d+a,b[9]=k*d-m,b[2]=-d,b[6]=c*g,b[10]=f*g):"YZX"===a.order?(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=q-a*e,b[8]=m*e+k,b[1]=e,b[5]=f*h,b[9]=-c*h,b[2]=-d*h,b[6]=k*e+m,b[10]=a-q*e):"XZY"===a.order&&(a=f*g,k=f*d,m=c*g,q=c*d,b[0]=g*h,b[4]=-e,b[8]=d*h,b[1]=a*e+q,b[5]=f*h,b[9]=k*e-m,b[2]=m*e-k,b[6]=c*h,b[10]=q*e+a);b[3]=0;b[7]=0;b[11]=0;b[12]=0;b[13]=0;b[14]=0;b[15]=1;return this},makeRotationFromQuaternion:function(){var a=
-new p(0,0,0),b=new p(1,1,1);return function(c){return this.compose(a,c,b)}}(),lookAt:function(){var a=new p,b=new p,c=new p;return function(d,e,f){var g=this.elements;c.subVectors(d,e);0===c.lengthSq()&&(c.z=1);c.normalize();a.crossVectors(f,c);0===a.lengthSq()&&(1===Math.abs(f.z)?c.x+=1E-4:c.z+=1E-4,c.normalize(),a.crossVectors(f,c));a.normalize();b.crossVectors(c,a);g[0]=a.x;g[4]=b.x;g[8]=c.x;g[1]=a.y;g[5]=b.y;g[9]=c.y;g[2]=a.z;g[6]=b.z;g[10]=c.z;return this}}(),multiply:function(a,b){return void 0!==
-b?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(a,b)):this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[4],f=c[8],g=c[12],h=c[1],k=c[5],m=c[9],q=c[13],n=c[2],l=c[6],u=c[10],r=c[14],p=c[3],y=c[7],x=c[11];c=c[15];var w=d[0],B=d[4],E=d[8],P=d[12],N=d[1],z=d[5],A=d[9],D=d[13],C=d[2],
-H=d[6],G=d[10],K=d[14],L=d[3],I=d[7],J=d[11];d=d[15];b[0]=a*w+e*N+f*C+g*L;b[4]=a*B+e*z+f*H+g*I;b[8]=a*E+e*A+f*G+g*J;b[12]=a*P+e*D+f*K+g*d;b[1]=h*w+k*N+m*C+q*L;b[5]=h*B+k*z+m*H+q*I;b[9]=h*E+k*A+m*G+q*J;b[13]=h*P+k*D+m*K+q*d;b[2]=n*w+l*N+u*C+r*L;b[6]=n*B+l*z+u*H+r*I;b[10]=n*E+l*A+u*G+r*J;b[14]=n*P+l*D+u*K+r*d;b[3]=p*w+y*N+x*C+c*L;b[7]=p*B+y*z+x*H+c*I;b[11]=p*E+y*A+x*G+c*J;b[15]=p*P+y*D+x*K+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[4]*=a;b[8]*=a;b[12]*=a;b[1]*=a;b[5]*=
-a;b[9]*=a;b[13]*=a;b[2]*=a;b[6]*=a;b[10]*=a;b[14]*=a;b[3]*=a;b[7]*=a;b[11]*=a;b[15]*=a;return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix4(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),determinant:function(){var a=this.elements,b=a[0],c=a[4],d=a[8],e=a[12],f=a[1],g=a[5],h=a[9],k=a[13],m=a[2],q=a[6],n=a[10],l=a[14];return a[3]*(+e*h*q-d*k*q-e*g*n+c*k*n+d*g*l-c*h*l)+a[7]*(+b*h*l-b*k*n+e*f*n-
-d*f*l+d*k*m-e*h*m)+a[11]*(+b*k*q-b*g*l-e*f*q+c*f*l+e*g*m-c*k*m)+a[15]*(-d*g*m-b*h*q+b*g*n+d*f*q-c*f*n+c*h*m)},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[4];a[4]=b;b=a[2];a[2]=a[8];a[8]=b;b=a[6];a[6]=a[9];a[9]=b;b=a[3];a[3]=a[12];a[12]=b;b=a[7];a[7]=a[13];a[13]=b;b=a[11];a[11]=a[14];a[14]=b;return this},setPosition:function(a){var b=this.elements;b[12]=a.x;b[13]=a.y;b[14]=a.z;return this},getInverse:function(a,b){var c=this.elements,d=a.elements;a=d[0];var e=d[1],f=d[2],g=d[3],h=d[4],
-k=d[5],m=d[6],q=d[7],n=d[8],l=d[9],u=d[10],r=d[11],p=d[12],y=d[13],x=d[14];d=d[15];var w=l*x*q-y*u*q+y*m*r-k*x*r-l*m*d+k*u*d,B=p*u*q-n*x*q-p*m*r+h*x*r+n*m*d-h*u*d,E=n*y*q-p*l*q+p*k*r-h*y*r-n*k*d+h*l*d,z=p*l*m-n*y*m-p*k*u+h*y*u+n*k*x-h*l*x,N=a*w+e*B+f*E+g*z;if(0===N){if(!0===b)throw Error("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");console.warn("THREE.Matrix4: .getInverse() can't invert matrix, determinant is 0");return this.identity()}b=1/N;c[0]=w*b;c[1]=(y*u*g-l*x*g-y*f*
-r+e*x*r+l*f*d-e*u*d)*b;c[2]=(k*x*g-y*m*g+y*f*q-e*x*q-k*f*d+e*m*d)*b;c[3]=(l*m*g-k*u*g-l*f*q+e*u*q+k*f*r-e*m*r)*b;c[4]=B*b;c[5]=(n*x*g-p*u*g+p*f*r-a*x*r-n*f*d+a*u*d)*b;c[6]=(p*m*g-h*x*g-p*f*q+a*x*q+h*f*d-a*m*d)*b;c[7]=(h*u*g-n*m*g+n*f*q-a*u*q-h*f*r+a*m*r)*b;c[8]=E*b;c[9]=(p*l*g-n*y*g-p*e*r+a*y*r+n*e*d-a*l*d)*b;c[10]=(h*y*g-p*k*g+p*e*q-a*y*q-h*e*d+a*k*d)*b;c[11]=(n*k*g-h*l*g-n*e*q+a*l*q+h*e*r-a*k*r)*b;c[12]=z*b;c[13]=(n*y*f-p*l*f+p*e*u-a*y*u-n*e*x+a*l*x)*b;c[14]=(p*k*f-h*y*f-p*e*m+a*y*m+h*e*x-a*k*x)*
-b;c[15]=(h*l*f-n*k*f+n*e*m-a*l*m-h*e*u+a*k*u)*b;return this},scale:function(a){var b=this.elements,c=a.x,d=a.y;a=a.z;b[0]*=c;b[4]*=d;b[8]*=a;b[1]*=c;b[5]*=d;b[9]*=a;b[2]*=c;b[6]*=d;b[10]*=a;b[3]*=c;b[7]*=d;b[11]*=a;return this},getMaxScaleOnAxis:function(){var a=this.elements;return Math.sqrt(Math.max(a[0]*a[0]+a[1]*a[1]+a[2]*a[2],a[4]*a[4]+a[5]*a[5]+a[6]*a[6],a[8]*a[8]+a[9]*a[9]+a[10]*a[10]))},makeTranslation:function(a,b,c){this.set(1,0,0,a,0,1,0,b,0,0,1,c,0,0,0,1);return this},makeRotationX:function(a){var b=
-Math.cos(a);a=Math.sin(a);this.set(1,0,0,0,0,b,-a,0,0,a,b,0,0,0,0,1);return this},makeRotationY:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,0,a,0,0,1,0,0,-a,0,b,0,0,0,0,1);return this},makeRotationZ:function(a){var b=Math.cos(a);a=Math.sin(a);this.set(b,-a,0,0,a,b,0,0,0,0,1,0,0,0,0,1);return this},makeRotationAxis:function(a,b){var c=Math.cos(b);b=Math.sin(b);var d=1-c,e=a.x,f=a.y;a=a.z;var g=d*e,h=d*f;this.set(g*e+c,g*f-b*a,g*a+b*f,0,g*f+b*a,h*f+c,h*a-b*e,0,g*a-b*f,h*a+b*e,d*a*a+c,0,0,
-0,0,1);return this},makeScale:function(a,b,c){this.set(a,0,0,0,0,b,0,0,0,0,c,0,0,0,0,1);return this},makeShear:function(a,b,c){this.set(1,b,c,0,a,1,c,0,a,b,1,0,0,0,0,1);return this},compose:function(a,b,c){var d=this.elements,e=b._x,f=b._y,g=b._z,h=b._w,k=e+e,m=f+f,q=g+g;b=e*k;var l=e*m;e*=q;var t=f*m;f*=q;g*=q;k*=h;m*=h;h*=q;q=c.x;var u=c.y;c=c.z;d[0]=(1-(t+g))*q;d[1]=(l+h)*q;d[2]=(e-m)*q;d[3]=0;d[4]=(l-h)*u;d[5]=(1-(b+g))*u;d[6]=(f+k)*u;d[7]=0;d[8]=(e+m)*c;d[9]=(f-k)*c;d[10]=(1-(b+t))*c;d[11]=0;
-d[12]=a.x;d[13]=a.y;d[14]=a.z;d[15]=1;return this},decompose:function(){var a=new p,b=new I;return function(c,d,e){var f=this.elements,g=a.set(f[0],f[1],f[2]).length(),h=a.set(f[4],f[5],f[6]).length(),k=a.set(f[8],f[9],f[10]).length();0>this.determinant()&&(g=-g);c.x=f[12];c.y=f[13];c.z=f[14];b.copy(this);c=1/g;f=1/h;var m=1/k;b.elements[0]*=c;b.elements[1]*=c;b.elements[2]*=c;b.elements[4]*=f;b.elements[5]*=f;b.elements[6]*=f;b.elements[8]*=m;b.elements[9]*=m;b.elements[10]*=m;d.setFromRotationMatrix(b);
-e.x=g;e.y=h;e.z=k;return this}}(),makePerspective:function(a,b,c,d,e,f){void 0===f&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");var g=this.elements;g[0]=2*e/(b-a);g[4]=0;g[8]=(b+a)/(b-a);g[12]=0;g[1]=0;g[5]=2*e/(c-d);g[9]=(c+d)/(c-d);g[13]=0;g[2]=0;g[6]=0;g[10]=-(f+e)/(f-e);g[14]=-2*f*e/(f-e);g[3]=0;g[7]=0;g[11]=-1;g[15]=0;return this},makeOrthographic:function(a,b,c,d,e,f){var g=this.elements,h=1/(b-a),k=1/(c-d),m=1/(f-e);g[0]=
-2*h;g[4]=0;g[8]=0;g[12]=-((b+a)*h);g[1]=0;g[5]=2*k;g[9]=0;g[13]=-((c+d)*k);g[2]=0;g[6]=0;g[10]=-2*m;g[14]=-((f+e)*m);g[3]=0;g[7]=0;g[11]=0;g[15]=1;return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;16>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;16>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];
-a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];a[b+9]=c[9];a[b+10]=c[10];a[b+11]=c[11];a[b+12]=c[12];a[b+13]=c[13];a[b+14]=c[14];a[b+15]=c[15];return a}});Object.assign(fa,{slerp:function(a,b,c,d){return c.copy(a).slerp(b,d)},slerpFlat:function(a,b,c,d,e,f,g){var h=c[d+0],k=c[d+1],m=c[d+2];c=c[d+3];d=e[f+0];var q=e[f+1],l=e[f+2];e=e[f+3];if(c!==e||h!==d||k!==q||m!==l){f=1-g;var t=h*d+k*q+m*l+c*e,u=0<=t?1:-1,r=1-t*t;r>Number.EPSILON&&(r=Math.sqrt(r),t=Math.atan2(r,t*u),f=Math.sin(f*t)/r,g=Math.sin(g*
-t)/r);u*=g;h=h*f+d*u;k=k*f+q*u;m=m*f+l*u;c=c*f+e*u;f===1-g&&(g=1/Math.sqrt(h*h+k*k+m*m+c*c),h*=g,k*=g,m*=g,c*=g)}a[b]=h;a[b+1]=k;a[b+2]=m;a[b+3]=c}});Object.defineProperties(fa.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},w:{get:function(){return this._w},set:function(a){this._w=
-a;this.onChangeCallback()}}});Object.assign(fa.prototype,{set:function(a,b,c,d){this._x=a;this._y=b;this._z=c;this._w=d;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._w)},copy:function(a){this._x=a.x;this._y=a.y;this._z=a.z;this._w=a.w;this.onChangeCallback();return this},setFromEuler:function(a,b){if(!a||!a.isEuler)throw Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");var c=
-a._x,d=a._y,e=a._z;a=a.order;var f=Math.cos,g=Math.sin,h=f(c/2),k=f(d/2);f=f(e/2);c=g(c/2);d=g(d/2);e=g(e/2);"XYZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"YXZ"===a?(this._x=c*k*f+h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"ZXY"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f-c*d*e):"ZYX"===a?(this._x=c*k*f-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f+c*d*e):"YZX"===a?(this._x=c*k*f+
-h*d*e,this._y=h*d*f+c*k*e,this._z=h*k*e-c*d*f,this._w=h*k*f-c*d*e):"XZY"===a&&(this._x=c*k*f-h*d*e,this._y=h*d*f-c*k*e,this._z=h*k*e+c*d*f,this._w=h*k*f+c*d*e);if(!1!==b)this.onChangeCallback();return this},setFromAxisAngle:function(a,b){b/=2;var c=Math.sin(b);this._x=a.x*c;this._y=a.y*c;this._z=a.z*c;this._w=Math.cos(b);this.onChangeCallback();return this},setFromRotationMatrix:function(a){var b=a.elements,c=b[0];a=b[4];var d=b[8],e=b[1],f=b[5],g=b[9],h=b[2],k=b[6];b=b[10];var m=c+f+b;0<m?(c=.5/
-Math.sqrt(m+1),this._w=.25/c,this._x=(k-g)*c,this._y=(d-h)*c,this._z=(e-a)*c):c>f&&c>b?(c=2*Math.sqrt(1+c-f-b),this._w=(k-g)/c,this._x=.25*c,this._y=(a+e)/c,this._z=(d+h)/c):f>b?(c=2*Math.sqrt(1+f-c-b),this._w=(d-h)/c,this._x=(a+e)/c,this._y=.25*c,this._z=(g+k)/c):(c=2*Math.sqrt(1+b-c-f),this._w=(e-a)/c,this._x=(d+h)/c,this._y=(g+k)/c,this._z=.25*c);this.onChangeCallback();return this},setFromUnitVectors:function(){var a=new p,b;return function(c,d){void 0===a&&(a=new p);b=c.dot(d)+1;1E-6>b?(b=0,
-Math.abs(c.x)>Math.abs(c.z)?a.set(-c.y,c.x,0):a.set(0,-c.z,c.y)):a.crossVectors(c,d);this._x=a.x;this._y=a.y;this._z=a.z;this._w=b;return this.normalize()}}(),angleTo:function(a){return 2*Math.acos(Math.abs(H.clamp(this.dot(a),-1,1)))},rotateTowards:function(a,b){var c=this.angleTo(a);if(0===c)return this;this.slerp(a,Math.min(1,b/c));return this},inverse:function(){return this.conjugate()},conjugate:function(){this._x*=-1;this._y*=-1;this._z*=-1;this.onChangeCallback();return this},dot:function(a){return this._x*
-a._x+this._y*a._y+this._z*a._z+this._w*a._w},lengthSq:function(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w},length:function(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)},normalize:function(){var a=this.length();0===a?(this._z=this._y=this._x=0,this._w=1):(a=1/a,this._x*=a,this._y*=a,this._z*=a,this._w*=a);this.onChangeCallback();return this},multiply:function(a,b){return void 0!==b?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),
-this.multiplyQuaternions(a,b)):this.multiplyQuaternions(this,a)},premultiply:function(a){return this.multiplyQuaternions(a,this)},multiplyQuaternions:function(a,b){var c=a._x,d=a._y,e=a._z;a=a._w;var f=b._x,g=b._y,h=b._z;b=b._w;this._x=c*b+a*f+d*h-e*g;this._y=d*b+a*g+e*f-c*h;this._z=e*b+a*h+c*g-d*f;this._w=a*b-c*f-d*g-e*h;this.onChangeCallback();return this},slerp:function(a,b){if(0===b)return this;if(1===b)return this.copy(a);var c=this._x,d=this._y,e=this._z,f=this._w,g=f*a._w+c*a._x+d*a._y+e*a._z;
-0>g?(this._w=-a._w,this._x=-a._x,this._y=-a._y,this._z=-a._z,g=-g):this.copy(a);if(1<=g)return this._w=f,this._x=c,this._y=d,this._z=e,this;a=1-g*g;if(a<=Number.EPSILON)return g=1-b,this._w=g*f+b*this._w,this._x=g*c+b*this._x,this._y=g*d+b*this._y,this._z=g*e+b*this._z,this.normalize();a=Math.sqrt(a);var h=Math.atan2(a,g);g=Math.sin((1-b)*h)/a;b=Math.sin(b*h)/a;this._w=f*g+this._w*b;this._x=c*g+this._x*b;this._y=d*g+this._y*b;this._z=e*g+this._z*b;this.onChangeCallback();return this},equals:function(a){return a._x===
-this._x&&a._y===this._y&&a._z===this._z&&a._w===this._w},fromArray:function(a,b){void 0===b&&(b=0);this._x=a[b];this._y=a[b+1];this._z=a[b+2];this._w=a[b+3];this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._w;return a},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(p.prototype,{isVector3:!0,set:function(a,b,c){this.x=a;this.y=b;this.z=c;return this},
-setScalar:function(a){this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,
-this.y,this.z)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;return this},addScalar:function(a){this.x+=a;this.y+=a;this.z+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=
-a.z*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;return this},subScalar:function(a){this.x-=a;this.y-=a;this.z-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;return this},multiply:function(a,b){if(void 0!==b)return console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),
-this.multiplyVectors(a,b);this.x*=a.x;this.y*=a.y;this.z*=a.z;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;return this},multiplyVectors:function(a,b){this.x=a.x*b.x;this.y=a.y*b.y;this.z=a.z*b.z;return this},applyEuler:function(){var a=new fa;return function(b){b&&b.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order.");return this.applyQuaternion(a.setFromEuler(b))}}(),applyAxisAngle:function(){var a=new fa;return function(b,
-c){return this.applyQuaternion(a.setFromAxisAngle(b,c))}}(),applyMatrix3:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[3]*c+a[6]*d;this.y=a[1]*b+a[4]*c+a[7]*d;this.z=a[2]*b+a[5]*c+a[8]*d;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z;a=a.elements;var e=1/(a[3]*b+a[7]*c+a[11]*d+a[15]);this.x=(a[0]*b+a[4]*c+a[8]*d+a[12])*e;this.y=(a[1]*b+a[5]*c+a[9]*d+a[13])*e;this.z=(a[2]*b+a[6]*c+a[10]*d+a[14])*e;return this},applyQuaternion:function(a){var b=this.x,
-c=this.y,d=this.z,e=a.x,f=a.y,g=a.z;a=a.w;var h=a*b+f*d-g*c,k=a*c+g*b-e*d,m=a*d+e*c-f*b;b=-e*b-f*c-g*d;this.x=h*a+b*-e+k*-g-m*-f;this.y=k*a+b*-f+m*-e-h*-g;this.z=m*a+b*-g+h*-f-k*-e;return this},project:function(){var a=new I;return function(b){a.multiplyMatrices(b.projectionMatrix,a.getInverse(b.matrixWorld));return this.applyMatrix4(a)}}(),unproject:function(){var a=new I;return function(b){a.multiplyMatrices(b.matrixWorld,a.getInverse(b.projectionMatrix));return this.applyMatrix4(a)}}(),transformDirection:function(a){var b=
-this.x,c=this.y,d=this.z;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d;this.y=a[1]*b+a[5]*c+a[9]*d;this.z=a[2]*b+a[6]*c+a[10]*d;return this.normalize()},divide:function(a){this.x/=a.x;this.y/=a.y;this.z/=a.z;return this},divideScalar:function(a){return this.multiplyScalar(1/a)},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,a.y);this.z=Math.min(this.z,a.z);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);return this},clamp:function(a,
-b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));return this},clampScalar:function(){var a=new p,b=new p;return function(c,d){a.set(c,c,c);b.set(d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);return this},ceil:function(){this.x=
-Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);this.z=Math.round(this.z);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;return this},dot:function(a){return this.x*a.x+this.y*
-a.y+this.z*a.z},lengthSq:function(){return this.x*this.x+this.y*this.y+this.z*this.z},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;return this},lerpVectors:function(a,
-b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},cross:function(a,b){return void 0!==b?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(a,b)):this.crossVectors(this,a)},crossVectors:function(a,b){var c=a.x,d=a.y;a=a.z;var e=b.x,f=b.y;b=b.z;this.x=d*b-a*f;this.y=a*e-c*b;this.z=c*f-d*e;return this},projectOnVector:function(a){var b=a.dot(this)/a.lengthSq();return this.copy(a).multiplyScalar(b)},projectOnPlane:function(){var a=
-new p;return function(b){a.copy(this).projectOnVector(b);return this.sub(a)}}(),reflect:function(){var a=new p;return function(b){return this.sub(a.copy(b).multiplyScalar(2*this.dot(b)))}}(),angleTo:function(a){a=this.dot(a)/Math.sqrt(this.lengthSq()*a.lengthSq());return Math.acos(H.clamp(a,-1,1))},distanceTo:function(a){return Math.sqrt(this.distanceToSquared(a))},distanceToSquared:function(a){var b=this.x-a.x,c=this.y-a.y;a=this.z-a.z;return b*b+c*c+a*a},manhattanDistanceTo:function(a){return Math.abs(this.x-
-a.x)+Math.abs(this.y-a.y)+Math.abs(this.z-a.z)},setFromSpherical:function(a){var b=Math.sin(a.phi)*a.radius;this.x=b*Math.sin(a.theta);this.y=Math.cos(a.phi)*a.radius;this.z=b*Math.cos(a.theta);return this},setFromCylindrical:function(a){this.x=a.radius*Math.sin(a.theta);this.y=a.y;this.z=a.radius*Math.cos(a.theta);return this},setFromMatrixPosition:function(a){a=a.elements;this.x=a[12];this.y=a[13];this.z=a[14];return this},setFromMatrixScale:function(a){var b=this.setFromMatrixColumn(a,0).length(),
-c=this.setFromMatrixColumn(a,1).length();a=this.setFromMatrixColumn(a,2).length();this.x=b;this.y=c;this.z=a;return this},setFromMatrixColumn:function(a,b){return this.fromArray(a.elements,4*b)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;return a},fromBufferAttribute:function(a,b,c){void 0!==
-c&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute().");this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);return this}});Object.assign(ra.prototype,{isMatrix3:!0,set:function(a,b,c,d,e,f,g,h,k){var m=this.elements;m[0]=a;m[1]=d;m[2]=g;m[3]=b;m[4]=e;m[5]=h;m[6]=c;m[7]=f;m[8]=k;return this},identity:function(){this.set(1,0,0,0,1,0,0,0,1);return this},clone:function(){return(new this.constructor).fromArray(this.elements)},copy:function(a){var b=this.elements;a=a.elements;
-b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];b[5]=a[5];b[6]=a[6];b[7]=a[7];b[8]=a[8];return this},setFromMatrix4:function(a){a=a.elements;this.set(a[0],a[4],a[8],a[1],a[5],a[9],a[2],a[6],a[10]);return this},applyToBufferAttribute:function(){var a=new p;return function(b){for(var c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.applyMatrix3(this),b.setXYZ(c,a.x,a.y,a.z);return b}}(),multiply:function(a){return this.multiplyMatrices(this,a)},premultiply:function(a){return this.multiplyMatrices(a,
-this)},multiplyMatrices:function(a,b){var c=a.elements,d=b.elements;b=this.elements;a=c[0];var e=c[3],f=c[6],g=c[1],h=c[4],k=c[7],m=c[2],q=c[5];c=c[8];var l=d[0],t=d[3],u=d[6],r=d[1],p=d[4],y=d[7],x=d[2],w=d[5];d=d[8];b[0]=a*l+e*r+f*x;b[3]=a*t+e*p+f*w;b[6]=a*u+e*y+f*d;b[1]=g*l+h*r+k*x;b[4]=g*t+h*p+k*w;b[7]=g*u+h*y+k*d;b[2]=m*l+q*r+c*x;b[5]=m*t+q*p+c*w;b[8]=m*u+q*y+c*d;return this},multiplyScalar:function(a){var b=this.elements;b[0]*=a;b[3]*=a;b[6]*=a;b[1]*=a;b[4]*=a;b[7]*=a;b[2]*=a;b[5]*=a;b[8]*=
-a;return this},determinant:function(){var a=this.elements,b=a[0],c=a[1],d=a[2],e=a[3],f=a[4],g=a[5],h=a[6],k=a[7];a=a[8];return b*f*a-b*g*k-c*e*a+c*g*h+d*e*k-d*f*h},getInverse:function(a,b){a&&a.isMatrix4&&console.error("THREE.Matrix3: .getInverse() no longer takes a Matrix4 argument.");var c=a.elements;a=this.elements;var d=c[0],e=c[1],f=c[2],g=c[3],h=c[4],k=c[5],m=c[6],q=c[7];c=c[8];var l=c*h-k*q,t=k*m-c*g,u=q*g-h*m,r=d*l+e*t+f*u;if(0===r){if(!0===b)throw Error("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");
-console.warn("THREE.Matrix3: .getInverse() can't invert matrix, determinant is 0");return this.identity()}b=1/r;a[0]=l*b;a[1]=(f*q-c*e)*b;a[2]=(k*e-f*h)*b;a[3]=t*b;a[4]=(c*d-f*m)*b;a[5]=(f*g-k*d)*b;a[6]=u*b;a[7]=(e*m-q*d)*b;a[8]=(h*d-e*g)*b;return this},transpose:function(){var a=this.elements;var b=a[1];a[1]=a[3];a[3]=b;b=a[2];a[2]=a[6];a[6]=b;b=a[5];a[5]=a[7];a[7]=b;return this},getNormalMatrix:function(a){return this.setFromMatrix4(a).getInverse(this).transpose()},transposeIntoArray:function(a){var b=
-this.elements;a[0]=b[0];a[1]=b[3];a[2]=b[6];a[3]=b[1];a[4]=b[4];a[5]=b[7];a[6]=b[2];a[7]=b[5];a[8]=b[8];return this},setUvTransform:function(a,b,c,d,e,f,g){var h=Math.cos(e);e=Math.sin(e);this.set(c*h,c*e,-c*(h*f+e*g)+f+a,-d*e,d*h,-d*(-e*f+h*g)+g+b,0,0,1)},scale:function(a,b){var c=this.elements;c[0]*=a;c[3]*=a;c[6]*=a;c[1]*=b;c[4]*=b;c[7]*=b;return this},rotate:function(a){var b=Math.cos(a);a=Math.sin(a);var c=this.elements,d=c[0],e=c[3],f=c[6],g=c[1],h=c[4],k=c[7];c[0]=b*d+a*g;c[3]=b*e+a*h;c[6]=
-b*f+a*k;c[1]=-a*d+b*g;c[4]=-a*e+b*h;c[7]=-a*f+b*k;return this},translate:function(a,b){var c=this.elements;c[0]+=a*c[2];c[3]+=a*c[5];c[6]+=a*c[8];c[1]+=b*c[2];c[4]+=b*c[5];c[7]+=b*c[8];return this},equals:function(a){var b=this.elements;a=a.elements;for(var c=0;9>c;c++)if(b[c]!==a[c])return!1;return!0},fromArray:function(a,b){void 0===b&&(b=0);for(var c=0;9>c;c++)this.elements[c]=a[c+b];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);var c=this.elements;a[b]=c[0];a[b+1]=c[1];
-a[b+2]=c[2];a[b+3]=c[3];a[b+4]=c[4];a[b+5]=c[5];a[b+6]=c[6];a[b+7]=c[7];a[b+8]=c[8];return a}});var eb={getDataURL:function(a){if(a instanceof HTMLCanvasElement)var b=a;else{"undefined"!==typeof OffscreenCanvas?b=new OffscreenCanvas(a.width,a.height):(b=document.createElementNS("http://www.w3.org/1999/xhtml","canvas"),b.width=a.width,b.height=a.height);var c=b.getContext("2d");a instanceof ImageData?c.putImageData(a,0,0):c.drawImage(a,0,0,a.width,a.height)}return 2048<b.width||2048<b.height?b.toDataURL("image/jpeg",
-.6):b.toDataURL("image/png")}},Ef=0;T.DEFAULT_IMAGE=void 0;T.DEFAULT_MAPPING=300;T.prototype=Object.assign(Object.create(ya.prototype),{constructor:T,isTexture:!0,updateMatrix:function(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.image=a.image;this.mipmaps=a.mipmaps.slice(0);this.mapping=a.mapping;this.wrapS=a.wrapS;this.wrapT=
-a.wrapT;this.magFilter=a.magFilter;this.minFilter=a.minFilter;this.anisotropy=a.anisotropy;this.format=a.format;this.type=a.type;this.offset.copy(a.offset);this.repeat.copy(a.repeat);this.center.copy(a.center);this.rotation=a.rotation;this.matrixAutoUpdate=a.matrixAutoUpdate;this.matrix.copy(a.matrix);this.generateMipmaps=a.generateMipmaps;this.premultiplyAlpha=a.premultiplyAlpha;this.flipY=a.flipY;this.unpackAlignment=a.unpackAlignment;this.encoding=a.encoding;return this},toJSON:function(a){var b=
-void 0===a||"string"===typeof a;if(!b&&void 0!==a.textures[this.uuid])return a.textures[this.uuid];var c={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY};if(void 0!==
-this.image){var d=this.image;void 0===d.uuid&&(d.uuid=H.generateUUID());if(!b&&void 0===a.images[d.uuid]){if(Array.isArray(d)){var e=[];for(var f=0,g=d.length;f<g;f++)e.push(eb.getDataURL(d[f]))}else e=eb.getDataURL(d);a.images[d.uuid]={uuid:d.uuid,url:e}}c.image=d.uuid}b||(a.textures[this.uuid]=c);return c},dispose:function(){this.dispatchEvent({type:"dispose"})},transformUv:function(a){if(300===this.mapping){a.applyMatrix3(this.matrix);if(0>a.x||1<a.x)switch(this.wrapS){case 1E3:a.x-=Math.floor(a.x);
-break;case 1001:a.x=0>a.x?0:1;break;case 1002:a.x=1===Math.abs(Math.floor(a.x)%2)?Math.ceil(a.x)-a.x:a.x-Math.floor(a.x)}if(0>a.y||1<a.y)switch(this.wrapT){case 1E3:a.y-=Math.floor(a.y);break;case 1001:a.y=0>a.y?0:1;break;case 1002:a.y=1===Math.abs(Math.floor(a.y)%2)?Math.ceil(a.y)-a.y:a.y-Math.floor(a.y)}this.flipY&&(a.y=1-a.y)}}});Object.defineProperty(T.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(V.prototype,{isVector4:!0,set:function(a,b,c,d){this.x=a;this.y=
-b;this.z=c;this.w=d;return this},setScalar:function(a){this.w=this.z=this.y=this.x=a;return this},setX:function(a){this.x=a;return this},setY:function(a){this.y=a;return this},setZ:function(a){this.z=a;return this},setW:function(a){this.w=a;return this},setComponent:function(a,b){switch(a){case 0:this.x=b;break;case 1:this.y=b;break;case 2:this.z=b;break;case 3:this.w=b;break;default:throw Error("index is out of range: "+a);}return this},getComponent:function(a){switch(a){case 0:return this.x;case 1:return this.y;
-case 2:return this.z;case 3:return this.w;default:throw Error("index is out of range: "+a);}},clone:function(){return new this.constructor(this.x,this.y,this.z,this.w)},copy:function(a){this.x=a.x;this.y=a.y;this.z=a.z;this.w=void 0!==a.w?a.w:1;return this},add:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(a,b);this.x+=a.x;this.y+=a.y;this.z+=a.z;this.w+=a.w;return this},addScalar:function(a){this.x+=
-a;this.y+=a;this.z+=a;this.w+=a;return this},addVectors:function(a,b){this.x=a.x+b.x;this.y=a.y+b.y;this.z=a.z+b.z;this.w=a.w+b.w;return this},addScaledVector:function(a,b){this.x+=a.x*b;this.y+=a.y*b;this.z+=a.z*b;this.w+=a.w*b;return this},sub:function(a,b){if(void 0!==b)return console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(a,b);this.x-=a.x;this.y-=a.y;this.z-=a.z;this.w-=a.w;return this},subScalar:function(a){this.x-=a;this.y-=
-a;this.z-=a;this.w-=a;return this},subVectors:function(a,b){this.x=a.x-b.x;this.y=a.y-b.y;this.z=a.z-b.z;this.w=a.w-b.w;return this},multiplyScalar:function(a){this.x*=a;this.y*=a;this.z*=a;this.w*=a;return this},applyMatrix4:function(a){var b=this.x,c=this.y,d=this.z,e=this.w;a=a.elements;this.x=a[0]*b+a[4]*c+a[8]*d+a[12]*e;this.y=a[1]*b+a[5]*c+a[9]*d+a[13]*e;this.z=a[2]*b+a[6]*c+a[10]*d+a[14]*e;this.w=a[3]*b+a[7]*c+a[11]*d+a[15]*e;return this},divideScalar:function(a){return this.multiplyScalar(1/
-a)},setAxisAngleFromQuaternion:function(a){this.w=2*Math.acos(a.w);var b=Math.sqrt(1-a.w*a.w);1E-4>b?(this.x=1,this.z=this.y=0):(this.x=a.x/b,this.y=a.y/b,this.z=a.z/b);return this},setAxisAngleFromRotationMatrix:function(a){a=a.elements;var b=a[0];var c=a[4];var d=a[8],e=a[1],f=a[5],g=a[9];var h=a[2];var k=a[6];var m=a[10];if(.01>Math.abs(c-e)&&.01>Math.abs(d-h)&&.01>Math.abs(g-k)){if(.1>Math.abs(c+e)&&.1>Math.abs(d+h)&&.1>Math.abs(g+k)&&.1>Math.abs(b+f+m-3))return this.set(1,0,0,0),this;a=Math.PI;
-b=(b+1)/2;f=(f+1)/2;m=(m+1)/2;c=(c+e)/4;d=(d+h)/4;g=(g+k)/4;b>f&&b>m?.01>b?(k=0,c=h=.707106781):(k=Math.sqrt(b),h=c/k,c=d/k):f>m?.01>f?(k=.707106781,h=0,c=.707106781):(h=Math.sqrt(f),k=c/h,c=g/h):.01>m?(h=k=.707106781,c=0):(c=Math.sqrt(m),k=d/c,h=g/c);this.set(k,h,c,a);return this}a=Math.sqrt((k-g)*(k-g)+(d-h)*(d-h)+(e-c)*(e-c));.001>Math.abs(a)&&(a=1);this.x=(k-g)/a;this.y=(d-h)/a;this.z=(e-c)/a;this.w=Math.acos((b+f+m-1)/2);return this},min:function(a){this.x=Math.min(this.x,a.x);this.y=Math.min(this.y,
-a.y);this.z=Math.min(this.z,a.z);this.w=Math.min(this.w,a.w);return this},max:function(a){this.x=Math.max(this.x,a.x);this.y=Math.max(this.y,a.y);this.z=Math.max(this.z,a.z);this.w=Math.max(this.w,a.w);return this},clamp:function(a,b){this.x=Math.max(a.x,Math.min(b.x,this.x));this.y=Math.max(a.y,Math.min(b.y,this.y));this.z=Math.max(a.z,Math.min(b.z,this.z));this.w=Math.max(a.w,Math.min(b.w,this.w));return this},clampScalar:function(){var a,b;return function(c,d){void 0===a&&(a=new V,b=new V);a.set(c,
-c,c,c);b.set(d,d,d,d);return this.clamp(a,b)}}(),clampLength:function(a,b){var c=this.length();return this.divideScalar(c||1).multiplyScalar(Math.max(a,Math.min(b,c)))},floor:function(){this.x=Math.floor(this.x);this.y=Math.floor(this.y);this.z=Math.floor(this.z);this.w=Math.floor(this.w);return this},ceil:function(){this.x=Math.ceil(this.x);this.y=Math.ceil(this.y);this.z=Math.ceil(this.z);this.w=Math.ceil(this.w);return this},round:function(){this.x=Math.round(this.x);this.y=Math.round(this.y);
-this.z=Math.round(this.z);this.w=Math.round(this.w);return this},roundToZero:function(){this.x=0>this.x?Math.ceil(this.x):Math.floor(this.x);this.y=0>this.y?Math.ceil(this.y):Math.floor(this.y);this.z=0>this.z?Math.ceil(this.z):Math.floor(this.z);this.w=0>this.w?Math.ceil(this.w):Math.floor(this.w);return this},negate:function(){this.x=-this.x;this.y=-this.y;this.z=-this.z;this.w=-this.w;return this},dot:function(a){return this.x*a.x+this.y*a.y+this.z*a.z+this.w*a.w},lengthSq:function(){return this.x*
-this.x+this.y*this.y+this.z*this.z+this.w*this.w},length:function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)},manhattanLength:function(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)},normalize:function(){return this.divideScalar(this.length()||1)},setLength:function(a){return this.normalize().multiplyScalar(a)},lerp:function(a,b){this.x+=(a.x-this.x)*b;this.y+=(a.y-this.y)*b;this.z+=(a.z-this.z)*b;this.w+=(a.w-this.w)*b;return this},lerpVectors:function(a,
-b,c){return this.subVectors(b,a).multiplyScalar(c).add(a)},equals:function(a){return a.x===this.x&&a.y===this.y&&a.z===this.z&&a.w===this.w},fromArray:function(a,b){void 0===b&&(b=0);this.x=a[b];this.y=a[b+1];this.z=a[b+2];this.w=a[b+3];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.x;a[b+1]=this.y;a[b+2]=this.z;a[b+3]=this.w;return a},fromBufferAttribute:function(a,b,c){void 0!==c&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute().");
-this.x=a.getX(b);this.y=a.getY(b);this.z=a.getZ(b);this.w=a.getW(b);return this}});fb.prototype=Object.assign(Object.create(ya.prototype),{constructor:fb,isWebGLRenderTarget:!0,setSize:function(a,b){if(this.width!==a||this.height!==b)this.width=a,this.height=b,this.dispose();this.viewport.set(0,0,a,b);this.scissor.set(0,0,a,b)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.width=a.width;this.height=a.height;this.viewport.copy(a.viewport);this.texture=a.texture.clone();
-this.depthBuffer=a.depthBuffer;this.stencilBuffer=a.stencilBuffer;this.depthTexture=a.depthTexture;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Gb.prototype=Object.create(fb.prototype);Gb.prototype.constructor=Gb;Gb.prototype.isWebGLRenderTargetCube=!0;gb.prototype=Object.create(T.prototype);gb.prototype.constructor=gb;gb.prototype.isDataTexture=!0;Object.assign(Sa.prototype,{isBox3:!0,set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromArray:function(a){for(var b=
-Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.length;h<k;h+=3){var m=a[h],q=a[h+1],l=a[h+2];m<b&&(b=m);q<c&&(c=q);l<d&&(d=l);m>e&&(e=m);q>f&&(f=q);l>g&&(g=l)}this.min.set(b,c,d);this.max.set(e,f,g);return this},setFromBufferAttribute:function(a){for(var b=Infinity,c=Infinity,d=Infinity,e=-Infinity,f=-Infinity,g=-Infinity,h=0,k=a.count;h<k;h++){var m=a.getX(h),l=a.getY(h),n=a.getZ(h);m<b&&(b=m);l<c&&(c=l);n<d&&(d=n);m>e&&(e=m);l>f&&(f=l);n>g&&(g=n)}this.min.set(b,c,d);
-this.max.set(e,f,g);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new p;return function(b,c){c=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(c);this.max.copy(b).add(c);return this}}(),setFromObject:function(a){this.makeEmpty();return this.expandByObject(a)},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);this.max.copy(a.max);return this},
-makeEmpty:function(){this.min.x=this.min.y=this.min.z=Infinity;this.max.x=this.max.y=this.max.z=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z},getCenter:function(a){void 0===a&&(console.warn("THREE.Box3: .getCenter() target is now required"),a=new p);return this.isEmpty()?a.set(0,0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box3: .getSize() target is now required"),
-a=new p);return this.isEmpty()?a.set(0,0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},expandByObject:function(){function a(a){var f=a.geometry;if(void 0!==f)if(f.isGeometry)for(f=f.vertices,c=0,d=f.length;c<d;c++)e.copy(f[c]),e.applyMatrix4(a.matrixWorld),b.expandByPoint(e);else if(f.isBufferGeometry&&
-(f=f.attributes.position,void 0!==f))for(c=0,d=f.count;c<d;c++)e.fromBufferAttribute(f,c).applyMatrix4(a.matrixWorld),b.expandByPoint(e)}var b,c,d,e=new p;return function(c){b=this;c.updateMatrixWorld(!0);c.traverse(a);return this}}(),containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y||a.z<this.min.z||a.z>this.max.z?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y&&this.min.z<=a.min.z&&
-a.max.z<=this.max.z},getParameter:function(a,b){void 0===b&&(console.warn("THREE.Box3: .getParameter() target is now required"),b=new p);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y),(a.z-this.min.z)/(this.max.z-this.min.z))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y||a.max.z<this.min.z||a.min.z>this.max.z?!1:!0},intersectsSphere:function(){var a=new p;return function(b){this.clampPoint(b.center,
-a);return a.distanceToSquared(b.center)<=b.radius*b.radius}}(),intersectsPlane:function(a){if(0<a.normal.x){var b=a.normal.x*this.min.x;var c=a.normal.x*this.max.x}else b=a.normal.x*this.max.x,c=a.normal.x*this.min.x;0<a.normal.y?(b+=a.normal.y*this.min.y,c+=a.normal.y*this.max.y):(b+=a.normal.y*this.max.y,c+=a.normal.y*this.min.y);0<a.normal.z?(b+=a.normal.z*this.min.z,c+=a.normal.z*this.max.z):(b+=a.normal.z*this.max.z,c+=a.normal.z*this.min.z);return b<=a.constant&&c>=a.constant},intersectsTriangle:function(){function a(a){var e;
-var f=0;for(e=a.length-3;f<=e;f+=3){h.fromArray(a,f);var g=m.x*Math.abs(h.x)+m.y*Math.abs(h.y)+m.z*Math.abs(h.z),k=b.dot(h),l=c.dot(h),q=d.dot(h);if(Math.max(-Math.max(k,l,q),Math.min(k,l,q))>g)return!1}return!0}var b=new p,c=new p,d=new p,e=new p,f=new p,g=new p,h=new p,k=new p,m=new p,l=new p;return function(h){if(this.isEmpty())return!1;this.getCenter(k);m.subVectors(this.max,k);b.subVectors(h.a,k);c.subVectors(h.b,k);d.subVectors(h.c,k);e.subVectors(c,b);f.subVectors(d,c);g.subVectors(b,d);h=
-[0,-e.z,e.y,0,-f.z,f.y,0,-g.z,g.y,e.z,0,-e.x,f.z,0,-f.x,g.z,0,-g.x,-e.y,e.x,0,-f.y,f.x,0,-g.y,g.x,0];if(!a(h))return!1;h=[1,0,0,0,1,0,0,0,1];if(!a(h))return!1;l.crossVectors(e,f);h=[l.x,l.y,l.z];return a(h)}}(),clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box3: .clampPoint() target is now required"),b=new p);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new p;return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),getBoundingSphere:function(){var a=
-new p;return function(b){void 0===b&&(console.warn("THREE.Box3: .getBoundingSphere() target is now required"),b=new Da);this.getCenter(b.center);b.radius=.5*this.getSize(a).length();return b}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);this.isEmpty()&&this.makeEmpty();return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},applyMatrix4:function(a){if(this.isEmpty())return this;a=a.elements;var b=a[0]*this.min.x,c=a[1]*this.min.x,d=a[2]*this.min.x,e=
-a[0]*this.max.x,f=a[1]*this.max.x,g=a[2]*this.max.x,h=a[4]*this.min.y,k=a[5]*this.min.y,m=a[6]*this.min.y,l=a[4]*this.max.y,n=a[5]*this.max.y,t=a[6]*this.max.y,u=a[8]*this.min.z,r=a[9]*this.min.z,p=a[10]*this.min.z,y=a[8]*this.max.z,x=a[9]*this.max.z,w=a[10]*this.max.z;this.min.x=Math.min(b,e)+Math.min(h,l)+Math.min(u,y)+a[12];this.min.y=Math.min(c,f)+Math.min(k,n)+Math.min(r,x)+a[13];this.min.z=Math.min(d,g)+Math.min(m,t)+Math.min(p,w)+a[14];this.max.x=Math.max(b,e)+Math.max(h,l)+Math.max(u,y)+a[12];
-this.max.y=Math.max(c,f)+Math.max(k,n)+Math.max(r,x)+a[13];this.max.z=Math.max(d,g)+Math.max(m,t)+Math.max(p,w)+a[14];return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(Da.prototype,{set:function(a,b){this.center.copy(a);this.radius=b;return this},setFromPoints:function(){var a=new Sa;return function(b,c){var d=this.center;void 0!==c?d.copy(c):a.setFromPoints(b).getCenter(d);for(var e=
-c=0,f=b.length;e<f;e++)c=Math.max(c,d.distanceToSquared(b[e]));this.radius=Math.sqrt(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.center.copy(a.center);this.radius=a.radius;return this},empty:function(){return 0>=this.radius},containsPoint:function(a){return a.distanceToSquared(this.center)<=this.radius*this.radius},distanceToPoint:function(a){return a.distanceTo(this.center)-this.radius},intersectsSphere:function(a){var b=this.radius+a.radius;
-return a.center.distanceToSquared(this.center)<=b*b},intersectsBox:function(a){return a.intersectsSphere(this)},intersectsPlane:function(a){return Math.abs(a.distanceToPoint(this.center))<=this.radius},clampPoint:function(a,b){var c=this.center.distanceToSquared(a);void 0===b&&(console.warn("THREE.Sphere: .clampPoint() target is now required"),b=new p);b.copy(a);c>this.radius*this.radius&&(b.sub(this.center).normalize(),b.multiplyScalar(this.radius).add(this.center));return b},getBoundingBox:function(a){void 0===
-a&&(console.warn("THREE.Sphere: .getBoundingBox() target is now required"),a=new Sa);a.set(this.center,this.center);a.expandByScalar(this.radius);return a},applyMatrix4:function(a){this.center.applyMatrix4(a);this.radius*=a.getMaxScaleOnAxis();return this},translate:function(a){this.center.add(a);return this},equals:function(a){return a.center.equals(this.center)&&a.radius===this.radius}});Object.assign(Ma.prototype,{set:function(a,b){this.normal.copy(a);this.constant=b;return this},setComponents:function(a,
-b,c,d){this.normal.set(a,b,c);this.constant=d;return this},setFromNormalAndCoplanarPoint:function(a,b){this.normal.copy(a);this.constant=-b.dot(this.normal);return this},setFromCoplanarPoints:function(){var a=new p,b=new p;return function(c,d,e){d=a.subVectors(e,d).cross(b.subVectors(c,d)).normalize();this.setFromNormalAndCoplanarPoint(d,c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.normal.copy(a.normal);this.constant=a.constant;return this},normalize:function(){var a=
-1/this.normal.length();this.normal.multiplyScalar(a);this.constant*=a;return this},negate:function(){this.constant*=-1;this.normal.negate();return this},distanceToPoint:function(a){return this.normal.dot(a)+this.constant},distanceToSphere:function(a){return this.distanceToPoint(a.center)-a.radius},projectPoint:function(a,b){void 0===b&&(console.warn("THREE.Plane: .projectPoint() target is now required"),b=new p);return b.copy(this.normal).multiplyScalar(-this.distanceToPoint(a)).add(a)},intersectLine:function(){var a=
-new p;return function(b,c){void 0===c&&(console.warn("THREE.Plane: .intersectLine() target is now required"),c=new p);var d=b.delta(a),e=this.normal.dot(d);if(0===e){if(0===this.distanceToPoint(b.start))return c.copy(b.start)}else if(e=-(b.start.dot(this.normal)+this.constant)/e,!(0>e||1<e))return c.copy(d).multiplyScalar(e).add(b.start)}}(),intersectsLine:function(a){var b=this.distanceToPoint(a.start);a=this.distanceToPoint(a.end);return 0>b&&0<a||0>a&&0<b},intersectsBox:function(a){return a.intersectsPlane(this)},
-intersectsSphere:function(a){return a.intersectsPlane(this)},coplanarPoint:function(a){void 0===a&&(console.warn("THREE.Plane: .coplanarPoint() target is now required"),a=new p);return a.copy(this.normal).multiplyScalar(-this.constant)},applyMatrix4:function(){var a=new p,b=new ra;return function(c,d){d=d||b.getNormalMatrix(c);c=this.coplanarPoint(a).applyMatrix4(c);d=this.normal.applyMatrix3(d).normalize();this.constant=-c.dot(d);return this}}(),translate:function(a){this.constant-=a.dot(this.normal);
-return this},equals:function(a){return a.normal.equals(this.normal)&&a.constant===this.constant}});Object.assign(md.prototype,{set:function(a,b,c,d,e,f){var g=this.planes;g[0].copy(a);g[1].copy(b);g[2].copy(c);g[3].copy(d);g[4].copy(e);g[5].copy(f);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){for(var b=this.planes,c=0;6>c;c++)b[c].copy(a.planes[c]);return this},setFromMatrix:function(a){var b=this.planes,c=a.elements;a=c[0];var d=c[1],e=c[2],f=c[3],g=c[4],
-h=c[5],k=c[6],m=c[7],l=c[8],n=c[9],t=c[10],p=c[11],r=c[12],v=c[13],y=c[14];c=c[15];b[0].setComponents(f-a,m-g,p-l,c-r).normalize();b[1].setComponents(f+a,m+g,p+l,c+r).normalize();b[2].setComponents(f+d,m+h,p+n,c+v).normalize();b[3].setComponents(f-d,m-h,p-n,c-v).normalize();b[4].setComponents(f-e,m-k,p-t,c-y).normalize();b[5].setComponents(f+e,m+k,p+t,c+y).normalize();return this},intersectsObject:function(){var a=new Da;return function(b){var c=b.geometry;null===c.boundingSphere&&c.computeBoundingSphere();
-a.copy(c.boundingSphere).applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSprite:function(){var a=new Da;return function(b){a.center.set(0,0,0);a.radius=.7071067811865476;a.applyMatrix4(b.matrixWorld);return this.intersectsSphere(a)}}(),intersectsSphere:function(a){var b=this.planes,c=a.center;a=-a.radius;for(var d=0;6>d;d++)if(b[d].distanceToPoint(c)<a)return!1;return!0},intersectsBox:function(){var a=new p;return function(b){for(var c=this.planes,d=0;6>d;d++){var e=c[d];
-a.x=0<e.normal.x?b.max.x:b.min.x;a.y=0<e.normal.y?b.max.y:b.min.y;a.z=0<e.normal.z?b.max.z:b.min.z;if(0>e.distanceToPoint(a))return!1}return!0}}(),containsPoint:function(a){for(var b=this.planes,c=0;6>c;c++)if(0>b[c].distanceToPoint(a))return!1;return!0}});var S={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif\n",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif\n",alphatest_fragment:"#ifdef ALPHATEST\n\tif ( diffuseColor.a < ALPHATEST ) discard;\n#endif\n",
-aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.specularRoughness );\n\t#endif\n#endif\n",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",
-begin_vertex:"\nvec3 transformed = vec3( position );\n",beginnormal_vertex:"\nvec3 objectNormal = vec3( normal );\n",bsdfs:"float punctualLightIntensityToIrradianceFactor( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\tif( decayExponent > 0.0 ) {\n#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tfloat maxDistanceCutoffFactor = pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\treturn distanceFalloff * maxDistanceCutoffFactor;\n#else\n\t\treturn pow( saturate( -lightDistance / cutoffDistance + 1.0 ), decayExponent );\n#endif\n\t}\n\treturn 1.0;\n}\nvec3 BRDF_Diffuse_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 specularColor, const in float dotLH ) {\n\tfloat fresnel = exp2( ( -5.55473 * dotLH - 6.98316 ) * dotLH );\n\treturn ( 1.0 - specularColor ) * fresnel + specularColor;\n}\nfloat G_GGX_Smith( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gl = dotNL + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\tfloat gv = dotNV + sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\treturn 1.0 / ( gl * gv );\n}\nfloat G_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_Specular_GGX( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNL = saturate( dot( geometry.normal, incidentLight.direction ) );\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( G * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE  = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS  = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nvec3 BRDF_Specular_GGX_Environment( const in GeometricContext geometry, const in vec3 specularColor, const in float roughness ) {\n\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 AB = vec2( -1.04, 1.04 ) * a004 + r.zw;\n\treturn specularColor * AB.x + AB.y;\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_Specular_BlinnPhong( const in IncidentLight incidentLight, const in GeometricContext geometry, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( incidentLight.direction + geometry.viewDir );\n\tfloat dotNH = saturate( dot( geometry.normal, halfDir ) );\n\tfloat dotLH = saturate( dot( incidentLight.direction, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, dotLH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\nfloat GGXRoughnessToBlinnExponent( const in float ggxRoughness ) {\n\treturn ( 2.0 / pow2( ggxRoughness + 0.0001 ) - 2.0 );\n}\nfloat BlinnExponentToGGXRoughness( const in float blinnExponent ) {\n\treturn sqrt( 2.0 / ( blinnExponent + 2.0 ) );\n}\n",
-bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 );\n\t\tfDet *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif\n",
-clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vViewPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vViewPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\tif ( clipped ) discard;\n\t#endif\n#endif\n",
-clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\t#if ! defined( PHYSICAL ) && ! defined( PHONG )\n\t\tvarying vec3 vViewPosition;\n\t#endif\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif\n",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvarying vec3 vViewPosition;\n#endif\n",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0 && ! defined( PHYSICAL ) && ! defined( PHONG )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n",
-color_fragment:"#ifdef USE_COLOR\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif\n",color_pars_vertex:"#ifdef USE_COLOR\n\tvarying vec3 vColor;\n#endif",color_vertex:"#ifdef USE_COLOR\n\tvColor.xyz = color.xyz;\n#endif",common:"#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n#define RECIPROCAL_PI 0.31830988618\n#define RECIPROCAL_PI2 0.15915494\n#define LOG2 1.442695\n#define EPSILON 1e-6\n#define saturate(a) clamp( a, 0.0, 1.0 )\n#define whiteCompliment(a) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract(sin(sn) * c);\n}\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nvec3 projectOnPlane(in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\tfloat distance = dot( planeNormal, point - pointOnPlane );\n\treturn - distance * planeNormal + point;\n}\nfloat sideOfPlane( in vec3 point, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn sign( dot( point - pointOnPlane, planeNormal ) );\n}\nvec3 linePlaneIntersect( in vec3 pointOnLine, in vec3 lineDirection, in vec3 pointOnPlane, in vec3 planeNormal ) {\n\treturn lineDirection * ( dot( planeNormal, pointOnPlane - pointOnLine ) / dot( planeNormal, lineDirection ) ) + pointOnLine;\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\n",
-cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n#define cubeUV_textureSize (1024.0)\nint getFaceFromDirection(vec3 direction) {\n\tvec3 absDirection = abs(direction);\n\tint face = -1;\n\tif( absDirection.x > absDirection.z ) {\n\t\tif(absDirection.x > absDirection.y )\n\t\t\tface = direction.x > 0.0 ? 0 : 3;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\telse {\n\t\tif(absDirection.z > absDirection.y )\n\t\t\tface = direction.z > 0.0 ? 2 : 5;\n\t\telse\n\t\t\tface = direction.y > 0.0 ? 1 : 4;\n\t}\n\treturn face;\n}\n#define cubeUV_maxLods1  (log2(cubeUV_textureSize*0.25) - 1.0)\n#define cubeUV_rangeClamp (exp2((6.0 - 1.0) * 2.0))\nvec2 MipLevelInfo( vec3 vec, float roughnessLevel, float roughness ) {\n\tfloat scale = exp2(cubeUV_maxLods1 - roughnessLevel);\n\tfloat dxRoughness = dFdx(roughness);\n\tfloat dyRoughness = dFdy(roughness);\n\tvec3 dx = dFdx( vec * scale * dxRoughness );\n\tvec3 dy = dFdy( vec * scale * dyRoughness );\n\tfloat d = max( dot( dx, dx ), dot( dy, dy ) );\n\td = clamp(d, 1.0, cubeUV_rangeClamp);\n\tfloat mipLevel = 0.5 * log2(d);\n\treturn vec2(floor(mipLevel), fract(mipLevel));\n}\n#define cubeUV_maxLods2 (log2(cubeUV_textureSize*0.25) - 2.0)\n#define cubeUV_rcpTextureSize (1.0 / cubeUV_textureSize)\nvec2 getCubeUV(vec3 direction, float roughnessLevel, float mipLevel) {\n\tmipLevel = roughnessLevel > cubeUV_maxLods2 - 3.0 ? 0.0 : mipLevel;\n\tfloat a = 16.0 * cubeUV_rcpTextureSize;\n\tvec2 exp2_packed = exp2( vec2( roughnessLevel, mipLevel ) );\n\tvec2 rcp_exp2_packed = vec2( 1.0 ) / exp2_packed;\n\tfloat powScale = exp2_packed.x * exp2_packed.y;\n\tfloat scale = rcp_exp2_packed.x * rcp_exp2_packed.y * 0.25;\n\tfloat mipOffset = 0.75*(1.0 - rcp_exp2_packed.y) * rcp_exp2_packed.x;\n\tbool bRes = mipLevel == 0.0;\n\tscale =  bRes && (scale < a) ? a : scale;\n\tvec3 r;\n\tvec2 offset;\n\tint face = getFaceFromDirection(direction);\n\tfloat rcpPowScale = 1.0 / powScale;\n\tif( face == 0) {\n\t\tr = vec3(direction.x, -direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 1) {\n\t\tr = vec3(direction.y, direction.x, direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 2) {\n\t\tr = vec3(direction.z, direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.75 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? a : offset.y;\n\t}\n\telse if( face == 3) {\n\t\tr = vec3(direction.x, direction.z, direction.y);\n\t\toffset = vec2(0.0+mipOffset,0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse if( face == 4) {\n\t\tr = vec3(direction.y, direction.x, -direction.z);\n\t\toffset = vec2(scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\telse {\n\t\tr = vec3(direction.z, -direction.x, direction.y);\n\t\toffset = vec2(2.0*scale+mipOffset, 0.5 * rcpPowScale);\n\t\toffset.y = bRes && (offset.y < 2.0*a) ? 0.0 : offset.y;\n\t}\n\tr = normalize(r);\n\tfloat texelOffset = 0.5 * cubeUV_rcpTextureSize;\n\tvec2 s = ( r.yz / abs( r.x ) + vec2( 1.0 ) ) * 0.5;\n\tvec2 base = offset + vec2( texelOffset );\n\treturn base + s * ( scale - 2.0 * texelOffset );\n}\n#define cubeUV_maxLods3 (log2(cubeUV_textureSize*0.25) - 3.0)\nvec4 textureCubeUV( sampler2D envMap, vec3 reflectedDirection, float roughness ) {\n\tfloat roughnessVal = roughness* cubeUV_maxLods3;\n\tfloat r1 = floor(roughnessVal);\n\tfloat r2 = r1 + 1.0;\n\tfloat t = fract(roughnessVal);\n\tvec2 mipInfo = MipLevelInfo(reflectedDirection, r1, roughness);\n\tfloat s = mipInfo.y;\n\tfloat level0 = mipInfo.x;\n\tfloat level1 = level0 + 1.0;\n\tlevel1 = level1 > 5.0 ? 5.0 : level1;\n\tlevel0 += min( floor( s + 0.5 ), 5.0 );\n\tvec2 uv_10 = getCubeUV(reflectedDirection, r1, level0);\n\tvec4 color10 = envMapTexelToLinear(texture2D(envMap, uv_10));\n\tvec2 uv_20 = getCubeUV(reflectedDirection, r2, level0);\n\tvec4 color20 = envMapTexelToLinear(texture2D(envMap, uv_20));\n\tvec4 result = mix(color10, color20, t);\n\treturn vec4(result.rgb, 1.0);\n}\n#endif\n",
-defaultnormal_vertex:"vec3 transformedNormal = normalMatrix * objectNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif\n",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, uv ).x * displacementScale + displacementBias );\n#endif\n",
-emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif\n",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif\n",encodings_fragment:"  gl_FragColor = linearToOutputTexel( gl_FragColor );\n",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( gammaFactor ) ), value.w );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.xyz, vec3( 1.0 / gammaFactor ) ), value.w );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.w );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.w );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.xyz * value.w * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat M      = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM            = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.x, max( value.g, value.b ) );\n\tfloat D      = max( maxRange / maxRGB, 1.0 );\n\tD            = min( floor( D ) / 255.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value )  {\n\tvec3 Xp_Y_XYZp = value.rgb * cLogLuvM;\n\tXp_Y_XYZp = max(Xp_Y_XYZp, vec3(1e-6, 1e-6, 1e-6));\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract(Le);\n\tvResult.z = (Le - (floor(vResult.w*255.0))/255.0)/255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2((Le - 127.0) / 2.0);\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = Xp_Y_XYZp.rgb * cLogLuvInverseM;\n\treturn vec4( max(vRGB, 0.0), 1.0 );\n}\n",
-envmap_fragment:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvec3 cameraToVertex = normalize( vWorldPosition - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\tvec2 sampleUV;\n\t\treflectVec = normalize( reflectVec );\n\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\tvec4 envColor = texture2D( envMap, sampleUV );\n\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\treflectVec = normalize( reflectVec );\n\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0, 0.0, 1.0 ) );\n\t\tvec4 envColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\tenvColor = envMapTexelToLinear( envColor );\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif\n",
-envmap_pars_fragment:"#if defined( USE_ENVMAP ) || defined( PHYSICAL )\n\tuniform float reflectivity;\n\tuniform float envMapIntensity;\n#endif\n#ifdef USE_ENVMAP\n\t#if ! defined( PHYSICAL ) && ( defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) )\n\t\tvarying vec3 vWorldPosition;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( PHYSICAL )\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif\n",
-envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif\n",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP ) && defined( PHYSICAL )\n\tvec3 getLightProbeIndirectIrradiance( const in GeometricContext geometry, const in int maxMIPLevel ) {\n\t\tvec3 worldNormal = inverseTransformDirection( geometry.normal, viewMatrix );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryVec, float( maxMIPLevel ) );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryVec = vec3( flipEnvMap * worldNormal.x, worldNormal.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryVec, 1.0 );\n\t\t#else\n\t\t\tvec4 envMapColor = vec4( 0.0 );\n\t\t#endif\n\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t}\n\tfloat getSpecularMIPLevel( const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\tfloat maxMIPLevelScalar = float( maxMIPLevel );\n\t\tfloat desiredMIPLevel = maxMIPLevelScalar + 0.79248 - 0.5 * log2( pow2( blinnShininessExponent ) + 1.0 );\n\t\treturn clamp( desiredMIPLevel, 0.0, maxMIPLevelScalar );\n\t}\n\tvec3 getLightProbeIndirectRadiance( const in GeometricContext geometry, const in float blinnShininessExponent, const in int maxMIPLevel ) {\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( -geometry.viewDir, geometry.normal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( -geometry.viewDir, geometry.normal, refractionRatio );\n\t\t#endif\n\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\tfloat specularMIPLevel = getSpecularMIPLevel( blinnShininessExponent, maxMIPLevel );\n\t\t#ifdef ENVMAP_TYPE_CUBE\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = textureCubeLodEXT( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = textureCube( envMap, queryReflectVec, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 queryReflectVec = vec3( flipEnvMap * reflectVec.x, reflectVec.yz );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, queryReflectVec, BlinnExponentToGGXRoughness(blinnShininessExponent ));\n\t\t#elif defined( ENVMAP_TYPE_EQUIREC )\n\t\t\tvec2 sampleUV;\n\t\t\tsampleUV.y = asin( clamp( reflectVec.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\t\t\tsampleUV.x = atan( reflectVec.z, reflectVec.x ) * RECIPROCAL_PI2 + 0.5;\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, sampleUV, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, sampleUV, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#elif defined( ENVMAP_TYPE_SPHERE )\n\t\t\tvec3 reflectView = normalize( ( viewMatrix * vec4( reflectVec, 0.0 ) ).xyz + vec3( 0.0,0.0,1.0 ) );\n\t\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\t\tvec4 envMapColor = texture2DLodEXT( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#else\n\t\t\t\tvec4 envMapColor = texture2D( envMap, reflectView.xy * 0.5 + 0.5, specularMIPLevel );\n\t\t\t#endif\n\t\t\tenvMapColor.rgb = envMapTexelToLinear( envMapColor ).rgb;\n\t\t#endif\n\t\treturn envMapColor.rgb * envMapIntensity;\n\t}\n#endif\n",
-envmap_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif\n",
-fog_vertex:"\n#ifdef USE_FOG\nfogDepth = -mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n  varying float fogDepth;\n#endif\n",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = whiteCompliment( exp2( - fogDensity * fogDensity * fogDepth * fogDepth * LOG2 ) );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, fogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif\n",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float fogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif\n",
-gradientmap_pars_fragment:"#ifdef TOON\n\tuniform sampler2D gradientMap;\n\tvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\t\tfloat dotNL = dot( normal, lightDirection );\n\t\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t\t#ifdef USE_GRADIENTMAP\n\t\t\treturn texture2D( gradientMap, coord ).rgb;\n\t\t#else\n\t\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t\t#endif\n\t}\n#endif\n",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\treflectedLight.indirectDiffuse += PI * texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n#endif\n",
-lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointDirectLightIrradiance( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotDirectLightIrradiance( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalDirectLightIrradiance( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = PI * directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( -dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvLightFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry );\n\t\t#endif\n\t}\n#endif\n",
-lights_pars_begin:"uniform vec3 ambientLightColor;\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treturn irradiance;\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalDirectLightIrradiance( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tdirectLight.color = directionalLight.color;\n\t\tdirectLight.direction = directionalLight.direction;\n\t\tdirectLight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t\tfloat shadowCameraNear;\n\t\tfloat shadowCameraFar;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointDirectLightIrradiance( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight directLight ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tdirectLight.color = pointLight.color;\n\t\tdirectLight.color *= punctualLightIntensityToIrradianceFactor( lightDistance, pointLight.distance, pointLight.decay );\n\t\tdirectLight.visible = ( directLight.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t\tint shadow;\n\t\tfloat shadowBias;\n\t\tfloat shadowRadius;\n\t\tvec2 shadowMapSize;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotDirectLightIrradiance( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight directLight  ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tdirectLight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tfloat angleCos = dot( directLight.direction, spotLight.direction );\n\t\tif ( angleCos > spotLight.coneCos ) {\n\t\t\tfloat spotEffect = smoothstep( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\t\tdirectLight.color = spotLight.color;\n\t\t\tdirectLight.color *= spotEffect * punctualLightIntensityToIrradianceFactor( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tdirectLight.visible = true;\n\t\t} else {\n\t\t\tdirectLight.color = vec3( 0.0 );\n\t\t\tdirectLight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in GeometricContext geometry ) {\n\t\tfloat dotNL = dot( geometry.normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tirradiance *= PI;\n\t\t#endif\n\t\treturn irradiance;\n\t}\n#endif\n",
-lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;\n",lights_phong_pars_fragment:"varying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\nstruct BlinnPhongMaterial {\n\tvec3\tdiffuseColor;\n\tvec3\tspecularColor;\n\tfloat\tspecularShininess;\n\tfloat\tspecularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifdef TOON\n\t\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\t#else\n\t\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\t\tvec3 irradiance = dotNL * directLight.color;\n\t#endif\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\treflectedLight.directDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_Specular_BlinnPhong( directLight, geometry, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)\n",
-lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nmaterial.specularRoughness = clamp( roughnessFactor, 0.04, 1.0 );\n#ifdef STANDARD\n\tmaterial.specularColor = mix( vec3( DEFAULT_SPECULAR_COEFFICIENT ), diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( MAXIMUM_SPECULAR_COEFFICIENT * pow2( reflectivity ) ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.clearCoat = saturate( clearCoat );\tmaterial.clearCoatRoughness = clamp( clearCoatRoughness, 0.04, 1.0 );\n#endif\n",
-lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3\tdiffuseColor;\n\tfloat\tspecularRoughness;\n\tvec3\tspecularColor;\n\t#ifndef STANDARD\n\t\tfloat clearCoat;\n\t\tfloat clearCoatRoughness;\n\t#endif\n};\n#define MAXIMUM_SPECULAR_COEFFICIENT 0.16\n#define DEFAULT_SPECULAR_COEFFICIENT 0.04\nfloat clearCoatDHRApprox( const in float roughness, const in float dotNL ) {\n\treturn DEFAULT_SPECULAR_COEFFICIENT + ( 1.0 - DEFAULT_SPECULAR_COEFFICIENT ) * ( pow( 1.0 - dotNL, 5.0 ) * pow( 1.0 - roughness, 2.0 ) );\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.specularRoughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos - halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos + halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos + halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos - halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tirradiance *= PI;\n\t#endif\n\t#ifndef STANDARD\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.directSpecular += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Specular_GGX( directLight, geometry, material.specularColor, material.specularRoughness );\n\treflectedLight.directDiffuse += ( 1.0 - clearCoatDHR ) * irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n\t#ifndef STANDARD\n\t\treflectedLight.directSpecular += irradiance * material.clearCoat * BRDF_Specular_GGX( directLight, geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Diffuse_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 clearCoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t#ifndef STANDARD\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\tfloat dotNL = dotNV;\n\t\tfloat clearCoatDHR = material.clearCoat * clearCoatDHRApprox( material.clearCoatRoughness, dotNL );\n\t#else\n\t\tfloat clearCoatDHR = 0.0;\n\t#endif\n\treflectedLight.indirectSpecular += ( 1.0 - clearCoatDHR ) * radiance * BRDF_Specular_GGX_Environment( geometry, material.specularColor, material.specularRoughness );\n\t#ifndef STANDARD\n\t\treflectedLight.indirectSpecular += clearCoatRadiance * material.clearCoat * BRDF_Specular_GGX_Environment( geometry, vec3( DEFAULT_SPECULAR_COEFFICIENT ), material.clearCoatRoughness );\n\t#endif\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\n#define Material_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.specularRoughness )\n#define Material_ClearCoat_BlinnShininessExponent( material )   GGXRoughnessToBlinnExponent( material.clearCoatRoughness )\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}\n",
-lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = normalize( vViewPosition );\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointDirectLightIrradiance( pointLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( pointLight.shadow, directLight.visible ) ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotDirectLightIrradiance( spotLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( spotLight.shadow, directLight.visible ) ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalDirectLightIrradiance( directionalLight, geometry, directLight );\n\t\t#ifdef USE_SHADOWMAP\n\t\tdirectLight.color *= all( bvec2( directionalLight.shadow, directLight.visible ) ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry );\n\t\t}\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearCoatRadiance = vec3( 0.0 );\n#endif\n",
-lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec3 lightMapIrradiance = texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( PHYSICAL ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tirradiance += getLightProbeIndirectIrradiance( geometry, maxMipLevel );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getLightProbeIndirectRadiance( geometry, Material_BlinnShininessExponent( material ), maxMipLevel );\n\t#ifndef STANDARD\n\t\tclearCoatRadiance += getLightProbeIndirectRadiance( geometry, Material_ClearCoat_BlinnShininessExponent( material ), maxMipLevel );\n\t#endif\n#endif\n",
-lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, clearCoatRadiance, geometry, material, reflectedLight );\n#endif\n",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#ifdef USE_LOGDEPTHBUF\n\tuniform float logDepthBufFC;\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n#endif\n",
-logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t#endif\n\tuniform float logDepthBufFC;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t#else\n\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\tgl_Position.z *= gl_Position.w;\n\t#endif\n#endif\n",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif\n",
-map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n",map_particle_fragment:"#ifdef USE_MAP\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n",map_particle_pars_fragment:"#ifdef USE_MAP\n\tuniform mat3 uvTransform;\n\tuniform sampler2D map;\n#endif\n",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif\n",
-metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal += ( morphNormal0 - normal ) * morphTargetInfluences[ 0 ];\n\tobjectNormal += ( morphNormal1 - normal ) * morphTargetInfluences[ 1 ];\n\tobjectNormal += ( morphNormal2 - normal ) * morphTargetInfluences[ 2 ];\n\tobjectNormal += ( morphNormal3 - normal ) * morphTargetInfluences[ 3 ];\n#endif\n",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_MORPHNORMALS\n\tuniform float morphTargetInfluences[ 8 ];\n\t#else\n\tuniform float morphTargetInfluences[ 4 ];\n\t#endif\n#endif",
-morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed += ( morphTarget0 - position ) * morphTargetInfluences[ 0 ];\n\ttransformed += ( morphTarget1 - position ) * morphTargetInfluences[ 1 ];\n\ttransformed += ( morphTarget2 - position ) * morphTargetInfluences[ 2 ];\n\ttransformed += ( morphTarget3 - position ) * morphTargetInfluences[ 3 ];\n\t#ifndef USE_MORPHNORMALS\n\ttransformed += ( morphTarget4 - position ) * morphTargetInfluences[ 4 ];\n\ttransformed += ( morphTarget5 - position ) * morphTargetInfluences[ 5 ];\n\ttransformed += ( morphTarget6 - position ) * morphTargetInfluences[ 6 ];\n\ttransformed += ( morphTarget7 - position ) * morphTargetInfluences[ 7 ];\n\t#endif\n#endif\n",
-normal_fragment_begin:"#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t#endif\n#endif\n",normal_fragment_maps:"#ifdef USE_NORMALMAP\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t#ifdef FLIP_SIDED\n\t\t\tnormal = - normal;\n\t\t#endif\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tnormal = normal * ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t#endif\n\t\tnormal = normalize( normalMatrix * normal );\n\t#else\n\t\tnormal = perturbNormal2Arb( -vViewPosition, normal );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( -vViewPosition, normal, dHdxy_fwd() );\n#endif\n",
-normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n\t#ifdef OBJECTSPACE_NORMALMAP\n\t\tuniform mat3 normalMatrix;\n\t#else\n\t\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm ) {\n\t\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\t\tvec2 st0 = dFdx( vUv.st );\n\t\t\tvec2 st1 = dFdy( vUv.st );\n\t\t\tfloat scale = sign( st1.t * st0.s - st0.t * st1.s );\n\t\t\tvec3 S = normalize( ( q0 * st1.t - q1 * st0.t ) * scale );\n\t\t\tvec3 T = normalize( ( - q0 * st1.s + q1 * st0.s ) * scale );\n\t\t\tvec3 N = normalize( surf_norm );\n\t\t\tmat3 tsn = mat3( S, T, N );\n\t\t\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t\t\tmapN.xy *= normalScale;\n\t\t\tmapN.xy *= ( float( gl_FrontFacing ) * 2.0 - 1.0 );\n\t\t\treturn normalize( tsn * mapN );\n\t\t}\n\t#endif\n#endif\n",
-packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256.,  256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn (( near + viewZ ) * far ) / (( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}\n",
-premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif\n",project_vertex:"vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\ngl_Position = projectionMatrix * mvPosition;\n",dithering_fragment:"#if defined( DITHERING )\n  gl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif\n",dithering_pars_fragment:"#if defined( DITHERING )\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif\n",
-roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif\n",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tfloat texture2DShadowLerp( sampler2D depths, vec2 size, vec2 uv, float compare ) {\n\t\tconst vec2 offset = vec2( 0.0, 1.0 );\n\t\tvec2 texelSize = vec2( 1.0 ) / size;\n\t\tvec2 centroidUV = floor( uv * size + 0.5 ) / size;\n\t\tfloat lb = texture2DCompare( depths, centroidUV + texelSize * offset.xx, compare );\n\t\tfloat lt = texture2DCompare( depths, centroidUV + texelSize * offset.xy, compare );\n\t\tfloat rb = texture2DCompare( depths, centroidUV + texelSize * offset.yx, compare );\n\t\tfloat rt = texture2DCompare( depths, centroidUV + texelSize * offset.yy, compare );\n\t\tvec2 f = fract( uv * size + 0.5 );\n\t\tfloat a = mix( lb, lt, f.y );\n\t\tfloat b = mix( rb, rt, f.y );\n\t\tfloat c = mix( a, b, f.x );\n\t\treturn c;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tshadow = (\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DShadowLerp( shadowMap, shadowMapSize, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif\n",
-shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHTS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHTS ];\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHTS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHTS ];\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHTS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHTS ];\n\t#endif\n#endif\n",
-shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * worldPosition;\n\t}\n\t#endif\n#endif\n",
-shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHTS > 0\n\tDirectionalLight directionalLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tshadow *= bool( directionalLight.shadow ) ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_SPOT_LIGHTS > 0\n\tSpotLight spotLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tshadow *= bool( spotLight.shadow ) ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#endif\n\t#if NUM_POINT_LIGHTS > 0\n\tPointLight pointLight;\n\t#pragma unroll_loop\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tshadow *= bool( pointLight.shadow ) ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#endif\n\t#endif\n\treturn shadow;\n}\n",
-skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif\n",
-skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif\n",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix  = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n#endif\n",
-specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n  gl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif\n",tonemapping_pars_fragment:"#ifndef saturate\n\t#define saturate(a) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nuniform float toneMappingWhitePoint;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\n#define Uncharted2Helper( x ) max( ( ( x * ( 0.15 * x + 0.10 * 0.50 ) + 0.20 * 0.02 ) / ( x * ( 0.15 * x + 0.50 ) + 0.20 * 0.30 ) ) - 0.02 / 0.30, vec3( 0.0 ) )\nvec3 Uncharted2ToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( Uncharted2Helper( color ) / Uncharted2Helper( vec3( toneMappingWhitePoint ) ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\n",
-uv_pars_fragment:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\n",
-uv_vertex:"#if defined( USE_MAP ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( USE_SPECULARMAP ) || defined( USE_ALPHAMAP ) || defined( USE_EMISSIVEMAP ) || defined( USE_ROUGHNESSMAP ) || defined( USE_METALNESSMAP )\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n#endif",
-uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = uv2;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP )\n\tvec4 worldPosition = modelMatrix * vec4( transformed, 1.0 );\n#endif\n",cube_frag:"uniform samplerCube tCube;\nuniform float tFlip;\nuniform float opacity;\nvarying vec3 vWorldPosition;\nvoid main() {\n\tgl_FragColor = textureCube( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );\n\tgl_FragColor.a *= opacity;\n}\n",
-cube_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}\n",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - gl_FragCoord.z ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( gl_FragCoord.z );\n\t#endif\n}\n",
-depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n",
-distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}\n",
-distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}\n",
-equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldPosition );\n\tvec2 sampleUV;\n\tsampleUV.y = asin( clamp( direction.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\tsampleUV.x = atan( direction.z, direction.x ) * RECIPROCAL_PI2 + 0.5;\n\tgl_FragColor = texture2D( tEquirect, sampleUV );\n}\n",equirect_vert:"varying vec3 vWorldPosition;\n#include <common>\nvoid main() {\n\tvWorldPosition = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}\n",
-linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\tvLineDistance = scale * lineDistance;\n\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n",
-meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\treflectedLight.indirectDiffuse += texture2D( lightMap, vUv2 ).xyz * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_ENVMAP\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\treflectedLight.indirectDiffuse = getAmbientLightIrradiance( ambientLightColor );\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Diffuse_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
-meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
-meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-meshphysical_frag:"#define PHYSICAL\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifndef STANDARD\n\tuniform float clearCoat;\n\tuniform float clearCoatRoughness;\n#endif\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <lights_physical_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}\n",
-meshphysical_vert:"#define PHYSICAL\nvarying vec3 vViewPosition;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-normal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}\n",
-normal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvarying vec3 vViewPosition;\n#endif\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || ( defined( USE_NORMALMAP ) && ! defined( OBJECTSPACE_NORMALMAP ) )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}\n",
-points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <premultiplied_alpha_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#ifdef USE_SIZEATTENUATION\n\t\tgl_PointSize = size * ( scale / - mvPosition.z );\n\t#else\n\t\tgl_PointSize = size;\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}\n",
-shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <fog_fragment>\n}\n",shadow_vert:"#include <fog_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}\n",
-sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}\n",
-sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tvec4 mvPosition;\n\tmvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}\n"},
-Aa={merge:function(a){for(var b={},c=0;c<a.length;c++){var d=this.clone(a[c]),e;for(e in d)b[e]=d[e]}return b},clone:function(a){var b={},c;for(c in a){b[c]={};for(var d in a[c]){var e=a[c][d];e&&(e.isColor||e.isMatrix3||e.isMatrix4||e.isVector2||e.isVector3||e.isVector4||e.isTexture)?b[c][d]=e.clone():Array.isArray(e)?b[c][d]=e.slice():b[c][d]=e}}return b}},Tg={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,
-blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,
-darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,
-lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,
-mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,
-rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};Object.assign(G.prototype,
-{isColor:!0,r:1,g:1,b:1,set:function(a){a&&a.isColor?this.copy(a):"number"===typeof a?this.setHex(a):"string"===typeof a&&this.setStyle(a);return this},setScalar:function(a){this.b=this.g=this.r=a;return this},setHex:function(a){a=Math.floor(a);this.r=(a>>16&255)/255;this.g=(a>>8&255)/255;this.b=(a&255)/255;return this},setRGB:function(a,b,c){this.r=a;this.g=b;this.b=c;return this},setHSL:function(){function a(a,c,d){0>d&&(d+=1);1<d&&--d;return d<1/6?a+6*(c-a)*d:.5>d?c:d<2/3?a+6*(c-a)*(2/3-d):a}return function(b,
-c,d){b=H.euclideanModulo(b,1);c=H.clamp(c,0,1);d=H.clamp(d,0,1);0===c?this.r=this.g=this.b=d:(c=.5>=d?d*(1+c):d+c-d*c,d=2*d-c,this.r=a(d,c,b+1/3),this.g=a(d,c,b),this.b=a(d,c,b-1/3));return this}}(),setStyle:function(a){function b(b){void 0!==b&&1>parseFloat(b)&&console.warn("THREE.Color: Alpha component of "+a+" will be ignored.")}var c;if(c=/^((?:rgb|hsl)a?)\(\s*([^\)]*)\)/.exec(a)){var d=c[2];switch(c[1]){case "rgb":case "rgba":if(c=/^(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=
-Math.min(255,parseInt(c[1],10))/255,this.g=Math.min(255,parseInt(c[2],10))/255,this.b=Math.min(255,parseInt(c[3],10))/255,b(c[5]),this;if(c=/^(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d))return this.r=Math.min(100,parseInt(c[1],10))/100,this.g=Math.min(100,parseInt(c[2],10))/100,this.b=Math.min(100,parseInt(c[3],10))/100,b(c[5]),this;break;case "hsl":case "hsla":if(c=/^([0-9]*\.?[0-9]+)\s*,\s*(\d+)%\s*,\s*(\d+)%\s*(,\s*([0-9]*\.?[0-9]+)\s*)?$/.exec(d)){d=parseFloat(c[1])/
-360;var e=parseInt(c[2],10)/100,f=parseInt(c[3],10)/100;b(c[5]);return this.setHSL(d,e,f)}}}else if(c=/^#([A-Fa-f0-9]+)$/.exec(a)){c=c[1];d=c.length;if(3===d)return this.r=parseInt(c.charAt(0)+c.charAt(0),16)/255,this.g=parseInt(c.charAt(1)+c.charAt(1),16)/255,this.b=parseInt(c.charAt(2)+c.charAt(2),16)/255,this;if(6===d)return this.r=parseInt(c.charAt(0)+c.charAt(1),16)/255,this.g=parseInt(c.charAt(2)+c.charAt(3),16)/255,this.b=parseInt(c.charAt(4)+c.charAt(5),16)/255,this}a&&0<a.length&&(c=Tg[a],
-void 0!==c?this.setHex(c):console.warn("THREE.Color: Unknown color "+a));return this},clone:function(){return new this.constructor(this.r,this.g,this.b)},copy:function(a){this.r=a.r;this.g=a.g;this.b=a.b;return this},copyGammaToLinear:function(a,b){void 0===b&&(b=2);this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},copyLinearToGamma:function(a,b){void 0===b&&(b=2);b=0<b?1/b:1;this.r=Math.pow(a.r,b);this.g=Math.pow(a.g,b);this.b=Math.pow(a.b,b);return this},convertGammaToLinear:function(a){this.copyGammaToLinear(this,
-a);return this},convertLinearToGamma:function(a){this.copyLinearToGamma(this,a);return this},copySRGBToLinear:function(){function a(a){return.04045>a?.0773993808*a:Math.pow(.9478672986*a+.0521327014,2.4)}return function(b){this.r=a(b.r);this.g=a(b.g);this.b=a(b.b);return this}}(),copyLinearToSRGB:function(){function a(a){return.0031308>a?12.92*a:1.055*Math.pow(a,.41666)-.055}return function(b){this.r=a(b.r);this.g=a(b.g);this.b=a(b.b);return this}}(),convertSRGBToLinear:function(){this.copySRGBToLinear(this);
-return this},convertLinearToSRGB:function(){this.copyLinearToSRGB(this);return this},getHex:function(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0},getHexString:function(){return("000000"+this.getHex().toString(16)).slice(-6)},getHSL:function(a){void 0===a&&(console.warn("THREE.Color: .getHSL() target is now required"),a={h:0,s:0,l:0});var b=this.r,c=this.g,d=this.b,e=Math.max(b,c,d),f=Math.min(b,c,d),g,h=(f+e)/2;if(f===e)f=g=0;else{var k=e-f;f=.5>=h?k/(e+f):k/(2-e-f);switch(e){case b:g=(c-
-d)/k+(c<d?6:0);break;case c:g=(d-b)/k+2;break;case d:g=(b-c)/k+4}g/=6}a.h=g;a.s=f;a.l=h;return a},getStyle:function(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"},offsetHSL:function(){var a={};return function(b,c,d){this.getHSL(a);a.h+=b;a.s+=c;a.l+=d;this.setHSL(a.h,a.s,a.l);return this}}(),add:function(a){this.r+=a.r;this.g+=a.g;this.b+=a.b;return this},addColors:function(a,b){this.r=a.r+b.r;this.g=a.g+b.g;this.b=a.b+b.b;return this},addScalar:function(a){this.r+=a;this.g+=
-a;this.b+=a;return this},sub:function(a){this.r=Math.max(0,this.r-a.r);this.g=Math.max(0,this.g-a.g);this.b=Math.max(0,this.b-a.b);return this},multiply:function(a){this.r*=a.r;this.g*=a.g;this.b*=a.b;return this},multiplyScalar:function(a){this.r*=a;this.g*=a;this.b*=a;return this},lerp:function(a,b){this.r+=(a.r-this.r)*b;this.g+=(a.g-this.g)*b;this.b+=(a.b-this.b)*b;return this},equals:function(a){return a.r===this.r&&a.g===this.g&&a.b===this.b},fromArray:function(a,b){void 0===b&&(b=0);this.r=
-a[b];this.g=a[b+1];this.b=a[b+2];return this},toArray:function(a,b){void 0===a&&(a=[]);void 0===b&&(b=0);a[b]=this.r;a[b+1]=this.g;a[b+2]=this.b;return a},toJSON:function(){return this.getHex()}});var K={common:{diffuse:{value:new G(15658734)},opacity:{value:1},map:{value:null},uvTransform:{value:new ra},alphaMap:{value:null}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},
-aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new z(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:2.5E-4},fogNear:{value:1},
-fogFar:{value:2E3},fogColor:{value:new G(16777215)}},lights:{ambientLightColor:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},
-pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{},shadow:{},shadowBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}}},points:{diffuse:{value:new G(15658734)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},uvTransform:{value:new ra}},
-sprite:{diffuse:{value:new G(15658734)},opacity:{value:1},center:{value:new z(.5,.5)},rotation:{value:0},map:{value:null},uvTransform:{value:new ra}}},nb={basic:{uniforms:Aa.merge([K.common,K.specularmap,K.envmap,K.aomap,K.lightmap,K.fog]),vertexShader:S.meshbasic_vert,fragmentShader:S.meshbasic_frag},lambert:{uniforms:Aa.merge([K.common,K.specularmap,K.envmap,K.aomap,K.lightmap,K.emissivemap,K.fog,K.lights,{emissive:{value:new G(0)}}]),vertexShader:S.meshlambert_vert,fragmentShader:S.meshlambert_frag},
-phong:{uniforms:Aa.merge([K.common,K.specularmap,K.envmap,K.aomap,K.lightmap,K.emissivemap,K.bumpmap,K.normalmap,K.displacementmap,K.gradientmap,K.fog,K.lights,{emissive:{value:new G(0)},specular:{value:new G(1118481)},shininess:{value:30}}]),vertexShader:S.meshphong_vert,fragmentShader:S.meshphong_frag},standard:{uniforms:Aa.merge([K.common,K.envmap,K.aomap,K.lightmap,K.emissivemap,K.bumpmap,K.normalmap,K.displacementmap,K.roughnessmap,K.metalnessmap,K.fog,K.lights,{emissive:{value:new G(0)},roughness:{value:.5},
-metalness:{value:.5},envMapIntensity:{value:1}}]),vertexShader:S.meshphysical_vert,fragmentShader:S.meshphysical_frag},points:{uniforms:Aa.merge([K.points,K.fog]),vertexShader:S.points_vert,fragmentShader:S.points_frag},dashed:{uniforms:Aa.merge([K.common,K.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:S.linedashed_vert,fragmentShader:S.linedashed_frag},depth:{uniforms:Aa.merge([K.common,K.displacementmap]),vertexShader:S.depth_vert,fragmentShader:S.depth_frag},normal:{uniforms:Aa.merge([K.common,
-K.bumpmap,K.normalmap,K.displacementmap,{opacity:{value:1}}]),vertexShader:S.normal_vert,fragmentShader:S.normal_frag},sprite:{uniforms:Aa.merge([K.sprite,K.fog]),vertexShader:S.sprite_vert,fragmentShader:S.sprite_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:S.cube_vert,fragmentShader:S.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:S.equirect_vert,fragmentShader:S.equirect_frag},distanceRGBA:{uniforms:Aa.merge([K.common,K.displacementmap,
-{referencePosition:{value:new p},nearDistance:{value:1},farDistance:{value:1E3}}]),vertexShader:S.distanceRGBA_vert,fragmentShader:S.distanceRGBA_frag},shadow:{uniforms:Aa.merge([K.lights,K.fog,{color:{value:new G(0)},opacity:{value:1}}]),vertexShader:S.shadow_vert,fragmentShader:S.shadow_frag}};nb.physical={uniforms:Aa.merge([nb.standard.uniforms,{clearCoat:{value:0},clearCoatRoughness:{value:0}}]),vertexShader:S.meshphysical_vert,fragmentShader:S.meshphysical_frag};hb.RotationOrders="XYZ YZX ZXY XZY YXZ ZYX".split(" ");
-hb.DefaultOrder="XYZ";Object.defineProperties(hb.prototype,{x:{get:function(){return this._x},set:function(a){this._x=a;this.onChangeCallback()}},y:{get:function(){return this._y},set:function(a){this._y=a;this.onChangeCallback()}},z:{get:function(){return this._z},set:function(a){this._z=a;this.onChangeCallback()}},order:{get:function(){return this._order},set:function(a){this._order=a;this.onChangeCallback()}}});Object.assign(hb.prototype,{isEuler:!0,set:function(a,b,c,d){this._x=a;this._y=b;this._z=
-c;this._order=d||this._order;this.onChangeCallback();return this},clone:function(){return new this.constructor(this._x,this._y,this._z,this._order)},copy:function(a){this._x=a._x;this._y=a._y;this._z=a._z;this._order=a._order;this.onChangeCallback();return this},setFromRotationMatrix:function(a,b,c){var d=H.clamp,e=a.elements;a=e[0];var f=e[4],g=e[8],h=e[1],k=e[5],m=e[9],l=e[2],n=e[6];e=e[10];b=b||this._order;"XYZ"===b?(this._y=Math.asin(d(g,-1,1)),.99999>Math.abs(g)?(this._x=Math.atan2(-m,e),this._z=
-Math.atan2(-f,a)):(this._x=Math.atan2(n,k),this._z=0)):"YXZ"===b?(this._x=Math.asin(-d(m,-1,1)),.99999>Math.abs(m)?(this._y=Math.atan2(g,e),this._z=Math.atan2(h,k)):(this._y=Math.atan2(-l,a),this._z=0)):"ZXY"===b?(this._x=Math.asin(d(n,-1,1)),.99999>Math.abs(n)?(this._y=Math.atan2(-l,e),this._z=Math.atan2(-f,k)):(this._y=0,this._z=Math.atan2(h,a))):"ZYX"===b?(this._y=Math.asin(-d(l,-1,1)),.99999>Math.abs(l)?(this._x=Math.atan2(n,e),this._z=Math.atan2(h,a)):(this._x=0,this._z=Math.atan2(-f,k))):"YZX"===
-b?(this._z=Math.asin(d(h,-1,1)),.99999>Math.abs(h)?(this._x=Math.atan2(-m,k),this._y=Math.atan2(-l,a)):(this._x=0,this._y=Math.atan2(g,e))):"XZY"===b?(this._z=Math.asin(-d(f,-1,1)),.99999>Math.abs(f)?(this._x=Math.atan2(n,k),this._y=Math.atan2(g,a)):(this._x=Math.atan2(-m,e),this._y=0)):console.warn("THREE.Euler: .setFromRotationMatrix() given unsupported order: "+b);this._order=b;if(!1!==c)this.onChangeCallback();return this},setFromQuaternion:function(){var a=new I;return function(b,c,d){a.makeRotationFromQuaternion(b);
-return this.setFromRotationMatrix(a,c,d)}}(),setFromVector3:function(a,b){return this.set(a.x,a.y,a.z,b||this._order)},reorder:function(){var a=new fa;return function(b){a.setFromEuler(this);return this.setFromQuaternion(a,b)}}(),equals:function(a){return a._x===this._x&&a._y===this._y&&a._z===this._z&&a._order===this._order},fromArray:function(a){this._x=a[0];this._y=a[1];this._z=a[2];void 0!==a[3]&&(this._order=a[3]);this.onChangeCallback();return this},toArray:function(a,b){void 0===a&&(a=[]);
-void 0===b&&(b=0);a[b]=this._x;a[b+1]=this._y;a[b+2]=this._z;a[b+3]=this._order;return a},toVector3:function(a){return a?a.set(this._x,this._y,this._z):new p(this._x,this._y,this._z)},onChange:function(a){this.onChangeCallback=a;return this},onChangeCallback:function(){}});Object.assign(Rd.prototype,{set:function(a){this.mask=1<<a|0},enable:function(a){this.mask=this.mask|1<<a|0},toggle:function(a){this.mask^=1<<a|0},disable:function(a){this.mask&=~(1<<a|0)},test:function(a){return 0!==(this.mask&
-a.mask)}});var Gf=0;D.DefaultUp=new p(0,1,0);D.DefaultMatrixAutoUpdate=!0;D.prototype=Object.assign(Object.create(ya.prototype),{constructor:D,isObject3D:!0,onBeforeRender:function(){},onAfterRender:function(){},applyMatrix:function(a){this.matrix.multiplyMatrices(a,this.matrix);this.matrix.decompose(this.position,this.quaternion,this.scale)},applyQuaternion:function(a){this.quaternion.premultiply(a);return this},setRotationFromAxisAngle:function(a,b){this.quaternion.setFromAxisAngle(a,b)},setRotationFromEuler:function(a){this.quaternion.setFromEuler(a,
-!0)},setRotationFromMatrix:function(a){this.quaternion.setFromRotationMatrix(a)},setRotationFromQuaternion:function(a){this.quaternion.copy(a)},rotateOnAxis:function(){var a=new fa;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.multiply(a);return this}}(),rotateOnWorldAxis:function(){var a=new fa;return function(b,c){a.setFromAxisAngle(b,c);this.quaternion.premultiply(a);return this}}(),rotateX:function(){var a=new p(1,0,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateY:function(){var a=
-new p(0,1,0);return function(b){return this.rotateOnAxis(a,b)}}(),rotateZ:function(){var a=new p(0,0,1);return function(b){return this.rotateOnAxis(a,b)}}(),translateOnAxis:function(){var a=new p;return function(b,c){a.copy(b).applyQuaternion(this.quaternion);this.position.add(a.multiplyScalar(c));return this}}(),translateX:function(){var a=new p(1,0,0);return function(b){return this.translateOnAxis(a,b)}}(),translateY:function(){var a=new p(0,1,0);return function(b){return this.translateOnAxis(a,
-b)}}(),translateZ:function(){var a=new p(0,0,1);return function(b){return this.translateOnAxis(a,b)}}(),localToWorld:function(a){return a.applyMatrix4(this.matrixWorld)},worldToLocal:function(){var a=new I;return function(b){return b.applyMatrix4(a.getInverse(this.matrixWorld))}}(),lookAt:function(){var a=new I,b=new p;return function(c,d,e){c.isVector3?b.copy(c):b.set(c,d,e);this.isCamera?a.lookAt(this.position,b,this.up):a.lookAt(b,this.position,this.up);this.quaternion.setFromRotationMatrix(a)}}(),
-add:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.add(arguments[b]);return this}if(a===this)return console.error("THREE.Object3D.add: object can't be added as a child of itself.",a),this;a&&a.isObject3D?(null!==a.parent&&a.parent.remove(a),a.parent=this,a.dispatchEvent({type:"added"}),this.children.push(a)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",a);return this},remove:function(a){if(1<arguments.length){for(var b=0;b<arguments.length;b++)this.remove(arguments[b]);
-return this}b=this.children.indexOf(a);-1!==b&&(a.parent=null,a.dispatchEvent({type:"removed"}),this.children.splice(b,1));return this},getObjectById:function(a){return this.getObjectByProperty("id",a)},getObjectByName:function(a){return this.getObjectByProperty("name",a)},getObjectByProperty:function(a,b){if(this[a]===b)return this;for(var c=0,d=this.children.length;c<d;c++){var e=this.children[c].getObjectByProperty(a,b);if(void 0!==e)return e}},getWorldPosition:function(a){void 0===a&&(console.warn("THREE.Object3D: .getWorldPosition() target is now required"),
-a=new p);this.updateMatrixWorld(!0);return a.setFromMatrixPosition(this.matrixWorld)},getWorldQuaternion:function(){var a=new p,b=new p;return function(c){void 0===c&&(console.warn("THREE.Object3D: .getWorldQuaternion() target is now required"),c=new fa);this.updateMatrixWorld(!0);this.matrixWorld.decompose(a,c,b);return c}}(),getWorldScale:function(){var a=new p,b=new fa;return function(c){void 0===c&&(console.warn("THREE.Object3D: .getWorldScale() target is now required"),c=new p);this.updateMatrixWorld(!0);
-this.matrixWorld.decompose(a,b,c);return c}}(),getWorldDirection:function(){var a=new fa;return function(b){void 0===b&&(console.warn("THREE.Object3D: .getWorldDirection() target is now required"),b=new p);this.getWorldQuaternion(a);return b.set(0,0,1).applyQuaternion(a)}}(),raycast:function(){},traverse:function(a){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverse(a)},traverseVisible:function(a){if(!1!==this.visible){a(this);for(var b=this.children,c=0,d=b.length;c<d;c++)b[c].traverseVisible(a)}},
-traverseAncestors:function(a){var b=this.parent;null!==b&&(a(b),b.traverseAncestors(a))},updateMatrix:function(){this.matrix.compose(this.position,this.quaternion,this.scale);this.matrixWorldNeedsUpdate=!0},updateMatrixWorld:function(a){this.matrixAutoUpdate&&this.updateMatrix();if(this.matrixWorldNeedsUpdate||a)null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,a=!0;for(var b=this.children,c=
-0,d=b.length;c<d;c++)b[c].updateMatrixWorld(a)},toJSON:function(a){function b(b,c){void 0===b[c.uuid]&&(b[c.uuid]=c.toJSON(a));return c.uuid}function c(a){var b=[],c;for(c in a){var d=a[c];delete d.metadata;b.push(d)}return b}var d=void 0===a||"string"===typeof a,e={};d&&(a={geometries:{},materials:{},textures:{},images:{},shapes:{}},e.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});var f={};f.uuid=this.uuid;f.type=this.type;""!==this.name&&(f.name=this.name);!0===this.castShadow&&
-(f.castShadow=!0);!0===this.receiveShadow&&(f.receiveShadow=!0);!1===this.visible&&(f.visible=!1);!1===this.frustumCulled&&(f.frustumCulled=!1);0!==this.renderOrder&&(f.renderOrder=this.renderOrder);"{}"!==JSON.stringify(this.userData)&&(f.userData=this.userData);f.layers=this.layers.mask;f.matrix=this.matrix.toArray();!1===this.matrixAutoUpdate&&(f.matrixAutoUpdate=!1);if(this.isMesh||this.isLine||this.isPoints){f.geometry=b(a.geometries,this.geometry);var g=this.geometry.parameters;if(void 0!==
-g&&void 0!==g.shapes)if(g=g.shapes,Array.isArray(g))for(var h=0,k=g.length;h<k;h++)b(a.shapes,g[h]);else b(a.shapes,g)}if(void 0!==this.material)if(Array.isArray(this.material)){g=[];h=0;for(k=this.material.length;h<k;h++)g.push(b(a.materials,this.material[h]));f.material=g}else f.material=b(a.materials,this.material);if(0<this.children.length)for(f.children=[],h=0;h<this.children.length;h++)f.children.push(this.children[h].toJSON(a).object);if(d){d=c(a.geometries);h=c(a.materials);k=c(a.textures);
-var m=c(a.images);g=c(a.shapes);0<d.length&&(e.geometries=d);0<h.length&&(e.materials=h);0<k.length&&(e.textures=k);0<m.length&&(e.images=m);0<g.length&&(e.shapes=g)}e.object=f;return e},clone:function(a){return(new this.constructor).copy(this,a)},copy:function(a,b){void 0===b&&(b=!0);this.name=a.name;this.up.copy(a.up);this.position.copy(a.position);this.quaternion.copy(a.quaternion);this.scale.copy(a.scale);this.matrix.copy(a.matrix);this.matrixWorld.copy(a.matrixWorld);this.matrixAutoUpdate=a.matrixAutoUpdate;
-this.matrixWorldNeedsUpdate=a.matrixWorldNeedsUpdate;this.layers.mask=a.layers.mask;this.visible=a.visible;this.castShadow=a.castShadow;this.receiveShadow=a.receiveShadow;this.frustumCulled=a.frustumCulled;this.renderOrder=a.renderOrder;this.userData=JSON.parse(JSON.stringify(a.userData));if(!0===b)for(b=0;b<a.children.length;b++)this.add(a.children[b].clone());return this}});Na.prototype=Object.assign(Object.create(D.prototype),{constructor:Na,isCamera:!0,copy:function(a,b){D.prototype.copy.call(this,
-a,b);this.matrixWorldInverse.copy(a.matrixWorldInverse);this.projectionMatrix.copy(a.projectionMatrix);return this},getWorldDirection:function(){var a=new fa;return function(b){void 0===b&&(console.warn("THREE.Camera: .getWorldDirection() target is now required"),b=new p);this.getWorldQuaternion(a);return b.set(0,0,-1).applyQuaternion(a)}}(),updateMatrixWorld:function(a){D.prototype.updateMatrixWorld.call(this,a);this.matrixWorldInverse.getInverse(this.matrixWorld)},clone:function(){return(new this.constructor).copy(this)}});
-Hb.prototype=Object.assign(Object.create(Na.prototype),{constructor:Hb,isOrthographicCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.left=a.left;this.right=a.right;this.top=a.top;this.bottom=a.bottom;this.near=a.near;this.far=a.far;this.zoom=a.zoom;this.view=null===a.view?null:Object.assign({},a.view);return this},setViewOffset:function(a,b,c,d,e,f){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=
-a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=(this.right-this.left)/(2*this.zoom),b=(this.top-this.bottom)/(2*this.zoom),c=(this.right+this.left)/2,d=(this.top+this.bottom)/2,e=c-a;c+=a;a=d+b;b=d-b;if(null!==this.view&&this.view.enabled){c=this.zoom/(this.view.width/this.view.fullWidth);
-b=this.zoom/(this.view.height/this.view.fullHeight);var f=(this.right-this.left)/this.view.width;d=(this.top-this.bottom)/this.view.height;e+=this.view.offsetX/c*f;c=e+this.view.width/c*f;a-=this.view.offsetY/b*d;b=a-this.view.height/b*d}this.projectionMatrix.makeOrthographic(e,c,a,b,this.near,this.far)},toJSON:function(a){a=D.prototype.toJSON.call(this,a);a.object.zoom=this.zoom;a.object.left=this.left;a.object.right=this.right;a.object.top=this.top;a.object.bottom=this.bottom;a.object.near=this.near;
-a.object.far=this.far;null!==this.view&&(a.object.view=Object.assign({},this.view));return a}});Object.assign(Ta.prototype,{clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a=a.a;this.b=a.b;this.c=a.c;this.normal.copy(a.normal);this.color.copy(a.color);this.materialIndex=a.materialIndex;for(var b=0,c=a.vertexNormals.length;b<c;b++)this.vertexNormals[b]=a.vertexNormals[b].clone();b=0;for(c=a.vertexColors.length;b<c;b++)this.vertexColors[b]=a.vertexColors[b].clone();return this}});
-var Hf=0;R.prototype=Object.assign(Object.create(ya.prototype),{constructor:R,isGeometry:!0,applyMatrix:function(a){for(var b=(new ra).getNormalMatrix(a),c=0,d=this.vertices.length;c<d;c++)this.vertices[c].applyMatrix4(a);c=0;for(d=this.faces.length;c<d;c++){a=this.faces[c];a.normal.applyMatrix3(b).normalize();for(var e=0,f=a.vertexNormals.length;e<f;e++)a.vertexNormals[e].applyMatrix3(b).normalize()}null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();
-this.normalsNeedUpdate=this.verticesNeedUpdate=!0;return this},rotateX:function(){var a=new I;return function(b){a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a=new I;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new I;return function(b){a.makeRotationZ(b);this.applyMatrix(a);return this}}(),translate:function(){var a=new I;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=
-new I;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new D;return function(b){a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),fromBufferGeometry:function(a){function b(a,b,d,e){var f=void 0!==g?[l[a].clone(),l[b].clone(),l[d].clone()]:[],q=void 0!==h?[c.colors[a].clone(),c.colors[b].clone(),c.colors[d].clone()]:[];e=new Ta(a,b,d,f,q,e);c.faces.push(e);void 0!==k&&c.faceVertexUvs[0].push([n[a].clone(),n[b].clone(),n[d].clone()]);void 0!==
-m&&c.faceVertexUvs[1].push([t[a].clone(),t[b].clone(),t[d].clone()])}var c=this,d=null!==a.index?a.index.array:void 0,e=a.attributes,f=e.position.array,g=void 0!==e.normal?e.normal.array:void 0,h=void 0!==e.color?e.color.array:void 0,k=void 0!==e.uv?e.uv.array:void 0,m=void 0!==e.uv2?e.uv2.array:void 0;void 0!==m&&(this.faceVertexUvs[1]=[]);for(var l=[],n=[],t=[],u=e=0;e<f.length;e+=3,u+=2)c.vertices.push(new p(f[e],f[e+1],f[e+2])),void 0!==g&&l.push(new p(g[e],g[e+1],g[e+2])),void 0!==h&&c.colors.push(new G(h[e],
-h[e+1],h[e+2])),void 0!==k&&n.push(new z(k[u],k[u+1])),void 0!==m&&t.push(new z(m[u],m[u+1]));var r=a.groups;if(0<r.length)for(e=0;e<r.length;e++){f=r[e];var v=f.start,y=f.count;u=v;for(v+=y;u<v;u+=3)void 0!==d?b(d[u],d[u+1],d[u+2],f.materialIndex):b(u,u+1,u+2,f.materialIndex)}else if(void 0!==d)for(e=0;e<d.length;e+=3)b(d[e],d[e+1],d[e+2]);else for(e=0;e<f.length/3;e+=3)b(e,e+1,e+2);this.computeFaceNormals();null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());null!==a.boundingSphere&&
-(this.boundingSphere=a.boundingSphere.clone());return this},center:function(){var a=new p;return function(){this.computeBoundingBox();this.boundingBox.getCenter(a).negate();this.translate(a.x,a.y,a.z);return this}}(),normalize:function(){this.computeBoundingSphere();var a=this.boundingSphere.center,b=this.boundingSphere.radius;b=0===b?1:1/b;var c=new I;c.set(b,0,0,-b*a.x,0,b,0,-b*a.y,0,0,b,-b*a.z,0,0,0,1);this.applyMatrix(c);return this},computeFaceNormals:function(){for(var a=new p,b=new p,c=0,d=
-this.faces.length;c<d;c++){var e=this.faces[c],f=this.vertices[e.a],g=this.vertices[e.b];a.subVectors(this.vertices[e.c],g);b.subVectors(f,g);a.cross(b);a.normalize();e.normal.copy(a)}},computeVertexNormals:function(a){void 0===a&&(a=!0);var b;var c=Array(this.vertices.length);var d=0;for(b=this.vertices.length;d<b;d++)c[d]=new p;if(a){var e=new p,f=new p;a=0;for(d=this.faces.length;a<d;a++){b=this.faces[a];var g=this.vertices[b.a];var h=this.vertices[b.b];var k=this.vertices[b.c];e.subVectors(k,
-h);f.subVectors(g,h);e.cross(f);c[b.a].add(e);c[b.b].add(e);c[b.c].add(e)}}else for(this.computeFaceNormals(),a=0,d=this.faces.length;a<d;a++)b=this.faces[a],c[b.a].add(b.normal),c[b.b].add(b.normal),c[b.c].add(b.normal);d=0;for(b=this.vertices.length;d<b;d++)c[d].normalize();a=0;for(d=this.faces.length;a<d;a++)b=this.faces[a],g=b.vertexNormals,3===g.length?(g[0].copy(c[b.a]),g[1].copy(c[b.b]),g[2].copy(c[b.c])):(g[0]=c[b.a].clone(),g[1]=c[b.b].clone(),g[2]=c[b.c].clone());0<this.faces.length&&(this.normalsNeedUpdate=
-!0)},computeFlatVertexNormals:function(){var a;this.computeFaceNormals();var b=0;for(a=this.faces.length;b<a;b++){var c=this.faces[b];var d=c.vertexNormals;3===d.length?(d[0].copy(c.normal),d[1].copy(c.normal),d[2].copy(c.normal)):(d[0]=c.normal.clone(),d[1]=c.normal.clone(),d[2]=c.normal.clone())}0<this.faces.length&&(this.normalsNeedUpdate=!0)},computeMorphNormals:function(){var a,b;var c=0;for(b=this.faces.length;c<b;c++){var d=this.faces[c];d.__originalFaceNormal?d.__originalFaceNormal.copy(d.normal):
-d.__originalFaceNormal=d.normal.clone();d.__originalVertexNormals||(d.__originalVertexNormals=[]);var e=0;for(a=d.vertexNormals.length;e<a;e++)d.__originalVertexNormals[e]?d.__originalVertexNormals[e].copy(d.vertexNormals[e]):d.__originalVertexNormals[e]=d.vertexNormals[e].clone()}var f=new R;f.faces=this.faces;e=0;for(a=this.morphTargets.length;e<a;e++){if(!this.morphNormals[e]){this.morphNormals[e]={};this.morphNormals[e].faceNormals=[];this.morphNormals[e].vertexNormals=[];d=this.morphNormals[e].faceNormals;
-var g=this.morphNormals[e].vertexNormals;c=0;for(b=this.faces.length;c<b;c++){var h=new p;var k={a:new p,b:new p,c:new p};d.push(h);g.push(k)}}g=this.morphNormals[e];f.vertices=this.morphTargets[e].vertices;f.computeFaceNormals();f.computeVertexNormals();c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],h=g.faceNormals[c],k=g.vertexNormals[c],h.copy(d.normal),k.a.copy(d.vertexNormals[0]),k.b.copy(d.vertexNormals[1]),k.c.copy(d.vertexNormals[2])}c=0;for(b=this.faces.length;c<b;c++)d=this.faces[c],
-d.normal=d.__originalFaceNormal,d.vertexNormals=d.__originalVertexNormals},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Sa);this.boundingBox.setFromPoints(this.vertices)},computeBoundingSphere:function(){null===this.boundingSphere&&(this.boundingSphere=new Da);this.boundingSphere.setFromPoints(this.vertices)},merge:function(a,b,c){if(a&&a.isGeometry){var d,e=this.vertices.length,f=this.vertices,g=a.vertices,h=this.faces,k=a.faces,m=this.faceVertexUvs[0],l=a.faceVertexUvs[0],
-n=this.colors,t=a.colors;void 0===c&&(c=0);void 0!==b&&(d=(new ra).getNormalMatrix(b));a=0;for(var p=g.length;a<p;a++){var r=g[a].clone();void 0!==b&&r.applyMatrix4(b);f.push(r)}a=0;for(p=t.length;a<p;a++)n.push(t[a].clone());a=0;for(p=k.length;a<p;a++){g=k[a];var v=g.vertexNormals;t=g.vertexColors;n=new Ta(g.a+e,g.b+e,g.c+e);n.normal.copy(g.normal);void 0!==d&&n.normal.applyMatrix3(d).normalize();b=0;for(f=v.length;b<f;b++)r=v[b].clone(),void 0!==d&&r.applyMatrix3(d).normalize(),n.vertexNormals.push(r);
-n.color.copy(g.color);b=0;for(f=t.length;b<f;b++)r=t[b],n.vertexColors.push(r.clone());n.materialIndex=g.materialIndex+c;h.push(n)}a=0;for(p=l.length;a<p;a++)if(c=l[a],d=[],void 0!==c){b=0;for(f=c.length;b<f;b++)d.push(c[b].clone());m.push(d)}}else console.error("THREE.Geometry.merge(): geometry not an instance of THREE.Geometry.",a)},mergeMesh:function(a){a&&a.isMesh?(a.matrixAutoUpdate&&a.updateMatrix(),this.merge(a.geometry,a.matrix)):console.error("THREE.Geometry.mergeMesh(): mesh not an instance of THREE.Mesh.",
-a)},mergeVertices:function(){var a={},b=[],c=[],d=Math.pow(10,4),e;var f=0;for(e=this.vertices.length;f<e;f++){var g=this.vertices[f];g=Math.round(g.x*d)+"_"+Math.round(g.y*d)+"_"+Math.round(g.z*d);void 0===a[g]?(a[g]=f,b.push(this.vertices[f]),c[f]=b.length-1):c[f]=c[a[g]]}a=[];f=0;for(e=this.faces.length;f<e;f++)for(d=this.faces[f],d.a=c[d.a],d.b=c[d.b],d.c=c[d.c],d=[d.a,d.b,d.c],g=0;3>g;g++)if(d[g]===d[(g+1)%3]){a.push(f);break}for(f=a.length-1;0<=f;f--)for(d=a[f],this.faces.splice(d,1),c=0,e=
-this.faceVertexUvs.length;c<e;c++)this.faceVertexUvs[c].splice(d,1);f=this.vertices.length-b.length;this.vertices=b;return f},setFromPoints:function(a){this.vertices=[];for(var b=0,c=a.length;b<c;b++){var d=a[b];this.vertices.push(new p(d.x,d.y,d.z||0))}return this},sortFacesByMaterialIndex:function(){for(var a=this.faces,b=a.length,c=0;c<b;c++)a[c]._id=c;a.sort(function(a,b){return a.materialIndex-b.materialIndex});var d=this.faceVertexUvs[0],e=this.faceVertexUvs[1],f,g;d&&d.length===b&&(f=[]);e&&
-e.length===b&&(g=[]);for(c=0;c<b;c++){var h=a[c]._id;f&&f.push(d[h]);g&&g.push(e[h])}f&&(this.faceVertexUvs[0]=f);g&&(this.faceVertexUvs[1]=g)},toJSON:function(){function a(a,b,c){return c?a|1<<b:a&~(1<<b)}function b(a){var b=a.x.toString()+a.y.toString()+a.z.toString();if(void 0!==m[b])return m[b];m[b]=k.length/3;k.push(a.x,a.y,a.z);return m[b]}function c(a){var b=a.r.toString()+a.g.toString()+a.b.toString();if(void 0!==n[b])return n[b];n[b]=l.length;l.push(a.getHex());return n[b]}function d(a){var b=
-a.x.toString()+a.y.toString();if(void 0!==p[b])return p[b];p[b]=t.length/2;t.push(a.x,a.y);return p[b]}var e={metadata:{version:4.5,type:"Geometry",generator:"Geometry.toJSON"}};e.uuid=this.uuid;e.type=this.type;""!==this.name&&(e.name=this.name);if(void 0!==this.parameters){var f=this.parameters,g;for(g in f)void 0!==f[g]&&(e[g]=f[g]);return e}f=[];for(g=0;g<this.vertices.length;g++){var h=this.vertices[g];f.push(h.x,h.y,h.z)}h=[];var k=[],m={},l=[],n={},t=[],p={};for(g=0;g<this.faces.length;g++){var r=
-this.faces[g],v=void 0!==this.faceVertexUvs[0][g],y=0<r.normal.length(),x=0<r.vertexNormals.length,w=1!==r.color.r||1!==r.color.g||1!==r.color.b,B=0<r.vertexColors.length,E=0;E=a(E,0,0);E=a(E,1,!0);E=a(E,2,!1);E=a(E,3,v);E=a(E,4,y);E=a(E,5,x);E=a(E,6,w);E=a(E,7,B);h.push(E);h.push(r.a,r.b,r.c);h.push(r.materialIndex);v&&(v=this.faceVertexUvs[0][g],h.push(d(v[0]),d(v[1]),d(v[2])));y&&h.push(b(r.normal));x&&(y=r.vertexNormals,h.push(b(y[0]),b(y[1]),b(y[2])));w&&h.push(c(r.color));B&&(r=r.vertexColors,
-h.push(c(r[0]),c(r[1]),c(r[2])))}e.data={};e.data.vertices=f;e.data.normals=k;0<l.length&&(e.data.colors=l);0<t.length&&(e.data.uvs=[t]);e.data.faces=h;return e},clone:function(){return(new R).copy(this)},copy:function(a){var b,c,d;this.vertices=[];this.colors=[];this.faces=[];this.faceVertexUvs=[[]];this.morphTargets=[];this.morphNormals=[];this.skinWeights=[];this.skinIndices=[];this.lineDistances=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var e=a.vertices;var f=0;for(b=e.length;f<
-b;f++)this.vertices.push(e[f].clone());e=a.colors;f=0;for(b=e.length;f<b;f++)this.colors.push(e[f].clone());e=a.faces;f=0;for(b=e.length;f<b;f++)this.faces.push(e[f].clone());f=0;for(b=a.faceVertexUvs.length;f<b;f++){var g=a.faceVertexUvs[f];void 0===this.faceVertexUvs[f]&&(this.faceVertexUvs[f]=[]);e=0;for(c=g.length;e<c;e++){var h=g[e],k=[];var m=0;for(d=h.length;m<d;m++)k.push(h[m].clone());this.faceVertexUvs[f].push(k)}}m=a.morphTargets;f=0;for(b=m.length;f<b;f++){d={};d.name=m[f].name;if(void 0!==
-m[f].vertices)for(d.vertices=[],e=0,c=m[f].vertices.length;e<c;e++)d.vertices.push(m[f].vertices[e].clone());if(void 0!==m[f].normals)for(d.normals=[],e=0,c=m[f].normals.length;e<c;e++)d.normals.push(m[f].normals[e].clone());this.morphTargets.push(d)}m=a.morphNormals;f=0;for(b=m.length;f<b;f++){d={};if(void 0!==m[f].vertexNormals)for(d.vertexNormals=[],e=0,c=m[f].vertexNormals.length;e<c;e++)g=m[f].vertexNormals[e],h={},h.a=g.a.clone(),h.b=g.b.clone(),h.c=g.c.clone(),d.vertexNormals.push(h);if(void 0!==
-m[f].faceNormals)for(d.faceNormals=[],e=0,c=m[f].faceNormals.length;e<c;e++)d.faceNormals.push(m[f].faceNormals[e].clone());this.morphNormals.push(d)}e=a.skinWeights;f=0;for(b=e.length;f<b;f++)this.skinWeights.push(e[f].clone());e=a.skinIndices;f=0;for(b=e.length;f<b;f++)this.skinIndices.push(e[f].clone());e=a.lineDistances;f=0;for(b=e.length;f<b;f++)this.lineDistances.push(e[f]);f=a.boundingBox;null!==f&&(this.boundingBox=f.clone());f=a.boundingSphere;null!==f&&(this.boundingSphere=f.clone());this.elementsNeedUpdate=
-a.elementsNeedUpdate;this.verticesNeedUpdate=a.verticesNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.lineDistancesNeedUpdate=a.lineDistancesNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Object.defineProperty(Q.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(Q.prototype,{isBufferAttribute:!0,onUploadCallback:function(){},
-setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.itemSize:0;this.array=a;return this},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.name=a.name;this.array=new a.array.constructor(a.array);this.itemSize=a.itemSize;this.count=a.count;this.normalized=a.normalized;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.itemSize;c*=b.itemSize;for(var d=0,e=this.itemSize;d<
-e;d++)this.array[a+d]=b.array[c+d];return this},copyArray:function(a){this.array.set(a);return this},copyColorsArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",d),f=new G);b[c++]=f.r;b[c++]=f.g;b[c++]=f.b}return this},copyVector2sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",
-d),f=new z);b[c++]=f.x;b[c++]=f.y}return this},copyVector3sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",d),f=new p);b[c++]=f.x;b[c++]=f.y;b[c++]=f.z}return this},copyVector4sArray:function(a){for(var b=this.array,c=0,d=0,e=a.length;d<e;d++){var f=a[d];void 0===f&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",d),f=new V);b[c++]=f.x;b[c++]=f.y;
-b[c++]=f.z;b[c++]=f.w}return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},getX:function(a){return this.array[a*this.itemSize]},setX:function(a,b){this.array[a*this.itemSize]=b;return this},getY:function(a){return this.array[a*this.itemSize+1]},setY:function(a,b){this.array[a*this.itemSize+1]=b;return this},getZ:function(a){return this.array[a*this.itemSize+2]},setZ:function(a,b){this.array[a*this.itemSize+2]=b;return this},getW:function(a){return this.array[a*this.itemSize+
-3]},setW:function(a,b){this.array[a*this.itemSize+3]=b;return this},setXY:function(a,b,c){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;return this},setXYZW:function(a,b,c,d,e){a*=this.itemSize;this.array[a+0]=b;this.array[a+1]=c;this.array[a+2]=d;this.array[a+3]=e;return this},onUpload:function(a){this.onUploadCallback=a;return this},clone:function(){return(new this.constructor(this.array,
-this.itemSize)).copy(this)}});oc.prototype=Object.create(Q.prototype);oc.prototype.constructor=oc;pc.prototype=Object.create(Q.prototype);pc.prototype.constructor=pc;qc.prototype=Object.create(Q.prototype);qc.prototype.constructor=qc;rc.prototype=Object.create(Q.prototype);rc.prototype.constructor=rc;ib.prototype=Object.create(Q.prototype);ib.prototype.constructor=ib;sc.prototype=Object.create(Q.prototype);sc.prototype.constructor=sc;jb.prototype=Object.create(Q.prototype);jb.prototype.constructor=
-jb;A.prototype=Object.create(Q.prototype);A.prototype.constructor=A;tc.prototype=Object.create(Q.prototype);tc.prototype.constructor=tc;Object.assign(Ee.prototype,{computeGroups:function(a){var b=[],c=void 0;a=a.faces;for(var d=0;d<a.length;d++){var e=a[d];if(e.materialIndex!==c){c=e.materialIndex;void 0!==f&&(f.count=3*d-f.start,b.push(f));var f={start:3*d,materialIndex:c}}}void 0!==f&&(f.count=3*d-f.start,b.push(f));this.groups=b},fromGeometry:function(a){var b=a.faces,c=a.vertices,d=a.faceVertexUvs,
-e=d[0]&&0<d[0].length,f=d[1]&&0<d[1].length,g=a.morphTargets,h=g.length;if(0<h){var k=[];for(var m=0;m<h;m++)k[m]=[];this.morphTargets.position=k}var l=a.morphNormals,n=l.length;if(0<n){var t=[];for(m=0;m<n;m++)t[m]=[];this.morphTargets.normal=t}var p=a.skinIndices,r=a.skinWeights,v=p.length===c.length,y=r.length===c.length;0<c.length&&0===b.length&&console.error("THREE.DirectGeometry: Faceless geometries are not supported.");for(m=0;m<b.length;m++){var x=b[m];this.vertices.push(c[x.a],c[x.b],c[x.c]);
-var w=x.vertexNormals;3===w.length?this.normals.push(w[0],w[1],w[2]):(w=x.normal,this.normals.push(w,w,w));w=x.vertexColors;3===w.length?this.colors.push(w[0],w[1],w[2]):(w=x.color,this.colors.push(w,w,w));!0===e&&(w=d[0][m],void 0!==w?this.uvs.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv ",m),this.uvs.push(new z,new z,new z)));!0===f&&(w=d[1][m],void 0!==w?this.uvs2.push(w[0],w[1],w[2]):(console.warn("THREE.DirectGeometry.fromGeometry(): Undefined vertexUv2 ",
-m),this.uvs2.push(new z,new z,new z)));for(w=0;w<h;w++){var B=g[w].vertices;k[w].push(B[x.a],B[x.b],B[x.c])}for(w=0;w<n;w++)B=l[w].vertexNormals[m],t[w].push(B.a,B.b,B.c);v&&this.skinIndices.push(p[x.a],p[x.b],p[x.c]);y&&this.skinWeights.push(r[x.a],r[x.b],r[x.c])}this.computeGroups(a);this.verticesNeedUpdate=a.verticesNeedUpdate;this.normalsNeedUpdate=a.normalsNeedUpdate;this.colorsNeedUpdate=a.colorsNeedUpdate;this.uvsNeedUpdate=a.uvsNeedUpdate;this.groupsNeedUpdate=a.groupsNeedUpdate;return this}});
-var If=1;C.prototype=Object.assign(Object.create(ya.prototype),{constructor:C,isBufferGeometry:!0,getIndex:function(){return this.index},setIndex:function(a){Array.isArray(a)?this.index=new (65535<Fe(a)?jb:ib)(a,1):this.index=a},addAttribute:function(a,b,c){if(!(b&&b.isBufferAttribute||b&&b.isInterleavedBufferAttribute))return console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.addAttribute(a,new Q(b,c));if("index"===a)return console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),
-this.setIndex(b),this;this.attributes[a]=b;return this},getAttribute:function(a){return this.attributes[a]},removeAttribute:function(a){delete this.attributes[a];return this},addGroup:function(a,b,c){this.groups.push({start:a,count:b,materialIndex:void 0!==c?c:0})},clearGroups:function(){this.groups=[]},setDrawRange:function(a,b){this.drawRange.start=a;this.drawRange.count=b},applyMatrix:function(a){var b=this.attributes.position;void 0!==b&&(a.applyToBufferAttribute(b),b.needsUpdate=!0);b=this.attributes.normal;
-void 0!==b&&((new ra).getNormalMatrix(a).applyToBufferAttribute(b),b.needsUpdate=!0);null!==this.boundingBox&&this.computeBoundingBox();null!==this.boundingSphere&&this.computeBoundingSphere();return this},rotateX:function(){var a=new I;return function(b){a.makeRotationX(b);this.applyMatrix(a);return this}}(),rotateY:function(){var a=new I;return function(b){a.makeRotationY(b);this.applyMatrix(a);return this}}(),rotateZ:function(){var a=new I;return function(b){a.makeRotationZ(b);this.applyMatrix(a);
-return this}}(),translate:function(){var a=new I;return function(b,c,d){a.makeTranslation(b,c,d);this.applyMatrix(a);return this}}(),scale:function(){var a=new I;return function(b,c,d){a.makeScale(b,c,d);this.applyMatrix(a);return this}}(),lookAt:function(){var a=new D;return function(b){a.lookAt(b);a.updateMatrix();this.applyMatrix(a.matrix)}}(),center:function(){var a=new p;return function(){this.computeBoundingBox();this.boundingBox.getCenter(a).negate();this.translate(a.x,a.y,a.z);return this}}(),
-setFromObject:function(a){var b=a.geometry;if(a.isPoints||a.isLine){a=new A(3*b.vertices.length,3);var c=new A(3*b.colors.length,3);this.addAttribute("position",a.copyVector3sArray(b.vertices));this.addAttribute("color",c.copyColorsArray(b.colors));b.lineDistances&&b.lineDistances.length===b.vertices.length&&(a=new A(b.lineDistances.length,1),this.addAttribute("lineDistance",a.copyArray(b.lineDistances)));null!==b.boundingSphere&&(this.boundingSphere=b.boundingSphere.clone());null!==b.boundingBox&&
-(this.boundingBox=b.boundingBox.clone())}else a.isMesh&&b&&b.isGeometry&&this.fromGeometry(b);return this},setFromPoints:function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];b.push(e.x,e.y,e.z||0)}this.addAttribute("position",new A(b,3));return this},updateFromObject:function(a){var b=a.geometry;if(a.isMesh){var c=b.__directGeometry;!0===b.elementsNeedUpdate&&(c=void 0,b.elementsNeedUpdate=!1);if(void 0===c)return this.fromGeometry(b);c.verticesNeedUpdate=b.verticesNeedUpdate;c.normalsNeedUpdate=
-b.normalsNeedUpdate;c.colorsNeedUpdate=b.colorsNeedUpdate;c.uvsNeedUpdate=b.uvsNeedUpdate;c.groupsNeedUpdate=b.groupsNeedUpdate;b.verticesNeedUpdate=!1;b.normalsNeedUpdate=!1;b.colorsNeedUpdate=!1;b.uvsNeedUpdate=!1;b.groupsNeedUpdate=!1;b=c}!0===b.verticesNeedUpdate&&(c=this.attributes.position,void 0!==c&&(c.copyVector3sArray(b.vertices),c.needsUpdate=!0),b.verticesNeedUpdate=!1);!0===b.normalsNeedUpdate&&(c=this.attributes.normal,void 0!==c&&(c.copyVector3sArray(b.normals),c.needsUpdate=!0),b.normalsNeedUpdate=
-!1);!0===b.colorsNeedUpdate&&(c=this.attributes.color,void 0!==c&&(c.copyColorsArray(b.colors),c.needsUpdate=!0),b.colorsNeedUpdate=!1);b.uvsNeedUpdate&&(c=this.attributes.uv,void 0!==c&&(c.copyVector2sArray(b.uvs),c.needsUpdate=!0),b.uvsNeedUpdate=!1);b.lineDistancesNeedUpdate&&(c=this.attributes.lineDistance,void 0!==c&&(c.copyArray(b.lineDistances),c.needsUpdate=!0),b.lineDistancesNeedUpdate=!1);b.groupsNeedUpdate&&(b.computeGroups(a.geometry),this.groups=b.groups,b.groupsNeedUpdate=!1);return this},
-fromGeometry:function(a){a.__directGeometry=(new Ee).fromGeometry(a);return this.fromDirectGeometry(a.__directGeometry)},fromDirectGeometry:function(a){var b=new Float32Array(3*a.vertices.length);this.addAttribute("position",(new Q(b,3)).copyVector3sArray(a.vertices));0<a.normals.length&&(b=new Float32Array(3*a.normals.length),this.addAttribute("normal",(new Q(b,3)).copyVector3sArray(a.normals)));0<a.colors.length&&(b=new Float32Array(3*a.colors.length),this.addAttribute("color",(new Q(b,3)).copyColorsArray(a.colors)));
-0<a.uvs.length&&(b=new Float32Array(2*a.uvs.length),this.addAttribute("uv",(new Q(b,2)).copyVector2sArray(a.uvs)));0<a.uvs2.length&&(b=new Float32Array(2*a.uvs2.length),this.addAttribute("uv2",(new Q(b,2)).copyVector2sArray(a.uvs2)));this.groups=a.groups;for(var c in a.morphTargets){b=[];for(var d=a.morphTargets[c],e=0,f=d.length;e<f;e++){var g=d[e],h=new A(3*g.length,3);b.push(h.copyVector3sArray(g))}this.morphAttributes[c]=b}0<a.skinIndices.length&&(c=new A(4*a.skinIndices.length,4),this.addAttribute("skinIndex",
-c.copyVector4sArray(a.skinIndices)));0<a.skinWeights.length&&(c=new A(4*a.skinWeights.length,4),this.addAttribute("skinWeight",c.copyVector4sArray(a.skinWeights)));null!==a.boundingSphere&&(this.boundingSphere=a.boundingSphere.clone());null!==a.boundingBox&&(this.boundingBox=a.boundingBox.clone());return this},computeBoundingBox:function(){null===this.boundingBox&&(this.boundingBox=new Sa);var a=this.attributes.position;void 0!==a?this.boundingBox.setFromBufferAttribute(a):this.boundingBox.makeEmpty();
-(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox: Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)},computeBoundingSphere:function(){var a=new Sa,b=new p;return function(){null===this.boundingSphere&&(this.boundingSphere=new Da);var c=this.attributes.position;if(c){var d=this.boundingSphere.center;a.setFromBufferAttribute(c);a.getCenter(d);for(var e=0,
-f=0,g=c.count;f<g;f++)b.x=c.getX(f),b.y=c.getY(f),b.z=c.getZ(f),e=Math.max(e,d.distanceToSquared(b));this.boundingSphere.radius=Math.sqrt(e);isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}}(),computeFaceNormals:function(){},computeVertexNormals:function(){var a=this.index,b=this.attributes,c=this.groups;if(b.position){var d=b.position.array;if(void 0===b.normal)this.addAttribute("normal",
-new Q(new Float32Array(d.length),3));else for(var e=b.normal.array,f=0,g=e.length;f<g;f++)e[f]=0;e=b.normal.array;var h=new p,k=new p,m=new p,l=new p,n=new p;if(a){a=a.array;0===c.length&&this.addGroup(0,a.length);for(var t=0,u=c.length;t<u;++t){f=c[t];g=f.start;var r=f.count;f=g;for(g+=r;f<g;f+=3){r=3*a[f+0];var v=3*a[f+1];var y=3*a[f+2];h.fromArray(d,r);k.fromArray(d,v);m.fromArray(d,y);l.subVectors(m,k);n.subVectors(h,k);l.cross(n);e[r]+=l.x;e[r+1]+=l.y;e[r+2]+=l.z;e[v]+=l.x;e[v+1]+=l.y;e[v+2]+=
-l.z;e[y]+=l.x;e[y+1]+=l.y;e[y+2]+=l.z}}}else for(f=0,g=d.length;f<g;f+=9)h.fromArray(d,f),k.fromArray(d,f+3),m.fromArray(d,f+6),l.subVectors(m,k),n.subVectors(h,k),l.cross(n),e[f]=l.x,e[f+1]=l.y,e[f+2]=l.z,e[f+3]=l.x,e[f+4]=l.y,e[f+5]=l.z,e[f+6]=l.x,e[f+7]=l.y,e[f+8]=l.z;this.normalizeNormals();b.normal.needsUpdate=!0}},merge:function(a,b){if(a&&a.isBufferGeometry){void 0===b&&(b=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));
-var c=this.attributes,d;for(d in c)if(void 0!==a.attributes[d]){var e=c[d].array,f=a.attributes[d],g=f.array,h=0;for(f=f.itemSize*b;h<g.length;h++,f++)e[f]=g[h]}return this}console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",a)},normalizeNormals:function(){var a=new p;return function(){for(var b=this.attributes.normal,c=0,d=b.count;c<d;c++)a.x=b.getX(c),a.y=b.getY(c),a.z=b.getZ(c),a.normalize(),b.setXYZ(c,a.x,a.y,a.z)}}(),toNonIndexed:function(){if(null===
-this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): Geometry is already non-indexed."),this;var a=new C,b=this.index.array,c=this.attributes,d;for(d in c){var e=c[d],f=e.array,g=e.itemSize,h=new f.constructor(b.length*g),k=0;e=0;for(var m=b.length;e<m;e++){var l=b[e]*g;for(var n=0;n<g;n++)h[k++]=f[l++]}a.addAttribute(d,new Q(h,g))}b=this.groups;e=0;for(m=b.length;e<m;e++)c=b[e],a.addGroup(c.start,c.count,c.materialIndex);return a},toJSON:function(){var a={metadata:{version:4.5,type:"BufferGeometry",
-generator:"BufferGeometry.toJSON"}};a.uuid=this.uuid;a.type=this.type;""!==this.name&&(a.name=this.name);0<Object.keys(this.userData).length&&(a.userData=this.userData);if(void 0!==this.parameters){var b=this.parameters;for(e in b)void 0!==b[e]&&(a[e]=b[e]);return a}a.data={attributes:{}};var c=this.index;null!==c&&(b=Array.prototype.slice.call(c.array),a.data.index={type:c.array.constructor.name,array:b});c=this.attributes;for(e in c){var d=c[e];b=Array.prototype.slice.call(d.array);a.data.attributes[e]=
-{itemSize:d.itemSize,type:d.array.constructor.name,array:b,normalized:d.normalized}}var e=this.groups;0<e.length&&(a.data.groups=JSON.parse(JSON.stringify(e)));e=this.boundingSphere;null!==e&&(a.data.boundingSphere={center:e.center.toArray(),radius:e.radius});return a},clone:function(){return(new C).copy(this)},copy:function(a){var b;this.index=null;this.attributes={};this.morphAttributes={};this.groups=[];this.boundingSphere=this.boundingBox=null;this.name=a.name;var c=a.index;null!==c&&this.setIndex(c.clone());
-c=a.attributes;for(g in c)this.addAttribute(g,c[g].clone());var d=a.morphAttributes;for(g in d){var e=[],f=d[g];c=0;for(b=f.length;c<b;c++)e.push(f[c].clone());this.morphAttributes[g]=e}var g=a.groups;c=0;for(b=g.length;c<b;c++)d=g[c],this.addGroup(d.start,d.count,d.materialIndex);g=a.boundingBox;null!==g&&(this.boundingBox=g.clone());g=a.boundingSphere;null!==g&&(this.boundingSphere=g.clone());this.drawRange.start=a.drawRange.start;this.drawRange.count=a.drawRange.count;this.userData=a.userData;
-return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});Ib.prototype=Object.create(R.prototype);Ib.prototype.constructor=Ib;kb.prototype=Object.create(C.prototype);kb.prototype.constructor=kb;uc.prototype=Object.create(R.prototype);uc.prototype.constructor=uc;lb.prototype=Object.create(C.prototype);lb.prototype.constructor=lb;var Kf=0;J.prototype=Object.assign(Object.create(ya.prototype),{constructor:J,isMaterial:!0,onBeforeCompile:function(){},setValues:function(a){if(void 0!==a)for(var b in a){var c=
-a[b];if(void 0===c)console.warn("THREE.Material: '"+b+"' parameter is undefined.");else if("shading"===b)console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===c?!0:!1;else{var d=this[b];void 0===d?console.warn("THREE."+this.type+": '"+b+"' is not a property of this material."):d&&d.isColor?d.set(c):d&&d.isVector3&&c&&c.isVector3?d.copy(c):this[b]="overdraw"===b?Number(c):c}}},toJSON:function(a){function b(a){var b=[],c;for(c in a){var d=
-a[c];delete d.metadata;b.push(d)}return b}var c=void 0===a||"string"===typeof a;c&&(a={textures:{},images:{}});var d={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};d.uuid=this.uuid;d.type=this.type;""!==this.name&&(d.name=this.name);this.color&&this.color.isColor&&(d.color=this.color.getHex());void 0!==this.roughness&&(d.roughness=this.roughness);void 0!==this.metalness&&(d.metalness=this.metalness);this.emissive&&this.emissive.isColor&&(d.emissive=this.emissive.getHex());1!==
-this.emissiveIntensity&&(d.emissiveIntensity=this.emissiveIntensity);this.specular&&this.specular.isColor&&(d.specular=this.specular.getHex());void 0!==this.shininess&&(d.shininess=this.shininess);void 0!==this.clearCoat&&(d.clearCoat=this.clearCoat);void 0!==this.clearCoatRoughness&&(d.clearCoatRoughness=this.clearCoatRoughness);this.map&&this.map.isTexture&&(d.map=this.map.toJSON(a).uuid);this.alphaMap&&this.alphaMap.isTexture&&(d.alphaMap=this.alphaMap.toJSON(a).uuid);this.lightMap&&this.lightMap.isTexture&&
-(d.lightMap=this.lightMap.toJSON(a).uuid);this.aoMap&&this.aoMap.isTexture&&(d.aoMap=this.aoMap.toJSON(a).uuid,d.aoMapIntensity=this.aoMapIntensity);this.bumpMap&&this.bumpMap.isTexture&&(d.bumpMap=this.bumpMap.toJSON(a).uuid,d.bumpScale=this.bumpScale);this.normalMap&&this.normalMap.isTexture&&(d.normalMap=this.normalMap.toJSON(a).uuid,d.normalMapType=this.normalMapType,d.normalScale=this.normalScale.toArray());this.displacementMap&&this.displacementMap.isTexture&&(d.displacementMap=this.displacementMap.toJSON(a).uuid,
-d.displacementScale=this.displacementScale,d.displacementBias=this.displacementBias);this.roughnessMap&&this.roughnessMap.isTexture&&(d.roughnessMap=this.roughnessMap.toJSON(a).uuid);this.metalnessMap&&this.metalnessMap.isTexture&&(d.metalnessMap=this.metalnessMap.toJSON(a).uuid);this.emissiveMap&&this.emissiveMap.isTexture&&(d.emissiveMap=this.emissiveMap.toJSON(a).uuid);this.specularMap&&this.specularMap.isTexture&&(d.specularMap=this.specularMap.toJSON(a).uuid);this.envMap&&this.envMap.isTexture&&
-(d.envMap=this.envMap.toJSON(a).uuid,d.reflectivity=this.reflectivity);this.gradientMap&&this.gradientMap.isTexture&&(d.gradientMap=this.gradientMap.toJSON(a).uuid);void 0!==this.size&&(d.size=this.size);void 0!==this.sizeAttenuation&&(d.sizeAttenuation=this.sizeAttenuation);1!==this.blending&&(d.blending=this.blending);!0===this.flatShading&&(d.flatShading=this.flatShading);0!==this.side&&(d.side=this.side);0!==this.vertexColors&&(d.vertexColors=this.vertexColors);1>this.opacity&&(d.opacity=this.opacity);
-!0===this.transparent&&(d.transparent=this.transparent);d.depthFunc=this.depthFunc;d.depthTest=this.depthTest;d.depthWrite=this.depthWrite;0!==this.rotation&&(d.rotation=this.rotation);1!==this.linewidth&&(d.linewidth=this.linewidth);void 0!==this.dashSize&&(d.dashSize=this.dashSize);void 0!==this.gapSize&&(d.gapSize=this.gapSize);void 0!==this.scale&&(d.scale=this.scale);!0===this.dithering&&(d.dithering=!0);0<this.alphaTest&&(d.alphaTest=this.alphaTest);!0===this.premultipliedAlpha&&(d.premultipliedAlpha=
-this.premultipliedAlpha);!0===this.wireframe&&(d.wireframe=this.wireframe);1<this.wireframeLinewidth&&(d.wireframeLinewidth=this.wireframeLinewidth);"round"!==this.wireframeLinecap&&(d.wireframeLinecap=this.wireframeLinecap);"round"!==this.wireframeLinejoin&&(d.wireframeLinejoin=this.wireframeLinejoin);!0===this.morphTargets&&(d.morphTargets=!0);!0===this.skinning&&(d.skinning=!0);!1===this.visible&&(d.visible=!1);"{}"!==JSON.stringify(this.userData)&&(d.userData=this.userData);c&&(c=b(a.textures),
-a=b(a.images),0<c.length&&(d.textures=c),0<a.length&&(d.images=a));return d},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.name=a.name;this.fog=a.fog;this.lights=a.lights;this.blending=a.blending;this.side=a.side;this.flatShading=a.flatShading;this.vertexColors=a.vertexColors;this.opacity=a.opacity;this.transparent=a.transparent;this.blendSrc=a.blendSrc;this.blendDst=a.blendDst;this.blendEquation=a.blendEquation;this.blendSrcAlpha=a.blendSrcAlpha;this.blendDstAlpha=
-a.blendDstAlpha;this.blendEquationAlpha=a.blendEquationAlpha;this.depthFunc=a.depthFunc;this.depthTest=a.depthTest;this.depthWrite=a.depthWrite;this.colorWrite=a.colorWrite;this.precision=a.precision;this.polygonOffset=a.polygonOffset;this.polygonOffsetFactor=a.polygonOffsetFactor;this.polygonOffsetUnits=a.polygonOffsetUnits;this.dithering=a.dithering;this.alphaTest=a.alphaTest;this.premultipliedAlpha=a.premultipliedAlpha;this.overdraw=a.overdraw;this.visible=a.visible;this.userData=JSON.parse(JSON.stringify(a.userData));
-this.clipShadows=a.clipShadows;this.clipIntersection=a.clipIntersection;var b=a.clippingPlanes,c=null;if(null!==b){var d=b.length;c=Array(d);for(var e=0;e!==d;++e)c[e]=b[e].clone()}this.clippingPlanes=c;this.shadowSide=a.shadowSide;return this},dispose:function(){this.dispatchEvent({type:"dispose"})}});da.prototype=Object.create(J.prototype);da.prototype.constructor=da;da.prototype.isMeshBasicMaterial=!0;da.prototype.copy=function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);this.map=
-a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=
-a.morphTargets;return this};ta.prototype=Object.create(J.prototype);ta.prototype.constructor=ta;ta.prototype.isShaderMaterial=!0;ta.prototype.copy=function(a){J.prototype.copy.call(this,a);this.fragmentShader=a.fragmentShader;this.vertexShader=a.vertexShader;this.uniforms=Aa.clone(a.uniforms);this.defines=Object.assign({},a.defines);this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.lights=a.lights;this.clipping=a.clipping;this.skinning=a.skinning;this.morphTargets=a.morphTargets;
-this.morphNormals=a.morphNormals;this.extensions=a.extensions;return this};ta.prototype.toJSON=function(a){a=J.prototype.toJSON.call(this,a);a.uniforms=this.uniforms;a.vertexShader=this.vertexShader;a.fragmentShader=this.fragmentShader;return a};Object.assign(mb.prototype,{set:function(a,b){this.origin.copy(a);this.direction.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.origin.copy(a.origin);this.direction.copy(a.direction);return this},at:function(a,
-b){void 0===b&&(console.warn("THREE.Ray: .at() target is now required"),b=new p);return b.copy(this.direction).multiplyScalar(a).add(this.origin)},lookAt:function(a){this.direction.copy(a).sub(this.origin).normalize();return this},recast:function(){var a=new p;return function(b){this.origin.copy(this.at(b,a));return this}}(),closestPointToPoint:function(a,b){void 0===b&&(console.warn("THREE.Ray: .closestPointToPoint() target is now required"),b=new p);b.subVectors(a,this.origin);a=b.dot(this.direction);
-return 0>a?b.copy(this.origin):b.copy(this.direction).multiplyScalar(a).add(this.origin)},distanceToPoint:function(a){return Math.sqrt(this.distanceSqToPoint(a))},distanceSqToPoint:function(){var a=new p;return function(b){var c=a.subVectors(b,this.origin).dot(this.direction);if(0>c)return this.origin.distanceToSquared(b);a.copy(this.direction).multiplyScalar(c).add(this.origin);return a.distanceToSquared(b)}}(),distanceSqToSegment:function(){var a=new p,b=new p,c=new p;return function(d,e,f,g){a.copy(d).add(e).multiplyScalar(.5);
-b.copy(e).sub(d).normalize();c.copy(this.origin).sub(a);var h=.5*d.distanceTo(e),k=-this.direction.dot(b),m=c.dot(this.direction),l=-c.dot(b),n=c.lengthSq(),t=Math.abs(1-k*k);if(0<t){d=k*l-m;e=k*m-l;var p=h*t;0<=d?e>=-p?e<=p?(h=1/t,d*=h,e*=h,k=d*(d+k*e+2*m)+e*(k*d+e+2*l)+n):(e=h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):(e=-h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n):e<=-p?(d=Math.max(0,-(-k*h+m)),e=0<d?-h:Math.min(Math.max(-h,-l),h),k=-d*d+e*(e+2*l)+n):e<=p?(d=0,e=Math.min(Math.max(-h,-l),h),k=
-e*(e+2*l)+n):(d=Math.max(0,-(k*h+m)),e=0<d?h:Math.min(Math.max(-h,-l),h),k=-d*d+e*(e+2*l)+n)}else e=0<k?-h:h,d=Math.max(0,-(k*e+m)),k=-d*d+e*(e+2*l)+n;f&&f.copy(this.direction).multiplyScalar(d).add(this.origin);g&&g.copy(b).multiplyScalar(e).add(a);return k}}(),intersectSphere:function(){var a=new p;return function(b,c){a.subVectors(b.center,this.origin);var d=a.dot(this.direction),e=a.dot(a)-d*d;b=b.radius*b.radius;if(e>b)return null;b=Math.sqrt(b-e);e=d-b;d+=b;return 0>e&&0>d?null:0>e?this.at(d,
-c):this.at(e,c)}}(),intersectsSphere:function(a){return this.distanceToPoint(a.center)<=a.radius},distanceToPlane:function(a){var b=a.normal.dot(this.direction);if(0===b)return 0===a.distanceToPoint(this.origin)?0:null;a=-(this.origin.dot(a.normal)+a.constant)/b;return 0<=a?a:null},intersectPlane:function(a,b){a=this.distanceToPlane(a);return null===a?null:this.at(a,b)},intersectsPlane:function(a){var b=a.distanceToPoint(this.origin);return 0===b||0>a.normal.dot(this.direction)*b?!0:!1},intersectBox:function(a,
-b){var c=1/this.direction.x;var d=1/this.direction.y;var e=1/this.direction.z,f=this.origin;if(0<=c){var g=(a.min.x-f.x)*c;c*=a.max.x-f.x}else g=(a.max.x-f.x)*c,c*=a.min.x-f.x;if(0<=d){var h=(a.min.y-f.y)*d;d*=a.max.y-f.y}else h=(a.max.y-f.y)*d,d*=a.min.y-f.y;if(g>d||h>c)return null;if(h>g||g!==g)g=h;if(d<c||c!==c)c=d;0<=e?(h=(a.min.z-f.z)*e,a=(a.max.z-f.z)*e):(h=(a.max.z-f.z)*e,a=(a.min.z-f.z)*e);if(g>a||h>c)return null;if(h>g||g!==g)g=h;if(a<c||c!==c)c=a;return 0>c?null:this.at(0<=g?g:c,b)},intersectsBox:function(){var a=
-new p;return function(b){return null!==this.intersectBox(b,a)}}(),intersectTriangle:function(){var a=new p,b=new p,c=new p,d=new p;return function(e,f,g,h,k){b.subVectors(f,e);c.subVectors(g,e);d.crossVectors(b,c);f=this.direction.dot(d);if(0<f){if(h)return null;h=1}else if(0>f)h=-1,f=-f;else return null;a.subVectors(this.origin,e);e=h*this.direction.dot(c.crossVectors(a,c));if(0>e)return null;g=h*this.direction.dot(b.cross(a));if(0>g||e+g>f)return null;e=-h*a.dot(d);return 0>e?null:this.at(e/f,k)}}(),
-applyMatrix4:function(a){this.origin.applyMatrix4(a);this.direction.transformDirection(a);return this},equals:function(a){return a.origin.equals(this.origin)&&a.direction.equals(this.direction)}});Object.assign(ja,{getNormal:function(){var a=new p;return function(b,c,d,e){void 0===e&&(console.warn("THREE.Triangle: .getNormal() target is now required"),e=new p);e.subVectors(d,c);a.subVectors(b,c);e.cross(a);b=e.lengthSq();return 0<b?e.multiplyScalar(1/Math.sqrt(b)):e.set(0,0,0)}}(),getBarycoord:function(){var a=
-new p,b=new p,c=new p;return function(d,e,f,g,h){a.subVectors(g,e);b.subVectors(f,e);c.subVectors(d,e);d=a.dot(a);e=a.dot(b);f=a.dot(c);var k=b.dot(b);g=b.dot(c);var m=d*k-e*e;void 0===h&&(console.warn("THREE.Triangle: .getBarycoord() target is now required"),h=new p);if(0===m)return h.set(-2,-1,-1);m=1/m;k=(k*f-e*g)*m;d=(d*g-e*f)*m;return h.set(1-k-d,d,k)}}(),containsPoint:function(){var a=new p;return function(b,c,d,e){ja.getBarycoord(b,c,d,e,a);return 0<=a.x&&0<=a.y&&1>=a.x+a.y}}()});Object.assign(ja.prototype,
-{set:function(a,b,c){this.a.copy(a);this.b.copy(b);this.c.copy(c);return this},setFromPointsAndIndices:function(a,b,c,d){this.a.copy(a[b]);this.b.copy(a[c]);this.c.copy(a[d]);return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.a.copy(a.a);this.b.copy(a.b);this.c.copy(a.c);return this},getArea:function(){var a=new p,b=new p;return function(){a.subVectors(this.c,this.b);b.subVectors(this.a,this.b);return.5*a.cross(b).length()}}(),getMidpoint:function(a){void 0===
-a&&(console.warn("THREE.Triangle: .getMidpoint() target is now required"),a=new p);return a.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)},getNormal:function(a){return ja.getNormal(this.a,this.b,this.c,a)},getPlane:function(a){void 0===a&&(console.warn("THREE.Triangle: .getPlane() target is now required"),a=new p);return a.setFromCoplanarPoints(this.a,this.b,this.c)},getBarycoord:function(a,b){return ja.getBarycoord(a,this.a,this.b,this.c,b)},containsPoint:function(a){return ja.containsPoint(a,
-this.a,this.b,this.c)},intersectsBox:function(a){return a.intersectsTriangle(this)},closestPointToPoint:function(){var a=new p,b=new p,c=new p,d=new p,e=new p,f=new p;return function(g,h){void 0===h&&(console.warn("THREE.Triangle: .closestPointToPoint() target is now required"),h=new p);var k=this.a,m=this.b,l=this.c;a.subVectors(m,k);b.subVectors(l,k);d.subVectors(g,k);var n=a.dot(d),t=b.dot(d);if(0>=n&&0>=t)return h.copy(k);e.subVectors(g,m);var u=a.dot(e),r=b.dot(e);if(0<=u&&r<=u)return h.copy(m);
-var v=n*r-u*t;if(0>=v&&0<=n&&0>=u)return m=n/(n-u),h.copy(k).addScaledVector(a,m);f.subVectors(g,l);g=a.dot(f);var y=b.dot(f);if(0<=y&&g<=y)return h.copy(l);n=g*t-n*y;if(0>=n&&0<=t&&0>=y)return v=t/(t-y),h.copy(k).addScaledVector(b,v);t=u*y-g*r;if(0>=t&&0<=r-u&&0<=g-y)return c.subVectors(l,m),v=(r-u)/(r-u+(g-y)),h.copy(m).addScaledVector(c,v);l=1/(t+n+v);m=n*l;v*=l;return h.copy(k).addScaledVector(a,m).addScaledVector(b,v)}}(),equals:function(a){return a.a.equals(this.a)&&a.b.equals(this.b)&&a.c.equals(this.c)}});
-la.prototype=Object.assign(Object.create(D.prototype),{constructor:la,isMesh:!0,setDrawMode:function(a){this.drawMode=a},copy:function(a){D.prototype.copy.call(this,a);this.drawMode=a.drawMode;void 0!==a.morphTargetInfluences&&(this.morphTargetInfluences=a.morphTargetInfluences.slice());void 0!==a.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},a.morphTargetDictionary));return this},updateMorphTargets:function(){var a=this.geometry;if(a.isBufferGeometry){a=a.morphAttributes;var b=
-Object.keys(a);if(0<b.length){var c=a[b[0]];if(void 0!==c)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++){var d=c[a].name||String(a);this.morphTargetInfluences.push(0);this.morphTargetDictionary[d]=a}}}else if(c=a.morphTargets,void 0!==c&&0<c.length)for(this.morphTargetInfluences=[],this.morphTargetDictionary={},a=0,b=c.length;a<b;a++)d=c[a].name||String(a),this.morphTargetInfluences.push(0),this.morphTargetDictionary[d]=a},raycast:function(){function a(a,b,
-c,d,e,f,g){ja.getBarycoord(a,b,c,d,v);e.multiplyScalar(v.x);f.multiplyScalar(v.y);g.multiplyScalar(v.z);e.add(f).add(g);return e.clone()}function b(a,b,c,d,e,f,g,h){if(null===(1===b.side?d.intersectTriangle(g,f,e,!0,h):d.intersectTriangle(e,f,g,2!==b.side,h)))return null;x.copy(h);x.applyMatrix4(a.matrixWorld);b=c.ray.origin.distanceTo(x);return b<c.near||b>c.far?null:{distance:b,point:x.clone(),object:a}}function c(c,d,e,f,m,l,n,q,p){g.fromBufferAttribute(m,n);h.fromBufferAttribute(m,q);k.fromBufferAttribute(m,
-p);if(c=b(c,d,e,f,g,h,k,y))l&&(t.fromBufferAttribute(l,n),u.fromBufferAttribute(l,q),r.fromBufferAttribute(l,p),c.uv=a(y,g,h,k,t,u,r)),l=new Ta(n,q,p),ja.getNormal(g,h,k,l.normal),c.face=l;return c}var d=new I,e=new mb,f=new Da,g=new p,h=new p,k=new p,m=new p,l=new p,n=new p,t=new z,u=new z,r=new z,v=new p,y=new p,x=new p;return function(q,p){var v=this.geometry,w=this.material,x=this.matrixWorld;if(void 0!==w&&(null===v.boundingSphere&&v.computeBoundingSphere(),f.copy(v.boundingSphere),f.applyMatrix4(x),
-!1!==q.ray.intersectsSphere(f)&&(d.getInverse(x),e.copy(q.ray).applyMatrix4(d),null===v.boundingBox||!1!==e.intersectsBox(v.boundingBox))))if(v.isBufferGeometry){var z=v.index,B=v.attributes.position,A=v.attributes.uv,D=v.groups;v=v.drawRange;var C;if(null!==z)if(Array.isArray(w)){var H=0;for(C=D.length;H<C;H++){var G=D[H];var K=w[G.materialIndex];x=Math.max(G.start,v.start);var L=Math.min(G.start+G.count,v.start+v.count);for(G=x;G<L;G+=3){x=z.getX(G);var I=z.getX(G+1);var J=z.getX(G+2);if(x=c(this,
-K,q,e,B,A,x,I,J))x.faceIndex=Math.floor(G/3),p.push(x)}}}else for(x=Math.max(0,v.start),L=Math.min(z.count,v.start+v.count),H=x,C=L;H<C;H+=3){if(x=z.getX(H),I=z.getX(H+1),J=z.getX(H+2),x=c(this,w,q,e,B,A,x,I,J))x.faceIndex=Math.floor(H/3),p.push(x)}else if(void 0!==B)if(Array.isArray(w))for(H=0,C=D.length;H<C;H++)for(G=D[H],K=w[G.materialIndex],x=Math.max(G.start,v.start),L=Math.min(G.start+G.count,v.start+v.count),G=x;G<L;G+=3){if(x=G,I=G+1,J=G+2,x=c(this,K,q,e,B,A,x,I,J))x.faceIndex=Math.floor(G/
-3),p.push(x)}else for(x=Math.max(0,v.start),L=Math.min(B.count,v.start+v.count),H=x,C=L;H<C;H+=3)if(x=H,I=H+1,J=H+2,x=c(this,w,q,e,B,A,x,I,J))x.faceIndex=Math.floor(H/3),p.push(x)}else if(v.isGeometry)for(B=Array.isArray(w),A=v.vertices,D=v.faces,x=v.faceVertexUvs[0],0<x.length&&(z=x),G=0,L=D.length;G<L;G++)if(I=D[G],x=B?w[I.materialIndex]:w,void 0!==x){H=A[I.a];C=A[I.b];K=A[I.c];if(!0===x.morphTargets){J=v.morphTargets;var R=this.morphTargetInfluences;g.set(0,0,0);h.set(0,0,0);k.set(0,0,0);for(var Q=
-0,S=J.length;Q<S;Q++){var T=R[Q];if(0!==T){var V=J[Q].vertices;g.addScaledVector(m.subVectors(V[I.a],H),T);h.addScaledVector(l.subVectors(V[I.b],C),T);k.addScaledVector(n.subVectors(V[I.c],K),T)}}g.add(H);h.add(C);k.add(K);H=g;C=h;K=k}if(x=b(this,x,q,e,H,C,K,y))z&&z[G]&&(J=z[G],t.copy(J[0]),u.copy(J[1]),r.copy(J[2]),x.uv=a(y,H,C,K,t,u,r)),x.face=I,x.faceIndex=G,p.push(x)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});Ua.prototype=Object.create(T.prototype);
-Ua.prototype.constructor=Ua;Ua.prototype.isCubeTexture=!0;Object.defineProperty(Ua.prototype,"images",{get:function(){return this.image},set:function(a){this.image=a}});var Me=new T,Ne=new Ua,Ge=[],Ie=[],Le=new Float32Array(16),Ke=new Float32Array(9),Je=new Float32Array(4);Re.prototype.updateCache=function(a){var b=this.cache;a instanceof Float32Array&&b.length!==a.length&&(this.cache=new Float32Array(a.length));qa(b,a)};Se.prototype.setValue=function(a,b,c){for(var d=this.seq,e=0,f=d.length;e!==
-f;++e){var g=d[e];g.setValue(a,b[g.id],c)}};var Vd=/([\w\d_]+)(\])?(\[|\.)?/g;Za.prototype.setValue=function(a,b,c){b=this.map[b];void 0!==b&&b.setValue(a,c,this.renderer)};Za.prototype.setOptional=function(a,b,c){b=b[c];void 0!==b&&this.setValue(a,c,b)};Za.upload=function(a,b,c,d){for(var e=0,f=b.length;e!==f;++e){var g=b[e],h=c[g.id];!1!==h.needsUpdate&&g.setValue(a,h.value,d)}};Za.seqWithValue=function(a,b){for(var c=[],d=0,e=a.length;d!==e;++d){var f=a[d];f.id in b&&c.push(f)}return c};var yg=
-0,Hg=0;$a.prototype=Object.create(J.prototype);$a.prototype.constructor=$a;$a.prototype.isMeshDepthMaterial=!0;$a.prototype.copy=function(a){J.prototype.copy.call(this,a);this.depthPacking=a.depthPacking;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;return this};
-ab.prototype=Object.create(J.prototype);ab.prototype.constructor=ab;ab.prototype.isMeshDistanceMaterial=!0;ab.prototype.copy=function(a){J.prototype.copy.call(this,a);this.referencePosition.copy(a.referencePosition);this.nearDistance=a.nearDistance;this.farDistance=a.farDistance;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.map=a.map;this.alphaMap=a.alphaMap;this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;
-return this};Kb.prototype=Object.assign(Object.create(D.prototype),{constructor:Kb,isGroup:!0});Z.prototype=Object.assign(Object.create(Na.prototype),{constructor:Z,isPerspectiveCamera:!0,copy:function(a,b){Na.prototype.copy.call(this,a,b);this.fov=a.fov;this.zoom=a.zoom;this.near=a.near;this.far=a.far;this.focus=a.focus;this.aspect=a.aspect;this.view=null===a.view?null:Object.assign({},a.view);this.filmGauge=a.filmGauge;this.filmOffset=a.filmOffset;return this},setFocalLength:function(a){a=.5*this.getFilmHeight()/
-a;this.fov=2*H.RAD2DEG*Math.atan(a);this.updateProjectionMatrix()},getFocalLength:function(){var a=Math.tan(.5*H.DEG2RAD*this.fov);return.5*this.getFilmHeight()/a},getEffectiveFOV:function(){return 2*H.RAD2DEG*Math.atan(Math.tan(.5*H.DEG2RAD*this.fov)/this.zoom)},getFilmWidth:function(){return this.filmGauge*Math.min(this.aspect,1)},getFilmHeight:function(){return this.filmGauge/Math.max(this.aspect,1)},setViewOffset:function(a,b,c,d,e,f){this.aspect=a/b;null===this.view&&(this.view={enabled:!0,fullWidth:1,
-fullHeight:1,offsetX:0,offsetY:0,width:1,height:1});this.view.enabled=!0;this.view.fullWidth=a;this.view.fullHeight=b;this.view.offsetX=c;this.view.offsetY=d;this.view.width=e;this.view.height=f;this.updateProjectionMatrix()},clearViewOffset:function(){null!==this.view&&(this.view.enabled=!1);this.updateProjectionMatrix()},updateProjectionMatrix:function(){var a=this.near,b=a*Math.tan(.5*H.DEG2RAD*this.fov)/this.zoom,c=2*b,d=this.aspect*c,e=-.5*d,f=this.view;if(null!==this.view&&this.view.enabled){var g=
-f.fullWidth,h=f.fullHeight;e+=f.offsetX*d/g;b-=f.offsetY*c/h;d*=f.width/g;c*=f.height/h}f=this.filmOffset;0!==f&&(e+=a*f/this.getFilmWidth());this.projectionMatrix.makePerspective(e,e+d,b,b-c,a,this.far)},toJSON:function(a){a=D.prototype.toJSON.call(this,a);a.object.fov=this.fov;a.object.zoom=this.zoom;a.object.near=this.near;a.object.far=this.far;a.object.focus=this.focus;a.object.aspect=this.aspect;null!==this.view&&(a.object.view=Object.assign({},this.view));a.object.filmGauge=this.filmGauge;a.object.filmOffset=
-this.filmOffset;return a}});yc.prototype=Object.assign(Object.create(Z.prototype),{constructor:yc,isArrayCamera:!0});Lb.prototype.isFogExp2=!0;Lb.prototype.clone=function(){return new Lb(this.color,this.density)};Lb.prototype.toJSON=function(){return{type:"FogExp2",color:this.color.getHex(),density:this.density}};Mb.prototype.isFog=!0;Mb.prototype.clone=function(){return new Mb(this.color,this.near,this.far)};Mb.prototype.toJSON=function(){return{type:"Fog",color:this.color.getHex(),near:this.near,
-far:this.far}};qd.prototype=Object.assign(Object.create(D.prototype),{constructor:qd,copy:function(a,b){D.prototype.copy.call(this,a,b);null!==a.background&&(this.background=a.background.clone());null!==a.fog&&(this.fog=a.fog.clone());null!==a.overrideMaterial&&(this.overrideMaterial=a.overrideMaterial.clone());this.autoUpdate=a.autoUpdate;this.matrixAutoUpdate=a.matrixAutoUpdate;return this},toJSON:function(a){var b=D.prototype.toJSON.call(this,a);null!==this.background&&(b.object.background=this.background.toJSON(a));
-null!==this.fog&&(b.object.fog=this.fog.toJSON());return b}});Object.defineProperty(ob.prototype,"needsUpdate",{set:function(a){!0===a&&this.version++}});Object.assign(ob.prototype,{isInterleavedBuffer:!0,onUploadCallback:function(){},setArray:function(a){if(Array.isArray(a))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.count=void 0!==a?a.length/this.stride:0;this.array=a;return this},setDynamic:function(a){this.dynamic=a;return this},copy:function(a){this.array=
-new a.array.constructor(a.array);this.count=a.count;this.stride=a.stride;this.dynamic=a.dynamic;return this},copyAt:function(a,b,c){a*=this.stride;c*=b.stride;for(var d=0,e=this.stride;d<e;d++)this.array[a+d]=b.array[c+d];return this},set:function(a,b){void 0===b&&(b=0);this.array.set(a,b);return this},clone:function(){return(new this.constructor).copy(this)},onUpload:function(a){this.onUploadCallback=a;return this}});Object.defineProperties(zc.prototype,{count:{get:function(){return this.data.count}},
-array:{get:function(){return this.data.array}}});Object.assign(zc.prototype,{isInterleavedBufferAttribute:!0,setX:function(a,b){this.data.array[a*this.data.stride+this.offset]=b;return this},setY:function(a,b){this.data.array[a*this.data.stride+this.offset+1]=b;return this},setZ:function(a,b){this.data.array[a*this.data.stride+this.offset+2]=b;return this},setW:function(a,b){this.data.array[a*this.data.stride+this.offset+3]=b;return this},getX:function(a){return this.data.array[a*this.data.stride+
-this.offset]},getY:function(a){return this.data.array[a*this.data.stride+this.offset+1]},getZ:function(a){return this.data.array[a*this.data.stride+this.offset+2]},getW:function(a){return this.data.array[a*this.data.stride+this.offset+3]},setXY:function(a,b,c){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;return this},setXYZ:function(a,b,c,d){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;return this},setXYZW:function(a,
-b,c,d,e){a=a*this.data.stride+this.offset;this.data.array[a+0]=b;this.data.array[a+1]=c;this.data.array[a+2]=d;this.data.array[a+3]=e;return this}});cb.prototype=Object.create(J.prototype);cb.prototype.constructor=cb;cb.prototype.isSpriteMaterial=!0;cb.prototype.copy=function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.rotation=a.rotation;return this};var Nb;Ac.prototype=Object.assign(Object.create(D.prototype),{constructor:Ac,isSprite:!0,raycast:function(){function a(a,
-b,c,d,h,k){e.subVectors(a,c).addScalar(.5).multiply(d);void 0!==h?(f.x=k*e.x-h*e.y,f.y=h*e.x+k*e.y):f.copy(e);a.copy(b);a.x+=f.x;a.y+=f.y;a.applyMatrix4(g)}var b=new p,c=new p,d=new p,e=new z,f=new z,g=new I,h=new p,k=new p,m=new p;return function(e,f){c.setFromMatrixScale(this.matrixWorld);g.getInverse(this.modelViewMatrix).premultiply(this.matrixWorld);d.setFromMatrixPosition(this.modelViewMatrix);var l=this.material.rotation;if(0!==l){var n=Math.cos(l);var q=Math.sin(l)}l=this.center;a(h.set(-.5,
--.5,0),d,l,c,q,n);a(k.set(.5,-.5,0),d,l,c,q,n);a(m.set(.5,.5,0),d,l,c,q,n);var p=e.ray.intersectTriangle(h,k,m,!1,b);if(null===p&&(a(k.set(-.5,.5,0),d,l,c,q,n),p=e.ray.intersectTriangle(h,m,k,!1,b),null===p))return;q=e.ray.origin.distanceTo(b);q<e.near||q>e.far||f.push({distance:q,point:b.clone(),face:null,object:this})}}(),clone:function(){return(new this.constructor(this.material)).copy(this)},copy:function(a){D.prototype.copy.call(this,a);void 0!==a.center&&this.center.copy(a.center);return this}});
-Bc.prototype=Object.assign(Object.create(D.prototype),{constructor:Bc,copy:function(a){D.prototype.copy.call(this,a,!1);a=a.levels;for(var b=0,c=a.length;b<c;b++){var d=a[b];this.addLevel(d.object.clone(),d.distance)}return this},addLevel:function(a,b){void 0===b&&(b=0);b=Math.abs(b);for(var c=this.levels,d=0;d<c.length&&!(b<c[d].distance);d++);c.splice(d,0,{distance:b,object:a});this.add(a)},getObjectForDistance:function(a){for(var b=this.levels,c=1,d=b.length;c<d&&!(a<b[c].distance);c++);return b[c-
-1].object},raycast:function(){var a=new p;return function(b,c){a.setFromMatrixPosition(this.matrixWorld);var d=b.ray.origin.distanceTo(a);this.getObjectForDistance(d).raycast(b,c)}}(),update:function(){var a=new p,b=new p;return function(c){var d=this.levels;if(1<d.length){a.setFromMatrixPosition(c.matrixWorld);b.setFromMatrixPosition(this.matrixWorld);c=a.distanceTo(b);d[0].object.visible=!0;for(var e=1,f=d.length;e<f;e++)if(c>=d[e].distance)d[e-1].object.visible=!1,d[e].object.visible=!0;else break;
-for(;e<f;e++)d[e].object.visible=!1}}}(),toJSON:function(a){a=D.prototype.toJSON.call(this,a);a.object.levels=[];for(var b=this.levels,c=0,d=b.length;c<d;c++){var e=b[c];a.object.levels.push({object:e.object.uuid,distance:e.distance})}return a}});Object.assign(Cc.prototype,{calculateInverses:function(){this.boneInverses=[];for(var a=0,b=this.bones.length;a<b;a++){var c=new I;this.bones[a]&&c.getInverse(this.bones[a].matrixWorld);this.boneInverses.push(c)}},pose:function(){var a,b;var c=0;for(b=this.bones.length;c<
-b;c++)(a=this.bones[c])&&a.matrixWorld.getInverse(this.boneInverses[c]);c=0;for(b=this.bones.length;c<b;c++)if(a=this.bones[c])a.parent&&a.parent.isBone?(a.matrix.getInverse(a.parent.matrixWorld),a.matrix.multiply(a.matrixWorld)):a.matrix.copy(a.matrixWorld),a.matrix.decompose(a.position,a.quaternion,a.scale)},update:function(){var a=new I,b=new I;return function(){for(var c=this.bones,d=this.boneInverses,e=this.boneMatrices,f=this.boneTexture,g=0,h=c.length;g<h;g++)a.multiplyMatrices(c[g]?c[g].matrixWorld:
-b,d[g]),a.toArray(e,16*g);void 0!==f&&(f.needsUpdate=!0)}}(),clone:function(){return new Cc(this.bones,this.boneInverses)},getBoneByName:function(a){for(var b=0,c=this.bones.length;b<c;b++){var d=this.bones[b];if(d.name===a)return d}}});rd.prototype=Object.assign(Object.create(D.prototype),{constructor:rd,isBone:!0});sd.prototype=Object.assign(Object.create(la.prototype),{constructor:sd,isSkinnedMesh:!0,initBones:function(){var a=[],b;if(this.geometry&&void 0!==this.geometry.bones){var c=0;for(b=
-this.geometry.bones.length;c<b;c++){var d=this.geometry.bones[c];var e=new rd;a.push(e);e.name=d.name;e.position.fromArray(d.pos);e.quaternion.fromArray(d.rotq);void 0!==d.scl&&e.scale.fromArray(d.scl)}c=0;for(b=this.geometry.bones.length;c<b;c++)d=this.geometry.bones[c],-1!==d.parent&&null!==d.parent&&void 0!==a[d.parent]?a[d.parent].add(a[c]):this.add(a[c])}this.updateMatrixWorld(!0);return a},bind:function(a,b){this.skeleton=a;void 0===b&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),
-b=this.matrixWorld);this.bindMatrix.copy(b);this.bindMatrixInverse.getInverse(b)},pose:function(){this.skeleton.pose()},normalizeSkinWeights:function(){var a;if(this.geometry&&this.geometry.isGeometry)for(a=0;a<this.geometry.skinWeights.length;a++){var b=this.geometry.skinWeights[a];var c=1/b.manhattanLength();Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0)}else if(this.geometry&&this.geometry.isBufferGeometry){b=new V;var d=this.geometry.attributes.skinWeight;for(a=0;a<d.count;a++)b.x=d.getX(a),
-b.y=d.getY(a),b.z=d.getZ(a),b.w=d.getW(a),c=1/b.manhattanLength(),Infinity!==c?b.multiplyScalar(c):b.set(1,0,0,0),d.setXYZW(a,b.x,b.y,b.z,b.w)}},updateMatrixWorld:function(a){la.prototype.updateMatrixWorld.call(this,a);"attached"===this.bindMode?this.bindMatrixInverse.getInverse(this.matrixWorld):"detached"===this.bindMode?this.bindMatrixInverse.getInverse(this.bindMatrix):console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)},clone:function(){return(new this.constructor(this.geometry,
-this.material)).copy(this)}});Y.prototype=Object.create(J.prototype);Y.prototype.constructor=Y;Y.prototype.isLineBasicMaterial=!0;Y.prototype.copy=function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);this.linewidth=a.linewidth;this.linecap=a.linecap;this.linejoin=a.linejoin;return this};sa.prototype=Object.assign(Object.create(D.prototype),{constructor:sa,isLine:!0,computeLineDistances:function(){var a=new p,b=new p;return function(){var c=this.geometry;if(c.isBufferGeometry)if(null===
-c.index){for(var d=c.attributes.position,e=[0],f=1,g=d.count;f<g;f++)a.fromBufferAttribute(d,f-1),b.fromBufferAttribute(d,f),e[f]=e[f-1],e[f]+=a.distanceTo(b);c.addAttribute("lineDistance",new A(e,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(c.isGeometry)for(d=c.vertices,e=c.lineDistances,e[0]=0,f=1,g=d.length;f<g;f++)e[f]=e[f-1],e[f]+=d[f-1].distanceTo(d[f]);return this}}(),raycast:function(){var a=new I,b=new mb,c=
-new Da;return function(d,e){var f=d.linePrecision;f*=f;var g=this.geometry,h=this.matrixWorld;null===g.boundingSphere&&g.computeBoundingSphere();c.copy(g.boundingSphere);c.applyMatrix4(h);if(!1!==d.ray.intersectsSphere(c)){a.getInverse(h);b.copy(d.ray).applyMatrix4(a);var k=new p,m=new p;h=new p;var l=new p,n=this&&this.isLineSegments?2:1;if(g.isBufferGeometry){var t=g.index,u=g.attributes.position.array;if(null!==t){t=t.array;g=0;for(var r=t.length-1;g<r;g+=n){var v=t[g+1];k.fromArray(u,3*t[g]);
-m.fromArray(u,3*v);v=b.distanceSqToSegment(k,m,l,h);v>f||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),v<d.near||v>d.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}else for(g=0,r=u.length/3-1;g<r;g+=n)k.fromArray(u,3*g),m.fromArray(u,3*g+3),v=b.distanceSqToSegment(k,m,l,h),v>f||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),v<d.near||v>d.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),
-index:g,face:null,faceIndex:null,object:this}))}else if(g.isGeometry)for(k=g.vertices,m=k.length,g=0;g<m-1;g+=n)v=b.distanceSqToSegment(k[g],k[g+1],l,h),v>f||(l.applyMatrix4(this.matrixWorld),v=d.ray.origin.distanceTo(l),v<d.near||v>d.far||e.push({distance:v,point:h.clone().applyMatrix4(this.matrixWorld),index:g,face:null,faceIndex:null,object:this}))}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});W.prototype=Object.assign(Object.create(sa.prototype),
-{constructor:W,isLineSegments:!0,computeLineDistances:function(){var a=new p,b=new p;return function(){var c=this.geometry;if(c.isBufferGeometry)if(null===c.index){for(var d=c.attributes.position,e=[],f=0,g=d.count;f<g;f+=2)a.fromBufferAttribute(d,f),b.fromBufferAttribute(d,f+1),e[f]=0===f?0:e[f-1],e[f+1]=e[f]+a.distanceTo(b);c.addAttribute("lineDistance",new A(e,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else if(c.isGeometry)for(d=
-c.vertices,e=c.lineDistances,f=0,g=d.length;f<g;f+=2)a.copy(d[f]),b.copy(d[f+1]),e[f]=0===f?0:e[f-1],e[f+1]=e[f]+a.distanceTo(b);return this}}()});td.prototype=Object.assign(Object.create(sa.prototype),{constructor:td,isLineLoop:!0});Ea.prototype=Object.create(J.prototype);Ea.prototype.constructor=Ea;Ea.prototype.isPointsMaterial=!0;Ea.prototype.copy=function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.size=a.size;this.sizeAttenuation=a.sizeAttenuation;this.morphTargets=
-a.morphTargets;return this};Ob.prototype=Object.assign(Object.create(D.prototype),{constructor:Ob,isPoints:!0,raycast:function(){var a=new I,b=new mb,c=new Da;return function(d,e){function f(a,c){var f=b.distanceSqToPoint(a);f<l&&(b.closestPointToPoint(a,n),n.applyMatrix4(k),a=d.ray.origin.distanceTo(n),a<d.near||a>d.far||e.push({distance:a,distanceToRay:Math.sqrt(f),point:n.clone(),index:c,face:null,object:g}))}var g=this,h=this.geometry,k=this.matrixWorld,m=d.params.Points.threshold;null===h.boundingSphere&&
-h.computeBoundingSphere();c.copy(h.boundingSphere);c.applyMatrix4(k);c.radius+=m;if(!1!==d.ray.intersectsSphere(c)){a.getInverse(k);b.copy(d.ray).applyMatrix4(a);m/=(this.scale.x+this.scale.y+this.scale.z)/3;var l=m*m;m=new p;var n=new p;if(h.isBufferGeometry){var t=h.index;h=h.attributes.position.array;if(null!==t){var u=t.array;t=0;for(var r=u.length;t<r;t++){var v=u[t];m.fromArray(h,3*v);f(m,v)}}else for(t=0,u=h.length/3;t<u;t++)m.fromArray(h,3*t),f(m,t)}else for(m=h.vertices,t=0,u=m.length;t<
-u;t++)f(m[t],t)}}}(),clone:function(){return(new this.constructor(this.geometry,this.material)).copy(this)}});$d.prototype=Object.assign(Object.create(T.prototype),{constructor:$d,isVideoTexture:!0,update:function(){var a=this.image;a.readyState>=a.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}});Pb.prototype=Object.create(T.prototype);Pb.prototype.constructor=Pb;Pb.prototype.isCompressedTexture=!0;Dc.prototype=Object.create(T.prototype);Dc.prototype.constructor=Dc;Dc.prototype.isCanvasTexture=!0;Ec.prototype=
-Object.create(T.prototype);Ec.prototype.constructor=Ec;Ec.prototype.isDepthTexture=!0;Qb.prototype=Object.create(C.prototype);Qb.prototype.constructor=Qb;Fc.prototype=Object.create(R.prototype);Fc.prototype.constructor=Fc;Rb.prototype=Object.create(C.prototype);Rb.prototype.constructor=Rb;Gc.prototype=Object.create(R.prototype);Gc.prototype.constructor=Gc;na.prototype=Object.create(C.prototype);na.prototype.constructor=na;Hc.prototype=Object.create(R.prototype);Hc.prototype.constructor=Hc;Sb.prototype=
-Object.create(na.prototype);Sb.prototype.constructor=Sb;Ic.prototype=Object.create(R.prototype);Ic.prototype.constructor=Ic;pb.prototype=Object.create(na.prototype);pb.prototype.constructor=pb;Jc.prototype=Object.create(R.prototype);Jc.prototype.constructor=Jc;Tb.prototype=Object.create(na.prototype);Tb.prototype.constructor=Tb;Kc.prototype=Object.create(R.prototype);Kc.prototype.constructor=Kc;Ub.prototype=Object.create(na.prototype);Ub.prototype.constructor=Ub;Lc.prototype=Object.create(R.prototype);
-Lc.prototype.constructor=Lc;Vb.prototype=Object.create(C.prototype);Vb.prototype.constructor=Vb;Mc.prototype=Object.create(R.prototype);Mc.prototype.constructor=Mc;Wb.prototype=Object.create(C.prototype);Wb.prototype.constructor=Wb;Nc.prototype=Object.create(R.prototype);Nc.prototype.constructor=Nc;Xb.prototype=Object.create(C.prototype);Xb.prototype.constructor=Xb;var Ug={triangulate:function(a,b,c){c=c||2;var d=b&&b.length,e=d?b[0]*c:a.length,f=bf(a,0,e,c,!0),g=[];if(!f)return g;var h;if(d){var k=
-c;d=[];var m;var l=0;for(m=b.length;l<m;l++){var n=b[l]*k;var t=l<m-1?b[l+1]*k:a.length;n=bf(a,n,t,k,!1);n===n.next&&(n.steiner=!0);d.push(Pg(n))}d.sort(Ng);for(l=0;l<d.length;l++){b=d[l];k=f;if(k=Og(b,k))b=ef(k,b),Pc(b,b.next);f=Pc(f,f.next)}}if(a.length>80*c){var p=h=a[0];var r=d=a[1];for(k=c;k<e;k+=c)l=a[k],b=a[k+1],l<p&&(p=l),b<r&&(r=b),l>h&&(h=l),b>d&&(d=b);h=Math.max(h-p,d-r);h=0!==h?1/h:0}Qc(f,g,c,p,r,h);return g}},Va={area:function(a){for(var b=a.length,c=0,d=b-1,e=0;e<b;d=e++)c+=a[d].x*a[e].y-
-a[e].x*a[d].y;return.5*c},isClockWise:function(a){return 0>Va.area(a)},triangulateShape:function(a,b){var c=[],d=[],e=[];ff(a);gf(c,a);var f=a.length;b.forEach(ff);for(a=0;a<b.length;a++)d.push(f),f+=b[a].length,gf(c,b[a]);b=Ug.triangulate(c,d);for(a=0;a<b.length;a+=3)e.push(b.slice(a,a+3));return e}};rb.prototype=Object.create(R.prototype);rb.prototype.constructor=rb;rb.prototype.toJSON=function(){var a=R.prototype.toJSON.call(this);return hf(this.parameters.shapes,this.parameters.options,a)};Oa.prototype=
-Object.create(C.prototype);Oa.prototype.constructor=Oa;Oa.prototype.toJSON=function(){var a=C.prototype.toJSON.call(this);return hf(this.parameters.shapes,this.parameters.options,a)};var Qg={generateTopUV:function(a,b,c,d,e){a=b[3*d];d=b[3*d+1];var f=b[3*e];e=b[3*e+1];return[new z(b[3*c],b[3*c+1]),new z(a,d),new z(f,e)]},generateSideWallUV:function(a,b,c,d,e,f){a=b[3*c];var g=b[3*c+1];c=b[3*c+2];var h=b[3*d],k=b[3*d+1];d=b[3*d+2];var m=b[3*e],l=b[3*e+1];e=b[3*e+2];var n=b[3*f],t=b[3*f+1];b=b[3*f+
-2];return.01>Math.abs(g-k)?[new z(a,1-c),new z(h,1-d),new z(m,1-e),new z(n,1-b)]:[new z(g,1-c),new z(k,1-d),new z(l,1-e),new z(t,1-b)]}};Sc.prototype=Object.create(R.prototype);Sc.prototype.constructor=Sc;Yb.prototype=Object.create(Oa.prototype);Yb.prototype.constructor=Yb;Tc.prototype=Object.create(R.prototype);Tc.prototype.constructor=Tc;sb.prototype=Object.create(C.prototype);sb.prototype.constructor=sb;Uc.prototype=Object.create(R.prototype);Uc.prototype.constructor=Uc;Zb.prototype=Object.create(C.prototype);
-Zb.prototype.constructor=Zb;Vc.prototype=Object.create(R.prototype);Vc.prototype.constructor=Vc;$b.prototype=Object.create(C.prototype);$b.prototype.constructor=$b;tb.prototype=Object.create(R.prototype);tb.prototype.constructor=tb;tb.prototype.toJSON=function(){var a=R.prototype.toJSON.call(this);return jf(this.parameters.shapes,a)};ub.prototype=Object.create(C.prototype);ub.prototype.constructor=ub;ub.prototype.toJSON=function(){var a=C.prototype.toJSON.call(this);return jf(this.parameters.shapes,
-a)};ac.prototype=Object.create(C.prototype);ac.prototype.constructor=ac;vb.prototype=Object.create(R.prototype);vb.prototype.constructor=vb;Wa.prototype=Object.create(C.prototype);Wa.prototype.constructor=Wa;Wc.prototype=Object.create(vb.prototype);Wc.prototype.constructor=Wc;Xc.prototype=Object.create(Wa.prototype);Xc.prototype.constructor=Xc;Yc.prototype=Object.create(R.prototype);Yc.prototype.constructor=Yc;bc.prototype=Object.create(C.prototype);bc.prototype.constructor=bc;var xa=Object.freeze({WireframeGeometry:Qb,
-ParametricGeometry:Fc,ParametricBufferGeometry:Rb,TetrahedronGeometry:Hc,TetrahedronBufferGeometry:Sb,OctahedronGeometry:Ic,OctahedronBufferGeometry:pb,IcosahedronGeometry:Jc,IcosahedronBufferGeometry:Tb,DodecahedronGeometry:Kc,DodecahedronBufferGeometry:Ub,PolyhedronGeometry:Gc,PolyhedronBufferGeometry:na,TubeGeometry:Lc,TubeBufferGeometry:Vb,TorusKnotGeometry:Mc,TorusKnotBufferGeometry:Wb,TorusGeometry:Nc,TorusBufferGeometry:Xb,TextGeometry:Sc,TextBufferGeometry:Yb,SphereGeometry:Tc,SphereBufferGeometry:sb,
-RingGeometry:Uc,RingBufferGeometry:Zb,PlaneGeometry:uc,PlaneBufferGeometry:lb,LatheGeometry:Vc,LatheBufferGeometry:$b,ShapeGeometry:tb,ShapeBufferGeometry:ub,ExtrudeGeometry:rb,ExtrudeBufferGeometry:Oa,EdgesGeometry:ac,ConeGeometry:Wc,ConeBufferGeometry:Xc,CylinderGeometry:vb,CylinderBufferGeometry:Wa,CircleGeometry:Yc,CircleBufferGeometry:bc,BoxGeometry:Ib,BoxBufferGeometry:kb});wb.prototype=Object.create(J.prototype);wb.prototype.constructor=wb;wb.prototype.isShadowMaterial=!0;wb.prototype.copy=
-function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);return this};cc.prototype=Object.create(ta.prototype);cc.prototype.constructor=cc;cc.prototype.isRawShaderMaterial=!0;Pa.prototype=Object.create(J.prototype);Pa.prototype.constructor=Pa;Pa.prototype.isMeshStandardMaterial=!0;Pa.prototype.copy=function(a){J.prototype.copy.call(this,a);this.defines={STANDARD:""};this.color.copy(a.color);this.roughness=a.roughness;this.metalness=a.metalness;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=
-a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.roughnessMap=a.roughnessMap;this.metalnessMap=
-a.metalnessMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.envMapIntensity=a.envMapIntensity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};xb.prototype=Object.create(Pa.prototype);xb.prototype.constructor=xb;xb.prototype.isMeshPhysicalMaterial=
-!0;xb.prototype.copy=function(a){Pa.prototype.copy.call(this,a);this.defines={PHYSICAL:""};this.reflectivity=a.reflectivity;this.clearCoat=a.clearCoat;this.clearCoatRoughness=a.clearCoatRoughness;return this};Fa.prototype=Object.create(J.prototype);Fa.prototype.constructor=Fa;Fa.prototype.isMeshPhongMaterial=!0;Fa.prototype.copy=function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);this.specular.copy(a.specular);this.shininess=a.shininess;this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=
-a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;
-this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};yb.prototype=Object.create(Fa.prototype);yb.prototype.constructor=yb;yb.prototype.isMeshToonMaterial=!0;yb.prototype.copy=function(a){Fa.prototype.copy.call(this,
-a);this.gradientMap=a.gradientMap;return this};zb.prototype=Object.create(J.prototype);zb.prototype.constructor=zb;zb.prototype.isMeshNormalMaterial=!0;zb.prototype.copy=function(a){J.prototype.copy.call(this,a);this.bumpMap=a.bumpMap;this.bumpScale=a.bumpScale;this.normalMap=a.normalMap;this.normalMapType=a.normalMapType;this.normalScale.copy(a.normalScale);this.displacementMap=a.displacementMap;this.displacementScale=a.displacementScale;this.displacementBias=a.displacementBias;this.wireframe=a.wireframe;
-this.wireframeLinewidth=a.wireframeLinewidth;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};Ab.prototype=Object.create(J.prototype);Ab.prototype.constructor=Ab;Ab.prototype.isMeshLambertMaterial=!0;Ab.prototype.copy=function(a){J.prototype.copy.call(this,a);this.color.copy(a.color);this.map=a.map;this.lightMap=a.lightMap;this.lightMapIntensity=a.lightMapIntensity;this.aoMap=a.aoMap;this.aoMapIntensity=a.aoMapIntensity;this.emissive.copy(a.emissive);
-this.emissiveMap=a.emissiveMap;this.emissiveIntensity=a.emissiveIntensity;this.specularMap=a.specularMap;this.alphaMap=a.alphaMap;this.envMap=a.envMap;this.combine=a.combine;this.reflectivity=a.reflectivity;this.refractionRatio=a.refractionRatio;this.wireframe=a.wireframe;this.wireframeLinewidth=a.wireframeLinewidth;this.wireframeLinecap=a.wireframeLinecap;this.wireframeLinejoin=a.wireframeLinejoin;this.skinning=a.skinning;this.morphTargets=a.morphTargets;this.morphNormals=a.morphNormals;return this};
-Bb.prototype=Object.create(Y.prototype);Bb.prototype.constructor=Bb;Bb.prototype.isLineDashedMaterial=!0;Bb.prototype.copy=function(a){Y.prototype.copy.call(this,a);this.scale=a.scale;this.dashSize=a.dashSize;this.gapSize=a.gapSize;return this};var Vg=Object.freeze({ShadowMaterial:wb,SpriteMaterial:cb,RawShaderMaterial:cc,ShaderMaterial:ta,PointsMaterial:Ea,MeshPhysicalMaterial:xb,MeshStandardMaterial:Pa,MeshPhongMaterial:Fa,MeshToonMaterial:yb,MeshNormalMaterial:zb,MeshLambertMaterial:Ab,MeshDepthMaterial:$a,
-MeshDistanceMaterial:ab,MeshBasicMaterial:da,LineDashedMaterial:Bb,LineBasicMaterial:Y,Material:J}),Fb={enabled:!1,files:{},add:function(a,b){!1!==this.enabled&&(this.files[a]=b)},get:function(a){if(!1!==this.enabled)return this.files[a]},remove:function(a){delete this.files[a]},clear:function(){this.files={}}},ka=new ce,Ya={};Object.assign(Ga.prototype,{load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=Fb.get(a);if(void 0!==f)return e.manager.itemStart(a),
-setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;if(void 0!==Ya[a])Ya[a].push({onLoad:b,onProgress:c,onError:d});else{var g=a.match(/^data:(.*?)(;base64)?,(.*)$/);if(g){c=g[1];var h=!!g[2];g=g[3];g=window.decodeURIComponent(g);h&&(g=window.atob(g));try{var k=(this.responseType||"").toLowerCase();switch(k){case "arraybuffer":case "blob":var m=new Uint8Array(g.length);for(h=0;h<g.length;h++)m[h]=g.charCodeAt(h);var l="blob"===k?new Blob([m.buffer],{type:c}):m.buffer;break;case "document":l=
-(new DOMParser).parseFromString(g,c);break;case "json":l=JSON.parse(g);break;default:l=g}window.setTimeout(function(){b&&b(l);e.manager.itemEnd(a)},0)}catch(t){window.setTimeout(function(){d&&d(t);e.manager.itemEnd(a);e.manager.itemError(a)},0)}}else{Ya[a]=[];Ya[a].push({onLoad:b,onProgress:c,onError:d});var n=new XMLHttpRequest;n.open("GET",a,!0);n.addEventListener("load",function(b){var c=this.response;Fb.add(a,c);var d=Ya[a];delete Ya[a];if(200===this.status||0===this.status){0===this.status&&
-console.warn("THREE.FileLoader: HTTP Status 0 received.");for(var f=0,g=d.length;f<g;f++){var h=d[f];if(h.onLoad)h.onLoad(c)}e.manager.itemEnd(a)}else{f=0;for(g=d.length;f<g;f++)if(h=d[f],h.onError)h.onError(b);e.manager.itemEnd(a);e.manager.itemError(a)}},!1);n.addEventListener("progress",function(b){for(var c=Ya[a],d=0,e=c.length;d<e;d++){var f=c[d];if(f.onProgress)f.onProgress(b)}},!1);n.addEventListener("error",function(b){var c=Ya[a];delete Ya[a];for(var d=0,f=c.length;d<f;d++){var g=c[d];if(g.onError)g.onError(b)}e.manager.itemEnd(a);
-e.manager.itemError(a)},!1);void 0!==this.responseType&&(n.responseType=this.responseType);void 0!==this.withCredentials&&(n.withCredentials=this.withCredentials);n.overrideMimeType&&n.overrideMimeType(void 0!==this.mimeType?this.mimeType:"text/plain");for(h in this.requestHeader)n.setRequestHeader(h,this.requestHeader[h]);n.send(null)}e.manager.itemStart(a);return n}},setPath:function(a){this.path=a;return this},setResponseType:function(a){this.responseType=a;return this},setWithCredentials:function(a){this.withCredentials=
-a;return this},setMimeType:function(a){this.mimeType=a;return this},setRequestHeader:function(a){this.requestHeader=a;return this}});Object.assign(kf.prototype,{load:function(a,b,c,d){function e(e){k.load(a[e],function(a){a=f._parser(a,!0);g[e]={width:a.width,height:a.height,format:a.format,mipmaps:a.mipmaps};m+=1;6===m&&(1===a.mipmapCount&&(h.minFilter=1006),h.format=a.format,h.needsUpdate=!0,b&&b(h))},c,d)}var f=this,g=[],h=new Pb;h.image=g;var k=new Ga(this.manager);k.setPath(this.path);k.setResponseType("arraybuffer");
-if(Array.isArray(a))for(var m=0,l=0,n=a.length;l<n;++l)e(l);else k.load(a,function(a){a=f._parser(a,!0);if(a.isCubemap)for(var c=a.mipmaps.length/a.mipmapCount,d=0;d<c;d++){g[d]={mipmaps:[]};for(var e=0;e<a.mipmapCount;e++)g[d].mipmaps.push(a.mipmaps[d*a.mipmapCount+e]),g[d].format=a.format,g[d].width=a.width,g[d].height=a.height}else h.image.width=a.width,h.image.height=a.height,h.mipmaps=a.mipmaps;1===a.mipmapCount&&(h.minFilter=1006);h.format=a.format;h.needsUpdate=!0;b&&b(h)},c,d);return h},setPath:function(a){this.path=
-a;return this}});Object.assign(de.prototype,{load:function(a,b,c,d){var e=this,f=new gb,g=new Ga(this.manager);g.setResponseType("arraybuffer");g.load(a,function(a){if(a=e._parser(a))void 0!==a.image?f.image=a.image:void 0!==a.data&&(f.image.width=a.width,f.image.height=a.height,f.image.data=a.data),f.wrapS=void 0!==a.wrapS?a.wrapS:1001,f.wrapT=void 0!==a.wrapT?a.wrapT:1001,f.magFilter=void 0!==a.magFilter?a.magFilter:1006,f.minFilter=void 0!==a.minFilter?a.minFilter:1008,f.anisotropy=void 0!==a.anisotropy?
-a.anisotropy:1,void 0!==a.format&&(f.format=a.format),void 0!==a.type&&(f.type=a.type),void 0!==a.mipmaps&&(f.mipmaps=a.mipmaps),1===a.mipmapCount&&(f.minFilter=1006),f.needsUpdate=!0,b&&b(f,a)},c,d);return f}});Object.assign(Zc.prototype,{crossOrigin:"anonymous",load:function(a,b,c,d){function e(){k.removeEventListener("load",e,!1);k.removeEventListener("error",f,!1);Fb.add(a,this);b&&b(this);g.manager.itemEnd(a)}function f(b){k.removeEventListener("load",e,!1);k.removeEventListener("error",f,!1);
-d&&d(b);g.manager.itemEnd(a);g.manager.itemError(a)}void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var g=this,h=Fb.get(a);if(void 0!==h)return g.manager.itemStart(a),setTimeout(function(){b&&b(h);g.manager.itemEnd(a)},0),h;var k=document.createElementNS("http://www.w3.org/1999/xhtml","img");k.addEventListener("load",e,!1);k.addEventListener("error",f,!1);"data:"!==a.substr(0,5)&&void 0!==this.crossOrigin&&(k.crossOrigin=this.crossOrigin);g.manager.itemStart(a);
-k.src=a;return k},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(ee.prototype,{crossOrigin:"anonymous",load:function(a,b,c,d){function e(c){g.load(a[c],function(a){f.images[c]=a;h++;6===h&&(f.needsUpdate=!0,b&&b(f))},void 0,d)}var f=new Ua,g=new Zc(this.manager);g.setCrossOrigin(this.crossOrigin);g.setPath(this.path);var h=0;for(c=0;c<a.length;++c)e(c);return f},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=
-a;return this}});Object.assign(vd.prototype,{crossOrigin:"anonymous",load:function(a,b,c,d){var e=new T,f=new Zc(this.manager);f.setCrossOrigin(this.crossOrigin);f.setPath(this.path);f.load(a,function(c){e.image=c;c=0<a.search(/\.(jpg|jpeg)$/)||0===a.search(/^data:image\/jpeg/);e.format=c?1022:1023;e.needsUpdate=!0;void 0!==b&&b(e)},c,d);return e},setCrossOrigin:function(a){this.crossOrigin=a;return this},setPath:function(a){this.path=a;return this}});Object.assign(L.prototype,{getPoint:function(){console.warn("THREE.Curve: .getPoint() not implemented.");
-return null},getPointAt:function(a,b){a=this.getUtoTmapping(a);return this.getPoint(a,b)},getPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));return b},getSpacedPoints:function(a){void 0===a&&(a=5);for(var b=[],c=0;c<=a;c++)b.push(this.getPointAt(c/a));return b},getLength:function(){var a=this.getLengths();return a[a.length-1]},getLengths:function(a){void 0===a&&(a=this.arcLengthDivisions);if(this.cacheArcLengths&&this.cacheArcLengths.length===a+1&&!this.needsUpdate)return this.cacheArcLengths;
-this.needsUpdate=!1;var b=[],c=this.getPoint(0),d,e=0;b.push(0);for(d=1;d<=a;d++){var f=this.getPoint(d/a);e+=f.distanceTo(c);b.push(e);c=f}return this.cacheArcLengths=b},updateArcLengths:function(){this.needsUpdate=!0;this.getLengths()},getUtoTmapping:function(a,b){var c=this.getLengths(),d=c.length;b=b?b:a*c[d-1];for(var e=0,f=d-1,g;e<=f;)if(a=Math.floor(e+(f-e)/2),g=c[a]-b,0>g)e=a+1;else if(0<g)f=a-1;else{f=a;break}a=f;if(c[a]===b)return a/(d-1);e=c[a];return(a+(b-e)/(c[a+1]-e))/(d-1)},getTangent:function(a){var b=
-a-1E-4;a+=1E-4;0>b&&(b=0);1<a&&(a=1);b=this.getPoint(b);return this.getPoint(a).clone().sub(b).normalize()},getTangentAt:function(a){a=this.getUtoTmapping(a);return this.getTangent(a)},computeFrenetFrames:function(a,b){var c=new p,d=[],e=[],f=[],g=new p,h=new I,k;for(k=0;k<=a;k++){var m=k/a;d[k]=this.getTangentAt(m);d[k].normalize()}e[0]=new p;f[0]=new p;k=Number.MAX_VALUE;m=Math.abs(d[0].x);var l=Math.abs(d[0].y),n=Math.abs(d[0].z);m<=k&&(k=m,c.set(1,0,0));l<=k&&(k=l,c.set(0,1,0));n<=k&&c.set(0,
-0,1);g.crossVectors(d[0],c).normalize();e[0].crossVectors(d[0],g);f[0].crossVectors(d[0],e[0]);for(k=1;k<=a;k++)e[k]=e[k-1].clone(),f[k]=f[k-1].clone(),g.crossVectors(d[k-1],d[k]),g.length()>Number.EPSILON&&(g.normalize(),c=Math.acos(H.clamp(d[k-1].dot(d[k]),-1,1)),e[k].applyMatrix4(h.makeRotationAxis(g,c))),f[k].crossVectors(d[k],e[k]);if(!0===b)for(c=Math.acos(H.clamp(e[0].dot(e[a]),-1,1)),c/=a,0<d[0].dot(g.crossVectors(e[0],e[a]))&&(c=-c),k=1;k<=a;k++)e[k].applyMatrix4(h.makeRotationAxis(d[k],
-c*k)),f[k].crossVectors(d[k],e[k]);return{tangents:d,normals:e,binormals:f}},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this},toJSON:function(){var a={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};a.arcLengthDivisions=this.arcLengthDivisions;a.type=this.type;return a},fromJSON:function(a){this.arcLengthDivisions=a.arcLengthDivisions;return this}});za.prototype=Object.create(L.prototype);za.prototype.constructor=
-za;za.prototype.isEllipseCurve=!0;za.prototype.getPoint=function(a,b){b=b||new z;for(var c=2*Math.PI,d=this.aEndAngle-this.aStartAngle,e=Math.abs(d)<Number.EPSILON;0>d;)d+=c;for(;d>c;)d-=c;d<Number.EPSILON&&(d=e?0:c);!0!==this.aClockwise||e||(d=d===c?-c:d-c);c=this.aStartAngle+a*d;a=this.aX+this.xRadius*Math.cos(c);var f=this.aY+this.yRadius*Math.sin(c);0!==this.aRotation&&(c=Math.cos(this.aRotation),d=Math.sin(this.aRotation),e=a-this.aX,f-=this.aY,a=e*c-f*d+this.aX,f=e*d+f*c+this.aY);return b.set(a,
-f)};za.prototype.copy=function(a){L.prototype.copy.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};za.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.aX=this.aX;a.aY=this.aY;a.xRadius=this.xRadius;a.yRadius=this.yRadius;a.aStartAngle=this.aStartAngle;a.aEndAngle=this.aEndAngle;a.aClockwise=this.aClockwise;a.aRotation=
-this.aRotation;return a};za.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.aX=a.aX;this.aY=a.aY;this.xRadius=a.xRadius;this.yRadius=a.yRadius;this.aStartAngle=a.aStartAngle;this.aEndAngle=a.aEndAngle;this.aClockwise=a.aClockwise;this.aRotation=a.aRotation;return this};dc.prototype=Object.create(za.prototype);dc.prototype.constructor=dc;dc.prototype.isArcCurve=!0;var Od=new p,Ae=new fe,Be=new fe,Ce=new fe;ca.prototype=Object.create(L.prototype);ca.prototype.constructor=ca;ca.prototype.isCatmullRomCurve3=
-!0;ca.prototype.getPoint=function(a,b){b=b||new p;var c=this.points,d=c.length;a*=d-(this.closed?0:1);var e=Math.floor(a);a-=e;this.closed?e+=0<e?0:(Math.floor(Math.abs(e)/d)+1)*d:0===a&&e===d-1&&(e=d-2,a=1);if(this.closed||0<e)var f=c[(e-1)%d];else Od.subVectors(c[0],c[1]).add(c[0]),f=Od;var g=c[e%d];var h=c[(e+1)%d];this.closed||e+2<d?c=c[(e+2)%d]:(Od.subVectors(c[d-1],c[d-2]).add(c[d-1]),c=Od);if("centripetal"===this.curveType||"chordal"===this.curveType){var k="chordal"===this.curveType?.5:.25;
-d=Math.pow(f.distanceToSquared(g),k);e=Math.pow(g.distanceToSquared(h),k);k=Math.pow(h.distanceToSquared(c),k);1E-4>e&&(e=1);1E-4>d&&(d=e);1E-4>k&&(k=e);Ae.initNonuniformCatmullRom(f.x,g.x,h.x,c.x,d,e,k);Be.initNonuniformCatmullRom(f.y,g.y,h.y,c.y,d,e,k);Ce.initNonuniformCatmullRom(f.z,g.z,h.z,c.z,d,e,k)}else"catmullrom"===this.curveType&&(Ae.initCatmullRom(f.x,g.x,h.x,c.x,this.tension),Be.initCatmullRom(f.y,g.y,h.y,c.y,this.tension),Ce.initCatmullRom(f.z,g.z,h.z,c.z,this.tension));b.set(Ae.calc(a),
-Be.calc(a),Ce.calc(a));return b};ca.prototype.copy=function(a){L.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};ca.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());a.closed=this.closed;a.curveType=this.curveType;a.tension=this.tension;return a};
-ca.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new p).fromArray(d))}this.closed=a.closed;this.curveType=a.curveType;this.tension=a.tension;return this};Ha.prototype=Object.create(L.prototype);Ha.prototype.constructor=Ha;Ha.prototype.isCubicBezierCurve=!0;Ha.prototype.getPoint=function(a,b){b=b||new z;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(ad(a,c.x,d.x,e.x,f.x),ad(a,c.y,d.y,e.y,
-f.y));return b};Ha.prototype.copy=function(a){L.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Ha.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};Ha.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};
-Qa.prototype=Object.create(L.prototype);Qa.prototype.constructor=Qa;Qa.prototype.isCubicBezierCurve3=!0;Qa.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2,f=this.v3;b.set(ad(a,c.x,d.x,e.x,f.x),ad(a,c.y,d.y,e.y,f.y),ad(a,c.z,d.z,e.z,f.z));return b};Qa.prototype.copy=function(a){L.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);this.v3.copy(a.v3);return this};Qa.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.v0=this.v0.toArray();
-a.v1=this.v1.toArray();a.v2=this.v2.toArray();a.v3=this.v3.toArray();return a};Qa.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);this.v3.fromArray(a.v3);return this};va.prototype=Object.create(L.prototype);va.prototype.constructor=va;va.prototype.isLineCurve=!0;va.prototype.getPoint=function(a,b){b=b||new z;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};va.prototype.getPointAt=
-function(a,b){return this.getPoint(a,b)};va.prototype.getTangent=function(){return this.v2.clone().sub(this.v1).normalize()};va.prototype.copy=function(a){L.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};va.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};va.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Ia.prototype=
-Object.create(L.prototype);Ia.prototype.constructor=Ia;Ia.prototype.isLineCurve3=!0;Ia.prototype.getPoint=function(a,b){b=b||new p;1===a?b.copy(this.v2):(b.copy(this.v2).sub(this.v1),b.multiplyScalar(a).add(this.v1));return b};Ia.prototype.getPointAt=function(a,b){return this.getPoint(a,b)};Ia.prototype.copy=function(a){L.prototype.copy.call(this,a);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ia.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.v1=this.v1.toArray();a.v2=this.v2.toArray();
-return a};Ia.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Ja.prototype=Object.create(L.prototype);Ja.prototype.constructor=Ja;Ja.prototype.isQuadraticBezierCurve=!0;Ja.prototype.getPoint=function(a,b){b=b||new z;var c=this.v0,d=this.v1,e=this.v2;b.set($c(a,c.x,d.x,e.x),$c(a,c.y,d.y,e.y));return b};Ja.prototype.copy=function(a){L.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};
-Ja.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ja.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Ra.prototype=Object.create(L.prototype);Ra.prototype.constructor=Ra;Ra.prototype.isQuadraticBezierCurve3=!0;Ra.prototype.getPoint=function(a,b){b=b||new p;var c=this.v0,d=this.v1,e=this.v2;b.set($c(a,c.x,
-d.x,e.x),$c(a,c.y,d.y,e.y),$c(a,c.z,d.z,e.z));return b};Ra.prototype.copy=function(a){L.prototype.copy.call(this,a);this.v0.copy(a.v0);this.v1.copy(a.v1);this.v2.copy(a.v2);return this};Ra.prototype.toJSON=function(){var a=L.prototype.toJSON.call(this);a.v0=this.v0.toArray();a.v1=this.v1.toArray();a.v2=this.v2.toArray();return a};Ra.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.v0.fromArray(a.v0);this.v1.fromArray(a.v1);this.v2.fromArray(a.v2);return this};Ka.prototype=Object.create(L.prototype);
-Ka.prototype.constructor=Ka;Ka.prototype.isSplineCurve=!0;Ka.prototype.getPoint=function(a,b){b=b||new z;var c=this.points,d=(c.length-1)*a;a=Math.floor(d);d-=a;var e=c[0===a?a:a-1],f=c[a],g=c[a>c.length-2?c.length-1:a+1];c=c[a>c.length-3?c.length-1:a+2];b.set(lf(d,e.x,f.x,g.x,c.x),lf(d,e.y,f.y,g.y,c.y));return b};Ka.prototype.copy=function(a){L.prototype.copy.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++)this.points.push(a.points[b].clone());return this};Ka.prototype.toJSON=function(){var a=
-L.prototype.toJSON.call(this);a.points=[];for(var b=0,c=this.points.length;b<c;b++)a.points.push(this.points[b].toArray());return a};Ka.prototype.fromJSON=function(a){L.prototype.fromJSON.call(this,a);this.points=[];for(var b=0,c=a.points.length;b<c;b++){var d=a.points[b];this.points.push((new z).fromArray(d))}return this};var Af=Object.freeze({ArcCurve:dc,CatmullRomCurve3:ca,CubicBezierCurve:Ha,CubicBezierCurve3:Qa,EllipseCurve:za,LineCurve:va,LineCurve3:Ia,QuadraticBezierCurve:Ja,QuadraticBezierCurve3:Ra,
-SplineCurve:Ka});Xa.prototype=Object.assign(Object.create(L.prototype),{constructor:Xa,add:function(a){this.curves.push(a)},closePath:function(){var a=this.curves[0].getPoint(0),b=this.curves[this.curves.length-1].getPoint(1);a.equals(b)||this.curves.push(new va(b,a))},getPoint:function(a){var b=a*this.getLength(),c=this.getCurveLengths();for(a=0;a<c.length;){if(c[a]>=b)return b=c[a]-b,a=this.curves[a],c=a.getLength(),a.getPointAt(0===c?0:1-b/c);a++}return null},getLength:function(){var a=this.getCurveLengths();
-return a[a.length-1]},updateArcLengths:function(){this.needsUpdate=!0;this.cacheLengths=null;this.getCurveLengths()},getCurveLengths:function(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;for(var a=[],b=0,c=0,d=this.curves.length;c<d;c++)b+=this.curves[c].getLength(),a.push(b);return this.cacheLengths=a},getSpacedPoints:function(a){void 0===a&&(a=40);for(var b=[],c=0;c<=a;c++)b.push(this.getPoint(c/a));this.autoClose&&b.push(b[0]);return b},getPoints:function(a){a=
-a||12;for(var b=[],c,d=0,e=this.curves;d<e.length;d++){var f=e[d];f=f.getPoints(f&&f.isEllipseCurve?2*a:f&&(f.isLineCurve||f.isLineCurve3)?1:f&&f.isSplineCurve?a*f.points.length:a);for(var g=0;g<f.length;g++){var h=f[g];c&&c.equals(h)||(b.push(h),c=h)}}this.autoClose&&1<b.length&&!b[b.length-1].equals(b[0])&&b.push(b[0]);return b},copy:function(a){L.prototype.copy.call(this,a);this.curves=[];for(var b=0,c=a.curves.length;b<c;b++)this.curves.push(a.curves[b].clone());this.autoClose=a.autoClose;return this},
-toJSON:function(){var a=L.prototype.toJSON.call(this);a.autoClose=this.autoClose;a.curves=[];for(var b=0,c=this.curves.length;b<c;b++)a.curves.push(this.curves[b].toJSON());return a},fromJSON:function(a){L.prototype.fromJSON.call(this,a);this.autoClose=a.autoClose;this.curves=[];for(var b=0,c=a.curves.length;b<c;b++){var d=a.curves[b];this.curves.push((new Af[d.type]).fromJSON(d))}return this}});La.prototype=Object.assign(Object.create(Xa.prototype),{constructor:La,setFromPoints:function(a){this.moveTo(a[0].x,
-a[0].y);for(var b=1,c=a.length;b<c;b++)this.lineTo(a[b].x,a[b].y)},moveTo:function(a,b){this.currentPoint.set(a,b)},lineTo:function(a,b){var c=new va(this.currentPoint.clone(),new z(a,b));this.curves.push(c);this.currentPoint.set(a,b)},quadraticCurveTo:function(a,b,c,d){a=new Ja(this.currentPoint.clone(),new z(a,b),new z(c,d));this.curves.push(a);this.currentPoint.set(c,d)},bezierCurveTo:function(a,b,c,d,e,f){a=new Ha(this.currentPoint.clone(),new z(a,b),new z(c,d),new z(e,f));this.curves.push(a);
-this.currentPoint.set(e,f)},splineThru:function(a){var b=[this.currentPoint.clone()].concat(a);b=new Ka(b);this.curves.push(b);this.currentPoint.copy(a[a.length-1])},arc:function(a,b,c,d,e,f){this.absarc(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f)},absarc:function(a,b,c,d,e,f){this.absellipse(a,b,c,c,d,e,f)},ellipse:function(a,b,c,d,e,f,g,h){this.absellipse(a+this.currentPoint.x,b+this.currentPoint.y,c,d,e,f,g,h)},absellipse:function(a,b,c,d,e,f,g,h){a=new za(a,b,c,d,e,f,g,h);0<this.curves.length&&
-(b=a.getPoint(0),b.equals(this.currentPoint)||this.lineTo(b.x,b.y));this.curves.push(a);a=a.getPoint(1);this.currentPoint.copy(a)},copy:function(a){Xa.prototype.copy.call(this,a);this.currentPoint.copy(a.currentPoint);return this},toJSON:function(){var a=Xa.prototype.toJSON.call(this);a.currentPoint=this.currentPoint.toArray();return a},fromJSON:function(a){Xa.prototype.fromJSON.call(this,a);this.currentPoint.fromArray(a.currentPoint);return this}});db.prototype=Object.assign(Object.create(La.prototype),
-{constructor:db,getPointsHoles:function(a){for(var b=[],c=0,d=this.holes.length;c<d;c++)b[c]=this.holes[c].getPoints(a);return b},extractPoints:function(a){return{shape:this.getPoints(a),holes:this.getPointsHoles(a)}},copy:function(a){La.prototype.copy.call(this,a);this.holes=[];for(var b=0,c=a.holes.length;b<c;b++)this.holes.push(a.holes[b].clone());return this},toJSON:function(){var a=La.prototype.toJSON.call(this);a.uuid=this.uuid;a.holes=[];for(var b=0,c=this.holes.length;b<c;b++)a.holes.push(this.holes[b].toJSON());
-return a},fromJSON:function(a){La.prototype.fromJSON.call(this,a);this.uuid=a.uuid;this.holes=[];for(var b=0,c=a.holes.length;b<c;b++){var d=a.holes[b];this.holes.push((new La).fromJSON(d))}return this}});X.prototype=Object.assign(Object.create(D.prototype),{constructor:X,isLight:!0,copy:function(a){D.prototype.copy.call(this,a);this.color.copy(a.color);this.intensity=a.intensity;return this},toJSON:function(a){a=D.prototype.toJSON.call(this,a);a.object.color=this.color.getHex();a.object.intensity=
-this.intensity;void 0!==this.groundColor&&(a.object.groundColor=this.groundColor.getHex());void 0!==this.distance&&(a.object.distance=this.distance);void 0!==this.angle&&(a.object.angle=this.angle);void 0!==this.decay&&(a.object.decay=this.decay);void 0!==this.penumbra&&(a.object.penumbra=this.penumbra);void 0!==this.shadow&&(a.object.shadow=this.shadow.toJSON());return a}});wd.prototype=Object.assign(Object.create(X.prototype),{constructor:wd,isHemisphereLight:!0,copy:function(a){X.prototype.copy.call(this,
-a);this.groundColor.copy(a.groundColor);return this}});Object.assign(Cb.prototype,{copy:function(a){this.camera=a.camera.clone();this.bias=a.bias;this.radius=a.radius;this.mapSize.copy(a.mapSize);return this},clone:function(){return(new this.constructor).copy(this)},toJSON:function(){var a={};0!==this.bias&&(a.bias=this.bias);1!==this.radius&&(a.radius=this.radius);if(512!==this.mapSize.x||512!==this.mapSize.y)a.mapSize=this.mapSize.toArray();a.camera=this.camera.toJSON(!1).object;delete a.camera.matrix;
-return a}});xd.prototype=Object.assign(Object.create(Cb.prototype),{constructor:xd,isSpotLightShadow:!0,update:function(a){var b=this.camera,c=2*H.RAD2DEG*a.angle,d=this.mapSize.width/this.mapSize.height;a=a.distance||b.far;if(c!==b.fov||d!==b.aspect||a!==b.far)b.fov=c,b.aspect=d,b.far=a,b.updateProjectionMatrix()}});yd.prototype=Object.assign(Object.create(X.prototype),{constructor:yd,isSpotLight:!0,copy:function(a){X.prototype.copy.call(this,a);this.distance=a.distance;this.angle=a.angle;this.penumbra=
-a.penumbra;this.decay=a.decay;this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});zd.prototype=Object.assign(Object.create(X.prototype),{constructor:zd,isPointLight:!0,copy:function(a){X.prototype.copy.call(this,a);this.distance=a.distance;this.decay=a.decay;this.shadow=a.shadow.clone();return this}});Ad.prototype=Object.assign(Object.create(Cb.prototype),{constructor:Ad});Bd.prototype=Object.assign(Object.create(X.prototype),{constructor:Bd,isDirectionalLight:!0,copy:function(a){X.prototype.copy.call(this,
-a);this.target=a.target.clone();this.shadow=a.shadow.clone();return this}});Cd.prototype=Object.assign(Object.create(X.prototype),{constructor:Cd,isAmbientLight:!0});Dd.prototype=Object.assign(Object.create(X.prototype),{constructor:Dd,isRectAreaLight:!0,copy:function(a){X.prototype.copy.call(this,a);this.width=a.width;this.height=a.height;return this},toJSON:function(a){a=X.prototype.toJSON.call(this,a);a.object.width=this.width;a.object.height=this.height;return a}});var ia={arraySlice:function(a,
-b,c){return ia.isTypedArray(a)?new a.constructor(a.subarray(b,void 0!==c?c:a.length)):a.slice(b,c)},convertArray:function(a,b,c){return!a||!c&&a.constructor===b?a:"number"===typeof b.BYTES_PER_ELEMENT?new b(a):Array.prototype.slice.call(a)},isTypedArray:function(a){return ArrayBuffer.isView(a)&&!(a instanceof DataView)},getKeyframeOrder:function(a){for(var b=a.length,c=Array(b),d=0;d!==b;++d)c[d]=d;c.sort(function(b,c){return a[b]-a[c]});return c},sortedArray:function(a,b,c){for(var d=a.length,e=
-new a.constructor(d),f=0,g=0;g!==d;++f)for(var h=c[f]*b,k=0;k!==b;++k)e[g++]=a[h+k];return e},flattenJSON:function(a,b,c,d){for(var e=1,f=a[0];void 0!==f&&void 0===f[d];)f=a[e++];if(void 0!==f){var g=f[d];if(void 0!==g)if(Array.isArray(g)){do g=f[d],void 0!==g&&(b.push(f.time),c.push.apply(c,g)),f=a[e++];while(void 0!==f)}else if(void 0!==g.toArray){do g=f[d],void 0!==g&&(b.push(f.time),g.toArray(c,c.length)),f=a[e++];while(void 0!==f)}else{do g=f[d],void 0!==g&&(b.push(f.time),c.push(g)),f=a[e++];
-while(void 0!==f)}}}};Object.assign(wa.prototype,{evaluate:function(a){var b=this.parameterPositions,c=this._cachedIndex,d=b[c],e=b[c-1];a:{b:{c:{d:if(!(a<d)){for(var f=c+2;;){if(void 0===d){if(a<e)break d;this._cachedIndex=c=b.length;return this.afterEnd_(c-1,a,e)}if(c===f)break;e=d;d=b[++c];if(a<d)break b}d=b.length;break c}if(a>=e)break a;else{f=b[1];a<f&&(c=2,e=f);for(f=c-2;;){if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(c===f)break;d=e;e=b[--c-1];if(a>=e)break b}d=c;c=
-0}}for(;c<d;)e=c+d>>>1,a<b[e]?d=e:c=e+1;d=b[c];e=b[c-1];if(void 0===e)return this._cachedIndex=0,this.beforeStart_(0,a,d);if(void 0===d)return this._cachedIndex=c=b.length,this.afterEnd_(c-1,e,a)}this._cachedIndex=c;this.intervalChanged_(c,e,d)}return this.interpolate_(c,e,a,d)},settings:null,DefaultSettings_:{},getSettings_:function(){return this.settings||this.DefaultSettings_},copySampleValue_:function(a){var b=this.resultBuffer,c=this.sampleValues,d=this.valueSize;a*=d;for(var e=0;e!==d;++e)b[e]=
-c[a+e];return b},interpolate_:function(){throw Error("call to abstract method");},intervalChanged_:function(){}});Object.assign(wa.prototype,{beforeStart_:wa.prototype.copySampleValue_,afterEnd_:wa.prototype.copySampleValue_});Ed.prototype=Object.assign(Object.create(wa.prototype),{constructor:Ed,DefaultSettings_:{endingStart:2400,endingEnd:2400},intervalChanged_:function(a,b,c){var d=this.parameterPositions,e=a-2,f=a+1,g=d[e],h=d[f];if(void 0===g)switch(this.getSettings_().endingStart){case 2401:e=
-a;g=2*b-c;break;case 2402:e=d.length-2;g=b+d[e]-d[e+1];break;default:e=a,g=c}if(void 0===h)switch(this.getSettings_().endingEnd){case 2401:f=a;h=2*c-b;break;case 2402:f=1;h=c+d[1]-d[0];break;default:f=a-1,h=b}a=.5*(c-b);d=this.valueSize;this._weightPrev=a/(b-g);this._weightNext=a/(h-c);this._offsetPrev=e*d;this._offsetNext=f*d},interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g,k=this._offsetPrev,m=this._offsetNext,l=this._weightPrev,n=this._weightNext,
-p=(c-b)/(d-b);c=p*p;d=c*p;b=-l*d+2*l*c-l*p;l=(1+l)*d+(-1.5-2*l)*c+(-.5+l)*p+1;p=(-1-n)*d+(1.5+n)*c+.5*p;n=n*d-n*c;for(c=0;c!==g;++c)e[c]=b*f[k+c]+l*f[h+c]+p*f[a+c]+n*f[m+c];return e}});bd.prototype=Object.assign(Object.create(wa.prototype),{constructor:bd,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;var h=a-g;b=(c-b)/(d-b);c=1-b;for(d=0;d!==g;++d)e[d]=f[h+d]*c+f[a+d]*b;return e}});Fd.prototype=Object.assign(Object.create(wa.prototype),{constructor:Fd,
-interpolate_:function(a){return this.copySampleValue_(a-1)}});Object.assign(oa,{toJSON:function(a){var b=a.constructor;if(void 0!==b.toJSON)b=b.toJSON(a);else{b={name:a.name,times:ia.convertArray(a.times,Array),values:ia.convertArray(a.values,Array)};var c=a.getInterpolation();c!==a.DefaultInterpolation&&(b.interpolation=c)}b.type=a.ValueTypeName;return b}});Object.assign(oa.prototype,{constructor:oa,TimeBufferType:Float32Array,ValueBufferType:Float32Array,DefaultInterpolation:2301,InterpolantFactoryMethodDiscrete:function(a){return new Fd(this.times,
-this.values,this.getValueSize(),a)},InterpolantFactoryMethodLinear:function(a){return new bd(this.times,this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:function(a){return new Ed(this.times,this.values,this.getValueSize(),a)},setInterpolation:function(a){switch(a){case 2300:var b=this.InterpolantFactoryMethodDiscrete;break;case 2301:b=this.InterpolantFactoryMethodLinear;break;case 2302:b=this.InterpolantFactoryMethodSmooth}if(void 0===b){b="unsupported interpolation for "+this.ValueTypeName+
-" keyframe track named "+this.name;if(void 0===this.createInterpolant)if(a!==this.DefaultInterpolation)this.setInterpolation(this.DefaultInterpolation);else throw Error(b);console.warn("THREE.KeyframeTrack:",b);return this}this.createInterpolant=b;return this},getInterpolation:function(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return 2300;case this.InterpolantFactoryMethodLinear:return 2301;case this.InterpolantFactoryMethodSmooth:return 2302}},getValueSize:function(){return this.values.length/
-this.times.length},shift:function(a){if(0!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]+=a;return this},scale:function(a){if(1!==a)for(var b=this.times,c=0,d=b.length;c!==d;++c)b[c]*=a;return this},trim:function(a,b){for(var c=this.times,d=c.length,e=0,f=d-1;e!==d&&c[e]<a;)++e;for(;-1!==f&&c[f]>b;)--f;++f;if(0!==e||f!==d)e>=f&&(f=Math.max(f,1),e=f-1),a=this.getValueSize(),this.times=ia.arraySlice(c,e,f),this.values=ia.arraySlice(this.values,e*a,f*a);return this},validate:function(){var a=
-!0,b=this.getValueSize();0!==b-Math.floor(b)&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),a=!1);var c=this.times;b=this.values;var d=c.length;0===d&&(console.error("THREE.KeyframeTrack: Track is empty.",this),a=!1);for(var e=null,f=0;f!==d;f++){var g=c[f];if("number"===typeof g&&isNaN(g)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,f,g);a=!1;break}if(null!==e&&e>g){console.error("THREE.KeyframeTrack: Out of order keys.",this,f,g,e);a=!1;break}e=
-g}if(void 0!==b&&ia.isTypedArray(b))for(f=0,c=b.length;f!==c;++f)if(d=b[f],isNaN(d)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,f,d);a=!1;break}return a},optimize:function(){for(var a=this.times,b=this.values,c=this.getValueSize(),d=2302===this.getInterpolation(),e=1,f=a.length-1,g=1;g<f;++g){var h=!1,k=a[g];if(k!==a[g+1]&&(1!==g||k!==k[0]))if(d)h=!0;else{var m=g*c,l=m-c,n=m+c;for(k=0;k!==c;++k){var p=b[m+k];if(p!==b[l+k]||p!==b[n+k]){h=!0;break}}}if(h){if(g!==e)for(a[e]=
-a[g],h=g*c,m=e*c,k=0;k!==c;++k)b[m+k]=b[h+k];++e}}if(0<f){a[e]=a[f];h=f*c;m=e*c;for(k=0;k!==c;++k)b[m+k]=b[h+k];++e}e!==a.length&&(this.times=ia.arraySlice(a,0,e),this.values=ia.arraySlice(b,0,e*c));return this}});Gd.prototype=Object.assign(Object.create(oa.prototype),{constructor:Gd,ValueTypeName:"bool",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});Hd.prototype=Object.assign(Object.create(oa.prototype),{constructor:Hd,
-ValueTypeName:"color"});ec.prototype=Object.assign(Object.create(oa.prototype),{constructor:ec,ValueTypeName:"number"});Id.prototype=Object.assign(Object.create(wa.prototype),{constructor:Id,interpolate_:function(a,b,c,d){var e=this.resultBuffer,f=this.sampleValues,g=this.valueSize;a*=g;b=(c-b)/(d-b);for(c=a+g;a!==c;a+=4)fa.slerpFlat(e,0,f,a-g,f,a,b);return e}});cd.prototype=Object.assign(Object.create(oa.prototype),{constructor:cd,ValueTypeName:"quaternion",DefaultInterpolation:2301,InterpolantFactoryMethodLinear:function(a){return new Id(this.times,
-this.values,this.getValueSize(),a)},InterpolantFactoryMethodSmooth:void 0});Jd.prototype=Object.assign(Object.create(oa.prototype),{constructor:Jd,ValueTypeName:"string",ValueBufferType:Array,DefaultInterpolation:2300,InterpolantFactoryMethodLinear:void 0,InterpolantFactoryMethodSmooth:void 0});fc.prototype=Object.assign(Object.create(oa.prototype),{constructor:fc,ValueTypeName:"vector"});Object.assign(Ca,{parse:function(a){for(var b=[],c=a.tracks,d=1/(a.fps||1),e=0,f=c.length;e!==f;++e)b.push(Sg(c[e]).scale(d));
-return new Ca(a.name,a.duration,b)},toJSON:function(a){var b=[],c=a.tracks;a={name:a.name,duration:a.duration,tracks:b,uuid:a.uuid};for(var d=0,e=c.length;d!==e;++d)b.push(oa.toJSON(c[d]));return a},CreateFromMorphTargetSequence:function(a,b,c,d){for(var e=b.length,f=[],g=0;g<e;g++){var h=[],k=[];h.push((g+e-1)%e,g,(g+1)%e);k.push(0,1,0);var m=ia.getKeyframeOrder(h);h=ia.sortedArray(h,1,m);k=ia.sortedArray(k,1,m);d||0!==h[0]||(h.push(e),k.push(k[0]));f.push((new ec(".morphTargetInfluences["+b[g].name+
-"]",h,k)).scale(1/c))}return new Ca(a,-1,f)},findByName:function(a,b){var c=a;Array.isArray(a)||(c=a.geometry&&a.geometry.animations||a.animations);for(a=0;a<c.length;a++)if(c[a].name===b)return c[a];return null},CreateClipsFromMorphTargetSequences:function(a,b,c){for(var d={},e=/^([\w-]*?)([\d]+)$/,f=0,g=a.length;f<g;f++){var h=a[f],k=h.name.match(e);if(k&&1<k.length){var m=k[1];(k=d[m])||(d[m]=k=[]);k.push(h)}}a=[];for(m in d)a.push(Ca.CreateFromMorphTargetSequence(m,d[m],b,c));return a},parseAnimation:function(a,
-b){if(!a)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;var c=function(a,b,c,d,e){if(0!==c.length){var f=[],g=[];ia.flattenJSON(c,f,g,d);0!==f.length&&e.push(new a(b,f,g))}},d=[],e=a.name||"default",f=a.length||-1,g=a.fps||30;a=a.hierarchy||[];for(var h=0;h<a.length;h++){var k=a[h].keys;if(k&&0!==k.length)if(k[0].morphTargets){f={};for(var m=0;m<k.length;m++)if(k[m].morphTargets)for(var l=0;l<k[m].morphTargets.length;l++)f[k[m].morphTargets[l]]=-1;for(var n in f){var p=
-[],u=[];for(l=0;l!==k[m].morphTargets.length;++l){var r=k[m];p.push(r.time);u.push(r.morphTarget===n?1:0)}d.push(new ec(".morphTargetInfluence["+n+"]",p,u))}f=f.length*(g||1)}else m=".bones["+b[h].name+"]",c(fc,m+".position",k,"pos",d),c(cd,m+".quaternion",k,"rot",d),c(fc,m+".scale",k,"scl",d)}return 0===d.length?null:new Ca(e,f,d)}});Object.assign(Ca.prototype,{resetDuration:function(){for(var a=0,b=0,c=this.tracks.length;b!==c;++b){var d=this.tracks[b];a=Math.max(a,d.times[d.times.length-1])}this.duration=
-a;return this},trim:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].trim(0,this.duration);return this},validate:function(){for(var a=!0,b=0;b<this.tracks.length;b++)a=a&&this.tracks[b].validate();return a},optimize:function(){for(var a=0;a<this.tracks.length;a++)this.tracks[a].optimize();return this}});Object.assign(Kd.prototype,{load:function(a,b,c,d){var e=this;(new Ga(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},setTextures:function(a){this.textures=a},parse:function(a){function b(a){void 0===
-c[a]&&console.warn("THREE.MaterialLoader: Undefined texture",a);return c[a]}var c=this.textures,d=new Vg[a.type];void 0!==a.uuid&&(d.uuid=a.uuid);void 0!==a.name&&(d.name=a.name);void 0!==a.color&&d.color.setHex(a.color);void 0!==a.roughness&&(d.roughness=a.roughness);void 0!==a.metalness&&(d.metalness=a.metalness);void 0!==a.emissive&&d.emissive.setHex(a.emissive);void 0!==a.specular&&d.specular.setHex(a.specular);void 0!==a.shininess&&(d.shininess=a.shininess);void 0!==a.clearCoat&&(d.clearCoat=
-a.clearCoat);void 0!==a.clearCoatRoughness&&(d.clearCoatRoughness=a.clearCoatRoughness);void 0!==a.uniforms&&(d.uniforms=a.uniforms);void 0!==a.vertexShader&&(d.vertexShader=a.vertexShader);void 0!==a.fragmentShader&&(d.fragmentShader=a.fragmentShader);void 0!==a.vertexColors&&(d.vertexColors=a.vertexColors);void 0!==a.fog&&(d.fog=a.fog);void 0!==a.flatShading&&(d.flatShading=a.flatShading);void 0!==a.blending&&(d.blending=a.blending);void 0!==a.side&&(d.side=a.side);void 0!==a.opacity&&(d.opacity=
-a.opacity);void 0!==a.transparent&&(d.transparent=a.transparent);void 0!==a.alphaTest&&(d.alphaTest=a.alphaTest);void 0!==a.depthTest&&(d.depthTest=a.depthTest);void 0!==a.depthWrite&&(d.depthWrite=a.depthWrite);void 0!==a.colorWrite&&(d.colorWrite=a.colorWrite);void 0!==a.wireframe&&(d.wireframe=a.wireframe);void 0!==a.wireframeLinewidth&&(d.wireframeLinewidth=a.wireframeLinewidth);void 0!==a.wireframeLinecap&&(d.wireframeLinecap=a.wireframeLinecap);void 0!==a.wireframeLinejoin&&(d.wireframeLinejoin=
-a.wireframeLinejoin);void 0!==a.rotation&&(d.rotation=a.rotation);1!==a.linewidth&&(d.linewidth=a.linewidth);void 0!==a.dashSize&&(d.dashSize=a.dashSize);void 0!==a.gapSize&&(d.gapSize=a.gapSize);void 0!==a.scale&&(d.scale=a.scale);void 0!==a.polygonOffset&&(d.polygonOffset=a.polygonOffset);void 0!==a.polygonOffsetFactor&&(d.polygonOffsetFactor=a.polygonOffsetFactor);void 0!==a.polygonOffsetUnits&&(d.polygonOffsetUnits=a.polygonOffsetUnits);void 0!==a.skinning&&(d.skinning=a.skinning);void 0!==a.morphTargets&&
-(d.morphTargets=a.morphTargets);void 0!==a.dithering&&(d.dithering=a.dithering);void 0!==a.visible&&(d.visible=a.visible);void 0!==a.userData&&(d.userData=a.userData);void 0!==a.shading&&(d.flatShading=1===a.shading);void 0!==a.size&&(d.size=a.size);void 0!==a.sizeAttenuation&&(d.sizeAttenuation=a.sizeAttenuation);void 0!==a.map&&(d.map=b(a.map));void 0!==a.alphaMap&&(d.alphaMap=b(a.alphaMap),d.transparent=!0);void 0!==a.bumpMap&&(d.bumpMap=b(a.bumpMap));void 0!==a.bumpScale&&(d.bumpScale=a.bumpScale);
-void 0!==a.normalMap&&(d.normalMap=b(a.normalMap));void 0!==a.normalMapType&&(d.normalMapType=a.normalMapType);if(void 0!==a.normalScale){var e=a.normalScale;!1===Array.isArray(e)&&(e=[e,e]);d.normalScale=(new z).fromArray(e)}void 0!==a.displacementMap&&(d.displacementMap=b(a.displacementMap));void 0!==a.displacementScale&&(d.displacementScale=a.displacementScale);void 0!==a.displacementBias&&(d.displacementBias=a.displacementBias);void 0!==a.roughnessMap&&(d.roughnessMap=b(a.roughnessMap));void 0!==
-a.metalnessMap&&(d.metalnessMap=b(a.metalnessMap));void 0!==a.emissiveMap&&(d.emissiveMap=b(a.emissiveMap));void 0!==a.emissiveIntensity&&(d.emissiveIntensity=a.emissiveIntensity);void 0!==a.specularMap&&(d.specularMap=b(a.specularMap));void 0!==a.envMap&&(d.envMap=b(a.envMap));void 0!==a.reflectivity&&(d.reflectivity=a.reflectivity);void 0!==a.lightMap&&(d.lightMap=b(a.lightMap));void 0!==a.lightMapIntensity&&(d.lightMapIntensity=a.lightMapIntensity);void 0!==a.aoMap&&(d.aoMap=b(a.aoMap));void 0!==
-a.aoMapIntensity&&(d.aoMapIntensity=a.aoMapIntensity);void 0!==a.gradientMap&&(d.gradientMap=b(a.gradientMap));return d}});Object.assign(ge.prototype,{load:function(a,b,c,d){var e=this;(new Ga(e.manager)).load(a,function(a){b(e.parse(JSON.parse(a)))},c,d)},parse:function(a){var b=new C,c=a.data.index;void 0!==c&&(c=new Bf[c.type](c.array),b.setIndex(new Q(c,1)));var d=a.data.attributes;for(f in d){var e=d[f];c=new Bf[e.type](e.array);b.addAttribute(f,new Q(c,e.itemSize,e.normalized))}var f=a.data.groups||
-a.data.drawcalls||a.data.offsets;if(void 0!==f)for(c=0,d=f.length;c!==d;++c)e=f[c],b.addGroup(e.start,e.count,e.materialIndex);a=a.data.boundingSphere;void 0!==a&&(f=new p,void 0!==a.center&&f.fromArray(a.center),b.boundingSphere=new Da(f,a.radius));return b}});var Bf={Int8Array:Int8Array,Uint8Array:Uint8Array,Uint8ClampedArray:"undefined"!==typeof Uint8ClampedArray?Uint8ClampedArray:Uint8Array,Int16Array:Int16Array,Uint16Array:Uint16Array,Int32Array:Int32Array,Uint32Array:Uint32Array,Float32Array:Float32Array,
-Float64Array:Float64Array};gc.Handlers={handlers:[],add:function(a,b){this.handlers.push(a,b)},get:function(a){for(var b=this.handlers,c=0,d=b.length;c<d;c+=2){var e=b[c+1];if(b[c].test(a))return e}return null}};Object.assign(gc.prototype,{crossOrigin:"anonymous",onLoadStart:function(){},onLoadProgress:function(){},onLoadComplete:function(){},initMaterials:function(a,b,c){for(var d=[],e=0;e<a.length;++e)d[e]=this.createMaterial(a[e],b,c);return d},createMaterial:function(){var a={NoBlending:0,NormalBlending:1,
-AdditiveBlending:2,SubtractiveBlending:3,MultiplyBlending:4,CustomBlending:5},b=new G,c=new vd,d=new Kd;return function(e,f,g){function h(a,b,d,e,h){a=f+a;var m=gc.Handlers.get(a);null!==m?a=m.load(a):(c.setCrossOrigin(g),a=c.load(a));void 0!==b&&(a.repeat.fromArray(b),1!==b[0]&&(a.wrapS=1E3),1!==b[1]&&(a.wrapT=1E3));void 0!==d&&a.offset.fromArray(d);void 0!==e&&("repeat"===e[0]&&(a.wrapS=1E3),"mirror"===e[0]&&(a.wrapS=1002),"repeat"===e[1]&&(a.wrapT=1E3),"mirror"===e[1]&&(a.wrapT=1002));void 0!==
-h&&(a.anisotropy=h);b=H.generateUUID();k[b]=a;return b}var k={},m={uuid:H.generateUUID(),type:"MeshLambertMaterial"},l;for(l in e){var n=e[l];switch(l){case "DbgColor":case "DbgIndex":case "opticalDensity":case "illumination":break;case "DbgName":m.name=n;break;case "blending":m.blending=a[n];break;case "colorAmbient":case "mapAmbient":console.warn("THREE.Loader.createMaterial:",l,"is no longer supported.");break;case "colorDiffuse":m.color=b.fromArray(n).getHex();break;case "colorSpecular":m.specular=
-b.fromArray(n).getHex();break;case "colorEmissive":m.emissive=b.fromArray(n).getHex();break;case "specularCoef":m.shininess=n;break;case "shading":"basic"===n.toLowerCase()&&(m.type="MeshBasicMaterial");"phong"===n.toLowerCase()&&(m.type="MeshPhongMaterial");"standard"===n.toLowerCase()&&(m.type="MeshStandardMaterial");break;case "mapDiffuse":m.map=h(n,e.mapDiffuseRepeat,e.mapDiffuseOffset,e.mapDiffuseWrap,e.mapDiffuseAnisotropy);break;case "mapDiffuseRepeat":case "mapDiffuseOffset":case "mapDiffuseWrap":case "mapDiffuseAnisotropy":break;
-case "mapEmissive":m.emissiveMap=h(n,e.mapEmissiveRepeat,e.mapEmissiveOffset,e.mapEmissiveWrap,e.mapEmissiveAnisotropy);break;case "mapEmissiveRepeat":case "mapEmissiveOffset":case "mapEmissiveWrap":case "mapEmissiveAnisotropy":break;case "mapLight":m.lightMap=h(n,e.mapLightRepeat,e.mapLightOffset,e.mapLightWrap,e.mapLightAnisotropy);break;case "mapLightRepeat":case "mapLightOffset":case "mapLightWrap":case "mapLightAnisotropy":break;case "mapAO":m.aoMap=h(n,e.mapAORepeat,e.mapAOOffset,e.mapAOWrap,
-e.mapAOAnisotropy);break;case "mapAORepeat":case "mapAOOffset":case "mapAOWrap":case "mapAOAnisotropy":break;case "mapBump":m.bumpMap=h(n,e.mapBumpRepeat,e.mapBumpOffset,e.mapBumpWrap,e.mapBumpAnisotropy);break;case "mapBumpScale":m.bumpScale=n;break;case "mapBumpRepeat":case "mapBumpOffset":case "mapBumpWrap":case "mapBumpAnisotropy":break;case "mapNormal":m.normalMap=h(n,e.mapNormalRepeat,e.mapNormalOffset,e.mapNormalWrap,e.mapNormalAnisotropy);break;case "mapNormalFactor":m.normalScale=n;break;
-case "mapNormalRepeat":case "mapNormalOffset":case "mapNormalWrap":case "mapNormalAnisotropy":break;case "mapSpecular":m.specularMap=h(n,e.mapSpecularRepeat,e.mapSpecularOffset,e.mapSpecularWrap,e.mapSpecularAnisotropy);break;case "mapSpecularRepeat":case "mapSpecularOffset":case "mapSpecularWrap":case "mapSpecularAnisotropy":break;case "mapMetalness":m.metalnessMap=h(n,e.mapMetalnessRepeat,e.mapMetalnessOffset,e.mapMetalnessWrap,e.mapMetalnessAnisotropy);break;case "mapMetalnessRepeat":case "mapMetalnessOffset":case "mapMetalnessWrap":case "mapMetalnessAnisotropy":break;
-case "mapRoughness":m.roughnessMap=h(n,e.mapRoughnessRepeat,e.mapRoughnessOffset,e.mapRoughnessWrap,e.mapRoughnessAnisotropy);break;case "mapRoughnessRepeat":case "mapRoughnessOffset":case "mapRoughnessWrap":case "mapRoughnessAnisotropy":break;case "mapAlpha":m.alphaMap=h(n,e.mapAlphaRepeat,e.mapAlphaOffset,e.mapAlphaWrap,e.mapAlphaAnisotropy);break;case "mapAlphaRepeat":case "mapAlphaOffset":case "mapAlphaWrap":case "mapAlphaAnisotropy":break;case "flipSided":m.side=1;break;case "doubleSided":m.side=
-2;break;case "transparency":console.warn("THREE.Loader.createMaterial: transparency has been renamed to opacity");m.opacity=n;break;case "depthTest":case "depthWrite":case "colorWrite":case "opacity":case "reflectivity":case "transparent":case "visible":case "wireframe":m[l]=n;break;case "vertexColors":!0===n&&(m.vertexColors=2);"face"===n&&(m.vertexColors=1);break;default:console.error("THREE.Loader.createMaterial: Unsupported",l,n)}}"MeshBasicMaterial"===m.type&&delete m.emissive;"MeshPhongMaterial"!==
-m.type&&delete m.specular;1>m.opacity&&(m.transparent=!0);d.setTextures(k);return d.parse(m)}}()});var De={decodeText:function(a){if("undefined"!==typeof TextDecoder)return(new TextDecoder).decode(a);for(var b="",c=0,d=a.length;c<d;c++)b+=String.fromCharCode(a[c]);return decodeURIComponent(escape(b))},extractUrlBase:function(a){var b=a.lastIndexOf("/");return-1===b?"./":a.substr(0,b+1)}};Object.assign(he.prototype,{crossOrigin:"anonymous",load:function(a,b,c,d){var e=this,f=this.texturePath&&"string"===
-typeof this.texturePath?this.texturePath:De.extractUrlBase(a),g=new Ga(this.manager);g.setWithCredentials(this.withCredentials);g.load(a,function(c){c=JSON.parse(c);var d=c.metadata;if(void 0!==d&&(d=d.type,void 0!==d&&"object"===d.toLowerCase())){console.error("THREE.JSONLoader: "+a+" should be loaded with THREE.ObjectLoader instead.");return}c=e.parse(c,f);b(c.geometry,c.materials)},c,d)},setCrossOrigin:function(a){this.crossOrigin=a;return this},setTexturePath:function(a){this.texturePath=a;return this},
-parse:function(){return function(a,b){void 0!==a.data&&(a=a.data);a.scale=void 0!==a.scale?1/a.scale:1;var c=new R,d=a,e,f,g,h=d.faces;var k=d.vertices;var m=d.normals,l=d.colors;var n=d.scale;var t=0;if(void 0!==d.uvs){for(e=0;e<d.uvs.length;e++)d.uvs[e].length&&t++;for(e=0;e<t;e++)c.faceVertexUvs[e]=[]}var u=0;for(g=k.length;u<g;)e=new p,e.x=k[u++]*n,e.y=k[u++]*n,e.z=k[u++]*n,c.vertices.push(e);u=0;for(g=h.length;u<g;){k=h[u++];var r=k&1;var v=k&2;e=k&8;var y=k&16;var x=k&32;n=k&64;k&=128;if(r){r=
-new Ta;r.a=h[u];r.b=h[u+1];r.c=h[u+3];var w=new Ta;w.a=h[u+1];w.b=h[u+2];w.c=h[u+3];u+=4;v&&(v=h[u++],r.materialIndex=v,w.materialIndex=v);v=c.faces.length;if(e)for(e=0;e<t;e++){var B=d.uvs[e];c.faceVertexUvs[e][v]=[];c.faceVertexUvs[e][v+1]=[];for(f=0;4>f;f++){var E=h[u++];var A=B[2*E];E=B[2*E+1];A=new z(A,E);2!==f&&c.faceVertexUvs[e][v].push(A);0!==f&&c.faceVertexUvs[e][v+1].push(A)}}y&&(y=3*h[u++],r.normal.set(m[y++],m[y++],m[y]),w.normal.copy(r.normal));if(x)for(e=0;4>e;e++)y=3*h[u++],x=new p(m[y++],
-m[y++],m[y]),2!==e&&r.vertexNormals.push(x),0!==e&&w.vertexNormals.push(x);n&&(n=h[u++],n=l[n],r.color.setHex(n),w.color.setHex(n));if(k)for(e=0;4>e;e++)n=h[u++],n=l[n],2!==e&&r.vertexColors.push(new G(n)),0!==e&&w.vertexColors.push(new G(n));c.faces.push(r);c.faces.push(w)}else{r=new Ta;r.a=h[u++];r.b=h[u++];r.c=h[u++];v&&(v=h[u++],r.materialIndex=v);v=c.faces.length;if(e)for(e=0;e<t;e++)for(B=d.uvs[e],c.faceVertexUvs[e][v]=[],f=0;3>f;f++)E=h[u++],A=B[2*E],E=B[2*E+1],A=new z(A,E),c.faceVertexUvs[e][v].push(A);
-y&&(y=3*h[u++],r.normal.set(m[y++],m[y++],m[y]));if(x)for(e=0;3>e;e++)y=3*h[u++],x=new p(m[y++],m[y++],m[y]),r.vertexNormals.push(x);n&&(n=h[u++],r.color.setHex(l[n]));if(k)for(e=0;3>e;e++)n=h[u++],r.vertexColors.push(new G(l[n]));c.faces.push(r)}}d=a;u=void 0!==d.influencesPerVertex?d.influencesPerVertex:2;if(d.skinWeights)for(g=0,h=d.skinWeights.length;g<h;g+=u)c.skinWeights.push(new V(d.skinWeights[g],1<u?d.skinWeights[g+1]:0,2<u?d.skinWeights[g+2]:0,3<u?d.skinWeights[g+3]:0));if(d.skinIndices)for(g=
-0,h=d.skinIndices.length;g<h;g+=u)c.skinIndices.push(new V(d.skinIndices[g],1<u?d.skinIndices[g+1]:0,2<u?d.skinIndices[g+2]:0,3<u?d.skinIndices[g+3]:0));c.bones=d.bones;c.bones&&0<c.bones.length&&(c.skinWeights.length!==c.skinIndices.length||c.skinIndices.length!==c.vertices.length)&&console.warn("When skinning, number of vertices ("+c.vertices.length+"), skinIndices ("+c.skinIndices.length+"), and skinWeights ("+c.skinWeights.length+") should match.");g=a;h=g.scale;if(void 0!==g.morphTargets)for(d=
-0,u=g.morphTargets.length;d<u;d++)for(c.morphTargets[d]={},c.morphTargets[d].name=g.morphTargets[d].name,c.morphTargets[d].vertices=[],m=c.morphTargets[d].vertices,l=g.morphTargets[d].vertices,t=0,k=l.length;t<k;t+=3)n=new p,n.x=l[t]*h,n.y=l[t+1]*h,n.z=l[t+2]*h,m.push(n);if(void 0!==g.morphColors&&0<g.morphColors.length)for(console.warn('THREE.JSONLoader: "morphColors" no longer supported. Using them as face colors.'),h=c.faces,g=g.morphColors[0].colors,d=0,u=h.length;d<u;d++)h[d].color.fromArray(g,
-3*d);g=a;d=[];u=[];void 0!==g.animation&&u.push(g.animation);void 0!==g.animations&&(g.animations.length?u=u.concat(g.animations):u.push(g.animations));for(g=0;g<u.length;g++)(h=Ca.parseAnimation(u[g],c.bones))&&d.push(h);c.morphTargets&&(u=Ca.CreateClipsFromMorphTargetSequences(c.morphTargets,10),d=d.concat(u));0<d.length&&(c.animations=d);c.computeFaceNormals();c.computeBoundingSphere();if(void 0===a.materials||0===a.materials.length)return{geometry:c};a=gc.prototype.initMaterials(a.materials,b,
-this.crossOrigin);return{geometry:c,materials:a}}}()});Object.assign(mf.prototype,{crossOrigin:"anonymous",load:function(a,b,c,d){""===this.texturePath&&(this.texturePath=a.substring(0,a.lastIndexOf("/")+1));var e=this;(new Ga(e.manager)).load(a,function(c){var f=null;try{f=JSON.parse(c)}catch(h){void 0!==d&&d(h);console.error("THREE:ObjectLoader: Can't parse "+a+".",h.message);return}c=f.metadata;void 0===c||void 0===c.type||"geometry"===c.type.toLowerCase()?console.error("THREE.ObjectLoader: Can't load "+
-a+". Use THREE.JSONLoader instead."):e.parse(f,b)},c,d)},setTexturePath:function(a){this.texturePath=a;return this},setCrossOrigin:function(a){this.crossOrigin=a;return this},parse:function(a,b){var c=this.parseShape(a.shapes);c=this.parseGeometries(a.geometries,c);var d=this.parseImages(a.images,function(){void 0!==b&&b(e)});d=this.parseTextures(a.textures,d);d=this.parseMaterials(a.materials,d);var e=this.parseObject(a.object,c,d);a.animations&&(e.animations=this.parseAnimations(a.animations));
-void 0!==a.images&&0!==a.images.length||void 0===b||b(e);return e},parseShape:function(a){var b={};if(void 0!==a)for(var c=0,d=a.length;c<d;c++){var e=(new db).fromJSON(a[c]);b[e.uuid]=e}return b},parseGeometries:function(a,b){var c={};if(void 0!==a)for(var d=new he,e=new ge,f=0,g=a.length;f<g;f++){var h=a[f];switch(h.type){case "PlaneGeometry":case "PlaneBufferGeometry":var k=new xa[h.type](h.width,h.height,h.widthSegments,h.heightSegments);break;case "BoxGeometry":case "BoxBufferGeometry":case "CubeGeometry":k=
-new xa[h.type](h.width,h.height,h.depth,h.widthSegments,h.heightSegments,h.depthSegments);break;case "CircleGeometry":case "CircleBufferGeometry":k=new xa[h.type](h.radius,h.segments,h.thetaStart,h.thetaLength);break;case "CylinderGeometry":case "CylinderBufferGeometry":k=new xa[h.type](h.radiusTop,h.radiusBottom,h.height,h.radialSegments,h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "ConeGeometry":case "ConeBufferGeometry":k=new xa[h.type](h.radius,h.height,h.radialSegments,
-h.heightSegments,h.openEnded,h.thetaStart,h.thetaLength);break;case "SphereGeometry":case "SphereBufferGeometry":k=new xa[h.type](h.radius,h.widthSegments,h.heightSegments,h.phiStart,h.phiLength,h.thetaStart,h.thetaLength);break;case "DodecahedronGeometry":case "DodecahedronBufferGeometry":case "IcosahedronGeometry":case "IcosahedronBufferGeometry":case "OctahedronGeometry":case "OctahedronBufferGeometry":case "TetrahedronGeometry":case "TetrahedronBufferGeometry":k=new xa[h.type](h.radius,h.detail);
-break;case "RingGeometry":case "RingBufferGeometry":k=new xa[h.type](h.innerRadius,h.outerRadius,h.thetaSegments,h.phiSegments,h.thetaStart,h.thetaLength);break;case "TorusGeometry":case "TorusBufferGeometry":k=new xa[h.type](h.radius,h.tube,h.radialSegments,h.tubularSegments,h.arc);break;case "TorusKnotGeometry":case "TorusKnotBufferGeometry":k=new xa[h.type](h.radius,h.tube,h.tubularSegments,h.radialSegments,h.p,h.q);break;case "LatheGeometry":case "LatheBufferGeometry":k=new xa[h.type](h.points,
-h.segments,h.phiStart,h.phiLength);break;case "PolyhedronGeometry":case "PolyhedronBufferGeometry":k=new xa[h.type](h.vertices,h.indices,h.radius,h.details);break;case "ShapeGeometry":case "ShapeBufferGeometry":k=[];for(var m=0,l=h.shapes.length;m<l;m++){var n=b[h.shapes[m]];k.push(n)}k=new xa[h.type](k,h.curveSegments);break;case "ExtrudeGeometry":case "ExtrudeBufferGeometry":k=[];m=0;for(l=h.shapes.length;m<l;m++)n=b[h.shapes[m]],k.push(n);m=h.options.extrudePath;void 0!==m&&(h.options.extrudePath=
-(new Af[m.type]).fromJSON(m));k=new xa[h.type](k,h.options);break;case "BufferGeometry":k=e.parse(h);break;case "Geometry":k=d.parse(h,this.texturePath).geometry;break;default:console.warn('THREE.ObjectLoader: Unsupported geometry type "'+h.type+'"');continue}k.uuid=h.uuid;void 0!==h.name&&(k.name=h.name);!0===k.isBufferGeometry&&void 0!==h.userData&&(k.userData=h.userData);c[h.uuid]=k}return c},parseMaterials:function(a,b){var c={};if(void 0!==a){var d=new Kd;d.setTextures(b);b=0;for(var e=a.length;b<
-e;b++){var f=a[b];if("MultiMaterial"===f.type){for(var g=[],h=0;h<f.materials.length;h++)g.push(d.parse(f.materials[h]));c[f.uuid]=g}else c[f.uuid]=d.parse(f)}}return c},parseAnimations:function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=Ca.parse(d);void 0!==d.uuid&&(e.uuid=d.uuid);b.push(e)}return b},parseImages:function(a,b){function c(a){d.manager.itemStart(a);return f.load(a,function(){d.manager.itemEnd(a)},void 0,function(){d.manager.itemEnd(a);d.manager.itemError(a)})}var d=this,e={};
-if(void 0!==a&&0<a.length){b=new ce(b);var f=new Zc(b);f.setCrossOrigin(this.crossOrigin);b=0;for(var g=a.length;b<g;b++){var h=a[b],k=h.url;if(Array.isArray(k)){e[h.uuid]=[];for(var m=0,l=k.length;m<l;m++){var n=k[m];n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(n)?n:d.texturePath+n;e[h.uuid].push(c(n))}}else n=/^(\/\/)|([a-z]+:(\/\/)?)/i.test(h.url)?h.url:d.texturePath+h.url,e[h.uuid]=c(n)}}return e},parseTextures:function(a,b){function c(a,b){if("number"===typeof a)return a;console.warn("THREE.ObjectLoader.parseTexture: Constant should be in numeric form.",
-a);return b[a]}var d={};if(void 0!==a)for(var e=0,f=a.length;e<f;e++){var g=a[e];void 0===g.image&&console.warn('THREE.ObjectLoader: No "image" specified for',g.uuid);void 0===b[g.image]&&console.warn("THREE.ObjectLoader: Undefined image",g.image);var h=Array.isArray(b[g.image])?new Ua(b[g.image]):new T(b[g.image]);h.needsUpdate=!0;h.uuid=g.uuid;void 0!==g.name&&(h.name=g.name);void 0!==g.mapping&&(h.mapping=c(g.mapping,Wg));void 0!==g.offset&&h.offset.fromArray(g.offset);void 0!==g.repeat&&h.repeat.fromArray(g.repeat);
-void 0!==g.center&&h.center.fromArray(g.center);void 0!==g.rotation&&(h.rotation=g.rotation);void 0!==g.wrap&&(h.wrapS=c(g.wrap[0],Cf),h.wrapT=c(g.wrap[1],Cf));void 0!==g.format&&(h.format=g.format);void 0!==g.minFilter&&(h.minFilter=c(g.minFilter,Df));void 0!==g.magFilter&&(h.magFilter=c(g.magFilter,Df));void 0!==g.anisotropy&&(h.anisotropy=g.anisotropy);void 0!==g.flipY&&(h.flipY=g.flipY);d[g.uuid]=h}return d},parseObject:function(a,b,c){function d(a){void 0===b[a]&&console.warn("THREE.ObjectLoader: Undefined geometry",
-a);return b[a]}function e(a){if(void 0!==a){if(Array.isArray(a)){for(var b=[],d=0,e=a.length;d<e;d++){var f=a[d];void 0===c[f]&&console.warn("THREE.ObjectLoader: Undefined material",f);b.push(c[f])}return b}void 0===c[a]&&console.warn("THREE.ObjectLoader: Undefined material",a);return c[a]}}switch(a.type){case "Scene":var f=new qd;void 0!==a.background&&Number.isInteger(a.background)&&(f.background=new G(a.background));void 0!==a.fog&&("Fog"===a.fog.type?f.fog=new Mb(a.fog.color,a.fog.near,a.fog.far):
-"FogExp2"===a.fog.type&&(f.fog=new Lb(a.fog.color,a.fog.density)));break;case "PerspectiveCamera":f=new Z(a.fov,a.aspect,a.near,a.far);void 0!==a.focus&&(f.focus=a.focus);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.filmGauge&&(f.filmGauge=a.filmGauge);void 0!==a.filmOffset&&(f.filmOffset=a.filmOffset);void 0!==a.view&&(f.view=Object.assign({},a.view));break;case "OrthographicCamera":f=new Hb(a.left,a.right,a.top,a.bottom,a.near,a.far);void 0!==a.zoom&&(f.zoom=a.zoom);void 0!==a.view&&(f.view=Object.assign({},
-a.view));break;case "AmbientLight":f=new Cd(a.color,a.intensity);break;case "DirectionalLight":f=new Bd(a.color,a.intensity);break;case "PointLight":f=new zd(a.color,a.intensity,a.distance,a.decay);break;case "RectAreaLight":f=new Dd(a.color,a.intensity,a.width,a.height);break;case "SpotLight":f=new yd(a.color,a.intensity,a.distance,a.angle,a.penumbra,a.decay);break;case "HemisphereLight":f=new wd(a.color,a.groundColor,a.intensity);break;case "SkinnedMesh":console.warn("THREE.ObjectLoader.parseObject() does not support SkinnedMesh yet.");
-case "Mesh":f=d(a.geometry);var g=e(a.material);f=f.bones&&0<f.bones.length?new sd(f,g):new la(f,g);break;case "LOD":f=new Bc;break;case "Line":f=new sa(d(a.geometry),e(a.material),a.mode);break;case "LineLoop":f=new td(d(a.geometry),e(a.material));break;case "LineSegments":f=new W(d(a.geometry),e(a.material));break;case "PointCloud":case "Points":f=new Ob(d(a.geometry),e(a.material));break;case "Sprite":f=new Ac(e(a.material));break;case "Group":f=new Kb;break;default:f=new D}f.uuid=a.uuid;void 0!==
-a.name&&(f.name=a.name);void 0!==a.matrix?(f.matrix.fromArray(a.matrix),void 0!==a.matrixAutoUpdate&&(f.matrixAutoUpdate=a.matrixAutoUpdate),f.matrixAutoUpdate&&f.matrix.decompose(f.position,f.quaternion,f.scale)):(void 0!==a.position&&f.position.fromArray(a.position),void 0!==a.rotation&&f.rotation.fromArray(a.rotation),void 0!==a.quaternion&&f.quaternion.fromArray(a.quaternion),void 0!==a.scale&&f.scale.fromArray(a.scale));void 0!==a.castShadow&&(f.castShadow=a.castShadow);void 0!==a.receiveShadow&&
-(f.receiveShadow=a.receiveShadow);a.shadow&&(void 0!==a.shadow.bias&&(f.shadow.bias=a.shadow.bias),void 0!==a.shadow.radius&&(f.shadow.radius=a.shadow.radius),void 0!==a.shadow.mapSize&&f.shadow.mapSize.fromArray(a.shadow.mapSize),void 0!==a.shadow.camera&&(f.shadow.camera=this.parseObject(a.shadow.camera)));void 0!==a.visible&&(f.visible=a.visible);void 0!==a.frustumCulled&&(f.frustumCulled=a.frustumCulled);void 0!==a.renderOrder&&(f.renderOrder=a.renderOrder);void 0!==a.userData&&(f.userData=a.userData);
-void 0!==a.layers&&(f.layers.mask=a.layers);if(void 0!==a.children){g=a.children;for(var h=0;h<g.length;h++)f.add(this.parseObject(g[h],b,c))}if("LOD"===a.type)for(a=a.levels,g=0;g<a.length;g++){h=a[g];var k=f.getObjectByProperty("uuid",h.object);void 0!==k&&f.addLevel(k,h.distance)}return f}});var Wg={UVMapping:300,CubeReflectionMapping:301,CubeRefractionMapping:302,EquirectangularReflectionMapping:303,EquirectangularRefractionMapping:304,SphericalReflectionMapping:305,CubeUVReflectionMapping:306,
-CubeUVRefractionMapping:307},Cf={RepeatWrapping:1E3,ClampToEdgeWrapping:1001,MirroredRepeatWrapping:1002},Df={NearestFilter:1003,NearestMipMapNearestFilter:1004,NearestMipMapLinearFilter:1005,LinearFilter:1006,LinearMipMapNearestFilter:1007,LinearMipMapLinearFilter:1008};ie.prototype={constructor:ie,setOptions:function(a){this.options=a;return this},load:function(a,b,c,d){void 0===a&&(a="");void 0!==this.path&&(a=this.path+a);a=this.manager.resolveURL(a);var e=this,f=Fb.get(a);if(void 0!==f)return e.manager.itemStart(a),
-setTimeout(function(){b&&b(f);e.manager.itemEnd(a)},0),f;fetch(a).then(function(a){return a.blob()}).then(function(a){return createImageBitmap(a,e.options)}).then(function(c){Fb.add(a,c);b&&b(c);e.manager.itemEnd(a)}).catch(function(b){d&&d(b);e.manager.itemEnd(a);e.manager.itemError(a)})},setCrossOrigin:function(){return this},setPath:function(a){this.path=a;return this}};Object.assign(je.prototype,{moveTo:function(a,b){this.currentPath=new La;this.subPaths.push(this.currentPath);this.currentPath.moveTo(a,
-b)},lineTo:function(a,b){this.currentPath.lineTo(a,b)},quadraticCurveTo:function(a,b,c,d){this.currentPath.quadraticCurveTo(a,b,c,d)},bezierCurveTo:function(a,b,c,d,e,f){this.currentPath.bezierCurveTo(a,b,c,d,e,f)},splineThru:function(a){this.currentPath.splineThru(a)},toShapes:function(a,b){function c(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c],f=new db;f.curves=e.curves;b.push(f)}return b}function d(a,b){for(var c=b.length,d=!1,e=c-1,f=0;f<c;e=f++){var g=b[e],h=b[f],k=h.x-g.x,m=h.y-g.y;if(Math.abs(m)>
-Number.EPSILON){if(0>m&&(g=b[f],k=-k,h=b[e],m=-m),!(a.y<g.y||a.y>h.y))if(a.y===g.y){if(a.x===g.x)return!0}else{e=m*(a.x-g.x)-k*(a.y-g.y);if(0===e)return!0;0>e||(d=!d)}}else if(a.y===g.y&&(h.x<=a.x&&a.x<=g.x||g.x<=a.x&&a.x<=h.x))return!0}return d}var e=Va.isClockWise,f=this.subPaths;if(0===f.length)return[];if(!0===b)return c(f);b=[];if(1===f.length){var g=f[0];var h=new db;h.curves=g.curves;b.push(h);return b}var k=!e(f[0].getPoints());k=a?!k:k;h=[];var m=[],l=[],n=0;m[n]=void 0;l[n]=[];for(var p=
-0,u=f.length;p<u;p++){g=f[p];var r=g.getPoints();var v=e(r);(v=a?!v:v)?(!k&&m[n]&&n++,m[n]={s:new db,p:r},m[n].s.curves=g.curves,k&&n++,l[n]=[]):l[n].push({h:g,p:r[0]})}if(!m[0])return c(f);if(1<m.length){p=!1;a=[];e=0;for(f=m.length;e<f;e++)h[e]=[];e=0;for(f=m.length;e<f;e++)for(g=l[e],v=0;v<g.length;v++){k=g[v];n=!0;for(r=0;r<m.length;r++)d(k.p,m[r].p)&&(e!==r&&a.push({froms:e,tos:r,hole:v}),n?(n=!1,h[r].push(k)):p=!0);n&&h[e].push(k)}0<a.length&&(p||(l=h))}p=0;for(e=m.length;p<e;p++)for(h=m[p].s,
-b.push(h),a=l[p],f=0,g=a.length;f<g;f++)h.holes.push(a[f].h);return b}});Object.assign(ke.prototype,{isFont:!0,generateShapes:function(a,b){void 0===b&&(b=100);var c=[],d=b;b=this.data;var e=Array.from?Array.from(a):String(a).split("");d/=b.resolution;var f=(b.boundingBox.yMax-b.boundingBox.yMin+b.underlineThickness)*d;a=[];for(var g=0,h=0,k=0;k<e.length;k++){var m=e[k];if("\n"===m)g=0,h-=f;else{var l=d;var n=g,p=h;if(m=b.glyphs[m]||b.glyphs["?"]){var u=new je;if(m.o)for(var r=m._cachedOutline||(m._cachedOutline=
-m.o.split(" ")),v=0,y=r.length;v<y;)switch(r[v++]){case "m":var x=r[v++]*l+n;var w=r[v++]*l+p;u.moveTo(x,w);break;case "l":x=r[v++]*l+n;w=r[v++]*l+p;u.lineTo(x,w);break;case "q":var z=r[v++]*l+n;var A=r[v++]*l+p;var C=r[v++]*l+n;var D=r[v++]*l+p;u.quadraticCurveTo(C,D,z,A);break;case "b":z=r[v++]*l+n,A=r[v++]*l+p,C=r[v++]*l+n,D=r[v++]*l+p,x=r[v++]*l+n,w=r[v++]*l+p,u.bezierCurveTo(C,D,x,w,z,A)}l={offsetX:m.ha*l,path:u}}else l=void 0;g+=l.offsetX;a.push(l.path)}}b=0;for(e=a.length;b<e;b++)Array.prototype.push.apply(c,
-a[b].toShapes());return c}});Object.assign(nf.prototype,{load:function(a,b,c,d){var e=this,f=new Ga(this.manager);f.setPath(this.path);f.load(a,function(a){try{var c=JSON.parse(a)}catch(k){console.warn("THREE.FontLoader: typeface.js support is being deprecated. Use typeface.json instead."),c=JSON.parse(a.substring(65,a.length-2))}a=e.parse(c);b&&b(a)},c,d)},parse:function(a){return new ke(a)},setPath:function(a){this.path=a;return this}});var Pd,ne={getContext:function(){void 0===Pd&&(Pd=new (window.AudioContext||
-window.webkitAudioContext));return Pd},setContext:function(a){Pd=a}};Object.assign(le.prototype,{load:function(a,b,c,d){var e=new Ga(this.manager);e.setResponseType("arraybuffer");e.load(a,function(a){a=a.slice(0);ne.getContext().decodeAudioData(a,function(a){b(a)})},c,d)}});Object.assign(of.prototype,{update:function(){var a,b,c,d,e,f,g,h,k=new I,l=new I;return function(m){if(a!==this||b!==m.focus||c!==m.fov||d!==m.aspect*this.aspect||e!==m.near||f!==m.far||g!==m.zoom||h!==this.eyeSep){a=this;b=
-m.focus;c=m.fov;d=m.aspect*this.aspect;e=m.near;f=m.far;g=m.zoom;var n=m.projectionMatrix.clone();h=this.eyeSep/2;var p=h*e/b,q=e*Math.tan(H.DEG2RAD*c*.5)/g;l.elements[12]=-h;k.elements[12]=h;var r=-q*d+p;var v=q*d+p;n.elements[0]=2*e/(v-r);n.elements[8]=(v+r)/(v-r);this.cameraL.projectionMatrix.copy(n);r=-q*d-p;v=q*d-p;n.elements[0]=2*e/(v-r);n.elements[8]=(v+r)/(v-r);this.cameraR.projectionMatrix.copy(n)}this.cameraL.matrixWorld.copy(m.matrixWorld).multiply(l);this.cameraR.matrixWorld.copy(m.matrixWorld).multiply(k)}}()});
-dd.prototype=Object.create(D.prototype);dd.prototype.constructor=dd;me.prototype=Object.assign(Object.create(D.prototype),{constructor:me,getInput:function(){return this.gain},removeFilter:function(){null!==this.filter&&(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination),this.gain.connect(this.context.destination),this.filter=null);return this},getFilter:function(){return this.filter},setFilter:function(a){null!==this.filter?(this.gain.disconnect(this.filter),this.filter.disconnect(this.context.destination)):
-this.gain.disconnect(this.context.destination);this.filter=a;this.gain.connect(this.filter);this.filter.connect(this.context.destination);return this},getMasterVolume:function(){return this.gain.gain.value},setMasterVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this},updateMatrixWorld:function(){var a=new p,b=new fa,c=new p,d=new p;return function(e){D.prototype.updateMatrixWorld.call(this,e);e=this.context.listener;var f=this.up;this.matrixWorld.decompose(a,
-b,c);d.set(0,0,-1).applyQuaternion(b);e.positionX?(e.positionX.setValueAtTime(a.x,this.context.currentTime),e.positionY.setValueAtTime(a.y,this.context.currentTime),e.positionZ.setValueAtTime(a.z,this.context.currentTime),e.forwardX.setValueAtTime(d.x,this.context.currentTime),e.forwardY.setValueAtTime(d.y,this.context.currentTime),e.forwardZ.setValueAtTime(d.z,this.context.currentTime),e.upX.setValueAtTime(f.x,this.context.currentTime),e.upY.setValueAtTime(f.y,this.context.currentTime),e.upZ.setValueAtTime(f.z,
-this.context.currentTime)):(e.setPosition(a.x,a.y,a.z),e.setOrientation(d.x,d.y,d.z,f.x,f.y,f.z))}}()});hc.prototype=Object.assign(Object.create(D.prototype),{constructor:hc,getOutput:function(){return this.gain},setNodeSource:function(a){this.hasPlaybackControl=!1;this.sourceType="audioNode";this.source=a;this.connect();return this},setMediaElementSource:function(a){this.hasPlaybackControl=!1;this.sourceType="mediaNode";this.source=this.context.createMediaElementSource(a);this.connect();return this},
-setBuffer:function(a){this.buffer=a;this.sourceType="buffer";this.autoplay&&this.play();return this},play:function(){if(!0===this.isPlaying)console.warn("THREE.Audio: Audio is already playing.");else if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else{var a=this.context.createBufferSource();a.buffer=this.buffer;a.loop=this.loop;a.onended=this.onEnded.bind(this);a.playbackRate.setValueAtTime(this.playbackRate,this.startTime);this.startTime=this.context.currentTime;
-a.start(this.startTime,this.offset);this.isPlaying=!0;this.source=a;return this.connect()}},pause:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return!0===this.isPlaying&&(this.source.stop(),this.source.onended=null,this.offset+=(this.context.currentTime-this.startTime)*this.playbackRate,this.isPlaying=!1),this},stop:function(){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.source.stop(),
-this.source.onended=null,this.offset=0,this.isPlaying=!1,this},connect:function(){if(0<this.filters.length){this.source.connect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].connect(this.filters[a]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this},disconnect:function(){if(0<this.filters.length){this.source.disconnect(this.filters[0]);for(var a=1,b=this.filters.length;a<b;a++)this.filters[a-1].disconnect(this.filters[a]);
-this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this},getFilters:function(){return this.filters},setFilters:function(a){a||(a=[]);!0===this.isPlaying?(this.disconnect(),this.filters=a,this.connect()):this.filters=a;return this},getFilter:function(){return this.getFilters()[0]},setFilter:function(a){return this.setFilters(a?[a]:[])},setPlaybackRate:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");
-else return this.playbackRate=a,!0===this.isPlaying&&this.source.playbackRate.setValueAtTime(this.playbackRate,this.context.currentTime),this},getPlaybackRate:function(){return this.playbackRate},onEnded:function(){this.isPlaying=!1},getLoop:function(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop},setLoop:function(a){if(!1===this.hasPlaybackControl)console.warn("THREE.Audio: this Audio has no playback control.");else return this.loop=
-a,!0===this.isPlaying&&(this.source.loop=this.loop),this},getVolume:function(){return this.gain.gain.value},setVolume:function(a){this.gain.gain.setTargetAtTime(a,this.context.currentTime,.01);return this}});oe.prototype=Object.assign(Object.create(hc.prototype),{constructor:oe,getOutput:function(){return this.panner},getRefDistance:function(){return this.panner.refDistance},setRefDistance:function(a){this.panner.refDistance=a;return this},getRolloffFactor:function(){return this.panner.rolloffFactor},
-setRolloffFactor:function(a){this.panner.rolloffFactor=a;return this},getDistanceModel:function(){return this.panner.distanceModel},setDistanceModel:function(a){this.panner.distanceModel=a;return this},getMaxDistance:function(){return this.panner.maxDistance},setMaxDistance:function(a){this.panner.maxDistance=a;return this},setDirectionalCone:function(a,b,c){this.panner.coneInnerAngle=a;this.panner.coneOuterAngle=b;this.panner.coneOuterGain=c;return this},updateMatrixWorld:function(){var a=new p,
-b=new fa,c=new p,d=new p;return function(e){D.prototype.updateMatrixWorld.call(this,e);e=this.panner;this.matrixWorld.decompose(a,b,c);d.set(0,0,1).applyQuaternion(b);e.setPosition(a.x,a.y,a.z);e.setOrientation(d.x,d.y,d.z)}}()});Object.assign(pe.prototype,{getFrequencyData:function(){this.analyser.getByteFrequencyData(this.data);return this.data},getAverageFrequency:function(){for(var a=0,b=this.getFrequencyData(),c=0;c<b.length;c++)a+=b[c];return a/b.length}});Object.assign(qe.prototype,{accumulate:function(a,
-b){var c=this.buffer,d=this.valueSize;a=a*d+d;var e=this.cumulativeWeight;if(0===e){for(e=0;e!==d;++e)c[a+e]=c[e];e=b}else e+=b,this._mixBufferRegion(c,a,0,b/e,d);this.cumulativeWeight=e},apply:function(a){var b=this.valueSize,c=this.buffer;a=a*b+b;var d=this.cumulativeWeight,e=this.binding;this.cumulativeWeight=0;1>d&&this._mixBufferRegion(c,a,3*b,1-d,b);d=b;for(var f=b+b;d!==f;++d)if(c[d]!==c[d+b]){e.setValue(c,a);break}},saveOriginalState:function(){var a=this.buffer,b=this.valueSize,c=3*b;this.binding.getValue(a,
-c);for(var d=b;d!==c;++d)a[d]=a[c+d%b];this.cumulativeWeight=0},restoreOriginalState:function(){this.binding.setValue(this.buffer,3*this.valueSize)},_select:function(a,b,c,d,e){if(.5<=d)for(d=0;d!==e;++d)a[b+d]=a[c+d]},_slerp:function(a,b,c,d){fa.slerpFlat(a,b,a,b,a,c,d)},_lerp:function(a,b,c,d,e){for(var f=1-d,g=0;g!==e;++g){var h=b+g;a[h]=a[h]*f+a[c+g]*d}}});Object.assign(pf.prototype,{getValue:function(a,b){this.bind();var c=this._bindings[this._targetGroup.nCachedObjects_];void 0!==c&&c.getValue(a,
-b)},setValue:function(a,b){for(var c=this._bindings,d=this._targetGroup.nCachedObjects_,e=c.length;d!==e;++d)c[d].setValue(a,b)},bind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].bind()},unbind:function(){for(var a=this._bindings,b=this._targetGroup.nCachedObjects_,c=a.length;b!==c;++b)a[b].unbind()}});Object.assign(pa,{Composite:pf,create:function(a,b,c){return a&&a.isAnimationObjectGroup?new pa.Composite(a,b,c):new pa(a,b,c)},sanitizeNodeName:function(){var a=
-/[\[\]\.:\/]/g;return function(b){return b.replace(/\s/g,"_").replace(a,"")}}(),parseTrackName:function(){var a="[^"+"\\[\\]\\.:\\/".replace("\\.","")+"]",b=/((?:WC+[\/:])*)/.source.replace("WC","[^\\[\\]\\.:\\/]");a=/(WCOD+)?/.source.replace("WCOD",a);var c=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC","[^\\[\\]\\.:\\/]"),d=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC","[^\\[\\]\\.:\\/]"),e=new RegExp("^"+b+a+c+d+"$"),f=["material","materials","bones"];return function(a){var b=e.exec(a);if(!b)throw Error("PropertyBinding: Cannot parse trackName: "+
-a);b={nodeName:b[2],objectName:b[3],objectIndex:b[4],propertyName:b[5],propertyIndex:b[6]};var c=b.nodeName&&b.nodeName.lastIndexOf(".");if(void 0!==c&&-1!==c){var d=b.nodeName.substring(c+1);-1!==f.indexOf(d)&&(b.nodeName=b.nodeName.substring(0,c),b.objectName=d)}if(null===b.propertyName||0===b.propertyName.length)throw Error("PropertyBinding: can not parse propertyName from trackName: "+a);return b}}(),findNode:function(a,b){if(!b||""===b||"root"===b||"."===b||-1===b||b===a.name||b===a.uuid)return a;
-if(a.skeleton){var c=a.skeleton.getBoneByName(b);if(void 0!==c)return c}if(a.children){var d=function(a){for(var c=0;c<a.length;c++){var e=a[c];if(e.name===b||e.uuid===b||(e=d(e.children)))return e}return null};if(a=d(a.children))return a}return null}});Object.assign(pa.prototype,{_getValue_unavailable:function(){},_setValue_unavailable:function(){},BindingType:{Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},Versioning:{None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},GetterByBindingType:[function(a,
-b){a[b]=this.node[this.propertyName]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)a[b++]=c[d]},function(a,b){a[b]=this.resolvedProperty[this.propertyIndex]},function(a,b){this.resolvedProperty.toArray(a,b)}],SetterByBindingTypeAndVersioning:[[function(a,b){this.targetObject[this.propertyName]=a[b]},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.needsUpdate=!0},function(a,b){this.targetObject[this.propertyName]=a[b];this.targetObject.matrixWorldNeedsUpdate=
-!0}],[function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++]},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.needsUpdate=!0},function(a,b){for(var c=this.resolvedProperty,d=0,e=c.length;d!==e;++d)c[d]=a[b++];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty[this.propertyIndex]=a[b]},function(a,b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.needsUpdate=!0},function(a,
-b){this.resolvedProperty[this.propertyIndex]=a[b];this.targetObject.matrixWorldNeedsUpdate=!0}],[function(a,b){this.resolvedProperty.fromArray(a,b)},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.needsUpdate=!0},function(a,b){this.resolvedProperty.fromArray(a,b);this.targetObject.matrixWorldNeedsUpdate=!0}]],getValue:function(a,b){this.bind();this.getValue(a,b)},setValue:function(a,b){this.bind();this.setValue(a,b)},bind:function(){var a=this.node,b=this.parsedPath,c=b.objectName,
-d=b.propertyName,e=b.propertyIndex;a||(this.node=a=pa.findNode(this.rootNode,b.nodeName)||this.rootNode);this.getValue=this._getValue_unavailable;this.setValue=this._setValue_unavailable;if(a){if(c){var f=b.objectIndex;switch(c){case "materials":if(!a.material){console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);return}if(!a.material.materials){console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",
-this);return}a=a.material.materials;break;case "bones":if(!a.skeleton){console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);return}a=a.skeleton.bones;for(c=0;c<a.length;c++)if(a[c].name===f){f=c;break}break;default:if(void 0===a[c]){console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);return}a=a[c]}if(void 0!==f){if(void 0===a[f]){console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",
-this,a);return}a=a[f]}}f=a[d];if(void 0===f)console.error("THREE.PropertyBinding: Trying to update property for track: "+b.nodeName+"."+d+" but it wasn't found.",a);else{b=this.Versioning.None;void 0!==a.needsUpdate?(b=this.Versioning.NeedsUpdate,this.targetObject=a):void 0!==a.matrixWorldNeedsUpdate&&(b=this.Versioning.MatrixWorldNeedsUpdate,this.targetObject=a);c=this.BindingType.Direct;if(void 0!==e){if("morphTargetInfluences"===d){if(!a.geometry){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",
-this);return}if(a.geometry.isBufferGeometry){if(!a.geometry.morphAttributes){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);return}for(c=0;c<this.node.geometry.morphAttributes.position.length;c++)if(a.geometry.morphAttributes.position[c].name===e){e=c;break}}else{if(!a.geometry.morphTargets){console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphTargets.",
-this);return}for(c=0;c<this.node.geometry.morphTargets.length;c++)if(a.geometry.morphTargets[c].name===e){e=c;break}}}c=this.BindingType.ArrayElement;this.resolvedProperty=f;this.propertyIndex=e}else void 0!==f.fromArray&&void 0!==f.toArray?(c=this.BindingType.HasFromToArray,this.resolvedProperty=f):Array.isArray(f)?(c=this.BindingType.EntireArray,this.resolvedProperty=f):this.propertyName=d;this.getValue=this.GetterByBindingType[c];this.setValue=this.SetterByBindingTypeAndVersioning[c][b]}}else console.error("THREE.PropertyBinding: Trying to update node for track: "+
-this.path+" but it wasn't found.")},unbind:function(){this.node=null;this.getValue=this._getValue_unbound;this.setValue=this._setValue_unbound}});Object.assign(pa.prototype,{_getValue_unbound:pa.prototype.getValue,_setValue_unbound:pa.prototype.setValue});Object.assign(qf.prototype,{isAnimationObjectGroup:!0,add:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._paths,f=this._parsedPaths,g=this._bindings,h=g.length,k=void 0,l=0,p=arguments.length;l!==
-p;++l){var n=arguments[l],t=n.uuid,u=d[t];if(void 0===u){u=b++;d[t]=u;a.push(n);t=0;for(var r=h;t!==r;++t)g[t].push(new pa(n,e[t],f[t]))}else if(u<c){k=a[u];var v=--c;r=a[v];d[r.uuid]=u;a[u]=r;d[t]=v;a[v]=n;t=0;for(r=h;t!==r;++t){var y=g[t],x=y[u];y[u]=y[v];void 0===x&&(x=new pa(n,e[t],f[t]));y[v]=x}}else a[u]!==k&&console.error("THREE.AnimationObjectGroup: Different objects with the same UUID detected. Clean the caches or recreate your infrastructure when reloading scenes.")}this.nCachedObjects_=
-c},remove:function(){for(var a=this._objects,b=this.nCachedObjects_,c=this._indicesByUUID,d=this._bindings,e=d.length,f=0,g=arguments.length;f!==g;++f){var h=arguments[f],k=h.uuid,l=c[k];if(void 0!==l&&l>=b){var p=b++,n=a[p];c[n.uuid]=l;a[l]=n;c[k]=p;a[p]=h;h=0;for(k=e;h!==k;++h){n=d[h];var t=n[l];n[l]=n[p];n[p]=t}}}this.nCachedObjects_=b},uncache:function(){for(var a=this._objects,b=a.length,c=this.nCachedObjects_,d=this._indicesByUUID,e=this._bindings,f=e.length,g=0,h=arguments.length;g!==h;++g){var k=
-arguments[g].uuid,l=d[k];if(void 0!==l)if(delete d[k],l<c){k=--c;var p=a[k],n=--b,t=a[n];d[p.uuid]=l;a[l]=p;d[t.uuid]=k;a[k]=t;a.pop();p=0;for(t=f;p!==t;++p){var u=e[p],r=u[n];u[l]=u[k];u[k]=r;u.pop()}}else for(n=--b,t=a[n],d[t.uuid]=l,a[l]=t,a.pop(),p=0,t=f;p!==t;++p)u=e[p],u[l]=u[n],u.pop()}this.nCachedObjects_=c},subscribe_:function(a,b){var c=this._bindingsIndicesByPath,d=c[a],e=this._bindings;if(void 0!==d)return e[d];var f=this._paths,g=this._parsedPaths,h=this._objects,k=this.nCachedObjects_,
-l=Array(h.length);d=e.length;c[a]=d;f.push(a);g.push(b);e.push(l);c=k;for(d=h.length;c!==d;++c)l[c]=new pa(h[c],a,b);return l},unsubscribe_:function(a){var b=this._bindingsIndicesByPath,c=b[a];if(void 0!==c){var d=this._paths,e=this._parsedPaths,f=this._bindings,g=f.length-1,h=f[g];b[a[g]]=c;f[c]=h;f.pop();e[c]=e[g];e.pop();d[c]=d[g];d.pop()}}});Object.assign(rf.prototype,{play:function(){this._mixer._activateAction(this);return this},stop:function(){this._mixer._deactivateAction(this);return this.reset()},
-reset:function(){this.paused=!1;this.enabled=!0;this.time=0;this._loopCount=-1;this._startTime=null;return this.stopFading().stopWarping()},isRunning:function(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)},isScheduled:function(){return this._mixer._isActiveAction(this)},startAt:function(a){this._startTime=a;return this},setLoop:function(a,b){this.loop=a;this.repetitions=b;return this},setEffectiveWeight:function(a){this.weight=a;
-this._effectiveWeight=this.enabled?a:0;return this.stopFading()},getEffectiveWeight:function(){return this._effectiveWeight},fadeIn:function(a){return this._scheduleFading(a,0,1)},fadeOut:function(a){return this._scheduleFading(a,1,0)},crossFadeFrom:function(a,b,c){a.fadeOut(b);this.fadeIn(b);if(c){c=this._clip.duration;var d=a._clip.duration,e=c/d;a.warp(1,d/c,b);this.warp(e,1,b)}return this},crossFadeTo:function(a,b,c){return a.crossFadeFrom(this,b,c)},stopFading:function(){var a=this._weightInterpolant;
-null!==a&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},setEffectiveTimeScale:function(a){this.timeScale=a;this._effectiveTimeScale=this.paused?0:a;return this.stopWarping()},getEffectiveTimeScale:function(){return this._effectiveTimeScale},setDuration:function(a){this.timeScale=this._clip.duration/a;return this.stopWarping()},syncWith:function(a){this.time=a.time;this.timeScale=a.timeScale;return this.stopWarping()},halt:function(a){return this.warp(this._effectiveTimeScale,
-0,a)},warp:function(a,b,c){var d=this._mixer,e=d.time,f=this._timeScaleInterpolant,g=this.timeScale;null===f&&(this._timeScaleInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;d[1]=e+c;f[0]=a/g;f[1]=b/g;return this},stopWarping:function(){var a=this._timeScaleInterpolant;null!==a&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(a));return this},getMixer:function(){return this._mixer},getClip:function(){return this._clip},getRoot:function(){return this._localRoot||
-this._mixer._root},_update:function(a,b,c,d){if(this.enabled){var e=this._startTime;if(null!==e){b=(a-e)*c;if(0>b||0===c)return;this._startTime=null;b*=c}b*=this._updateTimeScale(a);c=this._updateTime(b);a=this._updateWeight(a);if(0<a){b=this._interpolants;e=this._propertyBindings;for(var f=0,g=b.length;f!==g;++f)b[f].evaluate(c),e[f].accumulate(d,a)}}else this._updateWeight(a)},_updateWeight:function(a){var b=0;if(this.enabled){b=this.weight;var c=this._weightInterpolant;if(null!==c){var d=c.evaluate(a)[0];
-b*=d;a>c.parameterPositions[1]&&(this.stopFading(),0===d&&(this.enabled=!1))}}return this._effectiveWeight=b},_updateTimeScale:function(a){var b=0;if(!this.paused){b=this.timeScale;var c=this._timeScaleInterpolant;if(null!==c){var d=c.evaluate(a)[0];b*=d;a>c.parameterPositions[1]&&(this.stopWarping(),0===b?this.paused=!0:this.timeScale=b)}}return this._effectiveTimeScale=b},_updateTime:function(a){var b=this.time+a,c=this._clip.duration,d=this.loop,e=this._loopCount,f=2202===d;if(0===a)return-1===
-e?b:f&&1===(e&1)?c-b:b;if(2200===d)a:{if(-1===e&&(this._loopCount=0,this._setEndings(!0,!0,!1)),b>=c)b=c;else if(0>b)b=0;else break a;this.clampWhenFinished?this.paused=!0:this.enabled=!1;this._mixer.dispatchEvent({type:"finished",action:this,direction:0>a?-1:1})}else{-1===e&&(0<=a?(e=0,this._setEndings(!0,0===this.repetitions,f)):this._setEndings(0===this.repetitions,!0,f));if(b>=c||0>b){d=Math.floor(b/c);b-=c*d;e+=Math.abs(d);var g=this.repetitions-e;0>=g?(this.clampWhenFinished?this.paused=!0:
-this.enabled=!1,b=0<a?c:0,this._mixer.dispatchEvent({type:"finished",action:this,direction:0<a?1:-1})):(1===g?(a=0>a,this._setEndings(a,!a,f)):this._setEndings(!1,!1,f),this._loopCount=e,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:d}))}if(f&&1===(e&1))return this.time=b,c-b}return this.time=b},_setEndings:function(a,b,c){var d=this._interpolantSettings;c?(d.endingStart=2401,d.endingEnd=2401):(d.endingStart=a?this.zeroSlopeAtStart?2401:2400:2402,d.endingEnd=b?this.zeroSlopeAtEnd?2401:
-2400:2402)},_scheduleFading:function(a,b,c){var d=this._mixer,e=d.time,f=this._weightInterpolant;null===f&&(this._weightInterpolant=f=d._lendControlInterpolant());d=f.parameterPositions;f=f.sampleValues;d[0]=e;f[0]=b;d[1]=e+a;f[1]=c;return this}});re.prototype=Object.assign(Object.create(ya.prototype),{constructor:re,_bindAction:function(a,b){var c=a._localRoot||this._root,d=a._clip.tracks,e=d.length,f=a._propertyBindings;a=a._interpolants;var g=c.uuid,h=this._bindingsByRootAndName,k=h[g];void 0===
-k&&(k={},h[g]=k);for(h=0;h!==e;++h){var l=d[h],p=l.name,n=k[p];if(void 0===n){n=f[h];if(void 0!==n){null===n._cacheIndex&&(++n.referenceCount,this._addInactiveBinding(n,g,p));continue}n=new qe(pa.create(c,p,b&&b._propertyBindings[h].binding.parsedPath),l.ValueTypeName,l.getValueSize());++n.referenceCount;this._addInactiveBinding(n,g,p)}f[h]=n;a[h].resultBuffer=n.buffer}},_activateAction:function(a){if(!this._isActiveAction(a)){if(null===a._cacheIndex){var b=(a._localRoot||this._root).uuid,c=a._clip.uuid,
-d=this._actionsByClip[c];this._bindAction(a,d&&d.knownActions[0]);this._addInactiveAction(a,c,b)}b=a._propertyBindings;c=0;for(d=b.length;c!==d;++c){var e=b[c];0===e.useCount++&&(this._lendBinding(e),e.saveOriginalState())}this._lendAction(a)}},_deactivateAction:function(a){if(this._isActiveAction(a)){for(var b=a._propertyBindings,c=0,d=b.length;c!==d;++c){var e=b[c];0===--e.useCount&&(e.restoreOriginalState(),this._takeBackBinding(e))}this._takeBackAction(a)}},_initMemoryManager:function(){this._actions=
-[];this._nActiveActions=0;this._actionsByClip={};this._bindings=[];this._nActiveBindings=0;this._bindingsByRootAndName={};this._controlInterpolants=[];this._nActiveControlInterpolants=0;var a=this;this.stats={actions:{get total(){return a._actions.length},get inUse(){return a._nActiveActions}},bindings:{get total(){return a._bindings.length},get inUse(){return a._nActiveBindings}},controlInterpolants:{get total(){return a._controlInterpolants.length},get inUse(){return a._nActiveControlInterpolants}}}},
-_isActiveAction:function(a){a=a._cacheIndex;return null!==a&&a<this._nActiveActions},_addInactiveAction:function(a,b,c){var d=this._actions,e=this._actionsByClip,f=e[b];void 0===f?(f={knownActions:[a],actionByRoot:{}},a._byClipCacheIndex=0,e[b]=f):(b=f.knownActions,a._byClipCacheIndex=b.length,b.push(a));a._cacheIndex=d.length;d.push(a);f.actionByRoot[c]=a},_removeInactiveAction:function(a){var b=this._actions,c=b[b.length-1],d=a._cacheIndex;c._cacheIndex=d;b[d]=c;b.pop();a._cacheIndex=null;b=a._clip.uuid;
-c=this._actionsByClip;d=c[b];var e=d.knownActions,f=e[e.length-1],g=a._byClipCacheIndex;f._byClipCacheIndex=g;e[g]=f;e.pop();a._byClipCacheIndex=null;delete d.actionByRoot[(a._localRoot||this._root).uuid];0===e.length&&delete c[b];this._removeInactiveBindingsForAction(a)},_removeInactiveBindingsForAction:function(a){a=a._propertyBindings;for(var b=0,c=a.length;b!==c;++b){var d=a[b];0===--d.referenceCount&&this._removeInactiveBinding(d)}},_lendAction:function(a){var b=this._actions,c=a._cacheIndex,
-d=this._nActiveActions++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackAction:function(a){var b=this._actions,c=a._cacheIndex,d=--this._nActiveActions,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_addInactiveBinding:function(a,b,c){var d=this._bindingsByRootAndName,e=d[b],f=this._bindings;void 0===e&&(e={},d[b]=e);e[c]=a;a._cacheIndex=f.length;f.push(a)},_removeInactiveBinding:function(a){var b=this._bindings,c=a.binding,d=c.rootNode.uuid;c=c.path;var e=this._bindingsByRootAndName,
-f=e[d],g=b[b.length-1];a=a._cacheIndex;g._cacheIndex=a;b[a]=g;b.pop();delete f[c];a:{for(var h in f)break a;delete e[d]}},_lendBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=this._nActiveBindings++,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_takeBackBinding:function(a){var b=this._bindings,c=a._cacheIndex,d=--this._nActiveBindings,e=b[d];a._cacheIndex=d;b[d]=a;e._cacheIndex=c;b[c]=e},_lendControlInterpolant:function(){var a=this._controlInterpolants,b=this._nActiveControlInterpolants++,
-c=a[b];void 0===c&&(c=new bd(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),c.__cacheIndex=b,a[b]=c);return c},_takeBackControlInterpolant:function(a){var b=this._controlInterpolants,c=a.__cacheIndex,d=--this._nActiveControlInterpolants,e=b[d];a.__cacheIndex=d;b[d]=a;e.__cacheIndex=c;b[c]=e},_controlInterpolantsResultBuffer:new Float32Array(1),clipAction:function(a,b){var c=b||this._root,d=c.uuid;c="string"===typeof a?Ca.findByName(c,a):a;a=null!==c?c.uuid:a;var e=
-this._actionsByClip[a],f=null;if(void 0!==e){f=e.actionByRoot[d];if(void 0!==f)return f;f=e.knownActions[0];null===c&&(c=f._clip)}if(null===c)return null;b=new rf(this,c,b);this._bindAction(b,f);this._addInactiveAction(b,a,d);return b},existingAction:function(a,b){var c=b||this._root;b=c.uuid;c="string"===typeof a?Ca.findByName(c,a):a;a=this._actionsByClip[c?c.uuid:a];return void 0!==a?a.actionByRoot[b]||null:null},stopAllAction:function(){for(var a=this._actions,b=this._nActiveActions,c=this._bindings,
-d=this._nActiveBindings,e=this._nActiveBindings=this._nActiveActions=0;e!==b;++e)a[e].reset();for(e=0;e!==d;++e)c[e].useCount=0;return this},update:function(a){a*=this.timeScale;for(var b=this._actions,c=this._nActiveActions,d=this.time+=a,e=Math.sign(a),f=this._accuIndex^=1,g=0;g!==c;++g)b[g]._update(d,a,e,f);a=this._bindings;b=this._nActiveBindings;for(g=0;g!==b;++g)a[g].apply(f);return this},getRoot:function(){return this._root},uncacheClip:function(a){var b=this._actions;a=a.uuid;var c=this._actionsByClip,
-d=c[a];if(void 0!==d){d=d.knownActions;for(var e=0,f=d.length;e!==f;++e){var g=d[e];this._deactivateAction(g);var h=g._cacheIndex,k=b[b.length-1];g._cacheIndex=null;g._byClipCacheIndex=null;k._cacheIndex=h;b[h]=k;b.pop();this._removeInactiveBindingsForAction(g)}delete c[a]}},uncacheRoot:function(a){a=a.uuid;var b=this._actionsByClip;for(d in b){var c=b[d].actionByRoot[a];void 0!==c&&(this._deactivateAction(c),this._removeInactiveAction(c))}var d=this._bindingsByRootAndName[a];if(void 0!==d)for(var e in d)a=
-d[e],a.restoreOriginalState(),this._removeInactiveBinding(a)},uncacheAction:function(a,b){a=this.existingAction(a,b);null!==a&&(this._deactivateAction(a),this._removeInactiveAction(a))}});Ld.prototype.clone=function(){return new Ld(void 0===this.value.clone?this.value:this.value.clone())};se.prototype=Object.assign(Object.create(C.prototype),{constructor:se,isInstancedBufferGeometry:!0,copy:function(a){C.prototype.copy.call(this,a);this.maxInstancedCount=a.maxInstancedCount;return this},clone:function(){return(new this.constructor).copy(this)}});
-te.prototype=Object.assign(Object.create(ob.prototype),{constructor:te,isInstancedInterleavedBuffer:!0,copy:function(a){ob.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});ue.prototype=Object.assign(Object.create(Q.prototype),{constructor:ue,isInstancedBufferAttribute:!0,copy:function(a){Q.prototype.copy.call(this,a);this.meshPerAttribute=a.meshPerAttribute;return this}});Object.assign(sf.prototype,{linePrecision:1,set:function(a,b){this.ray.set(a,b)},setFromCamera:function(a,
-b){b&&b.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(b.matrixWorld),this.ray.direction.set(a.x,a.y,.5).unproject(b).sub(this.ray.origin).normalize()):b&&b.isOrthographicCamera?(this.ray.origin.set(a.x,a.y,(b.near+b.far)/(b.near-b.far)).unproject(b),this.ray.direction.set(0,0,-1).transformDirection(b.matrixWorld)):console.error("THREE.Raycaster: Unsupported camera type.")},intersectObject:function(a,b,c){c=c||[];ve(a,this,c,b);c.sort(tf);return c},intersectObjects:function(a,b,c){c=c||
-[];if(!1===Array.isArray(a))return console.warn("THREE.Raycaster.intersectObjects: objects is not an Array."),c;for(var d=0,e=a.length;d<e;d++)ve(a[d],this,c,b);c.sort(tf);return c}});Object.assign(uf.prototype,{start:function(){this.oldTime=this.startTime=("undefined"===typeof performance?Date:performance).now();this.elapsedTime=0;this.running=!0},stop:function(){this.getElapsedTime();this.autoStart=this.running=!1},getElapsedTime:function(){this.getDelta();return this.elapsedTime},getDelta:function(){var a=
-0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){var b=("undefined"===typeof performance?Date:performance).now();a=(b-this.oldTime)/1E3;this.oldTime=b;this.elapsedTime+=a}return a}});Object.assign(vf.prototype,{set:function(a,b,c){this.radius=a;this.phi=b;this.theta=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.phi=a.phi;this.theta=a.theta;return this},makeSafe:function(){this.phi=Math.max(1E-6,Math.min(Math.PI-
-1E-6,this.phi));return this},setFromVector3:function(a){this.radius=a.length();0===this.radius?this.phi=this.theta=0:(this.theta=Math.atan2(a.x,a.z),this.phi=Math.acos(H.clamp(a.y/this.radius,-1,1)));return this}});Object.assign(wf.prototype,{set:function(a,b,c){this.radius=a;this.theta=b;this.y=c;return this},clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.radius=a.radius;this.theta=a.theta;this.y=a.y;return this},setFromVector3:function(a){this.radius=Math.sqrt(a.x*
-a.x+a.z*a.z);this.theta=Math.atan2(a.x,a.z);this.y=a.y;return this}});Object.assign(we.prototype,{set:function(a,b){this.min.copy(a);this.max.copy(b);return this},setFromPoints:function(a){this.makeEmpty();for(var b=0,c=a.length;b<c;b++)this.expandByPoint(a[b]);return this},setFromCenterAndSize:function(){var a=new z;return function(b,c){c=a.copy(c).multiplyScalar(.5);this.min.copy(b).sub(c);this.max.copy(b).add(c);return this}}(),clone:function(){return(new this.constructor).copy(this)},copy:function(a){this.min.copy(a.min);
-this.max.copy(a.max);return this},makeEmpty:function(){this.min.x=this.min.y=Infinity;this.max.x=this.max.y=-Infinity;return this},isEmpty:function(){return this.max.x<this.min.x||this.max.y<this.min.y},getCenter:function(a){void 0===a&&(console.warn("THREE.Box2: .getCenter() target is now required"),a=new z);return this.isEmpty()?a.set(0,0):a.addVectors(this.min,this.max).multiplyScalar(.5)},getSize:function(a){void 0===a&&(console.warn("THREE.Box2: .getSize() target is now required"),a=new z);return this.isEmpty()?
-a.set(0,0):a.subVectors(this.max,this.min)},expandByPoint:function(a){this.min.min(a);this.max.max(a);return this},expandByVector:function(a){this.min.sub(a);this.max.add(a);return this},expandByScalar:function(a){this.min.addScalar(-a);this.max.addScalar(a);return this},containsPoint:function(a){return a.x<this.min.x||a.x>this.max.x||a.y<this.min.y||a.y>this.max.y?!1:!0},containsBox:function(a){return this.min.x<=a.min.x&&a.max.x<=this.max.x&&this.min.y<=a.min.y&&a.max.y<=this.max.y},getParameter:function(a,
-b){void 0===b&&(console.warn("THREE.Box2: .getParameter() target is now required"),b=new z);return b.set((a.x-this.min.x)/(this.max.x-this.min.x),(a.y-this.min.y)/(this.max.y-this.min.y))},intersectsBox:function(a){return a.max.x<this.min.x||a.min.x>this.max.x||a.max.y<this.min.y||a.min.y>this.max.y?!1:!0},clampPoint:function(a,b){void 0===b&&(console.warn("THREE.Box2: .clampPoint() target is now required"),b=new z);return b.copy(a).clamp(this.min,this.max)},distanceToPoint:function(){var a=new z;
-return function(b){return a.copy(b).clamp(this.min,this.max).sub(b).length()}}(),intersect:function(a){this.min.max(a.min);this.max.min(a.max);return this},union:function(a){this.min.min(a.min);this.max.max(a.max);return this},translate:function(a){this.min.add(a);this.max.add(a);return this},equals:function(a){return a.min.equals(this.min)&&a.max.equals(this.max)}});Object.assign(xe.prototype,{set:function(a,b){this.start.copy(a);this.end.copy(b);return this},clone:function(){return(new this.constructor).copy(this)},
-copy:function(a){this.start.copy(a.start);this.end.copy(a.end);return this},getCenter:function(a){void 0===a&&(console.warn("THREE.Line3: .getCenter() target is now required"),a=new p);return a.addVectors(this.start,this.end).multiplyScalar(.5)},delta:function(a){void 0===a&&(console.warn("THREE.Line3: .delta() target is now required"),a=new p);return a.subVectors(this.end,this.start)},distanceSq:function(){return this.start.distanceToSquared(this.end)},distance:function(){return this.start.distanceTo(this.end)},
-at:function(a,b){void 0===b&&(console.warn("THREE.Line3: .at() target is now required"),b=new p);return this.delta(b).multiplyScalar(a).add(this.start)},closestPointToPointParameter:function(){var a=new p,b=new p;return function(c,d){a.subVectors(c,this.start);b.subVectors(this.end,this.start);c=b.dot(b);c=b.dot(a)/c;d&&(c=H.clamp(c,0,1));return c}}(),closestPointToPoint:function(a,b,c){a=this.closestPointToPointParameter(a,b);void 0===c&&(console.warn("THREE.Line3: .closestPointToPoint() target is now required"),
-c=new p);return this.delta(c).multiplyScalar(a).add(this.start)},applyMatrix4:function(a){this.start.applyMatrix4(a);this.end.applyMatrix4(a);return this},equals:function(a){return a.start.equals(this.start)&&a.end.equals(this.end)}});ed.prototype=Object.create(D.prototype);ed.prototype.constructor=ed;ed.prototype.isImmediateRenderObject=!0;fd.prototype=Object.create(W.prototype);fd.prototype.constructor=fd;fd.prototype.update=function(){var a=new p,b=new p,c=new ra;return function(){var d=["a","b",
-"c"];this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);var e=this.object.matrixWorld,f=this.geometry.attributes.position,g=this.object.geometry;if(g&&g.isGeometry)for(var h=g.vertices,k=g.faces,l=g=0,p=k.length;l<p;l++)for(var n=k[l],t=0,u=n.vertexNormals.length;t<u;t++){var r=n.vertexNormals[t];a.copy(h[n[d[t]]]).applyMatrix4(e);b.copy(r).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);f.setXYZ(g,a.x,a.y,a.z);g+=1;f.setXYZ(g,b.x,b.y,b.z);g+=1}else if(g&&g.isBufferGeometry)for(d=
-g.attributes.position,h=g.attributes.normal,t=g=0,u=d.count;t<u;t++)a.set(d.getX(t),d.getY(t),d.getZ(t)).applyMatrix4(e),b.set(h.getX(t),h.getY(t),h.getZ(t)),b.applyMatrix3(c).normalize().multiplyScalar(this.size).add(a),f.setXYZ(g,a.x,a.y,a.z),g+=1,f.setXYZ(g,b.x,b.y,b.z),g+=1;f.needsUpdate=!0}}();ic.prototype=Object.create(D.prototype);ic.prototype.constructor=ic;ic.prototype.dispose=function(){this.cone.geometry.dispose();this.cone.material.dispose()};ic.prototype.update=function(){var a=new p,
-b=new p;return function(){this.light.updateMatrixWorld();var c=this.light.distance?this.light.distance:1E3,d=c*Math.tan(this.light.angle);this.cone.scale.set(d,d,c);a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);this.cone.lookAt(b.sub(a));void 0!==this.color?this.cone.material.color.set(this.color):this.cone.material.color.copy(this.light.color)}}();jc.prototype=Object.create(W.prototype);jc.prototype.constructor=jc;jc.prototype.updateMatrixWorld=
-function(){var a=new p,b=new I,c=new I;return function(d){var e=this.bones,f=this.geometry,g=f.getAttribute("position");c.getInverse(this.root.matrixWorld);for(var h=0,k=0;h<e.length;h++){var l=e[h];l.parent&&l.parent.isBone&&(b.multiplyMatrices(c,l.matrixWorld),a.setFromMatrixPosition(b),g.setXYZ(k,a.x,a.y,a.z),b.multiplyMatrices(c,l.parent.matrixWorld),a.setFromMatrixPosition(b),g.setXYZ(k+1,a.x,a.y,a.z),k+=2)}f.getAttribute("position").needsUpdate=!0;D.prototype.updateMatrixWorld.call(this,d)}}();
-kc.prototype=Object.create(la.prototype);kc.prototype.constructor=kc;kc.prototype.dispose=function(){this.geometry.dispose();this.material.dispose()};kc.prototype.update=function(){void 0!==this.color?this.material.color.set(this.color):this.material.color.copy(this.light.color)};lc.prototype=Object.create(D.prototype);lc.prototype.constructor=lc;lc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};lc.prototype.update=function(){var a=.5*this.light.width,
-b=.5*this.light.height,c=this.line.geometry.attributes.position,d=c.array;d[0]=a;d[1]=-b;d[2]=0;d[3]=a;d[4]=b;d[5]=0;d[6]=-a;d[7]=b;d[8]=0;d[9]=-a;d[10]=-b;d[11]=0;d[12]=a;d[13]=-b;d[14]=0;c.needsUpdate=!0;void 0!==this.color?this.line.material.color.set(this.color):this.line.material.color.copy(this.light.color)};mc.prototype=Object.create(D.prototype);mc.prototype.constructor=mc;mc.prototype.dispose=function(){this.children[0].geometry.dispose();this.children[0].material.dispose()};mc.prototype.update=
-function(){var a=new p,b=new G,c=new G;return function(){var d=this.children[0];if(void 0!==this.color)this.material.color.set(this.color);else{var e=d.geometry.getAttribute("color");b.copy(this.light.color);c.copy(this.light.groundColor);for(var f=0,g=e.count;f<g;f++){var h=f<g/2?b:c;e.setXYZ(f,h.r,h.g,h.b)}e.needsUpdate=!0}d.lookAt(a.setFromMatrixPosition(this.light.matrixWorld).negate())}}();gd.prototype=Object.create(W.prototype);gd.prototype.constructor=gd;Md.prototype=Object.create(W.prototype);
-Md.prototype.constructor=Md;hd.prototype=Object.create(W.prototype);hd.prototype.constructor=hd;hd.prototype.update=function(){var a=new p,b=new p,c=new ra;return function(){this.object.updateMatrixWorld(!0);c.getNormalMatrix(this.object.matrixWorld);var d=this.object.matrixWorld,e=this.geometry.attributes.position,f=this.object.geometry,g=f.vertices;f=f.faces;for(var h=0,k=0,l=f.length;k<l;k++){var p=f[k],n=p.normal;a.copy(g[p.a]).add(g[p.b]).add(g[p.c]).divideScalar(3).applyMatrix4(d);b.copy(n).applyMatrix3(c).normalize().multiplyScalar(this.size).add(a);
-e.setXYZ(h,a.x,a.y,a.z);h+=1;e.setXYZ(h,b.x,b.y,b.z);h+=1}e.needsUpdate=!0}}();nc.prototype=Object.create(D.prototype);nc.prototype.constructor=nc;nc.prototype.dispose=function(){this.lightPlane.geometry.dispose();this.lightPlane.material.dispose();this.targetLine.geometry.dispose();this.targetLine.material.dispose()};nc.prototype.update=function(){var a=new p,b=new p,c=new p;return function(){a.setFromMatrixPosition(this.light.matrixWorld);b.setFromMatrixPosition(this.light.target.matrixWorld);c.subVectors(b,
-a);this.lightPlane.lookAt(c);void 0!==this.color?(this.lightPlane.material.color.set(this.color),this.targetLine.material.color.set(this.color)):(this.lightPlane.material.color.copy(this.light.color),this.targetLine.material.color.copy(this.light.color));this.targetLine.lookAt(c);this.targetLine.scale.z=c.length()}}();id.prototype=Object.create(W.prototype);id.prototype.constructor=id;id.prototype.update=function(){function a(a,g,h,k){d.set(g,h,k).unproject(e);a=c[a];if(void 0!==a)for(g=b.getAttribute("position"),
-h=0,k=a.length;h<k;h++)g.setXYZ(a[h],d.x,d.y,d.z)}var b,c,d=new p,e=new Na;return function(){b=this.geometry;c=this.pointMap;e.projectionMatrix.copy(this.camera.projectionMatrix);a("c",0,0,-1);a("t",0,0,1);a("n1",-1,-1,-1);a("n2",1,-1,-1);a("n3",-1,1,-1);a("n4",1,1,-1);a("f1",-1,-1,1);a("f2",1,-1,1);a("f3",-1,1,1);a("f4",1,1,1);a("u1",.7,1.1,-1);a("u2",-.7,1.1,-1);a("u3",0,2,-1);a("cf1",-1,0,1);a("cf2",1,0,1);a("cf3",0,-1,1);a("cf4",0,1,1);a("cn1",-1,0,-1);a("cn2",1,0,-1);a("cn3",0,-1,-1);a("cn4",
-0,1,-1);b.getAttribute("position").needsUpdate=!0}}();Db.prototype=Object.create(W.prototype);Db.prototype.constructor=Db;Db.prototype.update=function(){var a=new Sa;return function(b){void 0!==b&&console.warn("THREE.BoxHelper: .update() has no longer arguments.");void 0!==this.object&&a.setFromObject(this.object);if(!a.isEmpty()){b=a.min;var c=a.max,d=this.geometry.attributes.position,e=d.array;e[0]=c.x;e[1]=c.y;e[2]=c.z;e[3]=b.x;e[4]=c.y;e[5]=c.z;e[6]=b.x;e[7]=b.y;e[8]=c.z;e[9]=c.x;e[10]=b.y;e[11]=
-c.z;e[12]=c.x;e[13]=c.y;e[14]=b.z;e[15]=b.x;e[16]=c.y;e[17]=b.z;e[18]=b.x;e[19]=b.y;e[20]=b.z;e[21]=c.x;e[22]=b.y;e[23]=b.z;d.needsUpdate=!0;this.geometry.computeBoundingSphere()}}}();Db.prototype.setFromObject=function(a){this.object=a;this.update();return this};jd.prototype=Object.create(W.prototype);jd.prototype.constructor=jd;jd.prototype.updateMatrixWorld=function(a){var b=this.box;b.isEmpty()||(b.getCenter(this.position),b.getSize(this.scale),this.scale.multiplyScalar(.5),D.prototype.updateMatrixWorld.call(this,
-a))};kd.prototype=Object.create(sa.prototype);kd.prototype.constructor=kd;kd.prototype.updateMatrixWorld=function(a){var b=-this.plane.constant;1E-8>Math.abs(b)&&(b=1E-8);this.scale.set(.5*this.size,.5*this.size,b);this.children[0].material.side=0>b?1:0;this.lookAt(this.plane.normal);D.prototype.updateMatrixWorld.call(this,a)};var Nd,ye;Eb.prototype=Object.create(D.prototype);Eb.prototype.constructor=Eb;Eb.prototype.setDirection=function(){var a=new p,b;return function(c){.99999<c.y?this.quaternion.set(0,
-0,0,1):-.99999>c.y?this.quaternion.set(1,0,0,0):(a.set(c.z,0,-c.x).normalize(),b=Math.acos(c.y),this.quaternion.setFromAxisAngle(a,b))}}();Eb.prototype.setLength=function(a,b,c){void 0===b&&(b=.2*a);void 0===c&&(c=.2*b);this.line.scale.set(1,Math.max(0,a-b),1);this.line.updateMatrix();this.cone.scale.set(c,b,c);this.cone.position.y=a;this.cone.updateMatrix()};Eb.prototype.setColor=function(a){this.line.material.color.copy(a);this.cone.material.color.copy(a)};ld.prototype=Object.create(W.prototype);
-ld.prototype.constructor=ld;L.create=function(a,b){console.log("THREE.Curve.create() has been deprecated");a.prototype=Object.create(L.prototype);a.prototype.constructor=a;a.prototype.getPoint=b;return a};Object.assign(Xa.prototype,{createPointsGeometry:function(a){console.warn("THREE.CurvePath: .createPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");a=this.getPoints(a);return this.createGeometry(a)},createSpacedPointsGeometry:function(a){console.warn("THREE.CurvePath: .createSpacedPointsGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");
-a=this.getSpacedPoints(a);return this.createGeometry(a)},createGeometry:function(a){console.warn("THREE.CurvePath: .createGeometry() has been removed. Use new THREE.Geometry().setFromPoints( points ) instead.");for(var b=new R,c=0,d=a.length;c<d;c++){var e=a[c];b.vertices.push(new p(e.x,e.y,e.z||0))}return b}});Object.assign(La.prototype,{fromPoints:function(a){console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints().");this.setFromPoints(a)}});yf.prototype=Object.create(ca.prototype);
-zf.prototype=Object.create(ca.prototype);ze.prototype=Object.create(ca.prototype);Object.assign(ze.prototype,{initFromArray:function(){console.error("THREE.Spline: .initFromArray() has been removed.")},getControlPointsArray:function(){console.error("THREE.Spline: .getControlPointsArray() has been removed.")},reparametrizeByArcLength:function(){console.error("THREE.Spline: .reparametrizeByArcLength() has been removed.")}});gd.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")};
-jc.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")};Object.assign(gc.prototype,{extractUrlBase:function(a){console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead.");return De.extractUrlBase(a)}});Object.assign(we.prototype,{center:function(a){console.warn("THREE.Box2: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box2: .empty() has been renamed to .isEmpty().");
-return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box2: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},size:function(a){console.warn("THREE.Box2: .size() has been renamed to .getSize().");return this.getSize(a)}});Object.assign(Sa.prototype,{center:function(a){console.warn("THREE.Box3: .center() has been renamed to .getCenter().");return this.getCenter(a)},empty:function(){console.warn("THREE.Box3: .empty() has been renamed to .isEmpty().");
-return this.isEmpty()},isIntersectionBox:function(a){console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionSphere:function(a){console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)},size:function(a){console.warn("THREE.Box3: .size() has been renamed to .getSize().");return this.getSize(a)}});xe.prototype.center=function(a){console.warn("THREE.Line3: .center() has been renamed to .getCenter().");
-return this.getCenter(a)};Object.assign(H,{random16:function(){console.warn("THREE.Math: .random16() has been deprecated. Use Math.random() instead.");return Math.random()},nearestPowerOfTwo:function(a){console.warn("THREE.Math: .nearestPowerOfTwo() has been renamed to .floorPowerOfTwo().");return H.floorPowerOfTwo(a)},nextPowerOfTwo:function(a){console.warn("THREE.Math: .nextPowerOfTwo() has been renamed to .ceilPowerOfTwo().");return H.ceilPowerOfTwo(a)}});Object.assign(ra.prototype,{flattenToArrayOffset:function(a,
-b){console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},multiplyVector3:function(a){console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead.");return a.applyMatrix3(this)},multiplyVector3Array:function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix3: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");
-return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")}});Object.assign(I.prototype,{extractPosition:function(a){console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition().");return this.copyPosition(a)},flattenToArrayOffset:function(a,b){console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead.");return this.toArray(a,b)},getPosition:function(){var a;
-return function(){void 0===a&&(a=new p);console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead.");return a.setFromMatrixColumn(this,3)}}(),setRotationFromQuaternion:function(a){console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion().");return this.makeRotationFromQuaternion(a)},multiplyToArray:function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},multiplyVector3:function(a){console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead.");
-return a.applyMatrix4(this)},multiplyVector4:function(a){console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead.");return a.applyMatrix4(this)},multiplyVector3Array:function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},rotateAxis:function(a){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead.");a.transformDirection(this)},crossVector:function(a){console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead.");
-return a.applyMatrix4(this)},translate:function(){console.error("THREE.Matrix4: .translate() has been removed.")},rotateX:function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},rotateY:function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},rotateZ:function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},rotateByAxis:function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},applyToBuffer:function(a){console.warn("THREE.Matrix4: .applyToBuffer() has been removed. Use matrix.applyToBufferAttribute( attribute ) instead.");
-return this.applyToBufferAttribute(a)},applyToVector3Array:function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},makeFrustum:function(a,b,c,d,e,f){console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead.");return this.makePerspective(a,b,d,c,e,f)}});Ma.prototype.isIntersectionLine=function(a){console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine().");return this.intersectsLine(a)};
-fa.prototype.multiplyVector3=function(a){console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead.");return a.applyQuaternion(this)};Object.assign(mb.prototype,{isIntersectionBox:function(a){console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox().");return this.intersectsBox(a)},isIntersectionPlane:function(a){console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane().");return this.intersectsPlane(a)},
-isIntersectionSphere:function(a){console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere().");return this.intersectsSphere(a)}});Object.assign(ja.prototype,{area:function(){console.warn("THREE.Triangle: .area() has been renamed to .getArea().");return this.getArea()},barycoordFromPoint:function(a,b){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return this.getBarycoord(a,b)},midpoint:function(a){console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint().");
-return this.getMidpoint(a)},normal:function(a){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");return this.getNormal(a)},plane:function(a){console.warn("THREE.Triangle: .plane() has been renamed to .getPlane().");return this.getPlane(a)}});Object.assign(ja,{barycoordFromPoint:function(a,b,c,d,e){console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord().");return ja.getBarycoord(a,b,c,d,e)},normal:function(a,b,c,d){console.warn("THREE.Triangle: .normal() has been renamed to .getNormal().");
-return ja.getNormal(a,b,c,d)}});Object.assign(db.prototype,{extractAllPoints:function(a){console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead.");return this.extractPoints(a)},extrude:function(a){console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead.");return new rb(this,a)},makeGeometry:function(a){console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead.");return new tb(this,a)}});Object.assign(z.prototype,
-{fromAttribute:function(a,b,c){console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(p.prototype,
-{setEulerFromRotationMatrix:function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},setEulerFromQuaternion:function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},getPositionFromMatrix:function(a){console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition().");return this.setFromMatrixPosition(a)},getScaleFromMatrix:function(a){console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale().");
-return this.setFromMatrixScale(a)},getColumnFromMatrix:function(a,b){console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn().");return this.setFromMatrixColumn(b,a)},applyProjection:function(a){console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead.");return this.applyMatrix4(a)},fromAttribute:function(a,b,c){console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,
-b,c)},distanceToManhattan:function(a){console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo().");return this.manhattanDistanceTo(a)},lengthManhattan:function(){console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(V.prototype,{fromAttribute:function(a,b,c){console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute().");return this.fromBufferAttribute(a,
-b,c)},lengthManhattan:function(){console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength().");return this.manhattanLength()}});Object.assign(R.prototype,{computeTangents:function(){console.error("THREE.Geometry: .computeTangents() has been removed.")},computeLineDistances:function(){console.error("THREE.Geometry: .computeLineDistances() has been removed. Use THREE.Line.computeLineDistances() instead.")}});Object.assign(D.prototype,{getChildByName:function(a){console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName().");
-return this.getObjectByName(a)},renderDepth:function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},translate:function(a,b){console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead.");return this.translateOnAxis(b,a)},getWorldRotation:function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")}});Object.defineProperties(D.prototype,
-{eulerOrder:{get:function(){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");return this.rotation.order},set:function(a){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order.");this.rotation.order=a}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}});
-Object.defineProperties(Bc.prototype,{objects:{get:function(){console.warn("THREE.LOD: .objects has been renamed to .levels.");return this.levels}}});Object.defineProperty(Cc.prototype,"useVertexTexture",{get:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")},set:function(){console.warn("THREE.Skeleton: useVertexTexture has been removed.")}});Object.defineProperty(L.prototype,"__arcLengthDivisions",{get:function(){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");
-return this.arcLengthDivisions},set:function(a){console.warn("THREE.Curve: .__arcLengthDivisions is now .arcLengthDivisions.");this.arcLengthDivisions=a}});Z.prototype.setLens=function(a,b){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup.");void 0!==b&&(this.filmGauge=b);this.setFocalLength(a)};Object.defineProperties(X.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(a){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov.");
-this.shadow.camera.fov=a}},shadowCameraLeft:{set:function(a){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left.");this.shadow.camera.left=a}},shadowCameraRight:{set:function(a){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right.");this.shadow.camera.right=a}},shadowCameraTop:{set:function(a){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top.");this.shadow.camera.top=a}},shadowCameraBottom:{set:function(a){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom.");
-this.shadow.camera.bottom=a}},shadowCameraNear:{set:function(a){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near.");this.shadow.camera.near=a}},shadowCameraFar:{set:function(a){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far.");this.shadow.camera.far=a}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(a){console.warn("THREE.Light: .shadowBias is now .shadow.bias.");
-this.shadow.bias=a}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(a){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width.");this.shadow.mapSize.width=a}},shadowMapHeight:{set:function(a){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height.");this.shadow.mapSize.height=a}}});Object.defineProperties(Q.prototype,{length:{get:function(){console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead.");
-return this.array.length}},copyIndicesArray:function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")}});Object.assign(C.prototype,{addIndex:function(a){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex().");this.setIndex(a)},addDrawCall:function(a,b,c){void 0!==c&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset.");console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup().");this.addGroup(a,b)},
-clearDrawCalls:function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups().");this.clearGroups()},computeTangents:function(){console.warn("THREE.BufferGeometry: .computeTangents() has been removed.")},computeOffsets:function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")}});Object.defineProperties(C.prototype,{drawcalls:{get:function(){console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups.");return this.groups}},offsets:{get:function(){console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups.");
-return this.groups}}});Object.assign(Oa.prototype,{getArrays:function(){console.error("THREE.ExtrudeBufferGeometry: .getArrays() has been removed.")},addShapeList:function(){console.error("THREE.ExtrudeBufferGeometry: .addShapeList() has been removed.")},addShape:function(){console.error("THREE.ExtrudeBufferGeometry: .addShape() has been removed.")}});Object.defineProperties(Ld.prototype,{dynamic:{set:function(){console.warn("THREE.Uniform: .dynamic has been removed. Use object.onBeforeRender() instead.")}},
-onUpdate:{value:function(){console.warn("THREE.Uniform: .onUpdate() has been removed. Use object.onBeforeRender() instead.");return this}}});Object.defineProperties(J.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},wrapRGB:{get:function(){console.warn("THREE.Material: .wrapRGB has been removed.");return new G}},shading:{get:function(){console.error("THREE."+this.type+
-": .shading has been removed. Use the boolean .flatShading instead.")},set:function(a){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.");this.flatShading=1===a}}});Object.defineProperties(Fa.prototype,{metal:{get:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead.");return!1},set:function(){console.warn("THREE.MeshPhongMaterial: .metal has been removed. Use THREE.MeshStandardMaterial instead")}}});
-Object.defineProperties(ta.prototype,{derivatives:{get:function(){console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");return this.extensions.derivatives},set:function(a){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives.");this.extensions.derivatives=a}}});Object.assign(Zd.prototype,{animate:function(a){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop().");this.setAnimationLoop(a)},getCurrentRenderTarget:function(){console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget().");
-return this.getRenderTarget()},getMaxAnisotropy:function(){console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy().");return this.capabilities.getMaxAnisotropy()},getPrecision:function(){console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision.");return this.capabilities.precision},resetGLState:function(){console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset().");return this.state.reset()},supportsFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' ).");
-return this.extensions.get("OES_texture_float")},supportsHalfFloatTextures:function(){console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' ).");return this.extensions.get("OES_texture_half_float")},supportsStandardDerivatives:function(){console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' ).");return this.extensions.get("OES_standard_derivatives")},supportsCompressedTextureS3TC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' ).");
-return this.extensions.get("WEBGL_compressed_texture_s3tc")},supportsCompressedTexturePVRTC:function(){console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' ).");return this.extensions.get("WEBGL_compressed_texture_pvrtc")},supportsBlendMinMax:function(){console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' ).");return this.extensions.get("EXT_blend_minmax")},supportsVertexTextures:function(){console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures.");
-return this.capabilities.vertexTextures},supportsInstancedArrays:function(){console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' ).");return this.extensions.get("ANGLE_instanced_arrays")},enableScissorTest:function(a){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest().");this.setScissorTest(a)},initMaterial:function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},addPrePlugin:function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},
-addPostPlugin:function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},updateShadowMap:function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},setFaceCulling:function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")}});Object.defineProperties(Zd.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled.");
-this.shadowMap.enabled=a}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(a){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type.");this.shadowMap.type=a}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}}});Object.defineProperties(Ze.prototype,
-{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},
-renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}});Object.defineProperties(fb.prototype,{wrapS:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");return this.texture.wrapS},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS.");
-this.texture.wrapS=a}},wrapT:{get:function(){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");return this.texture.wrapT},set:function(a){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT.");this.texture.wrapT=a}},magFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");return this.texture.magFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter.");this.texture.magFilter=
-a}},minFilter:{get:function(){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");return this.texture.minFilter},set:function(a){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter.");this.texture.minFilter=a}},anisotropy:{get:function(){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");return this.texture.anisotropy},set:function(a){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy.");this.texture.anisotropy=
-a}},offset:{get:function(){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");return this.texture.offset},set:function(a){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset.");this.texture.offset=a}},repeat:{get:function(){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");return this.texture.repeat},set:function(a){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat.");this.texture.repeat=a}},format:{get:function(){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");
-return this.texture.format},set:function(a){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format.");this.texture.format=a}},type:{get:function(){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");return this.texture.type},set:function(a){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type.");this.texture.type=a}},generateMipmaps:{get:function(){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");return this.texture.generateMipmaps},
-set:function(a){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps.");this.texture.generateMipmaps=a}}});Object.defineProperties(af.prototype,{standing:{set:function(){console.warn("THREE.WebVRManager: .standing has been removed.")}}});hc.prototype.load=function(a){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");var b=this;(new le).load(a,function(a){b.setBuffer(a)});return this};pe.prototype.getData=function(){console.warn("THREE.AudioAnalyser: .getData() is now .getFrequencyData().");
-return this.getFrequencyData()};dd.prototype.updateCubeMap=function(a,b){console.warn("THREE.CubeCamera: .updateCubeMap() is now .update().");return this.update(a,b)};eb.crossOrigin=void 0;eb.loadTexture=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");var e=new vd;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};eb.loadTextureCube=function(a,b,c,d){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");
-var e=new ee;e.setCrossOrigin(this.crossOrigin);a=e.load(a,c,void 0,d);b&&(a.mapping=b);return a};eb.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")};eb.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")};l.WebGLRenderTargetCube=Gb;l.WebGLRenderTarget=fb;l.WebGLRenderer=Zd;l.ShaderLib=nb;l.UniformsLib=K;l.UniformsUtils=
-Aa;l.ShaderChunk=S;l.FogExp2=Lb;l.Fog=Mb;l.Scene=qd;l.Sprite=Ac;l.LOD=Bc;l.SkinnedMesh=sd;l.Skeleton=Cc;l.Bone=rd;l.Mesh=la;l.LineSegments=W;l.LineLoop=td;l.Line=sa;l.Points=Ob;l.Group=Kb;l.VideoTexture=$d;l.DataTexture=gb;l.CompressedTexture=Pb;l.CubeTexture=Ua;l.CanvasTexture=Dc;l.DepthTexture=Ec;l.Texture=T;l.CompressedTextureLoader=kf;l.DataTextureLoader=de;l.CubeTextureLoader=ee;l.TextureLoader=vd;l.ObjectLoader=mf;l.MaterialLoader=Kd;l.BufferGeometryLoader=ge;l.DefaultLoadingManager=ka;l.LoadingManager=
-ce;l.JSONLoader=he;l.ImageLoader=Zc;l.ImageBitmapLoader=ie;l.FontLoader=nf;l.FileLoader=Ga;l.Loader=gc;l.LoaderUtils=De;l.Cache=Fb;l.AudioLoader=le;l.SpotLightShadow=xd;l.SpotLight=yd;l.PointLight=zd;l.RectAreaLight=Dd;l.HemisphereLight=wd;l.DirectionalLightShadow=Ad;l.DirectionalLight=Bd;l.AmbientLight=Cd;l.LightShadow=Cb;l.Light=X;l.StereoCamera=of;l.PerspectiveCamera=Z;l.OrthographicCamera=Hb;l.CubeCamera=dd;l.ArrayCamera=yc;l.Camera=Na;l.AudioListener=me;l.PositionalAudio=oe;l.AudioContext=ne;
-l.AudioAnalyser=pe;l.Audio=hc;l.VectorKeyframeTrack=fc;l.StringKeyframeTrack=Jd;l.QuaternionKeyframeTrack=cd;l.NumberKeyframeTrack=ec;l.ColorKeyframeTrack=Hd;l.BooleanKeyframeTrack=Gd;l.PropertyMixer=qe;l.PropertyBinding=pa;l.KeyframeTrack=oa;l.AnimationUtils=ia;l.AnimationObjectGroup=qf;l.AnimationMixer=re;l.AnimationClip=Ca;l.Uniform=Ld;l.InstancedBufferGeometry=se;l.BufferGeometry=C;l.Geometry=R;l.InterleavedBufferAttribute=zc;l.InstancedInterleavedBuffer=te;l.InterleavedBuffer=ob;l.InstancedBufferAttribute=
-ue;l.Face3=Ta;l.Object3D=D;l.Raycaster=sf;l.Layers=Rd;l.EventDispatcher=ya;l.Clock=uf;l.QuaternionLinearInterpolant=Id;l.LinearInterpolant=bd;l.DiscreteInterpolant=Fd;l.CubicInterpolant=Ed;l.Interpolant=wa;l.Triangle=ja;l.Math=H;l.Spherical=vf;l.Cylindrical=wf;l.Plane=Ma;l.Frustum=md;l.Sphere=Da;l.Ray=mb;l.Matrix4=I;l.Matrix3=ra;l.Box3=Sa;l.Box2=we;l.Line3=xe;l.Euler=hb;l.Vector4=V;l.Vector3=p;l.Vector2=z;l.Quaternion=fa;l.Color=G;l.ImmediateRenderObject=ed;l.VertexNormalsHelper=fd;l.SpotLightHelper=
-ic;l.SkeletonHelper=jc;l.PointLightHelper=kc;l.RectAreaLightHelper=lc;l.HemisphereLightHelper=mc;l.GridHelper=gd;l.PolarGridHelper=Md;l.FaceNormalsHelper=hd;l.DirectionalLightHelper=nc;l.CameraHelper=id;l.BoxHelper=Db;l.Box3Helper=jd;l.PlaneHelper=kd;l.ArrowHelper=Eb;l.AxesHelper=ld;l.Shape=db;l.Path=La;l.ShapePath=je;l.Font=ke;l.CurvePath=Xa;l.Curve=L;l.ImageUtils=eb;l.ShapeUtils=Va;l.WebGLUtils=$e;l.WireframeGeometry=Qb;l.ParametricGeometry=Fc;l.ParametricBufferGeometry=Rb;l.TetrahedronGeometry=
-Hc;l.TetrahedronBufferGeometry=Sb;l.OctahedronGeometry=Ic;l.OctahedronBufferGeometry=pb;l.IcosahedronGeometry=Jc;l.IcosahedronBufferGeometry=Tb;l.DodecahedronGeometry=Kc;l.DodecahedronBufferGeometry=Ub;l.PolyhedronGeometry=Gc;l.PolyhedronBufferGeometry=na;l.TubeGeometry=Lc;l.TubeBufferGeometry=Vb;l.TorusKnotGeometry=Mc;l.TorusKnotBufferGeometry=Wb;l.TorusGeometry=Nc;l.TorusBufferGeometry=Xb;l.TextGeometry=Sc;l.TextBufferGeometry=Yb;l.SphereGeometry=Tc;l.SphereBufferGeometry=sb;l.RingGeometry=Uc;l.RingBufferGeometry=
-Zb;l.PlaneGeometry=uc;l.PlaneBufferGeometry=lb;l.LatheGeometry=Vc;l.LatheBufferGeometry=$b;l.ShapeGeometry=tb;l.ShapeBufferGeometry=ub;l.ExtrudeGeometry=rb;l.ExtrudeBufferGeometry=Oa;l.EdgesGeometry=ac;l.ConeGeometry=Wc;l.ConeBufferGeometry=Xc;l.CylinderGeometry=vb;l.CylinderBufferGeometry=Wa;l.CircleGeometry=Yc;l.CircleBufferGeometry=bc;l.BoxGeometry=Ib;l.BoxBufferGeometry=kb;l.ShadowMaterial=wb;l.SpriteMaterial=cb;l.RawShaderMaterial=cc;l.ShaderMaterial=ta;l.PointsMaterial=Ea;l.MeshPhysicalMaterial=
-xb;l.MeshStandardMaterial=Pa;l.MeshPhongMaterial=Fa;l.MeshToonMaterial=yb;l.MeshNormalMaterial=zb;l.MeshLambertMaterial=Ab;l.MeshDepthMaterial=$a;l.MeshDistanceMaterial=ab;l.MeshBasicMaterial=da;l.LineDashedMaterial=Bb;l.LineBasicMaterial=Y;l.Material=J;l.Float64BufferAttribute=tc;l.Float32BufferAttribute=A;l.Uint32BufferAttribute=jb;l.Int32BufferAttribute=sc;l.Uint16BufferAttribute=ib;l.Int16BufferAttribute=rc;l.Uint8ClampedBufferAttribute=qc;l.Uint8BufferAttribute=pc;l.Int8BufferAttribute=oc;l.BufferAttribute=
-Q;l.ArcCurve=dc;l.CatmullRomCurve3=ca;l.CubicBezierCurve=Ha;l.CubicBezierCurve3=Qa;l.EllipseCurve=za;l.LineCurve=va;l.LineCurve3=Ia;l.QuadraticBezierCurve=Ja;l.QuadraticBezierCurve3=Ra;l.SplineCurve=Ka;l.REVISION="95";l.MOUSE={LEFT:0,MIDDLE:1,RIGHT:2};l.CullFaceNone=0;l.CullFaceBack=1;l.CullFaceFront=2;l.CullFaceFrontBack=3;l.FrontFaceDirectionCW=0;l.FrontFaceDirectionCCW=1;l.BasicShadowMap=0;l.PCFShadowMap=1;l.PCFSoftShadowMap=2;l.FrontSide=0;l.BackSide=1;l.DoubleSide=2;l.FlatShading=1;l.SmoothShading=
-2;l.NoColors=0;l.FaceColors=1;l.VertexColors=2;l.NoBlending=0;l.NormalBlending=1;l.AdditiveBlending=2;l.SubtractiveBlending=3;l.MultiplyBlending=4;l.CustomBlending=5;l.AddEquation=100;l.SubtractEquation=101;l.ReverseSubtractEquation=102;l.MinEquation=103;l.MaxEquation=104;l.ZeroFactor=200;l.OneFactor=201;l.SrcColorFactor=202;l.OneMinusSrcColorFactor=203;l.SrcAlphaFactor=204;l.OneMinusSrcAlphaFactor=205;l.DstAlphaFactor=206;l.OneMinusDstAlphaFactor=207;l.DstColorFactor=208;l.OneMinusDstColorFactor=
-209;l.SrcAlphaSaturateFactor=210;l.NeverDepth=0;l.AlwaysDepth=1;l.LessDepth=2;l.LessEqualDepth=3;l.EqualDepth=4;l.GreaterEqualDepth=5;l.GreaterDepth=6;l.NotEqualDepth=7;l.MultiplyOperation=0;l.MixOperation=1;l.AddOperation=2;l.NoToneMapping=0;l.LinearToneMapping=1;l.ReinhardToneMapping=2;l.Uncharted2ToneMapping=3;l.CineonToneMapping=4;l.UVMapping=300;l.CubeReflectionMapping=301;l.CubeRefractionMapping=302;l.EquirectangularReflectionMapping=303;l.EquirectangularRefractionMapping=304;l.SphericalReflectionMapping=
-305;l.CubeUVReflectionMapping=306;l.CubeUVRefractionMapping=307;l.RepeatWrapping=1E3;l.ClampToEdgeWrapping=1001;l.MirroredRepeatWrapping=1002;l.NearestFilter=1003;l.NearestMipMapNearestFilter=1004;l.NearestMipMapLinearFilter=1005;l.LinearFilter=1006;l.LinearMipMapNearestFilter=1007;l.LinearMipMapLinearFilter=1008;l.UnsignedByteType=1009;l.ByteType=1010;l.ShortType=1011;l.UnsignedShortType=1012;l.IntType=1013;l.UnsignedIntType=1014;l.FloatType=1015;l.HalfFloatType=1016;l.UnsignedShort4444Type=1017;
-l.UnsignedShort5551Type=1018;l.UnsignedShort565Type=1019;l.UnsignedInt248Type=1020;l.AlphaFormat=1021;l.RGBFormat=1022;l.RGBAFormat=1023;l.LuminanceFormat=1024;l.LuminanceAlphaFormat=1025;l.RGBEFormat=1023;l.DepthFormat=1026;l.DepthStencilFormat=1027;l.RGB_S3TC_DXT1_Format=33776;l.RGBA_S3TC_DXT1_Format=33777;l.RGBA_S3TC_DXT3_Format=33778;l.RGBA_S3TC_DXT5_Format=33779;l.RGB_PVRTC_4BPPV1_Format=35840;l.RGB_PVRTC_2BPPV1_Format=35841;l.RGBA_PVRTC_4BPPV1_Format=35842;l.RGBA_PVRTC_2BPPV1_Format=35843;l.RGB_ETC1_Format=
-36196;l.RGBA_ASTC_4x4_Format=37808;l.RGBA_ASTC_5x4_Format=37809;l.RGBA_ASTC_5x5_Format=37810;l.RGBA_ASTC_6x5_Format=37811;l.RGBA_ASTC_6x6_Format=37812;l.RGBA_ASTC_8x5_Format=37813;l.RGBA_ASTC_8x6_Format=37814;l.RGBA_ASTC_8x8_Format=37815;l.RGBA_ASTC_10x5_Format=37816;l.RGBA_ASTC_10x6_Format=37817;l.RGBA_ASTC_10x8_Format=37818;l.RGBA_ASTC_10x10_Format=37819;l.RGBA_ASTC_12x10_Format=37820;l.RGBA_ASTC_12x12_Format=37821;l.LoopOnce=2200;l.LoopRepeat=2201;l.LoopPingPong=2202;l.InterpolateDiscrete=2300;
-l.InterpolateLinear=2301;l.InterpolateSmooth=2302;l.ZeroCurvatureEnding=2400;l.ZeroSlopeEnding=2401;l.WrapAroundEnding=2402;l.TrianglesDrawMode=0;l.TriangleStripDrawMode=1;l.TriangleFanDrawMode=2;l.LinearEncoding=3E3;l.sRGBEncoding=3001;l.GammaEncoding=3007;l.RGBEEncoding=3002;l.LogLuvEncoding=3003;l.RGBM7Encoding=3004;l.RGBM16Encoding=3005;l.RGBDEncoding=3006;l.BasicDepthPacking=3200;l.RGBADepthPacking=3201;l.TangentSpaceNormalMap=0;l.ObjectSpaceNormalMap=1;l.CubeGeometry=Ib;l.Face4=function(a,b,
-c,d,e,f,g){console.warn("THREE.Face4 has been removed. A THREE.Face3 will be created instead.");return new Ta(a,b,c,e,f,g)};l.LineStrip=0;l.LinePieces=1;l.MeshFaceMaterial=function(a){console.warn("THREE.MeshFaceMaterial has been removed. Use an Array instead.");return a};l.MultiMaterial=function(a){void 0===a&&(a=[]);console.warn("THREE.MultiMaterial has been removed. Use an Array instead.");a.isMultiMaterial=!0;a.materials=a;a.clone=function(){return a.slice()};return a};l.PointCloud=function(a,
-b){console.warn("THREE.PointCloud has been renamed to THREE.Points.");return new Ob(a,b)};l.Particle=function(a){console.warn("THREE.Particle has been renamed to THREE.Sprite.");return new Ac(a)};l.ParticleSystem=function(a,b){console.warn("THREE.ParticleSystem has been renamed to THREE.Points.");return new Ob(a,b)};l.PointCloudMaterial=function(a){console.warn("THREE.PointCloudMaterial has been renamed to THREE.PointsMaterial.");return new Ea(a)};l.ParticleBasicMaterial=function(a){console.warn("THREE.ParticleBasicMaterial has been renamed to THREE.PointsMaterial.");
-return new Ea(a)};l.ParticleSystemMaterial=function(a){console.warn("THREE.ParticleSystemMaterial has been renamed to THREE.PointsMaterial.");return new Ea(a)};l.Vertex=function(a,b,c){console.warn("THREE.Vertex has been removed. Use THREE.Vector3 instead.");return new p(a,b,c)};l.DynamicBufferAttribute=function(a,b){console.warn("THREE.DynamicBufferAttribute has been removed. Use new THREE.BufferAttribute().setDynamic( true ) instead.");return(new Q(a,b)).setDynamic(!0)};l.Int8Attribute=function(a,
-b){console.warn("THREE.Int8Attribute has been removed. Use new THREE.Int8BufferAttribute() instead.");return new oc(a,b)};l.Uint8Attribute=function(a,b){console.warn("THREE.Uint8Attribute has been removed. Use new THREE.Uint8BufferAttribute() instead.");return new pc(a,b)};l.Uint8ClampedAttribute=function(a,b){console.warn("THREE.Uint8ClampedAttribute has been removed. Use new THREE.Uint8ClampedBufferAttribute() instead.");return new qc(a,b)};l.Int16Attribute=function(a,b){console.warn("THREE.Int16Attribute has been removed. Use new THREE.Int16BufferAttribute() instead.");
-return new rc(a,b)};l.Uint16Attribute=function(a,b){console.warn("THREE.Uint16Attribute has been removed. Use new THREE.Uint16BufferAttribute() instead.");return new ib(a,b)};l.Int32Attribute=function(a,b){console.warn("THREE.Int32Attribute has been removed. Use new THREE.Int32BufferAttribute() instead.");return new sc(a,b)};l.Uint32Attribute=function(a,b){console.warn("THREE.Uint32Attribute has been removed. Use new THREE.Uint32BufferAttribute() instead.");return new jb(a,b)};l.Float32Attribute=
-function(a,b){console.warn("THREE.Float32Attribute has been removed. Use new THREE.Float32BufferAttribute() instead.");return new A(a,b)};l.Float64Attribute=function(a,b){console.warn("THREE.Float64Attribute has been removed. Use new THREE.Float64BufferAttribute() instead.");return new tc(a,b)};l.ClosedSplineCurve3=yf;l.SplineCurve3=zf;l.Spline=ze;l.AxisHelper=function(a){console.warn("THREE.AxisHelper has been renamed to THREE.AxesHelper.");return new ld(a)};l.BoundingBoxHelper=function(a,b){console.warn("THREE.BoundingBoxHelper has been deprecated. Creating a THREE.BoxHelper instead.");
-return new Db(a,b)};l.EdgesHelper=function(a,b){console.warn("THREE.EdgesHelper has been removed. Use THREE.EdgesGeometry instead.");return new W(new ac(a.geometry),new Y({color:void 0!==b?b:16777215}))};l.WireframeHelper=function(a,b){console.warn("THREE.WireframeHelper has been removed. Use THREE.WireframeGeometry instead.");return new W(new Qb(a.geometry),new Y({color:void 0!==b?b:16777215}))};l.XHRLoader=function(a){console.warn("THREE.XHRLoader has been renamed to THREE.FileLoader.");return new Ga(a)};
-l.BinaryTextureLoader=function(a){console.warn("THREE.BinaryTextureLoader has been renamed to THREE.DataTextureLoader.");return new de(a)};l.GeometryUtils={merge:function(a,b,c){console.warn("THREE.GeometryUtils: .merge() has been moved to Geometry. Use geometry.merge( geometry2, matrix, materialIndexOffset ) instead.");if(b.isMesh){b.matrixAutoUpdate&&b.updateMatrix();var d=b.matrix;b=b.geometry}a.merge(b,d,c)},center:function(a){console.warn("THREE.GeometryUtils: .center() has been moved to Geometry. Use geometry.center() instead.");
-return a.center()}};l.Projector=function(){console.error("THREE.Projector has been moved to /examples/js/renderers/Projector.js.");this.projectVector=function(a,b){console.warn("THREE.Projector: .projectVector() is now vector.project().");a.project(b)};this.unprojectVector=function(a,b){console.warn("THREE.Projector: .unprojectVector() is now vector.unproject().");a.unproject(b)};this.pickingRay=function(){console.error("THREE.Projector: .pickingRay() is now raycaster.setFromCamera().")}};l.CanvasRenderer=
-function(){console.error("THREE.CanvasRenderer has been moved to /examples/js/renderers/CanvasRenderer.js");this.domElement=document.createElementNS("http://www.w3.org/1999/xhtml","canvas");this.clear=function(){};this.render=function(){};this.setClearColor=function(){};this.setSize=function(){}};l.SceneUtils={createMultiMaterialObject:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")},detach:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")},
-attach:function(){console.error("THREE.SceneUtils has been moved to /examples/js/utils/SceneUtils.js")}};l.LensFlare=function(){console.error("THREE.LensFlare has been moved to /examples/js/objects/Lensflare.js")};Object.defineProperty(l,"__esModule",{value:!0})});
-
-},{}],227:[function(require,module,exports){
-'use strict';
-
-module.exports = TinyQueue;
-
-function TinyQueue(data, compare) {
-    if (!(this instanceof TinyQueue)) return new TinyQueue(data, compare);
-
-    this.data = data || [];
-    this.length = this.data.length;
-    this.compare = compare || defaultCompare;
-
-    if (this.length > 0) {
-        for (var i = (this.length >> 1); i >= 0; i--) this._down(i);
-    }
-}
-
-function defaultCompare(a, b) {
-    return a < b ? -1 : a > b ? 1 : 0;
-}
-
-TinyQueue.prototype = {
-
-    push: function (item) {
-        this.data.push(item);
-        this.length++;
-        this._up(this.length - 1);
-    },
-
-    pop: function () {
-        if (this.length === 0) return undefined;
-        var top = this.data[0];
-        this.length--;
-        if (this.length > 0) {
-            this.data[0] = this.data[this.length];
-            this._down(0);
-        }
-        this.data.pop();
-        return top;
-    },
-
-    peek: function () {
-        return this.data[0];
-    },
-
-    _up: function (pos) {
-        var data = this.data;
-        var compare = this.compare;
-        var item = data[pos];
-
-        while (pos > 0) {
-            var parent = (pos - 1) >> 1;
-            var current = data[parent];
-            if (compare(item, current) >= 0) break;
-            data[pos] = current;
-            pos = parent;
-        }
-
-        data[pos] = item;
-    },
-
-    _down: function (pos) {
-        var data = this.data;
-        var compare = this.compare;
-        var len = this.length;
-        var halfLen = len >> 1;
-        var item = data[pos];
-
-        while (pos < halfLen) {
-            var left = (pos << 1) + 1;
-            var right = left + 1;
-            var best = data[left];
-
-            if (right < len && compare(data[right], best) < 0) {
-                left = right;
-                best = data[right];
-            }
-            if (compare(best, item) >= 0) break;
-
-            data[pos] = best;
-            pos = left;
-        }
-
-        data[pos] = item;
-    }
-};
-
-},{}],228:[function(require,module,exports){
-var createElement = require("./vdom/create-element.js")
-
-module.exports = createElement
-
-},{"./vdom/create-element.js":234}],229:[function(require,module,exports){
-var diff = require("./vtree/diff.js")
-
-module.exports = diff
-
-},{"./vtree/diff.js":254}],230:[function(require,module,exports){
-var h = require("./virtual-hyperscript/index.js")
-
-module.exports = h
-
-},{"./virtual-hyperscript/index.js":241}],231:[function(require,module,exports){
-var diff = require("./diff.js")
-var patch = require("./patch.js")
-var h = require("./h.js")
-var create = require("./create-element.js")
-var VNode = require('./vnode/vnode.js')
-var VText = require('./vnode/vtext.js')
-
-module.exports = {
-    diff: diff,
-    patch: patch,
-    h: h,
-    create: create,
-    VNode: VNode,
-    VText: VText
-}
-
-},{"./create-element.js":228,"./diff.js":229,"./h.js":230,"./patch.js":232,"./vnode/vnode.js":250,"./vnode/vtext.js":252}],232:[function(require,module,exports){
-var patch = require("./vdom/patch.js")
-
-module.exports = patch
-
-},{"./vdom/patch.js":237}],233:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook.js")
-
-module.exports = applyProperties
-
-function applyProperties(node, props, previous) {
-    for (var propName in props) {
-        var propValue = props[propName]
-
-        if (propValue === undefined) {
-            removeProperty(node, propName, propValue, previous);
-        } else if (isHook(propValue)) {
-            removeProperty(node, propName, propValue, previous)
-            if (propValue.hook) {
-                propValue.hook(node,
-                    propName,
-                    previous ? previous[propName] : undefined)
-            }
-        } else {
-            if (isObject(propValue)) {
-                patchObject(node, props, previous, propName, propValue);
-            } else {
-                node[propName] = propValue
-            }
-        }
-    }
-}
-
-function removeProperty(node, propName, propValue, previous) {
-    if (previous) {
-        var previousValue = previous[propName]
-
-        if (!isHook(previousValue)) {
-            if (propName === "attributes") {
-                for (var attrName in previousValue) {
-                    node.removeAttribute(attrName)
-                }
-            } else if (propName === "style") {
-                for (var i in previousValue) {
-                    node.style[i] = ""
-                }
-            } else if (typeof previousValue === "string") {
-                node[propName] = ""
-            } else {
-                node[propName] = null
-            }
-        } else if (previousValue.unhook) {
-            previousValue.unhook(node, propName, propValue)
-        }
-    }
-}
-
-function patchObject(node, props, previous, propName, propValue) {
-    var previousValue = previous ? previous[propName] : undefined
-
-    // Set attributes
-    if (propName === "attributes") {
-        for (var attrName in propValue) {
-            var attrValue = propValue[attrName]
-
-            if (attrValue === undefined) {
-                node.removeAttribute(attrName)
-            } else {
-                node.setAttribute(attrName, attrValue)
-            }
-        }
-
-        return
-    }
-
-    if(previousValue && isObject(previousValue) &&
-        getPrototype(previousValue) !== getPrototype(propValue)) {
-        node[propName] = propValue
-        return
-    }
-
-    if (!isObject(node[propName])) {
-        node[propName] = {}
-    }
-
-    var replacer = propName === "style" ? "" : undefined
-
-    for (var k in propValue) {
-        var value = propValue[k]
-        node[propName][k] = (value === undefined) ? replacer : value
-    }
-}
-
-function getPrototype(value) {
-    if (Object.getPrototypeOf) {
-        return Object.getPrototypeOf(value)
-    } else if (value.__proto__) {
-        return value.__proto__
-    } else if (value.constructor) {
-        return value.constructor.prototype
-    }
-}
-
-},{"../vnode/is-vhook.js":245,"is-object":20}],234:[function(require,module,exports){
-var document = require("global/document")
-
-var applyProperties = require("./apply-properties")
-
-var isVNode = require("../vnode/is-vnode.js")
-var isVText = require("../vnode/is-vtext.js")
-var isWidget = require("../vnode/is-widget.js")
-var handleThunk = require("../vnode/handle-thunk.js")
-
-module.exports = createElement
-
-function createElement(vnode, opts) {
-    var doc = opts ? opts.document || document : document
-    var warn = opts ? opts.warn : null
-
-    vnode = handleThunk(vnode).a
-
-    if (isWidget(vnode)) {
-        return vnode.init()
-    } else if (isVText(vnode)) {
-        return doc.createTextNode(vnode.text)
-    } else if (!isVNode(vnode)) {
-        if (warn) {
-            warn("Item is not a valid virtual dom node", vnode)
-        }
-        return null
-    }
-
-    var node = (vnode.namespace === null) ?
-        doc.createElement(vnode.tagName) :
-        doc.createElementNS(vnode.namespace, vnode.tagName)
-
-    var props = vnode.properties
-    applyProperties(node, props)
-
-    var children = vnode.children
-
-    for (var i = 0; i < children.length; i++) {
-        var childNode = createElement(children[i], opts)
-        if (childNode) {
-            node.appendChild(childNode)
-        }
-    }
-
-    return node
-}
-
-},{"../vnode/handle-thunk.js":243,"../vnode/is-vnode.js":246,"../vnode/is-vtext.js":247,"../vnode/is-widget.js":248,"./apply-properties":233,"global/document":16}],235:[function(require,module,exports){
-// Maps a virtual DOM tree onto a real DOM tree in an efficient manner.
-// We don't want to read all of the DOM nodes in the tree so we use
-// the in-order tree indexing to eliminate recursion down certain branches.
-// We only recurse into a DOM node if we know that it contains a child of
-// interest.
-
-var noChild = {}
-
-module.exports = domIndex
-
-function domIndex(rootNode, tree, indices, nodes) {
-    if (!indices || indices.length === 0) {
-        return {}
-    } else {
-        indices.sort(ascending)
-        return recurse(rootNode, tree, indices, nodes, 0)
-    }
-}
-
-function recurse(rootNode, tree, indices, nodes, rootIndex) {
-    nodes = nodes || {}
-
-
-    if (rootNode) {
-        if (indexInRange(indices, rootIndex, rootIndex)) {
-            nodes[rootIndex] = rootNode
-        }
-
-        var vChildren = tree.children
-
-        if (vChildren) {
-
-            var childNodes = rootNode.childNodes
-
-            for (var i = 0; i < tree.children.length; i++) {
-                rootIndex += 1
-
-                var vChild = vChildren[i] || noChild
-                var nextIndex = rootIndex + (vChild.count || 0)
-
-                // skip recursion down the tree if there are no nodes down here
-                if (indexInRange(indices, rootIndex, nextIndex)) {
-                    recurse(childNodes[i], vChild, indices, nodes, rootIndex)
-                }
-
-                rootIndex = nextIndex
-            }
-        }
-    }
-
-    return nodes
-}
-
-// Binary search for an index in the interval [left, right]
-function indexInRange(indices, left, right) {
-    if (indices.length === 0) {
-        return false
-    }
-
-    var minIndex = 0
-    var maxIndex = indices.length - 1
-    var currentIndex
-    var currentItem
-
-    while (minIndex <= maxIndex) {
-        currentIndex = ((maxIndex + minIndex) / 2) >> 0
-        currentItem = indices[currentIndex]
-
-        if (minIndex === maxIndex) {
-            return currentItem >= left && currentItem <= right
-        } else if (currentItem < left) {
-            minIndex = currentIndex + 1
-        } else  if (currentItem > right) {
-            maxIndex = currentIndex - 1
-        } else {
-            return true
-        }
-    }
-
-    return false;
-}
-
-function ascending(a, b) {
-    return a > b ? 1 : -1
-}
-
-},{}],236:[function(require,module,exports){
-var applyProperties = require("./apply-properties")
-
-var isWidget = require("../vnode/is-widget.js")
-var VPatch = require("../vnode/vpatch.js")
-
-var updateWidget = require("./update-widget")
-
-module.exports = applyPatch
-
-function applyPatch(vpatch, domNode, renderOptions) {
-    var type = vpatch.type
-    var vNode = vpatch.vNode
-    var patch = vpatch.patch
-
-    switch (type) {
-        case VPatch.REMOVE:
-            return removeNode(domNode, vNode)
-        case VPatch.INSERT:
-            return insertNode(domNode, patch, renderOptions)
-        case VPatch.VTEXT:
-            return stringPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.WIDGET:
-            return widgetPatch(domNode, vNode, patch, renderOptions)
-        case VPatch.VNODE:
-            return vNodePatch(domNode, vNode, patch, renderOptions)
-        case VPatch.ORDER:
-            reorderChildren(domNode, patch)
-            return domNode
-        case VPatch.PROPS:
-            applyProperties(domNode, patch, vNode.properties)
-            return domNode
-        case VPatch.THUNK:
-            return replaceRoot(domNode,
-                renderOptions.patch(domNode, patch, renderOptions))
-        default:
-            return domNode
-    }
-}
-
-function removeNode(domNode, vNode) {
-    var parentNode = domNode.parentNode
-
-    if (parentNode) {
-        parentNode.removeChild(domNode)
-    }
-
-    destroyWidget(domNode, vNode);
-
-    return null
-}
-
-function insertNode(parentNode, vNode, renderOptions) {
-    var newNode = renderOptions.render(vNode, renderOptions)
-
-    if (parentNode) {
-        parentNode.appendChild(newNode)
-    }
-
-    return parentNode
-}
-
-function stringPatch(domNode, leftVNode, vText, renderOptions) {
-    var newNode
-
-    if (domNode.nodeType === 3) {
-        domNode.replaceData(0, domNode.length, vText.text)
-        newNode = domNode
-    } else {
-        var parentNode = domNode.parentNode
-        newNode = renderOptions.render(vText, renderOptions)
-
-        if (parentNode && newNode !== domNode) {
-            parentNode.replaceChild(newNode, domNode)
-        }
-    }
-
-    return newNode
-}
-
-function widgetPatch(domNode, leftVNode, widget, renderOptions) {
-    var updating = updateWidget(leftVNode, widget)
-    var newNode
-
-    if (updating) {
-        newNode = widget.update(leftVNode, domNode) || domNode
-    } else {
-        newNode = renderOptions.render(widget, renderOptions)
-    }
-
-    var parentNode = domNode.parentNode
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
-    }
-
-    if (!updating) {
-        destroyWidget(domNode, leftVNode)
-    }
-
-    return newNode
-}
-
-function vNodePatch(domNode, leftVNode, vNode, renderOptions) {
-    var parentNode = domNode.parentNode
-    var newNode = renderOptions.render(vNode, renderOptions)
-
-    if (parentNode && newNode !== domNode) {
-        parentNode.replaceChild(newNode, domNode)
-    }
-
-    return newNode
-}
-
-function destroyWidget(domNode, w) {
-    if (typeof w.destroy === "function" && isWidget(w)) {
-        w.destroy(domNode)
-    }
-}
-
-function reorderChildren(domNode, moves) {
-    var childNodes = domNode.childNodes
-    var keyMap = {}
-    var node
-    var remove
-    var insert
-
-    for (var i = 0; i < moves.removes.length; i++) {
-        remove = moves.removes[i]
-        node = childNodes[remove.from]
-        if (remove.key) {
-            keyMap[remove.key] = node
-        }
-        domNode.removeChild(node)
-    }
-
-    var length = childNodes.length
-    for (var j = 0; j < moves.inserts.length; j++) {
-        insert = moves.inserts[j]
-        node = keyMap[insert.key]
-        // this is the weirdest bug i've ever seen in webkit
-        domNode.insertBefore(node, insert.to >= length++ ? null : childNodes[insert.to])
-    }
-}
-
-function replaceRoot(oldRoot, newRoot) {
-    if (oldRoot && newRoot && oldRoot !== newRoot && oldRoot.parentNode) {
-        oldRoot.parentNode.replaceChild(newRoot, oldRoot)
-    }
-
-    return newRoot;
-}
-
-},{"../vnode/is-widget.js":248,"../vnode/vpatch.js":251,"./apply-properties":233,"./update-widget":238}],237:[function(require,module,exports){
-var document = require("global/document")
-var isArray = require("x-is-array")
-
-var render = require("./create-element")
-var domIndex = require("./dom-index")
-var patchOp = require("./patch-op")
-module.exports = patch
-
-function patch(rootNode, patches, renderOptions) {
-    renderOptions = renderOptions || {}
-    renderOptions.patch = renderOptions.patch && renderOptions.patch !== patch
-        ? renderOptions.patch
-        : patchRecursive
-    renderOptions.render = renderOptions.render || render
-
-    return renderOptions.patch(rootNode, patches, renderOptions)
-}
-
-function patchRecursive(rootNode, patches, renderOptions) {
-    var indices = patchIndices(patches)
-
-    if (indices.length === 0) {
-        return rootNode
-    }
-
-    var index = domIndex(rootNode, patches.a, indices)
-    var ownerDocument = rootNode.ownerDocument
-
-    if (!renderOptions.document && ownerDocument !== document) {
-        renderOptions.document = ownerDocument
-    }
-
-    for (var i = 0; i < indices.length; i++) {
-        var nodeIndex = indices[i]
-        rootNode = applyPatch(rootNode,
-            index[nodeIndex],
-            patches[nodeIndex],
-            renderOptions)
-    }
-
-    return rootNode
-}
-
-function applyPatch(rootNode, domNode, patchList, renderOptions) {
-    if (!domNode) {
-        return rootNode
-    }
-
-    var newNode
-
-    if (isArray(patchList)) {
-        for (var i = 0; i < patchList.length; i++) {
-            newNode = patchOp(patchList[i], domNode, renderOptions)
-
-            if (domNode === rootNode) {
-                rootNode = newNode
-            }
-        }
-    } else {
-        newNode = patchOp(patchList, domNode, renderOptions)
-
-        if (domNode === rootNode) {
-            rootNode = newNode
-        }
-    }
-
-    return rootNode
-}
-
-function patchIndices(patches) {
-    var indices = []
-
-    for (var key in patches) {
-        if (key !== "a") {
-            indices.push(Number(key))
-        }
-    }
-
-    return indices
-}
-
-},{"./create-element":234,"./dom-index":235,"./patch-op":236,"global/document":16,"x-is-array":273}],238:[function(require,module,exports){
-var isWidget = require("../vnode/is-widget.js")
-
-module.exports = updateWidget
-
-function updateWidget(a, b) {
-    if (isWidget(a) && isWidget(b)) {
-        if ("name" in a && "name" in b) {
-            return a.id === b.id
-        } else {
-            return a.init === b.init
-        }
-    }
-
-    return false
-}
-
-},{"../vnode/is-widget.js":248}],239:[function(require,module,exports){
-'use strict';
-
-var EvStore = require('ev-store');
-
-module.exports = EvHook;
-
-function EvHook(value) {
-    if (!(this instanceof EvHook)) {
-        return new EvHook(value);
-    }
-
-    this.value = value;
-}
-
-EvHook.prototype.hook = function (node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = this.value;
-};
-
-EvHook.prototype.unhook = function(node, propertyName) {
-    var es = EvStore(node);
-    var propName = propertyName.substr(3);
-
-    es[propName] = undefined;
-};
-
-},{"ev-store":9}],240:[function(require,module,exports){
-'use strict';
-
-module.exports = SoftSetHook;
-
-function SoftSetHook(value) {
-    if (!(this instanceof SoftSetHook)) {
-        return new SoftSetHook(value);
-    }
-
-    this.value = value;
-}
-
-SoftSetHook.prototype.hook = function (node, propertyName) {
-    if (node[propertyName] !== this.value) {
-        node[propertyName] = this.value;
-    }
-};
-
-},{}],241:[function(require,module,exports){
-'use strict';
-
-var isArray = require('x-is-array');
-
-var VNode = require('../vnode/vnode.js');
-var VText = require('../vnode/vtext.js');
-var isVNode = require('../vnode/is-vnode');
-var isVText = require('../vnode/is-vtext');
-var isWidget = require('../vnode/is-widget');
-var isHook = require('../vnode/is-vhook');
-var isVThunk = require('../vnode/is-thunk');
-
-var parseTag = require('./parse-tag.js');
-var softSetHook = require('./hooks/soft-set-hook.js');
-var evHook = require('./hooks/ev-hook.js');
-
-module.exports = h;
-
-function h(tagName, properties, children) {
-    var childNodes = [];
-    var tag, props, key, namespace;
-
-    if (!children && isChildren(properties)) {
-        children = properties;
-        props = {};
-    }
-
-    props = props || properties || {};
-    tag = parseTag(tagName, props);
-
-    // support keys
-    if (props.hasOwnProperty('key')) {
-        key = props.key;
-        props.key = undefined;
-    }
-
-    // support namespace
-    if (props.hasOwnProperty('namespace')) {
-        namespace = props.namespace;
-        props.namespace = undefined;
-    }
-
-    // fix cursor bug
-    if (tag === 'INPUT' &&
-        !namespace &&
-        props.hasOwnProperty('value') &&
-        props.value !== undefined &&
-        !isHook(props.value)
-    ) {
-        props.value = softSetHook(props.value);
-    }
-
-    transformProperties(props);
-
-    if (children !== undefined && children !== null) {
-        addChild(children, childNodes, tag, props);
-    }
-
-
-    return new VNode(tag, props, childNodes, key, namespace);
-}
-
-function addChild(c, childNodes, tag, props) {
-    if (typeof c === 'string') {
-        childNodes.push(new VText(c));
-    } else if (typeof c === 'number') {
-        childNodes.push(new VText(String(c)));
-    } else if (isChild(c)) {
-        childNodes.push(c);
-    } else if (isArray(c)) {
-        for (var i = 0; i < c.length; i++) {
-            addChild(c[i], childNodes, tag, props);
-        }
-    } else if (c === null || c === undefined) {
-        return;
-    } else {
-        throw UnexpectedVirtualElement({
-            foreignObject: c,
-            parentVnode: {
-                tagName: tag,
-                properties: props
-            }
-        });
-    }
-}
-
-function transformProperties(props) {
-    for (var propName in props) {
-        if (props.hasOwnProperty(propName)) {
-            var value = props[propName];
-
-            if (isHook(value)) {
-                continue;
-            }
-
-            if (propName.substr(0, 3) === 'ev-') {
-                // add ev-foo support
-                props[propName] = evHook(value);
-            }
-        }
-    }
-}
-
-function isChild(x) {
-    return isVNode(x) || isVText(x) || isWidget(x) || isVThunk(x);
-}
-
-function isChildren(x) {
-    return typeof x === 'string' || isArray(x) || isChild(x);
-}
-
-function UnexpectedVirtualElement(data) {
-    var err = new Error();
-
-    err.type = 'virtual-hyperscript.unexpected.virtual-element';
-    err.message = 'Unexpected virtual child passed to h().\n' +
-        'Expected a VNode / Vthunk / VWidget / string but:\n' +
-        'got:\n' +
-        errorString(data.foreignObject) +
-        '.\n' +
-        'The parent vnode is:\n' +
-        errorString(data.parentVnode)
-        '\n' +
-        'Suggested fix: change your `h(..., [ ... ])` callsite.';
-    err.foreignObject = data.foreignObject;
-    err.parentVnode = data.parentVnode;
-
-    return err;
-}
-
-function errorString(obj) {
-    try {
-        return JSON.stringify(obj, null, '    ');
-    } catch (e) {
-        return String(obj);
-    }
-}
-
-},{"../vnode/is-thunk":244,"../vnode/is-vhook":245,"../vnode/is-vnode":246,"../vnode/is-vtext":247,"../vnode/is-widget":248,"../vnode/vnode.js":250,"../vnode/vtext.js":252,"./hooks/ev-hook.js":239,"./hooks/soft-set-hook.js":240,"./parse-tag.js":242,"x-is-array":273}],242:[function(require,module,exports){
-'use strict';
-
-var split = require('browser-split');
-
-var classIdSplit = /([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/;
-var notClassId = /^\.|#/;
-
-module.exports = parseTag;
-
-function parseTag(tag, props) {
-    if (!tag) {
-        return 'DIV';
-    }
-
-    var noId = !(props.hasOwnProperty('id'));
-
-    var tagParts = split(tag, classIdSplit);
-    var tagName = null;
-
-    if (notClassId.test(tagParts[1])) {
-        tagName = 'DIV';
-    }
-
-    var classes, part, type, i;
-
-    for (i = 0; i < tagParts.length; i++) {
-        part = tagParts[i];
-
-        if (!part) {
-            continue;
-        }
-
-        type = part.charAt(0);
-
-        if (!tagName) {
-            tagName = part;
-        } else if (type === '.') {
-            classes = classes || [];
-            classes.push(part.substring(1, part.length));
-        } else if (type === '#' && noId) {
-            props.id = part.substring(1, part.length);
-        }
-    }
-
-    if (classes) {
-        if (props.className) {
-            classes.push(props.className);
-        }
-
-        props.className = classes.join(' ');
-    }
-
-    return props.namespace ? tagName : tagName.toUpperCase();
-}
-
-},{"browser-split":5}],243:[function(require,module,exports){
-var isVNode = require("./is-vnode")
-var isVText = require("./is-vtext")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-
-module.exports = handleThunk
-
-function handleThunk(a, b) {
-    var renderedA = a
-    var renderedB = b
-
-    if (isThunk(b)) {
-        renderedB = renderThunk(b, a)
-    }
-
-    if (isThunk(a)) {
-        renderedA = renderThunk(a, null)
-    }
-
-    return {
-        a: renderedA,
-        b: renderedB
-    }
-}
-
-function renderThunk(thunk, previous) {
-    var renderedThunk = thunk.vnode
-
-    if (!renderedThunk) {
-        renderedThunk = thunk.vnode = thunk.render(previous)
-    }
-
-    if (!(isVNode(renderedThunk) ||
-            isVText(renderedThunk) ||
-            isWidget(renderedThunk))) {
-        throw new Error("thunk did not return a valid node");
-    }
-
-    return renderedThunk
-}
-
-},{"./is-thunk":244,"./is-vnode":246,"./is-vtext":247,"./is-widget":248}],244:[function(require,module,exports){
-module.exports = isThunk
-
-function isThunk(t) {
-    return t && t.type === "Thunk"
-}
-
-},{}],245:[function(require,module,exports){
-module.exports = isHook
-
-function isHook(hook) {
-    return hook &&
-      (typeof hook.hook === "function" && !hook.hasOwnProperty("hook") ||
-       typeof hook.unhook === "function" && !hook.hasOwnProperty("unhook"))
-}
-
-},{}],246:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualNode
-
-function isVirtualNode(x) {
-    return x && x.type === "VirtualNode" && x.version === version
-}
-
-},{"./version":249}],247:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = isVirtualText
-
-function isVirtualText(x) {
-    return x && x.type === "VirtualText" && x.version === version
-}
-
-},{"./version":249}],248:[function(require,module,exports){
-module.exports = isWidget
-
-function isWidget(w) {
-    return w && w.type === "Widget"
-}
-
-},{}],249:[function(require,module,exports){
-module.exports = "2"
-
-},{}],250:[function(require,module,exports){
-var version = require("./version")
-var isVNode = require("./is-vnode")
-var isWidget = require("./is-widget")
-var isThunk = require("./is-thunk")
-var isVHook = require("./is-vhook")
-
-module.exports = VirtualNode
-
-var noProperties = {}
-var noChildren = []
-
-function VirtualNode(tagName, properties, children, key, namespace) {
-    this.tagName = tagName
-    this.properties = properties || noProperties
-    this.children = children || noChildren
-    this.key = key != null ? String(key) : undefined
-    this.namespace = (typeof namespace === "string") ? namespace : null
-
-    var count = (children && children.length) || 0
-    var descendants = 0
-    var hasWidgets = false
-    var hasThunks = false
-    var descendantHooks = false
-    var hooks
-
-    for (var propName in properties) {
-        if (properties.hasOwnProperty(propName)) {
-            var property = properties[propName]
-            if (isVHook(property) && property.unhook) {
-                if (!hooks) {
-                    hooks = {}
-                }
-
-                hooks[propName] = property
-            }
-        }
-    }
-
-    for (var i = 0; i < count; i++) {
-        var child = children[i]
-        if (isVNode(child)) {
-            descendants += child.count || 0
-
-            if (!hasWidgets && child.hasWidgets) {
-                hasWidgets = true
-            }
-
-            if (!hasThunks && child.hasThunks) {
-                hasThunks = true
-            }
-
-            if (!descendantHooks && (child.hooks || child.descendantHooks)) {
-                descendantHooks = true
-            }
-        } else if (!hasWidgets && isWidget(child)) {
-            if (typeof child.destroy === "function") {
-                hasWidgets = true
-            }
-        } else if (!hasThunks && isThunk(child)) {
-            hasThunks = true;
-        }
-    }
-
-    this.count = count + descendants
-    this.hasWidgets = hasWidgets
-    this.hasThunks = hasThunks
-    this.hooks = hooks
-    this.descendantHooks = descendantHooks
-}
-
-VirtualNode.prototype.version = version
-VirtualNode.prototype.type = "VirtualNode"
-
-},{"./is-thunk":244,"./is-vhook":245,"./is-vnode":246,"./is-widget":248,"./version":249}],251:[function(require,module,exports){
-var version = require("./version")
-
-VirtualPatch.NONE = 0
-VirtualPatch.VTEXT = 1
-VirtualPatch.VNODE = 2
-VirtualPatch.WIDGET = 3
-VirtualPatch.PROPS = 4
-VirtualPatch.ORDER = 5
-VirtualPatch.INSERT = 6
-VirtualPatch.REMOVE = 7
-VirtualPatch.THUNK = 8
-
-module.exports = VirtualPatch
-
-function VirtualPatch(type, vNode, patch) {
-    this.type = Number(type)
-    this.vNode = vNode
-    this.patch = patch
-}
-
-VirtualPatch.prototype.version = version
-VirtualPatch.prototype.type = "VirtualPatch"
-
-},{"./version":249}],252:[function(require,module,exports){
-var version = require("./version")
-
-module.exports = VirtualText
-
-function VirtualText(text) {
-    this.text = String(text)
-}
-
-VirtualText.prototype.version = version
-VirtualText.prototype.type = "VirtualText"
-
-},{"./version":249}],253:[function(require,module,exports){
-var isObject = require("is-object")
-var isHook = require("../vnode/is-vhook")
-
-module.exports = diffProps
-
-function diffProps(a, b) {
-    var diff
-
-    for (var aKey in a) {
-        if (!(aKey in b)) {
-            diff = diff || {}
-            diff[aKey] = undefined
-        }
-
-        var aValue = a[aKey]
-        var bValue = b[aKey]
-
-        if (aValue === bValue) {
-            continue
-        } else if (isObject(aValue) && isObject(bValue)) {
-            if (getPrototype(bValue) !== getPrototype(aValue)) {
-                diff = diff || {}
-                diff[aKey] = bValue
-            } else if (isHook(bValue)) {
-                 diff = diff || {}
-                 diff[aKey] = bValue
-            } else {
-                var objectDiff = diffProps(aValue, bValue)
-                if (objectDiff) {
-                    diff = diff || {}
-                    diff[aKey] = objectDiff
-                }
-            }
-        } else {
-            diff = diff || {}
-            diff[aKey] = bValue
-        }
-    }
-
-    for (var bKey in b) {
-        if (!(bKey in a)) {
-            diff = diff || {}
-            diff[bKey] = b[bKey]
-        }
-    }
-
-    return diff
-}
-
-function getPrototype(value) {
-  if (Object.getPrototypeOf) {
-    return Object.getPrototypeOf(value)
-  } else if (value.__proto__) {
-    return value.__proto__
-  } else if (value.constructor) {
-    return value.constructor.prototype
-  }
-}
-
-},{"../vnode/is-vhook":245,"is-object":20}],254:[function(require,module,exports){
-var isArray = require("x-is-array")
-
-var VPatch = require("../vnode/vpatch")
-var isVNode = require("../vnode/is-vnode")
-var isVText = require("../vnode/is-vtext")
-var isWidget = require("../vnode/is-widget")
-var isThunk = require("../vnode/is-thunk")
-var handleThunk = require("../vnode/handle-thunk")
-
-var diffProps = require("./diff-props")
-
-module.exports = diff
-
-function diff(a, b) {
-    var patch = { a: a }
-    walk(a, b, patch, 0)
-    return patch
-}
-
-function walk(a, b, patch, index) {
-    if (a === b) {
-        return
-    }
-
-    var apply = patch[index]
-    var applyClear = false
-
-    if (isThunk(a) || isThunk(b)) {
-        thunks(a, b, patch, index)
-    } else if (b == null) {
-
-        // If a is a widget we will add a remove patch for it
-        // Otherwise any child widgets/hooks must be destroyed.
-        // This prevents adding two remove patches for a widget.
-        if (!isWidget(a)) {
-            clearState(a, patch, index)
-            apply = patch[index]
-        }
-
-        apply = appendPatch(apply, new VPatch(VPatch.REMOVE, a, b))
-    } else if (isVNode(b)) {
-        if (isVNode(a)) {
-            if (a.tagName === b.tagName &&
-                a.namespace === b.namespace &&
-                a.key === b.key) {
-                var propsPatch = diffProps(a.properties, b.properties)
-                if (propsPatch) {
-                    apply = appendPatch(apply,
-                        new VPatch(VPatch.PROPS, a, propsPatch))
-                }
-                apply = diffChildren(a, b, patch, apply, index)
-            } else {
-                apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-                applyClear = true
-            }
-        } else {
-            apply = appendPatch(apply, new VPatch(VPatch.VNODE, a, b))
-            applyClear = true
-        }
-    } else if (isVText(b)) {
-        if (!isVText(a)) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
-            applyClear = true
-        } else if (a.text !== b.text) {
-            apply = appendPatch(apply, new VPatch(VPatch.VTEXT, a, b))
-        }
-    } else if (isWidget(b)) {
-        if (!isWidget(a)) {
-            applyClear = true
-        }
-
-        apply = appendPatch(apply, new VPatch(VPatch.WIDGET, a, b))
-    }
-
-    if (apply) {
-        patch[index] = apply
-    }
-
-    if (applyClear) {
-        clearState(a, patch, index)
-    }
-}
-
-function diffChildren(a, b, patch, apply, index) {
-    var aChildren = a.children
-    var orderedSet = reorder(aChildren, b.children)
-    var bChildren = orderedSet.children
-
-    var aLen = aChildren.length
-    var bLen = bChildren.length
-    var len = aLen > bLen ? aLen : bLen
-
-    for (var i = 0; i < len; i++) {
-        var leftNode = aChildren[i]
-        var rightNode = bChildren[i]
-        index += 1
-
-        if (!leftNode) {
-            if (rightNode) {
-                // Excess nodes in b need to be added
-                apply = appendPatch(apply,
-                    new VPatch(VPatch.INSERT, null, rightNode))
-            }
-        } else {
-            walk(leftNode, rightNode, patch, index)
-        }
-
-        if (isVNode(leftNode) && leftNode.count) {
-            index += leftNode.count
-        }
-    }
-
-    if (orderedSet.moves) {
-        // Reorder nodes last
-        apply = appendPatch(apply, new VPatch(
-            VPatch.ORDER,
-            a,
-            orderedSet.moves
-        ))
-    }
-
-    return apply
-}
-
-function clearState(vNode, patch, index) {
-    // TODO: Make this a single walk, not two
-    unhook(vNode, patch, index)
-    destroyWidgets(vNode, patch, index)
-}
-
-// Patch records for all destroyed widgets must be added because we need
-// a DOM node reference for the destroy function
-function destroyWidgets(vNode, patch, index) {
-    if (isWidget(vNode)) {
-        if (typeof vNode.destroy === "function") {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(VPatch.REMOVE, vNode, null)
-            )
-        }
-    } else if (isVNode(vNode) && (vNode.hasWidgets || vNode.hasThunks)) {
-        var children = vNode.children
-        var len = children.length
-        for (var i = 0; i < len; i++) {
-            var child = children[i]
-            index += 1
-
-            destroyWidgets(child, patch, index)
-
-            if (isVNode(child) && child.count) {
-                index += child.count
-            }
-        }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
-    }
-}
-
-// Create a sub-patch for thunks
-function thunks(a, b, patch, index) {
-    var nodes = handleThunk(a, b)
-    var thunkPatch = diff(nodes.a, nodes.b)
-    if (hasPatches(thunkPatch)) {
-        patch[index] = new VPatch(VPatch.THUNK, null, thunkPatch)
-    }
-}
-
-function hasPatches(patch) {
-    for (var index in patch) {
-        if (index !== "a") {
-            return true
-        }
-    }
-
-    return false
-}
-
-// Execute hooks when two nodes are identical
-function unhook(vNode, patch, index) {
-    if (isVNode(vNode)) {
-        if (vNode.hooks) {
-            patch[index] = appendPatch(
-                patch[index],
-                new VPatch(
-                    VPatch.PROPS,
-                    vNode,
-                    undefinedKeys(vNode.hooks)
-                )
-            )
-        }
-
-        if (vNode.descendantHooks || vNode.hasThunks) {
-            var children = vNode.children
-            var len = children.length
-            for (var i = 0; i < len; i++) {
-                var child = children[i]
-                index += 1
-
-                unhook(child, patch, index)
-
-                if (isVNode(child) && child.count) {
-                    index += child.count
-                }
-            }
-        }
-    } else if (isThunk(vNode)) {
-        thunks(vNode, null, patch, index)
-    }
-}
-
-function undefinedKeys(obj) {
-    var result = {}
-
-    for (var key in obj) {
-        result[key] = undefined
-    }
-
-    return result
-}
-
-// List diff, naive left to right reordering
-function reorder(aChildren, bChildren) {
-    // O(M) time, O(M) memory
-    var bChildIndex = keyIndex(bChildren)
-    var bKeys = bChildIndex.keys
-    var bFree = bChildIndex.free
-
-    if (bFree.length === bChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
-        }
-    }
-
-    // O(N) time, O(N) memory
-    var aChildIndex = keyIndex(aChildren)
-    var aKeys = aChildIndex.keys
-    var aFree = aChildIndex.free
-
-    if (aFree.length === aChildren.length) {
-        return {
-            children: bChildren,
-            moves: null
-        }
-    }
-
-    // O(MAX(N, M)) memory
-    var newChildren = []
-
-    var freeIndex = 0
-    var freeCount = bFree.length
-    var deletedItems = 0
-
-    // Iterate through a and match a node in b
-    // O(N) time,
-    for (var i = 0 ; i < aChildren.length; i++) {
-        var aItem = aChildren[i]
-        var itemIndex
-
-        if (aItem.key) {
-            if (bKeys.hasOwnProperty(aItem.key)) {
-                // Match up the old keys
-                itemIndex = bKeys[aItem.key]
-                newChildren.push(bChildren[itemIndex])
-
-            } else {
-                // Remove old keyed items
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
-            }
-        } else {
-            // Match the item in a with the next free item in b
-            if (freeIndex < freeCount) {
-                itemIndex = bFree[freeIndex++]
-                newChildren.push(bChildren[itemIndex])
-            } else {
-                // There are no free items in b to match with
-                // the free items in a, so the extra free nodes
-                // are deleted.
-                itemIndex = i - deletedItems++
-                newChildren.push(null)
-            }
-        }
-    }
-
-    var lastFreeIndex = freeIndex >= bFree.length ?
-        bChildren.length :
-        bFree[freeIndex]
-
-    // Iterate through b and append any new keys
-    // O(M) time
-    for (var j = 0; j < bChildren.length; j++) {
-        var newItem = bChildren[j]
-
-        if (newItem.key) {
-            if (!aKeys.hasOwnProperty(newItem.key)) {
-                // Add any new keyed items
-                // We are adding new items to the end and then sorting them
-                // in place. In future we should insert new items in place.
-                newChildren.push(newItem)
-            }
-        } else if (j >= lastFreeIndex) {
-            // Add any leftover non-keyed items
-            newChildren.push(newItem)
-        }
-    }
-
-    var simulate = newChildren.slice()
-    var simulateIndex = 0
-    var removes = []
-    var inserts = []
-    var simulateItem
-
-    for (var k = 0; k < bChildren.length;) {
-        var wantedItem = bChildren[k]
-        simulateItem = simulate[simulateIndex]
-
-        // remove items
-        while (simulateItem === null && simulate.length) {
-            removes.push(remove(simulate, simulateIndex, null))
-            simulateItem = simulate[simulateIndex]
-        }
-
-        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-            // if we need a key in this position...
-            if (wantedItem.key) {
-                if (simulateItem && simulateItem.key) {
-                    // if an insert doesn't put this key in place, it needs to move
-                    if (bKeys[simulateItem.key] !== k + 1) {
-                        removes.push(remove(simulate, simulateIndex, simulateItem.key))
-                        simulateItem = simulate[simulateIndex]
-                        // if the remove didn't put the wanted item in place, we need to insert it
-                        if (!simulateItem || simulateItem.key !== wantedItem.key) {
-                            inserts.push({key: wantedItem.key, to: k})
-                        }
-                        // items are matching, so skip ahead
-                        else {
-                            simulateIndex++
-                        }
-                    }
-                    else {
-                        inserts.push({key: wantedItem.key, to: k})
-                    }
-                }
-                else {
-                    inserts.push({key: wantedItem.key, to: k})
-                }
-                k++
-            }
-            // a key in simulate has no matching wanted key, remove it
-            else if (simulateItem && simulateItem.key) {
-                removes.push(remove(simulate, simulateIndex, simulateItem.key))
-            }
-        }
-        else {
-            simulateIndex++
-            k++
-        }
-    }
-
-    // remove all the remaining nodes from simulate
-    while(simulateIndex < simulate.length) {
-        simulateItem = simulate[simulateIndex]
-        removes.push(remove(simulate, simulateIndex, simulateItem && simulateItem.key))
-    }
-
-    // If the only moves we have are deletes then we can just
-    // let the delete patch remove these items.
-    if (removes.length === deletedItems && !inserts.length) {
-        return {
-            children: newChildren,
-            moves: null
-        }
-    }
-
-    return {
-        children: newChildren,
-        moves: {
-            removes: removes,
-            inserts: inserts
-        }
-    }
-}
-
-function remove(arr, index, key) {
-    arr.splice(index, 1)
-
-    return {
-        from: index,
-        key: key
-    }
-}
-
-function keyIndex(children) {
-    var keys = {}
-    var free = []
-    var length = children.length
-
-    for (var i = 0; i < length; i++) {
-        var child = children[i]
-
-        if (child.key) {
-            keys[child.key] = i
-        } else {
-            free.push(i)
-        }
-    }
-
-    return {
-        keys: keys,     // A hash of key name to index
-        free: free      // An array of unkeyed item indices
-    }
-}
-
-function appendPatch(apply, patch) {
-    if (apply) {
-        if (isArray(apply)) {
-            apply.push(patch)
-        } else {
-            apply = [apply, patch]
-        }
-
-        return apply
-    } else {
-        return patch
-    }
-}
-
-},{"../vnode/handle-thunk":243,"../vnode/is-thunk":244,"../vnode/is-vnode":246,"../vnode/is-vtext":247,"../vnode/is-widget":248,"../vnode/vpatch":251,"./diff-props":253,"x-is-array":273}],255:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function (require) {
-
-       var makePromise = require('./makePromise');
-       var Scheduler = require('./Scheduler');
-       var async = require('./env').asap;
-
-       return makePromise({
-               scheduler: new Scheduler(async)
-       });
-
-});
-})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
-
-},{"./Scheduler":256,"./env":268,"./makePromise":270}],256:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       // Credit to Twisol (https://github.com/Twisol) for suggesting
-       // this type of extensible queue + trampoline approach for next-tick conflation.
-
-       /**
-        * Async task scheduler
-        * @param {function} async function to schedule a single async function
-        * @constructor
-        */
-       function Scheduler(async) {
-               this._async = async;
-               this._running = false;
-
-               this._queue = this;
-               this._queueLen = 0;
-               this._afterQueue = {};
-               this._afterQueueLen = 0;
-
-               var self = this;
-               this.drain = function() {
-                       self._drain();
-               };
-       }
-
-       /**
-        * Enqueue a task
-        * @param {{ run:function }} task
-        */
-       Scheduler.prototype.enqueue = function(task) {
-               this._queue[this._queueLen++] = task;
-               this.run();
-       };
-
-       /**
-        * Enqueue a task to run after the main task queue
-        * @param {{ run:function }} task
-        */
-       Scheduler.prototype.afterQueue = function(task) {
-               this._afterQueue[this._afterQueueLen++] = task;
-               this.run();
-       };
-
-       Scheduler.prototype.run = function() {
-               if (!this._running) {
-                       this._running = true;
-                       this._async(this.drain);
-               }
-       };
-
-       /**
-        * Drain the handler queue entirely, and then the after queue
-        */
-       Scheduler.prototype._drain = function() {
-               var i = 0;
-               for (; i < this._queueLen; ++i) {
-                       this._queue[i].run();
-                       this._queue[i] = void 0;
-               }
-
-               this._queueLen = 0;
-               this._running = false;
-
-               for (i = 0; i < this._afterQueueLen; ++i) {
-                       this._afterQueue[i].run();
-                       this._afterQueue[i] = void 0;
-               }
-
-               this._afterQueueLen = 0;
-       };
-
-       return Scheduler;
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],257:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       /**
-        * Custom error type for promises rejected by promise.timeout
-        * @param {string} message
-        * @constructor
-        */
-       function TimeoutError (message) {
-               Error.call(this);
-               this.message = message;
-               this.name = TimeoutError.name;
-               if (typeof Error.captureStackTrace === 'function') {
-                       Error.captureStackTrace(this, TimeoutError);
-               }
-       }
-
-       TimeoutError.prototype = Object.create(Error.prototype);
-       TimeoutError.prototype.constructor = TimeoutError;
-
-       return TimeoutError;
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-},{}],258:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       makeApply.tryCatchResolve = tryCatchResolve;
-
-       return makeApply;
-
-       function makeApply(Promise, call) {
-               if(arguments.length < 2) {
-                       call = tryCatchResolve;
-               }
-
-               return apply;
-
-               function apply(f, thisArg, args) {
-                       var p = Promise._defer();
-                       var l = args.length;
-                       var params = new Array(l);
-                       callAndResolve({ f:f, thisArg:thisArg, args:args, params:params, i:l-1, call:call }, p._handler);
-
-                       return p;
-               }
-
-               function callAndResolve(c, h) {
-                       if(c.i < 0) {
-                               return call(c.f, c.thisArg, c.params, h);
-                       }
-
-                       var handler = Promise._handler(c.args[c.i]);
-                       handler.fold(callAndResolveNext, c, void 0, h);
-               }
-
-               function callAndResolveNext(c, x, h) {
-                       c.params[c.i] = x;
-                       c.i -= 1;
-                       callAndResolve(c, h);
-               }
-       }
-
-       function tryCatchResolve(f, thisArg, args, resolver) {
-               try {
-                       resolver.resolve(f.apply(thisArg, args));
-               } catch(e) {
-                       resolver.reject(e);
-               }
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-
-
-},{}],259:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var state = require('../state');
-       var applier = require('../apply');
-
-       return function array(Promise) {
-
-               var applyFold = applier(Promise);
-               var toPromise = Promise.resolve;
-               var all = Promise.all;
-
-               var ar = Array.prototype.reduce;
-               var arr = Array.prototype.reduceRight;
-               var slice = Array.prototype.slice;
-
-               // Additional array combinators
-
-               Promise.any = any;
-               Promise.some = some;
-               Promise.settle = settle;
-
-               Promise.map = map;
-               Promise.filter = filter;
-               Promise.reduce = reduce;
-               Promise.reduceRight = reduceRight;
-
-               /**
-                * When this promise fulfills with an array, do
-                * onFulfilled.apply(void 0, array)
-                * @param {function} onFulfilled function to apply
-                * @returns {Promise} promise for the result of applying onFulfilled
-                */
-               Promise.prototype.spread = function(onFulfilled) {
-                       return this.then(all).then(function(array) {
-                               return onFulfilled.apply(this, array);
-                       });
-               };
-
-               return Promise;
-
-               /**
-                * One-winner competitive race.
-                * Return a promise that will fulfill when one of the promises
-                * in the input array fulfills, or will reject when all promises
-                * have rejected.
-                * @param {array} promises
-                * @returns {Promise} promise for the first fulfilled value
-                */
-               function any(promises) {
-                       var p = Promise._defer();
-                       var resolver = p._handler;
-                       var l = promises.length>>>0;
-
-                       var pending = l;
-                       var errors = [];
-
-                       for (var h, x, i = 0; i < l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       --pending;
-                                       continue;
-                               }
-
-                               h = Promise._handler(x);
-                               if(h.state() > 0) {
-                                       resolver.become(h);
-                                       Promise._visitRemaining(promises, i, h);
-                                       break;
-                               } else {
-                                       h.visit(resolver, handleFulfill, handleReject);
-                               }
-                       }
-
-                       if(pending === 0) {
-                               resolver.reject(new RangeError('any(): array must not be empty'));
-                       }
-
-                       return p;
-
-                       function handleFulfill(x) {
-                               /*jshint validthis:true*/
-                               errors = null;
-                               this.resolve(x); // this === resolver
-                       }
-
-                       function handleReject(e) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
-
-                               errors.push(e);
-                               if(--pending === 0) {
-                                       this.reject(errors);
-                               }
-                       }
-               }
-
-               /**
-                * N-winner competitive race
-                * Return a promise that will fulfill when n input promises have
-                * fulfilled, or will reject when it becomes impossible for n
-                * input promises to fulfill (ie when promises.length - n + 1
-                * have rejected)
-                * @param {array} promises
-                * @param {number} n
-                * @returns {Promise} promise for the earliest n fulfillment values
-                *
-                * @deprecated
-                */
-               function some(promises, n) {
-                       /*jshint maxcomplexity:7*/
-                       var p = Promise._defer();
-                       var resolver = p._handler;
-
-                       var results = [];
-                       var errors = [];
-
-                       var l = promises.length>>>0;
-                       var nFulfill = 0;
-                       var nReject;
-                       var x, i; // reused in both for() loops
-
-                       // First pass: count actual array items
-                       for(i=0; i<l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
-                               ++nFulfill;
-                       }
-
-                       // Compute actual goals
-                       n = Math.max(n, 0);
-                       nReject = (nFulfill - n + 1);
-                       nFulfill = Math.min(n, nFulfill);
-
-                       if(n > nFulfill) {
-                               resolver.reject(new RangeError('some(): array must contain at least '
-                               + n + ' item(s), but had ' + nFulfill));
-                       } else if(nFulfill === 0) {
-                               resolver.resolve(results);
-                       }
-
-                       // Second pass: observe each array item, make progress toward goals
-                       for(i=0; i<l; ++i) {
-                               x = promises[i];
-                               if(x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
-
-                               Promise._handler(x).visit(resolver, fulfill, reject, resolver.notify);
-                       }
-
-                       return p;
-
-                       function fulfill(x) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
-
-                               results.push(x);
-                               if(--nFulfill === 0) {
-                                       errors = null;
-                                       this.resolve(results);
-                               }
-                       }
-
-                       function reject(e) {
-                               /*jshint validthis:true*/
-                               if(this.resolved) { // this === resolver
-                                       return;
-                               }
-
-                               errors.push(e);
-                               if(--nReject === 0) {
-                                       results = null;
-                                       this.reject(errors);
-                               }
-                       }
-               }
-
-               /**
-                * Apply f to the value of each promise in a list of promises
-                * and return a new list containing the results.
-                * @param {array} promises
-                * @param {function(x:*, index:Number):*} f mapping function
-                * @returns {Promise}
-                */
-               function map(promises, f) {
-                       return Promise._traverse(f, promises);
-               }
-
-               /**
-                * Filter the provided array of promises using the provided predicate.  Input may
-                * contain promises and values
-                * @param {Array} promises array of promises and values
-                * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
-                *  Must return truthy (or promise for truthy) for items to retain.
-                * @returns {Promise} promise that will fulfill with an array containing all items
-                *  for which predicate returned truthy.
-                */
-               function filter(promises, predicate) {
-                       var a = slice.call(promises);
-                       return Promise._traverse(predicate, a).then(function(keep) {
-                               return filterSync(a, keep);
-                       });
-               }
-
-               function filterSync(promises, keep) {
-                       // Safe because we know all promises have fulfilled if we've made it this far
-                       var l = keep.length;
-                       var filtered = new Array(l);
-                       for(var i=0, j=0; i<l; ++i) {
-                               if(keep[i]) {
-                                       filtered[j++] = Promise._handler(promises[i]).value;
-                               }
-                       }
-                       filtered.length = j;
-                       return filtered;
-
-               }
-
-               /**
-                * Return a promise that will always fulfill with an array containing
-                * the outcome states of all input promises.  The returned promise
-                * will never reject.
-                * @param {Array} promises
-                * @returns {Promise} promise for array of settled state descriptors
-                */
-               function settle(promises) {
-                       return all(promises.map(settleOne));
-               }
-
-               function settleOne(p) {
-                       // Optimize the case where we get an already-resolved when.js promise
-                       //  by extracting its state:
-                       var handler;
-                       if (p instanceof Promise) {
-                               // This is our own Promise type and we can reach its handler internals:
-                               handler = p._handler.join();
-                       }
-                       if((handler && handler.state() === 0) || !handler) {
-                               // Either still pending, or not a Promise at all:
-                               return toPromise(p).then(state.fulfilled, state.rejected);
-                       }
-
-                       // The promise is our own, but it is already resolved. Take a shortcut.
-                       // Since we're not actually handling the resolution, we need to disable
-                       // rejection reporting.
-                       handler._unreport();
-                       return state.inspect(handler);
-               }
-
-               /**
-                * Traditional reduce function, similar to `Array.prototype.reduce()`, but
-                * input may contain promises and/or values, and reduceFunc
-                * may return either a value or a promise, *and* initialValue may
-                * be a promise for the starting value.
-                * @param {Array|Promise} promises array or promise for an array of anything,
-                *      may contain a mix of promises and values.
-                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
-                * @returns {Promise} that will resolve to the final reduced value
-                */
-               function reduce(promises, f /*, initialValue */) {
-                       return arguments.length > 2 ? ar.call(promises, liftCombine(f), arguments[2])
-                                       : ar.call(promises, liftCombine(f));
-               }
-
-               /**
-                * Traditional reduce function, similar to `Array.prototype.reduceRight()`, but
-                * input may contain promises and/or values, and reduceFunc
-                * may return either a value or a promise, *and* initialValue may
-                * be a promise for the starting value.
-                * @param {Array|Promise} promises array or promise for an array of anything,
-                *      may contain a mix of promises and values.
-                * @param {function(accumulated:*, x:*, index:Number):*} f reduce function
-                * @returns {Promise} that will resolve to the final reduced value
-                */
-               function reduceRight(promises, f /*, initialValue */) {
-                       return arguments.length > 2 ? arr.call(promises, liftCombine(f), arguments[2])
-                                       : arr.call(promises, liftCombine(f));
-               }
-
-               function liftCombine(f) {
-                       return function(z, x, i) {
-                               return applyFold(f, void 0, [z,x,i]);
-                       };
-               }
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../apply":258,"../state":271}],260:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function flow(Promise) {
-
-               var resolve = Promise.resolve;
-               var reject = Promise.reject;
-               var origCatch = Promise.prototype['catch'];
-
-               /**
-                * Handle the ultimate fulfillment value or rejection reason, and assume
-                * responsibility for all errors.  If an error propagates out of result
-                * or handleFatalError, it will be rethrown to the host, resulting in a
-                * loud stack track on most platforms and a crash on some.
-                * @param {function?} onResult
-                * @param {function?} onError
-                * @returns {undefined}
-                */
-               Promise.prototype.done = function(onResult, onError) {
-                       this._handler.visit(this._handler.receiver, onResult, onError);
-               };
-
-               /**
-                * Add Error-type and predicate matching to catch.  Examples:
-                * promise.catch(TypeError, handleTypeError)
-                *   .catch(predicate, handleMatchedErrors)
-                *   .catch(handleRemainingErrors)
-                * @param onRejected
-                * @returns {*}
-                */
-               Promise.prototype['catch'] = Promise.prototype.otherwise = function(onRejected) {
-                       if (arguments.length < 2) {
-                               return origCatch.call(this, onRejected);
-                       }
-
-                       if(typeof onRejected !== 'function') {
-                               return this.ensure(rejectInvalidPredicate);
-                       }
-
-                       return origCatch.call(this, createCatchFilter(arguments[1], onRejected));
-               };
-
-               /**
-                * Wraps the provided catch handler, so that it will only be called
-                * if the predicate evaluates truthy
-                * @param {?function} handler
-                * @param {function} predicate
-                * @returns {function} conditional catch handler
-                */
-               function createCatchFilter(handler, predicate) {
-                       return function(e) {
-                               return evaluatePredicate(e, predicate)
-                                       ? handler.call(this, e)
-                                       : reject(e);
-                       };
-               }
-
-               /**
-                * Ensures that onFulfilledOrRejected will be called regardless of whether
-                * this promise is fulfilled or rejected.  onFulfilledOrRejected WILL NOT
-                * receive the promises' value or reason.  Any returned value will be disregarded.
-                * onFulfilledOrRejected may throw or return a rejected promise to signal
-                * an additional error.
-                * @param {function} handler handler to be called regardless of
-                *  fulfillment or rejection
-                * @returns {Promise}
-                */
-               Promise.prototype['finally'] = Promise.prototype.ensure = function(handler) {
-                       if(typeof handler !== 'function') {
-                               return this;
-                       }
-
-                       return this.then(function(x) {
-                               return runSideEffect(handler, this, identity, x);
-                       }, function(e) {
-                               return runSideEffect(handler, this, reject, e);
-                       });
-               };
-
-               function runSideEffect (handler, thisArg, propagate, value) {
-                       var result = handler.call(thisArg);
-                       return maybeThenable(result)
-                               ? propagateValue(result, propagate, value)
-                               : propagate(value);
-               }
-
-               function propagateValue (result, propagate, x) {
-                       return resolve(result).then(function () {
-                               return propagate(x);
-                       });
-               }
-
-               /**
-                * Recover from a failure by returning a defaultValue.  If defaultValue
-                * is a promise, it's fulfillment value will be used.  If defaultValue is
-                * a promise that rejects, the returned promise will reject with the
-                * same reason.
-                * @param {*} defaultValue
-                * @returns {Promise} new promise
-                */
-               Promise.prototype['else'] = Promise.prototype.orElse = function(defaultValue) {
-                       return this.then(void 0, function() {
-                               return defaultValue;
-                       });
-               };
-
-               /**
-                * Shortcut for .then(function() { return value; })
-                * @param  {*} value
-                * @return {Promise} a promise that:
-                *  - is fulfilled if value is not a promise, or
-                *  - if value is a promise, will fulfill with its value, or reject
-                *    with its reason.
-                */
-               Promise.prototype['yield'] = function(value) {
-                       return this.then(function() {
-                               return value;
-                       });
-               };
-
-               /**
-                * Runs a side effect when this promise fulfills, without changing the
-                * fulfillment value.
-                * @param {function} onFulfilledSideEffect
-                * @returns {Promise}
-                */
-               Promise.prototype.tap = function(onFulfilledSideEffect) {
-                       return this.then(onFulfilledSideEffect)['yield'](this);
-               };
-
-               return Promise;
-       };
-
-       function rejectInvalidPredicate() {
-               throw new TypeError('catch predicate must be a function');
-       }
-
-       function evaluatePredicate(e, predicate) {
-               return isError(predicate) ? e instanceof predicate : predicate(e);
-       }
-
-       function isError(predicate) {
-               return predicate === Error
-                       || (predicate != null && predicate.prototype instanceof Error);
-       }
-
-       function maybeThenable(x) {
-               return (typeof x === 'object' || typeof x === 'function') && x !== null;
-       }
-
-       function identity(x) {
-               return x;
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],261:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-/** @author Jeff Escalante */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function fold(Promise) {
-
-               Promise.prototype.fold = function(f, z) {
-                       var promise = this._beget();
-
-                       this._handler.fold(function(z, x, to) {
-                               Promise._handler(z).fold(function(x, z, to) {
-                                       to.resolve(f.call(this, z, x));
-                               }, x, this, to);
-                       }, z, promise._handler.receiver, promise._handler);
-
-                       return promise;
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],262:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var inspect = require('../state').inspect;
-
-       return function inspection(Promise) {
-
-               Promise.prototype.inspect = function() {
-                       return inspect(Promise._handler(this));
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../state":271}],263:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function generate(Promise) {
-
-               var resolve = Promise.resolve;
-
-               Promise.iterate = iterate;
-               Promise.unfold = unfold;
-
-               return Promise;
-
-               /**
-                * @deprecated Use github.com/cujojs/most streams and most.iterate
-                * Generate a (potentially infinite) stream of promised values:
-                * x, f(x), f(f(x)), etc. until condition(x) returns true
-                * @param {function} f function to generate a new x from the previous x
-                * @param {function} condition function that, given the current x, returns
-                *  truthy when the iterate should stop
-                * @param {function} handler function to handle the value produced by f
-                * @param {*|Promise} x starting value, may be a promise
-                * @return {Promise} the result of the last call to f before
-                *  condition returns true
-                */
-               function iterate(f, condition, handler, x) {
-                       return unfold(function(x) {
-                               return [x, f(x)];
-                       }, condition, handler, x);
-               }
-
-               /**
-                * @deprecated Use github.com/cujojs/most streams and most.unfold
-                * Generate a (potentially infinite) stream of promised values
-                * by applying handler(generator(seed)) iteratively until
-                * condition(seed) returns true.
-                * @param {function} unspool function that generates a [value, newSeed]
-                *  given a seed.
-                * @param {function} condition function that, given the current seed, returns
-                *  truthy when the unfold should stop
-                * @param {function} handler function to handle the value produced by unspool
-                * @param x {*|Promise} starting value, may be a promise
-                * @return {Promise} the result of the last value produced by unspool before
-                *  condition returns true
-                */
-               function unfold(unspool, condition, handler, x) {
-                       return resolve(x).then(function(seed) {
-                               return resolve(condition(seed)).then(function(done) {
-                                       return done ? seed : resolve(unspool(seed)).spread(next);
-                               });
-                       });
-
-                       function next(item, newSeed) {
-                               return resolve(handler(item)).then(function() {
-                                       return unfold(unspool, condition, handler, newSeed);
-                               });
-                       }
-               }
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],264:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function progress(Promise) {
-
-               /**
-                * @deprecated
-                * Register a progress handler for this promise
-                * @param {function} onProgress
-                * @returns {Promise}
-                */
-               Promise.prototype.progress = function(onProgress) {
-                       return this.then(void 0, void 0, onProgress);
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],265:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var env = require('../env');
-       var TimeoutError = require('../TimeoutError');
-
-       function setTimeout(f, ms, x, y) {
-               return env.setTimer(function() {
-                       f(x, y, ms);
-               }, ms);
-       }
-
-       return function timed(Promise) {
-               /**
-                * Return a new promise whose fulfillment value is revealed only
-                * after ms milliseconds
-                * @param {number} ms milliseconds
-                * @returns {Promise}
-                */
-               Promise.prototype.delay = function(ms) {
-                       var p = this._beget();
-                       this._handler.fold(handleDelay, ms, void 0, p._handler);
-                       return p;
-               };
-
-               function handleDelay(ms, x, h) {
-                       setTimeout(resolveDelay, ms, x, h);
-               }
-
-               function resolveDelay(x, h) {
-                       h.resolve(x);
-               }
-
-               /**
-                * Return a new promise that rejects after ms milliseconds unless
-                * this promise fulfills earlier, in which case the returned promise
-                * fulfills with the same value.
-                * @param {number} ms milliseconds
-                * @param {Error|*=} reason optional rejection reason to use, defaults
-                *   to a TimeoutError if not provided
-                * @returns {Promise}
-                */
-               Promise.prototype.timeout = function(ms, reason) {
-                       var p = this._beget();
-                       var h = p._handler;
-
-                       var t = setTimeout(onTimeout, ms, reason, p._handler);
-
-                       this._handler.visit(h,
-                               function onFulfill(x) {
-                                       env.clearTimer(t);
-                                       this.resolve(x); // this = h
-                               },
-                               function onReject(x) {
-                                       env.clearTimer(t);
-                                       this.reject(x); // this = h
-                               },
-                               h.notify);
-
-                       return p;
-               };
-
-               function onTimeout(reason, h, ms) {
-                       var e = typeof reason === 'undefined'
-                               ? new TimeoutError('timed out after ' + ms + 'ms')
-                               : reason;
-                       h.reject(e);
-               }
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../TimeoutError":257,"../env":268}],266:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function(require) {
-
-       var setTimer = require('../env').setTimer;
-       var format = require('../format');
-
-       return function unhandledRejection(Promise) {
-
-               var logError = noop;
-               var logInfo = noop;
-               var localConsole;
-
-               if(typeof console !== 'undefined') {
-                       // Alias console to prevent things like uglify's drop_console option from
-                       // removing console.log/error. Unhandled rejections fall into the same
-                       // category as uncaught exceptions, and build tools shouldn't silence them.
-                       localConsole = console;
-                       logError = typeof localConsole.error !== 'undefined'
-                               ? function (e) { localConsole.error(e); }
-                               : function (e) { localConsole.log(e); };
-
-                       logInfo = typeof localConsole.info !== 'undefined'
-                               ? function (e) { localConsole.info(e); }
-                               : function (e) { localConsole.log(e); };
-               }
-
-               Promise.onPotentiallyUnhandledRejection = function(rejection) {
-                       enqueue(report, rejection);
-               };
-
-               Promise.onPotentiallyUnhandledRejectionHandled = function(rejection) {
-                       enqueue(unreport, rejection);
-               };
-
-               Promise.onFatalRejection = function(rejection) {
-                       enqueue(throwit, rejection.value);
-               };
-
-               var tasks = [];
-               var reported = [];
-               var running = null;
-
-               function report(r) {
-                       if(!r.handled) {
-                               reported.push(r);
-                               logError('Potentially unhandled rejection [' + r.id + '] ' + format.formatError(r.value));
-                       }
-               }
-
-               function unreport(r) {
-                       var i = reported.indexOf(r);
-                       if(i >= 0) {
-                               reported.splice(i, 1);
-                               logInfo('Handled previous rejection [' + r.id + '] ' + format.formatObject(r.value));
-                       }
-               }
-
-               function enqueue(f, x) {
-                       tasks.push(f, x);
-                       if(running === null) {
-                               running = setTimer(flush, 0);
-                       }
-               }
-
-               function flush() {
-                       running = null;
-                       while(tasks.length > 0) {
-                               tasks.shift()(tasks.shift());
-                       }
-               }
-
-               return Promise;
-       };
-
-       function throwit(e) {
-               throw e;
-       }
-
-       function noop() {}
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-},{"../env":268,"../format":269}],267:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function addWith(Promise) {
-               /**
-                * Returns a promise whose handlers will be called with `this` set to
-                * the supplied receiver.  Subsequent promises derived from the
-                * returned promise will also have their handlers called with receiver
-                * as `this`. Calling `with` with undefined or no arguments will return
-                * a promise whose handlers will again be called in the usual Promises/A+
-                * way (no `this`) thus safely undoing any previous `with` in the
-                * promise chain.
-                *
-                * WARNING: Promises returned from `with`/`withThis` are NOT Promises/A+
-                * compliant, specifically violating 2.2.5 (http://promisesaplus.com/#point-41)
-                *
-                * @param {object} receiver `this` value for all handlers attached to
-                *  the returned promise.
-                * @returns {Promise}
-                */
-               Promise.prototype['with'] = Promise.prototype.withThis = function(receiver) {
-                       var p = this._beget();
-                       var child = p._handler;
-                       child.receiver = receiver;
-                       this._handler.chain(child, receiver);
-                       return p;
-               };
-
-               return Promise;
-       };
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-
-},{}],268:[function(require,module,exports){
-(function (process){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-/*global process,document,setTimeout,clearTimeout,MutationObserver,WebKitMutationObserver*/
-(function(define) { 'use strict';
-define(function(require) {
-       /*jshint maxcomplexity:6*/
-
-       // Sniff "best" async scheduling option
-       // Prefer process.nextTick or MutationObserver, then check for
-       // setTimeout, and finally vertx, since its the only env that doesn't
-       // have setTimeout
-
-       var MutationObs;
-       var capturedSetTimeout = typeof setTimeout !== 'undefined' && setTimeout;
-
-       // Default env
-       var setTimer = function(f, ms) { return setTimeout(f, ms); };
-       var clearTimer = function(t) { return clearTimeout(t); };
-       var asap = function (f) { return capturedSetTimeout(f, 0); };
-
-       // Detect specific env
-       if (isNode()) { // Node
-               asap = function (f) { return process.nextTick(f); };
-
-       } else if (MutationObs = hasMutationObserver()) { // Modern browser
-               asap = initMutationObserver(MutationObs);
-
-       } else if (!capturedSetTimeout) { // vert.x
-               var vertxRequire = require;
-               var vertx = vertxRequire('vertx');
-               setTimer = function (f, ms) { return vertx.setTimer(ms, f); };
-               clearTimer = vertx.cancelTimer;
-               asap = vertx.runOnLoop || vertx.runOnContext;
-       }
-
-       return {
-               setTimer: setTimer,
-               clearTimer: clearTimer,
-               asap: asap
-       };
-
-       function isNode () {
-               return typeof process !== 'undefined' &&
-                       Object.prototype.toString.call(process) === '[object process]';
-       }
-
-       function hasMutationObserver () {
-           return (typeof MutationObserver !== 'undefined' && MutationObserver) ||
-                       (typeof WebKitMutationObserver !== 'undefined' && WebKitMutationObserver);
-       }
-
-       function initMutationObserver(MutationObserver) {
-               var scheduled;
-               var node = document.createTextNode('');
-               var o = new MutationObserver(run);
-               o.observe(node, { characterData: true });
-
-               function run() {
-                       var f = scheduled;
-                       scheduled = void 0;
-                       f();
-               }
-
-               var i = 0;
-               return function (f) {
-                       scheduled = f;
-                       node.data = (i ^= 1);
-               };
-       }
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(require); }));
-
-}).call(this,require('_process'))
-
-},{"_process":6}],269:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return {
-               formatError: formatError,
-               formatObject: formatObject,
-               tryStringify: tryStringify
-       };
-
-       /**
-        * Format an error into a string.  If e is an Error and has a stack property,
-        * it's returned.  Otherwise, e is formatted using formatObject, with a
-        * warning added about e not being a proper Error.
-        * @param {*} e
-        * @returns {String} formatted string, suitable for output to developers
-        */
-       function formatError(e) {
-               var s = typeof e === 'object' && e !== null && (e.stack || e.message) ? e.stack || e.message : formatObject(e);
-               return e instanceof Error ? s : s + ' (WARNING: non-Error used)';
-       }
-
-       /**
-        * Format an object, detecting "plain" objects and running them through
-        * JSON.stringify if possible.
-        * @param {Object} o
-        * @returns {string}
-        */
-       function formatObject(o) {
-               var s = String(o);
-               if(s === '[object Object]' && typeof JSON !== 'undefined') {
-                       s = tryStringify(o, s);
-               }
-               return s;
-       }
-
-       /**
-        * Try to return the result of JSON.stringify(x).  If that fails, return
-        * defaultValue
-        * @param {*} x
-        * @param {*} defaultValue
-        * @returns {String|*} JSON.stringify(x) or defaultValue
-        */
-       function tryStringify(x, defaultValue) {
-               try {
-                       return JSON.stringify(x);
-               } catch(e) {
-                       return defaultValue;
-               }
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],270:[function(require,module,exports){
-(function (process){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return function makePromise(environment) {
-
-               var tasks = environment.scheduler;
-               var emitRejection = initEmitRejection();
-
-               var objectCreate = Object.create ||
-                       function(proto) {
-                               function Child() {}
-                               Child.prototype = proto;
-                               return new Child();
-                       };
-
-               /**
-                * Create a promise whose fate is determined by resolver
-                * @constructor
-                * @returns {Promise} promise
-                * @name Promise
-                */
-               function Promise(resolver, handler) {
-                       this._handler = resolver === Handler ? handler : init(resolver);
-               }
-
-               /**
-                * Run the supplied resolver
-                * @param resolver
-                * @returns {Pending}
-                */
-               function init(resolver) {
-                       var handler = new Pending();
-
-                       try {
-                               resolver(promiseResolve, promiseReject, promiseNotify);
-                       } catch (e) {
-                               promiseReject(e);
-                       }
-
-                       return handler;
-
-                       /**
-                        * Transition from pre-resolution state to post-resolution state, notifying
-                        * all listeners of the ultimate fulfillment or rejection
-                        * @param {*} x resolution value
-                        */
-                       function promiseResolve (x) {
-                               handler.resolve(x);
-                       }
-                       /**
-                        * Reject this promise with reason, which will be used verbatim
-                        * @param {Error|*} reason rejection reason, strongly suggested
-                        *   to be an Error type
-                        */
-                       function promiseReject (reason) {
-                               handler.reject(reason);
-                       }
-
-                       /**
-                        * @deprecated
-                        * Issue a progress event, notifying all progress listeners
-                        * @param {*} x progress event payload to pass to all listeners
-                        */
-                       function promiseNotify (x) {
-                               handler.notify(x);
-                       }
-               }
-
-               // Creation
-
-               Promise.resolve = resolve;
-               Promise.reject = reject;
-               Promise.never = never;
-
-               Promise._defer = defer;
-               Promise._handler = getHandler;
-
-               /**
-                * Returns a trusted promise. If x is already a trusted promise, it is
-                * returned, otherwise returns a new trusted Promise which follows x.
-                * @param  {*} x
-                * @return {Promise} promise
-                */
-               function resolve(x) {
-                       return isPromise(x) ? x
-                               : new Promise(Handler, new Async(getHandler(x)));
-               }
-
-               /**
-                * Return a reject promise with x as its reason (x is used verbatim)
-                * @param {*} x
-                * @returns {Promise} rejected promise
-                */
-               function reject(x) {
-                       return new Promise(Handler, new Async(new Rejected(x)));
-               }
-
-               /**
-                * Return a promise that remains pending forever
-                * @returns {Promise} forever-pending promise.
-                */
-               function never() {
-                       return foreverPendingPromise; // Should be frozen
-               }
-
-               /**
-                * Creates an internal {promise, resolver} pair
-                * @private
-                * @returns {Promise}
-                */
-               function defer() {
-                       return new Promise(Handler, new Pending());
-               }
-
-               // Transformation and flow control
-
-               /**
-                * Transform this promise's fulfillment value, returning a new Promise
-                * for the transformed result.  If the promise cannot be fulfilled, onRejected
-                * is called with the reason.  onProgress *may* be called with updates toward
-                * this promise's fulfillment.
-                * @param {function=} onFulfilled fulfillment handler
-                * @param {function=} onRejected rejection handler
-                * @param {function=} onProgress @deprecated progress handler
-                * @return {Promise} new promise
-                */
-               Promise.prototype.then = function(onFulfilled, onRejected, onProgress) {
-                       var parent = this._handler;
-                       var state = parent.join().state();
-
-                       if ((typeof onFulfilled !== 'function' && state > 0) ||
-                               (typeof onRejected !== 'function' && state < 0)) {
-                               // Short circuit: value will not change, simply share handler
-                               return new this.constructor(Handler, parent);
-                       }
-
-                       var p = this._beget();
-                       var child = p._handler;
-
-                       parent.chain(child, parent.receiver, onFulfilled, onRejected, onProgress);
-
-                       return p;
-               };
-
-               /**
-                * If this promise cannot be fulfilled due to an error, call onRejected to
-                * handle the error. Shortcut for .then(undefined, onRejected)
-                * @param {function?} onRejected
-                * @return {Promise}
-                */
-               Promise.prototype['catch'] = function(onRejected) {
-                       return this.then(void 0, onRejected);
-               };
-
-               /**
-                * Creates a new, pending promise of the same type as this promise
-                * @private
-                * @returns {Promise}
-                */
-               Promise.prototype._beget = function() {
-                       return begetFrom(this._handler, this.constructor);
-               };
-
-               function begetFrom(parent, Promise) {
-                       var child = new Pending(parent.receiver, parent.join().context);
-                       return new Promise(Handler, child);
-               }
-
-               // Array combinators
-
-               Promise.all = all;
-               Promise.race = race;
-               Promise._traverse = traverse;
-
-               /**
-                * Return a promise that will fulfill when all promises in the
-                * input array have fulfilled, or will reject when one of the
-                * promises rejects.
-                * @param {array} promises array of promises
-                * @returns {Promise} promise for array of fulfillment values
-                */
-               function all(promises) {
-                       return traverseWith(snd, null, promises);
-               }
-
-               /**
-                * Array<Promise<X>> -> Promise<Array<f(X)>>
-                * @private
-                * @param {function} f function to apply to each promise's value
-                * @param {Array} promises array of promises
-                * @returns {Promise} promise for transformed values
-                */
-               function traverse(f, promises) {
-                       return traverseWith(tryCatch2, f, promises);
-               }
-
-               function traverseWith(tryMap, f, promises) {
-                       var handler = typeof f === 'function' ? mapAt : settleAt;
-
-                       var resolver = new Pending();
-                       var pending = promises.length >>> 0;
-                       var results = new Array(pending);
-
-                       for (var i = 0, x; i < promises.length && !resolver.resolved; ++i) {
-                               x = promises[i];
-
-                               if (x === void 0 && !(i in promises)) {
-                                       --pending;
-                                       continue;
-                               }
-
-                               traverseAt(promises, handler, i, x, resolver);
-                       }
-
-                       if(pending === 0) {
-                               resolver.become(new Fulfilled(results));
-                       }
-
-                       return new Promise(Handler, resolver);
-
-                       function mapAt(i, x, resolver) {
-                               if(!resolver.resolved) {
-                                       traverseAt(promises, settleAt, i, tryMap(f, x, i), resolver);
-                               }
-                       }
-
-                       function settleAt(i, x, resolver) {
-                               results[i] = x;
-                               if(--pending === 0) {
-                                       resolver.become(new Fulfilled(results));
-                               }
-                       }
-               }
-
-               function traverseAt(promises, handler, i, x, resolver) {
-                       if (maybeThenable(x)) {
-                               var h = getHandlerMaybeThenable(x);
-                               var s = h.state();
-
-                               if (s === 0) {
-                                       h.fold(handler, i, void 0, resolver);
-                               } else if (s > 0) {
-                                       handler(i, h.value, resolver);
-                               } else {
-                                       resolver.become(h);
-                                       visitRemaining(promises, i+1, h);
-                               }
-                       } else {
-                               handler(i, x, resolver);
-                       }
-               }
-
-               Promise._visitRemaining = visitRemaining;
-               function visitRemaining(promises, start, handler) {
-                       for(var i=start; i<promises.length; ++i) {
-                               markAsHandled(getHandler(promises[i]), handler);
-                       }
-               }
-
-               function markAsHandled(h, handler) {
-                       if(h === handler) {
-                               return;
-                       }
-
-                       var s = h.state();
-                       if(s === 0) {
-                               h.visit(h, void 0, h._unreport);
-                       } else if(s < 0) {
-                               h._unreport();
-                       }
-               }
-
-               /**
-                * Fulfill-reject competitive race. Return a promise that will settle
-                * to the same state as the earliest input promise to settle.
-                *
-                * WARNING: The ES6 Promise spec requires that race()ing an empty array
-                * must return a promise that is pending forever.  This implementation
-                * returns a singleton forever-pending promise, the same singleton that is
-                * returned by Promise.never(), thus can be checked with ===
-                *
-                * @param {array} promises array of promises to race
-                * @returns {Promise} if input is non-empty, a promise that will settle
-                * to the same outcome as the earliest input promise to settle. if empty
-                * is empty, returns a promise that will never settle.
-                */
-               function race(promises) {
-                       if(typeof promises !== 'object' || promises === null) {
-                               return reject(new TypeError('non-iterable passed to race()'));
-                       }
-
-                       // Sigh, race([]) is untestable unless we return *something*
-                       // that is recognizable without calling .then() on it.
-                       return promises.length === 0 ? never()
-                                : promises.length === 1 ? resolve(promises[0])
-                                : runRace(promises);
-               }
-
-               function runRace(promises) {
-                       var resolver = new Pending();
-                       var i, x, h;
-                       for(i=0; i<promises.length; ++i) {
-                               x = promises[i];
-                               if (x === void 0 && !(i in promises)) {
-                                       continue;
-                               }
-
-                               h = getHandler(x);
-                               if(h.state() !== 0) {
-                                       resolver.become(h);
-                                       visitRemaining(promises, i+1, h);
-                                       break;
-                               } else {
-                                       h.visit(resolver, resolver.resolve, resolver.reject);
-                               }
-                       }
-                       return new Promise(Handler, resolver);
-               }
-
-               // Promise internals
-               // Below this, everything is @private
-
-               /**
-                * Get an appropriate handler for x, without checking for cycles
-                * @param {*} x
-                * @returns {object} handler
-                */
-               function getHandler(x) {
-                       if(isPromise(x)) {
-                               return x._handler.join();
-                       }
-                       return maybeThenable(x) ? getHandlerUntrusted(x) : new Fulfilled(x);
-               }
-
-               /**
-                * Get a handler for thenable x.
-                * NOTE: You must only call this if maybeThenable(x) == true
-                * @param {object|function|Promise} x
-                * @returns {object} handler
-                */
-               function getHandlerMaybeThenable(x) {
-                       return isPromise(x) ? x._handler.join() : getHandlerUntrusted(x);
-               }
-
-               /**
-                * Get a handler for potentially untrusted thenable x
-                * @param {*} x
-                * @returns {object} handler
-                */
-               function getHandlerUntrusted(x) {
-                       try {
-                               var untrustedThen = x.then;
-                               return typeof untrustedThen === 'function'
-                                       ? new Thenable(untrustedThen, x)
-                                       : new Fulfilled(x);
-                       } catch(e) {
-                               return new Rejected(e);
-                       }
-               }
-
-               /**
-                * Handler for a promise that is pending forever
-                * @constructor
-                */
-               function Handler() {}
-
-               Handler.prototype.when
-                       = Handler.prototype.become
-                       = Handler.prototype.notify // deprecated
-                       = Handler.prototype.fail
-                       = Handler.prototype._unreport
-                       = Handler.prototype._report
-                       = noop;
-
-               Handler.prototype._state = 0;
-
-               Handler.prototype.state = function() {
-                       return this._state;
-               };
-
-               /**
-                * Recursively collapse handler chain to find the handler
-                * nearest to the fully resolved value.
-                * @returns {object} handler nearest the fully resolved value
-                */
-               Handler.prototype.join = function() {
-                       var h = this;
-                       while(h.handler !== void 0) {
-                               h = h.handler;
-                       }
-                       return h;
-               };
-
-               Handler.prototype.chain = function(to, receiver, fulfilled, rejected, progress) {
-                       this.when({
-                               resolver: to,
-                               receiver: receiver,
-                               fulfilled: fulfilled,
-                               rejected: rejected,
-                               progress: progress
-                       });
-               };
-
-               Handler.prototype.visit = function(receiver, fulfilled, rejected, progress) {
-                       this.chain(failIfRejected, receiver, fulfilled, rejected, progress);
-               };
-
-               Handler.prototype.fold = function(f, z, c, to) {
-                       this.when(new Fold(f, z, c, to));
-               };
-
-               /**
-                * Handler that invokes fail() on any handler it becomes
-                * @constructor
-                */
-               function FailIfRejected() {}
-
-               inherit(Handler, FailIfRejected);
-
-               FailIfRejected.prototype.become = function(h) {
-                       h.fail();
-               };
-
-               var failIfRejected = new FailIfRejected();
-
-               /**
-                * Handler that manages a queue of consumers waiting on a pending promise
-                * @constructor
-                */
-               function Pending(receiver, inheritedContext) {
-                       Promise.createContext(this, inheritedContext);
-
-                       this.consumers = void 0;
-                       this.receiver = receiver;
-                       this.handler = void 0;
-                       this.resolved = false;
-               }
-
-               inherit(Handler, Pending);
-
-               Pending.prototype._state = 0;
-
-               Pending.prototype.resolve = function(x) {
-                       this.become(getHandler(x));
-               };
-
-               Pending.prototype.reject = function(x) {
-                       if(this.resolved) {
-                               return;
-                       }
-
-                       this.become(new Rejected(x));
-               };
-
-               Pending.prototype.join = function() {
-                       if (!this.resolved) {
-                               return this;
-                       }
-
-                       var h = this;
-
-                       while (h.handler !== void 0) {
-                               h = h.handler;
-                               if (h === this) {
-                                       return this.handler = cycle();
-                               }
-                       }
-
-                       return h;
-               };
-
-               Pending.prototype.run = function() {
-                       var q = this.consumers;
-                       var handler = this.handler;
-                       this.handler = this.handler.join();
-                       this.consumers = void 0;
-
-                       for (var i = 0; i < q.length; ++i) {
-                               handler.when(q[i]);
-                       }
-               };
-
-               Pending.prototype.become = function(handler) {
-                       if(this.resolved) {
-                               return;
-                       }
-
-                       this.resolved = true;
-                       this.handler = handler;
-                       if(this.consumers !== void 0) {
-                               tasks.enqueue(this);
-                       }
-
-                       if(this.context !== void 0) {
-                               handler._report(this.context);
-                       }
-               };
-
-               Pending.prototype.when = function(continuation) {
-                       if(this.resolved) {
-                               tasks.enqueue(new ContinuationTask(continuation, this.handler));
-                       } else {
-                               if(this.consumers === void 0) {
-                                       this.consumers = [continuation];
-                               } else {
-                                       this.consumers.push(continuation);
-                               }
-                       }
-               };
-
-               /**
-                * @deprecated
-                */
-               Pending.prototype.notify = function(x) {
-                       if(!this.resolved) {
-                               tasks.enqueue(new ProgressTask(x, this));
-                       }
-               };
-
-               Pending.prototype.fail = function(context) {
-                       var c = typeof context === 'undefined' ? this.context : context;
-                       this.resolved && this.handler.join().fail(c);
-               };
-
-               Pending.prototype._report = function(context) {
-                       this.resolved && this.handler.join()._report(context);
-               };
-
-               Pending.prototype._unreport = function() {
-                       this.resolved && this.handler.join()._unreport();
-               };
-
-               /**
-                * Wrap another handler and force it into a future stack
-                * @param {object} handler
-                * @constructor
-                */
-               function Async(handler) {
-                       this.handler = handler;
-               }
-
-               inherit(Handler, Async);
-
-               Async.prototype.when = function(continuation) {
-                       tasks.enqueue(new ContinuationTask(continuation, this));
-               };
-
-               Async.prototype._report = function(context) {
-                       this.join()._report(context);
-               };
-
-               Async.prototype._unreport = function() {
-                       this.join()._unreport();
-               };
-
-               /**
-                * Handler that wraps an untrusted thenable and assimilates it in a future stack
-                * @param {function} then
-                * @param {{then: function}} thenable
-                * @constructor
-                */
-               function Thenable(then, thenable) {
-                       Pending.call(this);
-                       tasks.enqueue(new AssimilateTask(then, thenable, this));
-               }
-
-               inherit(Pending, Thenable);
-
-               /**
-                * Handler for a fulfilled promise
-                * @param {*} x fulfillment value
-                * @constructor
-                */
-               function Fulfilled(x) {
-                       Promise.createContext(this);
-                       this.value = x;
-               }
-
-               inherit(Handler, Fulfilled);
-
-               Fulfilled.prototype._state = 1;
-
-               Fulfilled.prototype.fold = function(f, z, c, to) {
-                       runContinuation3(f, z, this, c, to);
-               };
-
-               Fulfilled.prototype.when = function(cont) {
-                       runContinuation1(cont.fulfilled, this, cont.receiver, cont.resolver);
-               };
-
-               var errorId = 0;
-
-               /**
-                * Handler for a rejected promise
-                * @param {*} x rejection reason
-                * @constructor
-                */
-               function Rejected(x) {
-                       Promise.createContext(this);
-
-                       this.id = ++errorId;
-                       this.value = x;
-                       this.handled = false;
-                       this.reported = false;
-
-                       this._report();
-               }
-
-               inherit(Handler, Rejected);
-
-               Rejected.prototype._state = -1;
-
-               Rejected.prototype.fold = function(f, z, c, to) {
-                       to.become(this);
-               };
-
-               Rejected.prototype.when = function(cont) {
-                       if(typeof cont.rejected === 'function') {
-                               this._unreport();
-                       }
-                       runContinuation1(cont.rejected, this, cont.receiver, cont.resolver);
-               };
-
-               Rejected.prototype._report = function(context) {
-                       tasks.afterQueue(new ReportTask(this, context));
-               };
-
-               Rejected.prototype._unreport = function() {
-                       if(this.handled) {
-                               return;
-                       }
-                       this.handled = true;
-                       tasks.afterQueue(new UnreportTask(this));
-               };
-
-               Rejected.prototype.fail = function(context) {
-                       this.reported = true;
-                       emitRejection('unhandledRejection', this);
-                       Promise.onFatalRejection(this, context === void 0 ? this.context : context);
-               };
-
-               function ReportTask(rejection, context) {
-                       this.rejection = rejection;
-                       this.context = context;
-               }
-
-               ReportTask.prototype.run = function() {
-                       if(!this.rejection.handled && !this.rejection.reported) {
-                               this.rejection.reported = true;
-                               emitRejection('unhandledRejection', this.rejection) ||
-                                       Promise.onPotentiallyUnhandledRejection(this.rejection, this.context);
-                       }
-               };
-
-               function UnreportTask(rejection) {
-                       this.rejection = rejection;
-               }
-
-               UnreportTask.prototype.run = function() {
-                       if(this.rejection.reported) {
-                               emitRejection('rejectionHandled', this.rejection) ||
-                                       Promise.onPotentiallyUnhandledRejectionHandled(this.rejection);
-                       }
-               };
-
-               // Unhandled rejection hooks
-               // By default, everything is a noop
-
-               Promise.createContext
-                       = Promise.enterContext
-                       = Promise.exitContext
-                       = Promise.onPotentiallyUnhandledRejection
-                       = Promise.onPotentiallyUnhandledRejectionHandled
-                       = Promise.onFatalRejection
-                       = noop;
-
-               // Errors and singletons
-
-               var foreverPendingHandler = new Handler();
-               var foreverPendingPromise = new Promise(Handler, foreverPendingHandler);
-
-               function cycle() {
-                       return new Rejected(new TypeError('Promise cycle'));
-               }
-
-               // Task runners
-
-               /**
-                * Run a single consumer
-                * @constructor
-                */
-               function ContinuationTask(continuation, handler) {
-                       this.continuation = continuation;
-                       this.handler = handler;
-               }
-
-               ContinuationTask.prototype.run = function() {
-                       this.handler.join().when(this.continuation);
-               };
-
-               /**
-                * Run a queue of progress handlers
-                * @constructor
-                */
-               function ProgressTask(value, handler) {
-                       this.handler = handler;
-                       this.value = value;
-               }
-
-               ProgressTask.prototype.run = function() {
-                       var q = this.handler.consumers;
-                       if(q === void 0) {
-                               return;
-                       }
-
-                       for (var c, i = 0; i < q.length; ++i) {
-                               c = q[i];
-                               runNotify(c.progress, this.value, this.handler, c.receiver, c.resolver);
-                       }
-               };
-
-               /**
-                * Assimilate a thenable, sending it's value to resolver
-                * @param {function} then
-                * @param {object|function} thenable
-                * @param {object} resolver
-                * @constructor
-                */
-               function AssimilateTask(then, thenable, resolver) {
-                       this._then = then;
-                       this.thenable = thenable;
-                       this.resolver = resolver;
-               }
-
-               AssimilateTask.prototype.run = function() {
-                       var h = this.resolver;
-                       tryAssimilate(this._then, this.thenable, _resolve, _reject, _notify);
-
-                       function _resolve(x) { h.resolve(x); }
-                       function _reject(x)  { h.reject(x); }
-                       function _notify(x)  { h.notify(x); }
-               };
-
-               function tryAssimilate(then, thenable, resolve, reject, notify) {
-                       try {
-                               then.call(thenable, resolve, reject, notify);
-                       } catch (e) {
-                               reject(e);
-                       }
-               }
-
-               /**
-                * Fold a handler value with z
-                * @constructor
-                */
-               function Fold(f, z, c, to) {
-                       this.f = f; this.z = z; this.c = c; this.to = to;
-                       this.resolver = failIfRejected;
-                       this.receiver = this;
-               }
-
-               Fold.prototype.fulfilled = function(x) {
-                       this.f.call(this.c, this.z, x, this.to);
-               };
-
-               Fold.prototype.rejected = function(x) {
-                       this.to.reject(x);
-               };
-
-               Fold.prototype.progress = function(x) {
-                       this.to.notify(x);
-               };
-
-               // Other helpers
-
-               /**
-                * @param {*} x
-                * @returns {boolean} true iff x is a trusted Promise
-                */
-               function isPromise(x) {
-                       return x instanceof Promise;
-               }
-
-               /**
-                * Test just enough to rule out primitives, in order to take faster
-                * paths in some code
-                * @param {*} x
-                * @returns {boolean} false iff x is guaranteed *not* to be a thenable
-                */
-               function maybeThenable(x) {
-                       return (typeof x === 'object' || typeof x === 'function') && x !== null;
-               }
-
-               function runContinuation1(f, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.become(h);
-                       }
-
-                       Promise.enterContext(h);
-                       tryCatchReject(f, h.value, receiver, next);
-                       Promise.exitContext();
-               }
-
-               function runContinuation3(f, x, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.become(h);
-                       }
-
-                       Promise.enterContext(h);
-                       tryCatchReject3(f, x, h.value, receiver, next);
-                       Promise.exitContext();
-               }
-
-               /**
-                * @deprecated
-                */
-               function runNotify(f, x, h, receiver, next) {
-                       if(typeof f !== 'function') {
-                               return next.notify(x);
-                       }
-
-                       Promise.enterContext(h);
-                       tryCatchReturn(f, x, receiver, next);
-                       Promise.exitContext();
-               }
-
-               function tryCatch2(f, a, b) {
-                       try {
-                               return f(a, b);
-                       } catch(e) {
-                               return reject(e);
-                       }
-               }
-
-               /**
-                * Return f.call(thisArg, x), or if it throws return a rejected promise for
-                * the thrown exception
-                */
-               function tryCatchReject(f, x, thisArg, next) {
-                       try {
-                               next.become(getHandler(f.call(thisArg, x)));
-                       } catch(e) {
-                               next.become(new Rejected(e));
-                       }
-               }
-
-               /**
-                * Same as above, but includes the extra argument parameter.
-                */
-               function tryCatchReject3(f, x, y, thisArg, next) {
-                       try {
-                               f.call(thisArg, x, y, next);
-                       } catch(e) {
-                               next.become(new Rejected(e));
-                       }
-               }
-
-               /**
-                * @deprecated
-                * Return f.call(thisArg, x), or if it throws, *return* the exception
-                */
-               function tryCatchReturn(f, x, thisArg, next) {
-                       try {
-                               next.notify(f.call(thisArg, x));
-                       } catch(e) {
-                               next.notify(e);
-                       }
-               }
-
-               function inherit(Parent, Child) {
-                       Child.prototype = objectCreate(Parent.prototype);
-                       Child.prototype.constructor = Child;
-               }
-
-               function snd(x, y) {
-                       return y;
-               }
-
-               function noop() {}
-
-               function hasCustomEvent() {
-                       if(typeof CustomEvent === 'function') {
-                               try {
-                                       var ev = new CustomEvent('unhandledRejection');
-                                       return ev instanceof CustomEvent;
-                               } catch (ignoredException) {}
-                       }
-                       return false;
-               }
-
-               function hasInternetExplorerCustomEvent() {
-                       if(typeof document !== 'undefined' && typeof document.createEvent === 'function') {
-                               try {
-                                       // Try to create one event to make sure it's supported
-                                       var ev = document.createEvent('CustomEvent');
-                                       ev.initCustomEvent('eventType', false, true, {});
-                                       return true;
-                               } catch (ignoredException) {}
-                       }
-                       return false;
-               }
-
-               function initEmitRejection() {
-                       /*global process, self, CustomEvent*/
-                       if(typeof process !== 'undefined' && process !== null
-                               && typeof process.emit === 'function') {
-                               // Returning falsy here means to call the default
-                               // onPotentiallyUnhandledRejection API.  This is safe even in
-                               // browserify since process.emit always returns falsy in browserify:
-                               // https://github.com/defunctzombie/node-process/blob/master/browser.js#L40-L46
-                               return function(type, rejection) {
-                                       return type === 'unhandledRejection'
-                                               ? process.emit(type, rejection.value, rejection)
-                                               : process.emit(type, rejection);
-                               };
-                       } else if(typeof self !== 'undefined' && hasCustomEvent()) {
-                               return (function (self, CustomEvent) {
-                                       return function (type, rejection) {
-                                               var ev = new CustomEvent(type, {
-                                                       detail: {
-                                                               reason: rejection.value,
-                                                               key: rejection
-                                                       },
-                                                       bubbles: false,
-                                                       cancelable: true
-                                               });
-
-                                               return !self.dispatchEvent(ev);
-                                       };
-                               }(self, CustomEvent));
-                       } else if(typeof self !== 'undefined' && hasInternetExplorerCustomEvent()) {
-                               return (function(self, document) {
-                                       return function(type, rejection) {
-                                               var ev = document.createEvent('CustomEvent');
-                                               ev.initCustomEvent(type, false, true, {
-                                                       reason: rejection.value,
-                                                       key: rejection
-                                               });
-
-                                               return !self.dispatchEvent(ev);
-                                       };
-                               }(self, document));
-                       }
-
-                       return noop;
-               }
-
-               return Promise;
-       };
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-}).call(this,require('_process'))
-
-},{"_process":6}],271:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-/** @author Brian Cavalier */
-/** @author John Hann */
-
-(function(define) { 'use strict';
-define(function() {
-
-       return {
-               pending: toPendingState,
-               fulfilled: toFulfilledState,
-               rejected: toRejectedState,
-               inspect: inspect
-       };
-
-       function toPendingState() {
-               return { state: 'pending' };
-       }
-
-       function toRejectedState(e) {
-               return { state: 'rejected', reason: e };
-       }
-
-       function toFulfilledState(x) {
-               return { state: 'fulfilled', value: x };
-       }
-
-       function inspect(handler) {
-               var state = handler.state();
-               return state === 0 ? toPendingState()
-                        : state > 0   ? toFulfilledState(handler.value)
-                                      : toRejectedState(handler.value);
-       }
-
-});
-}(typeof define === 'function' && define.amd ? define : function(factory) { module.exports = factory(); }));
-
-},{}],272:[function(require,module,exports){
-/** @license MIT License (c) copyright 2010-2014 original author or authors */
-
-/**
- * Promises/A+ and when() implementation
- * when is part of the cujoJS family of libraries (http://cujojs.com/)
- * @author Brian Cavalier
- * @author John Hann
- */
-(function(define) { 'use strict';
-define(function (require) {
-
-       var timed = require('./lib/decorators/timed');
-       var array = require('./lib/decorators/array');
-       var flow = require('./lib/decorators/flow');
-       var fold = require('./lib/decorators/fold');
-       var inspect = require('./lib/decorators/inspect');
-       var generate = require('./lib/decorators/iterate');
-       var progress = require('./lib/decorators/progress');
-       var withThis = require('./lib/decorators/with');
-       var unhandledRejection = require('./lib/decorators/unhandledRejection');
-       var TimeoutError = require('./lib/TimeoutError');
-
-       var Promise = [array, flow, fold, generate, progress,
-               inspect, withThis, timed, unhandledRejection]
-               .reduce(function(Promise, feature) {
-                       return feature(Promise);
-               }, require('./lib/Promise'));
-
-       var apply = require('./lib/apply')(Promise);
-
-       // Public API
-
-       when.promise     = promise;              // Create a pending promise
-       when.resolve     = Promise.resolve;      // Create a resolved promise
-       when.reject      = Promise.reject;       // Create a rejected promise
-
-       when.lift        = lift;                 // lift a function to return promises
-       when['try']      = attempt;              // call a function and return a promise
-       when.attempt     = attempt;              // alias for when.try
-
-       when.iterate     = Promise.iterate;      // DEPRECATED (use cujojs/most streams) Generate a stream of promises
-       when.unfold      = Promise.unfold;       // DEPRECATED (use cujojs/most streams) Generate a stream of promises
-
-       when.join        = join;                 // Join 2 or more promises
-
-       when.all         = all;                  // Resolve a list of promises
-       when.settle      = settle;               // Settle a list of promises
-
-       when.any         = lift(Promise.any);    // One-winner race
-       when.some        = lift(Promise.some);   // Multi-winner race
-       when.race        = lift(Promise.race);   // First-to-settle race
-
-       when.map         = map;                  // Array.map() for promises
-       when.filter      = filter;               // Array.filter() for promises
-       when.reduce      = lift(Promise.reduce);       // Array.reduce() for promises
-       when.reduceRight = lift(Promise.reduceRight);  // Array.reduceRight() for promises
-
-       when.isPromiseLike = isPromiseLike;      // Is something promise-like, aka thenable
-
-       when.Promise     = Promise;              // Promise constructor
-       when.defer       = defer;                // Create a {promise, resolve, reject} tuple
-
-       // Error types
-
-       when.TimeoutError = TimeoutError;
-
-       /**
-        * Get a trusted promise for x, or by transforming x with onFulfilled
-        *
-        * @param {*} x
-        * @param {function?} onFulfilled callback to be called when x is
-        *   successfully fulfilled.  If promiseOrValue is an immediate value, callback
-        *   will be invoked immediately.
-        * @param {function?} onRejected callback to be called when x is
-        *   rejected.
-        * @param {function?} onProgress callback to be called when progress updates
-        *   are issued for x. @deprecated
-        * @returns {Promise} a new promise that will fulfill with the return
-        *   value of callback or errback or the completion value of promiseOrValue if
-        *   callback and/or errback is not supplied.
-        */
-       function when(x, onFulfilled, onRejected, onProgress) {
-               var p = Promise.resolve(x);
-               if (arguments.length < 2) {
-                       return p;
-               }
-
-               return p.then(onFulfilled, onRejected, onProgress);
-       }
-
-       /**
-        * Creates a new promise whose fate is determined by resolver.
-        * @param {function} resolver function(resolve, reject, notify)
-        * @returns {Promise} promise whose fate is determine by resolver
-        */
-       function promise(resolver) {
-               return new Promise(resolver);
-       }
-
-       /**
-        * Lift the supplied function, creating a version of f that returns
-        * promises, and accepts promises as arguments.
-        * @param {function} f
-        * @returns {Function} version of f that returns promises
-        */
-       function lift(f) {
-               return function() {
-                       for(var i=0, l=arguments.length, a=new Array(l); i<l; ++i) {
-                               a[i] = arguments[i];
-                       }
-                       return apply(f, this, a);
-               };
-       }
-
-       /**
-        * Call f in a future turn, with the supplied args, and return a promise
-        * for the result.
-        * @param {function} f
-        * @returns {Promise}
-        */
-       function attempt(f /*, args... */) {
-               /*jshint validthis:true */
-               for(var i=0, l=arguments.length-1, a=new Array(l); i<l; ++i) {
-                       a[i] = arguments[i+1];
-               }
-               return apply(f, this, a);
-       }
-
-       /**
-        * Creates a {promise, resolver} pair, either or both of which
-        * may be given out safely to consumers.
-        * @return {{promise: Promise, resolve: function, reject: function, notify: function}}
-        */
-       function defer() {
-               return new Deferred();
-       }
-
-       function Deferred() {
-               var p = Promise._defer();
-
-               function resolve(x) { p._handler.resolve(x); }
-               function reject(x) { p._handler.reject(x); }
-               function notify(x) { p._handler.notify(x); }
-
-               this.promise = p;
-               this.resolve = resolve;
-               this.reject = reject;
-               this.notify = notify;
-               this.resolver = { resolve: resolve, reject: reject, notify: notify };
-       }
-
-       /**
-        * Determines if x is promise-like, i.e. a thenable object
-        * NOTE: Will return true for *any thenable object*, and isn't truly
-        * safe, since it may attempt to access the `then` property of x (i.e.
-        *  clever/malicious getters may do weird things)
-        * @param {*} x anything
-        * @returns {boolean} true if x is promise-like
-        */
-       function isPromiseLike(x) {
-               return x && typeof x.then === 'function';
-       }
-
-       /**
-        * Return a promise that will resolve only once all the supplied arguments
-        * have resolved. The resolution value of the returned promise will be an array
-        * containing the resolution values of each of the arguments.
-        * @param {...*} arguments may be a mix of promises and values
-        * @returns {Promise}
-        */
-       function join(/* ...promises */) {
-               return Promise.all(arguments);
-       }
-
-       /**
-        * Return a promise that will fulfill once all input promises have
-        * fulfilled, or reject when any one input promise rejects.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise}
-        */
-       function all(promises) {
-               return when(promises, Promise.all);
-       }
-
-       /**
-        * Return a promise that will always fulfill with an array containing
-        * the outcome states of all input promises.  The returned promise
-        * will only reject if `promises` itself is a rejected promise.
-        * @param {array|Promise} promises array (or promise for an array) of promises
-        * @returns {Promise} promise for array of settled state descriptors
-        */
-       function settle(promises) {
-               return when(promises, Promise.settle);
-       }
-
-       /**
-        * Promise-aware array map function, similar to `Array.prototype.map()`,
-        * but input array may contain promises or values.
-        * @param {Array|Promise} promises array of anything, may contain promises and values
-        * @param {function(x:*, index:Number):*} mapFunc map function which may
-        *  return a promise or value
-        * @returns {Promise} promise that will fulfill with an array of mapped values
-        *  or reject if any input promise rejects.
-        */
-       function map(promises, mapFunc) {
-               return when(promises, function(promises) {
-                       return Promise.map(promises, mapFunc);
-               });
-       }
-
-       /**
-        * Filter the provided array of promises using the provided predicate.  Input may
-        * contain promises and values
-        * @param {Array|Promise} promises array of promises and values
-        * @param {function(x:*, index:Number):boolean} predicate filtering predicate.
-        *  Must return truthy (or promise for truthy) for items to retain.
-        * @returns {Promise} promise that will fulfill with an array containing all items
-        *  for which predicate returned truthy.
-        */
-       function filter(promises, predicate) {
-               return when(promises, function(promises) {
-                       return Promise.filter(promises, predicate);
-               });
-       }
-
-       return when;
-});
-})(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); });
-
-},{"./lib/Promise":255,"./lib/TimeoutError":257,"./lib/apply":258,"./lib/decorators/array":259,"./lib/decorators/flow":260,"./lib/decorators/fold":261,"./lib/decorators/inspect":262,"./lib/decorators/iterate":263,"./lib/decorators/progress":264,"./lib/decorators/timed":265,"./lib/decorators/unhandledRejection":266,"./lib/decorators/with":267}],273:[function(require,module,exports){
-var nativeIsArray = Array.isArray
-var toString = Object.prototype.toString
-
-module.exports = nativeIsArray || isArray
-
-function isArray(obj) {
-    return toString.call(obj) === "[object Array]"
-}
-
-},{}],274:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var APIv3_1 = require("./api/APIv3");
-exports.APIv3 = APIv3_1.APIv3;
-var ModelCreator_1 = require("./api/ModelCreator");
-exports.ModelCreator = ModelCreator_1.ModelCreator;
-
-},{"./api/APIv3":287,"./api/ModelCreator":288}],275:[function(require,module,exports){
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("./component/Component");
-exports.Component = Component_1.Component;
-var ComponentService_1 = require("./component/ComponentService");
-exports.ComponentService = ComponentService_1.ComponentService;
-var HandlerBase_1 = require("./component/utils/HandlerBase");
-exports.HandlerBase = HandlerBase_1.HandlerBase;
-var MeshFactory_1 = require("./component/utils/MeshFactory");
-exports.MeshFactory = MeshFactory_1.MeshFactory;
-var MeshScene_1 = require("./component/utils/MeshScene");
-exports.MeshScene = MeshScene_1.MeshScene;
-var MouseOperator_1 = require("./component/utils/MouseOperator");
-exports.MouseOperator = MouseOperator_1.MouseOperator;
-var ComponentSize_1 = require("./component/utils/ComponentSize");
-exports.ComponentSize = ComponentSize_1.ComponentSize;
-var AttributionComponent_1 = require("./component/AttributionComponent");
-exports.AttributionComponent = AttributionComponent_1.AttributionComponent;
-var BackgroundComponent_1 = require("./component/BackgroundComponent");
-exports.BackgroundComponent = BackgroundComponent_1.BackgroundComponent;
-var BearingComponent_1 = require("./component/BearingComponent");
-exports.BearingComponent = BearingComponent_1.BearingComponent;
-var CacheComponent_1 = require("./component/CacheComponent");
-exports.CacheComponent = CacheComponent_1.CacheComponent;
-var CoverComponent_1 = require("./component/CoverComponent");
-exports.CoverComponent = CoverComponent_1.CoverComponent;
-var DebugComponent_1 = require("./component/DebugComponent");
-exports.DebugComponent = DebugComponent_1.DebugComponent;
-var DirectionComponent_1 = require("./component/direction/DirectionComponent");
-exports.DirectionComponent = DirectionComponent_1.DirectionComponent;
-var DirectionDOMCalculator_1 = require("./component/direction/DirectionDOMCalculator");
-exports.DirectionDOMCalculator = DirectionDOMCalculator_1.DirectionDOMCalculator;
-var DirectionDOMRenderer_1 = require("./component/direction/DirectionDOMRenderer");
-exports.DirectionDOMRenderer = DirectionDOMRenderer_1.DirectionDOMRenderer;
-var ImageComponent_1 = require("./component/ImageComponent");
-exports.ImageComponent = ImageComponent_1.ImageComponent;
-var KeyboardComponent_1 = require("./component/keyboard/KeyboardComponent");
-exports.KeyboardComponent = KeyboardComponent_1.KeyboardComponent;
-var KeyPlayHandler_1 = require("./component/keyboard/KeyPlayHandler");
-exports.KeyPlayHandler = KeyPlayHandler_1.KeyPlayHandler;
-var KeyZoomHandler_1 = require("./component/keyboard/KeyZoomHandler");
-exports.KeyZoomHandler = KeyZoomHandler_1.KeyZoomHandler;
-var KeySequenceNavigationHandler_1 = require("./component/keyboard/KeySequenceNavigationHandler");
-exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler_1.KeySequenceNavigationHandler;
-var KeySpatialNavigationHandler_1 = require("./component/keyboard/KeySpatialNavigationHandler");
-exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler_1.KeySpatialNavigationHandler;
-var LoadingComponent_1 = require("./component/LoadingComponent");
-exports.LoadingComponent = LoadingComponent_1.LoadingComponent;
-var Marker_1 = require("./component/marker/marker/Marker");
-exports.Marker = Marker_1.Marker;
-var MarkerComponent_1 = require("./component/marker/MarkerComponent");
-exports.MarkerComponent = MarkerComponent_1.MarkerComponent;
-var MarkerScene_1 = require("./component/marker/MarkerScene");
-exports.MarkerScene = MarkerScene_1.MarkerScene;
-var MarkerSet_1 = require("./component/marker/MarkerSet");
-exports.MarkerSet = MarkerSet_1.MarkerSet;
-var MouseComponent_1 = require("./component/mouse/MouseComponent");
-exports.MouseComponent = MouseComponent_1.MouseComponent;
-var BounceHandler_1 = require("./component/mouse/BounceHandler");
-exports.BounceHandler = BounceHandler_1.BounceHandler;
-var DragPanHandler_1 = require("./component/mouse/DragPanHandler");
-exports.DragPanHandler = DragPanHandler_1.DragPanHandler;
-var DoubleClickZoomHandler_1 = require("./component/mouse/DoubleClickZoomHandler");
-exports.DoubleClickZoomHandler = DoubleClickZoomHandler_1.DoubleClickZoomHandler;
-var EarthControlHandler_1 = require("./component/mouse/EarthControlHandler");
-exports.EarthControlHandler = EarthControlHandler_1.EarthControlHandler;
-var ScrollZoomHandler_1 = require("./component/mouse/ScrollZoomHandler");
-exports.ScrollZoomHandler = ScrollZoomHandler_1.ScrollZoomHandler;
-var TouchZoomHandler_1 = require("./component/mouse/TouchZoomHandler");
-exports.TouchZoomHandler = TouchZoomHandler_1.TouchZoomHandler;
-var ImageBoundary = require("./component/mouse/ImageBoundary");
-exports.ImageBoundary = ImageBoundary;
-var Popup_1 = require("./component/popup/popup/Popup");
-exports.Popup = Popup_1.Popup;
-var PopupComponent_1 = require("./component/popup/PopupComponent");
-exports.PopupComponent = PopupComponent_1.PopupComponent;
-var NavigationComponent_1 = require("./component/NavigationComponent");
-exports.NavigationComponent = NavigationComponent_1.NavigationComponent;
-var RouteComponent_1 = require("./component/RouteComponent");
-exports.RouteComponent = RouteComponent_1.RouteComponent;
-var SequenceComponent_1 = require("./component/sequence/SequenceComponent");
-exports.SequenceComponent = SequenceComponent_1.SequenceComponent;
-var SequenceDOMRenderer_1 = require("./component/sequence/SequenceDOMRenderer");
-exports.SequenceDOMRenderer = SequenceDOMRenderer_1.SequenceDOMRenderer;
-var SequenceMode_1 = require("./component/sequence/SequenceMode");
-exports.SequenceMode = SequenceMode_1.SequenceMode;
-var SpatialDataCache_1 = require("./component/spatialdata/SpatialDataCache");
-exports.SpatialDataCache = SpatialDataCache_1.SpatialDataCache;
-var SpatialDataComponent_1 = require("./component/spatialdata/SpatialDataComponent");
-exports.SpatialDataComponent = SpatialDataComponent_1.SpatialDataComponent;
-var SpatialDataScene_1 = require("./component/spatialdata/SpatialDataScene");
-exports.SpatialDataScene = SpatialDataScene_1.SpatialDataScene;
-var ImagePlaneComponent_1 = require("./component/imageplane/ImagePlaneComponent");
-exports.ImagePlaneComponent = ImagePlaneComponent_1.ImagePlaneComponent;
-var ImagePlaneGLRenderer_1 = require("./component/imageplane/ImagePlaneGLRenderer");
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer_1.ImagePlaneGLRenderer;
-var Shaders_1 = require("./component/shaders/Shaders");
-exports.Shaders = Shaders_1.Shaders;
-var SimpleMarker_1 = require("./component/marker/marker/SimpleMarker");
-exports.SimpleMarker = SimpleMarker_1.SimpleMarker;
-var CircleMarker_1 = require("./component/marker/marker/CircleMarker");
-exports.CircleMarker = CircleMarker_1.CircleMarker;
-var SliderComponent_1 = require("./component/slider/SliderComponent");
-exports.SliderComponent = SliderComponent_1.SliderComponent;
-var SliderDOMRenderer_1 = require("./component/slider/SliderDOMRenderer");
-exports.SliderDOMRenderer = SliderDOMRenderer_1.SliderDOMRenderer;
-var SliderGLRenderer_1 = require("./component/slider/SliderGLRenderer");
-exports.SliderGLRenderer = SliderGLRenderer_1.SliderGLRenderer;
-var StatsComponent_1 = require("./component/StatsComponent");
-exports.StatsComponent = StatsComponent_1.StatsComponent;
-var TagHandlerBase_1 = require("./component/tag/handlers/TagHandlerBase");
-exports.TagHandlerBase = TagHandlerBase_1.TagHandlerBase;
-var CreateHandlerBase_1 = require("./component/tag/handlers/CreateHandlerBase");
-exports.CreateHandlerBase = CreateHandlerBase_1.CreateHandlerBase;
-var CreatePointHandler_1 = require("./component/tag/handlers/CreatePointHandler");
-exports.CreatePointHandler = CreatePointHandler_1.CreatePointHandler;
-var CreateVertexHandler_1 = require("./component/tag/handlers/CreateVertexHandler");
-exports.CreateVertexHandler = CreateVertexHandler_1.CreateVertexHandler;
-var CreatePolygonHandler_1 = require("./component/tag/handlers/CreatePolygonHandler");
-exports.CreatePolygonHandler = CreatePolygonHandler_1.CreatePolygonHandler;
-var CreateRectHandler_1 = require("./component/tag/handlers/CreateRectHandler");
-exports.CreateRectHandler = CreateRectHandler_1.CreateRectHandler;
-var CreateRectDragHandler_1 = require("./component/tag/handlers/CreateRectDragHandler");
-exports.CreateRectDragHandler = CreateRectDragHandler_1.CreateRectDragHandler;
-var EditVertexHandler_1 = require("./component/tag/handlers/EditVertexHandler");
-exports.EditVertexHandler = EditVertexHandler_1.EditVertexHandler;
-var Tag_1 = require("./component/tag/tag/Tag");
-exports.Tag = Tag_1.Tag;
-var OutlineTag_1 = require("./component/tag/tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var RenderTag_1 = require("./component/tag/tag/RenderTag");
-exports.RenderTag = RenderTag_1.RenderTag;
-var OutlineRenderTag_1 = require("./component/tag/tag/OutlineRenderTag");
-exports.OutlineRenderTag = OutlineRenderTag_1.OutlineRenderTag;
-var OutlineCreateTag_1 = require("./component/tag/tag/OutlineCreateTag");
-exports.OutlineCreateTag = OutlineCreateTag_1.OutlineCreateTag;
-var SpotTag_1 = require("./component/tag/tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var SpotRenderTag_1 = require("./component/tag/tag/SpotRenderTag");
-exports.SpotRenderTag = SpotRenderTag_1.SpotRenderTag;
-var TagDomain_1 = require("./component/tag/tag/TagDomain");
-exports.TagDomain = TagDomain_1.TagDomain;
-var TagComponent_1 = require("./component/tag/TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
-var TagCreator_1 = require("./component/tag/TagCreator");
-exports.TagCreator = TagCreator_1.TagCreator;
-var TagDOMRenderer_1 = require("./component/tag/TagDOMRenderer");
-exports.TagDOMRenderer = TagDOMRenderer_1.TagDOMRenderer;
-var TagMode_1 = require("./component/tag/TagMode");
-exports.TagMode = TagMode_1.TagMode;
-var TagOperation_1 = require("./component/tag/TagOperation");
-exports.TagOperation = TagOperation_1.TagOperation;
-var TagScene_1 = require("./component/tag/TagScene");
-exports.TagScene = TagScene_1.TagScene;
-var TagSet_1 = require("./component/tag/TagSet");
-exports.TagSet = TagSet_1.TagSet;
-var Geometry_1 = require("./component/tag/geometry/Geometry");
-exports.Geometry = Geometry_1.Geometry;
-var VertexGeometry_1 = require("./component/tag/geometry/VertexGeometry");
-exports.VertexGeometry = VertexGeometry_1.VertexGeometry;
-var RectGeometry_1 = require("./component/tag/geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PointGeometry_1 = require("./component/tag/geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var PolygonGeometry_1 = require("./component/tag/geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var GeometryTagError_1 = require("./component/tag/error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
-var ZoomComponent_1 = require("./component/zoom/ZoomComponent");
-exports.ZoomComponent = ZoomComponent_1.ZoomComponent;
-__export(require("./component/interfaces/interfaces"));
-
-},{"./component/AttributionComponent":289,"./component/BackgroundComponent":290,"./component/BearingComponent":291,"./component/CacheComponent":292,"./component/Component":293,"./component/ComponentService":294,"./component/CoverComponent":295,"./component/DebugComponent":296,"./component/ImageComponent":297,"./component/LoadingComponent":298,"./component/NavigationComponent":299,"./component/RouteComponent":300,"./component/StatsComponent":301,"./component/direction/DirectionComponent":302,"./component/direction/DirectionDOMCalculator":303,"./component/direction/DirectionDOMRenderer":304,"./component/imageplane/ImagePlaneComponent":305,"./component/imageplane/ImagePlaneGLRenderer":306,"./component/interfaces/interfaces":309,"./component/keyboard/KeyPlayHandler":310,"./component/keyboard/KeySequenceNavigationHandler":311,"./component/keyboard/KeySpatialNavigationHandler":312,"./component/keyboard/KeyZoomHandler":313,"./component/keyboard/KeyboardComponent":314,"./component/marker/MarkerComponent":316,"./component/marker/MarkerScene":317,"./component/marker/MarkerSet":318,"./component/marker/marker/CircleMarker":319,"./component/marker/marker/Marker":320,"./component/marker/marker/SimpleMarker":321,"./component/mouse/BounceHandler":322,"./component/mouse/DoubleClickZoomHandler":323,"./component/mouse/DragPanHandler":324,"./component/mouse/EarthControlHandler":325,"./component/mouse/ImageBoundary":326,"./component/mouse/MouseComponent":327,"./component/mouse/ScrollZoomHandler":328,"./component/mouse/TouchZoomHandler":329,"./component/popup/PopupComponent":331,"./component/popup/popup/Popup":332,"./component/sequence/SequenceComponent":333,"./component/sequence/SequenceDOMRenderer":334,"./component/sequence/SequenceMode":335,"./component/shaders/Shaders":336,"./component/slider/SliderComponent":337,"./component/slider/SliderDOMRenderer":338,"./component/slider/SliderGLRenderer":339,"./component/spatialdata/SpatialDataCache":340,"./component/spatialdata/SpatialDataComponent":341,"./component/spatialdata/SpatialDataScene":342,"./component/tag/TagComponent":344,"./component/tag/TagCreator":345,"./component/tag/TagDOMRenderer":346,"./component/tag/TagMode":347,"./component/tag/TagOperation":348,"./component/tag/TagScene":349,"./component/tag/TagSet":350,"./component/tag/error/GeometryTagError":351,"./component/tag/geometry/Geometry":352,"./component/tag/geometry/PointGeometry":353,"./component/tag/geometry/PolygonGeometry":354,"./component/tag/geometry/RectGeometry":355,"./component/tag/geometry/VertexGeometry":356,"./component/tag/handlers/CreateHandlerBase":357,"./component/tag/handlers/CreatePointHandler":358,"./component/tag/handlers/CreatePolygonHandler":359,"./component/tag/handlers/CreateRectDragHandler":360,"./component/tag/handlers/CreateRectHandler":361,"./component/tag/handlers/CreateVertexHandler":362,"./component/tag/handlers/EditVertexHandler":363,"./component/tag/handlers/TagHandlerBase":364,"./component/tag/tag/OutlineCreateTag":365,"./component/tag/tag/OutlineRenderTag":366,"./component/tag/tag/OutlineTag":367,"./component/tag/tag/RenderTag":368,"./component/tag/tag/SpotRenderTag":369,"./component/tag/tag/SpotTag":370,"./component/tag/tag/Tag":371,"./component/tag/tag/TagDomain":372,"./component/utils/ComponentSize":373,"./component/utils/HandlerBase":374,"./component/utils/MeshFactory":375,"./component/utils/MeshScene":376,"./component/utils/MouseOperator":377,"./component/zoom/ZoomComponent":378}],276:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeDirection_1 = require("./graph/edge/EdgeDirection");
-exports.EdgeDirection = EdgeDirection_1.EdgeDirection;
-var EdgeCalculatorSettings_1 = require("./graph/edge/EdgeCalculatorSettings");
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings_1.EdgeCalculatorSettings;
-var EdgeCalculatorDirections_1 = require("./graph/edge/EdgeCalculatorDirections");
-exports.EdgeCalculatorDirections = EdgeCalculatorDirections_1.EdgeCalculatorDirections;
-var EdgeCalculatorCoefficients_1 = require("./graph/edge/EdgeCalculatorCoefficients");
-exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients_1.EdgeCalculatorCoefficients;
-var EdgeCalculator_1 = require("./graph/edge/EdgeCalculator");
-exports.EdgeCalculator = EdgeCalculator_1.EdgeCalculator;
-
-},{"./graph/edge/EdgeCalculator":400,"./graph/edge/EdgeCalculatorCoefficients":401,"./graph/edge/EdgeCalculatorDirections":402,"./graph/edge/EdgeCalculatorSettings":403,"./graph/edge/EdgeDirection":404}],277:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var AbortMapillaryError_1 = require("./error/AbortMapillaryError");
-exports.AbortMapillaryError = AbortMapillaryError_1.AbortMapillaryError;
-var ArgumentMapillaryError_1 = require("./error/ArgumentMapillaryError");
-exports.ArgumentMapillaryError = ArgumentMapillaryError_1.ArgumentMapillaryError;
-var GraphMapillaryError_1 = require("./error/GraphMapillaryError");
-exports.GraphMapillaryError = GraphMapillaryError_1.GraphMapillaryError;
-var MapillaryError_1 = require("./error/MapillaryError");
-exports.MapillaryError = MapillaryError_1.MapillaryError;
-
-},{"./error/AbortMapillaryError":379,"./error/ArgumentMapillaryError":380,"./error/GraphMapillaryError":381,"./error/MapillaryError":382}],278:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Camera_1 = require("./geo/Camera");
-exports.Camera = Camera_1.Camera;
-var GeoCoords_1 = require("./geo/GeoCoords");
-exports.GeoCoords = GeoCoords_1.GeoCoords;
-var ViewportCoords_1 = require("./geo/ViewportCoords");
-exports.ViewportCoords = ViewportCoords_1.ViewportCoords;
-var Spatial_1 = require("./geo/Spatial");
-exports.Spatial = Spatial_1.Spatial;
-var Transform_1 = require("./geo/Transform");
-exports.Transform = Transform_1.Transform;
-var Geo = require("./geo/Geo");
-exports.Geo = Geo;
-var Lines = require("./geo/Lines");
-exports.Lines = Lines;
-
-},{"./geo/Camera":383,"./geo/Geo":384,"./geo/GeoCoords":385,"./geo/Lines":386,"./geo/Spatial":387,"./geo/Transform":388,"./geo/ViewportCoords":389}],279:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var FilterCreator_1 = require("./graph/FilterCreator");
-exports.FilterCreator = FilterCreator_1.FilterCreator;
-var Graph_1 = require("./graph/Graph");
-exports.Graph = Graph_1.Graph;
-var GraphCalculator_1 = require("./graph/GraphCalculator");
-exports.GraphCalculator = GraphCalculator_1.GraphCalculator;
-var GraphMode_1 = require("./graph/GraphMode");
-exports.GraphMode = GraphMode_1.GraphMode;
-var GraphService_1 = require("./graph/GraphService");
-exports.GraphService = GraphService_1.GraphService;
-var ImageLoadingService_1 = require("./graph/ImageLoadingService");
-exports.ImageLoadingService = ImageLoadingService_1.ImageLoadingService;
-var MeshReader_1 = require("./graph/MeshReader");
-exports.MeshReader = MeshReader_1.MeshReader;
-var Node_1 = require("./graph/Node");
-exports.Node = Node_1.Node;
-var NodeCache_1 = require("./graph/NodeCache");
-exports.NodeCache = NodeCache_1.NodeCache;
-var Sequence_1 = require("./graph/Sequence");
-exports.Sequence = Sequence_1.Sequence;
-
-},{"./graph/FilterCreator":390,"./graph/Graph":391,"./graph/GraphCalculator":392,"./graph/GraphMode":393,"./graph/GraphService":394,"./graph/ImageLoadingService":395,"./graph/MeshReader":396,"./graph/Node":397,"./graph/NodeCache":398,"./graph/Sequence":399}],280:[function(require,module,exports){
-"use strict";
-/**
- * MapillaryJS is a WebGL JavaScript library for exploring street level imagery
- * @name Mapillary
- */
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-__export(require("./Support"));
-var Edge_1 = require("./Edge");
-exports.EdgeDirection = Edge_1.EdgeDirection;
-var Error_1 = require("./Error");
-exports.AbortMapillaryError = Error_1.AbortMapillaryError;
-var Render_1 = require("./Render");
-exports.RenderMode = Render_1.RenderMode;
-var State_1 = require("./State");
-exports.TransitionMode = State_1.TransitionMode;
-var Viewer_1 = require("./Viewer");
-exports.Alignment = Viewer_1.Alignment;
-exports.ImageSize = Viewer_1.ImageSize;
-exports.Viewer = Viewer_1.Viewer;
-var Component_1 = require("./Component");
-exports.SliderMode = Component_1.SliderMode;
-exports.ComponentSize = Component_1.ComponentSize;
-var TagComponent = require("./component/tag/Tag");
-exports.TagComponent = TagComponent;
-var MarkerComponent = require("./component/marker/Marker");
-exports.MarkerComponent = MarkerComponent;
-var PopupComponent = require("./component/popup/Popup");
-exports.PopupComponent = PopupComponent;
-
-},{"./Component":275,"./Edge":276,"./Error":277,"./Render":281,"./State":282,"./Support":283,"./Viewer":286,"./component/marker/Marker":315,"./component/popup/Popup":330,"./component/tag/Tag":343}],281:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var DOMRenderer_1 = require("./render/DOMRenderer");
-exports.DOMRenderer = DOMRenderer_1.DOMRenderer;
-var GLRenderer_1 = require("./render/GLRenderer");
-exports.GLRenderer = GLRenderer_1.GLRenderer;
-var GLRenderStage_1 = require("./render/GLRenderStage");
-exports.GLRenderStage = GLRenderStage_1.GLRenderStage;
-var RenderCamera_1 = require("./render/RenderCamera");
-exports.RenderCamera = RenderCamera_1.RenderCamera;
-var RenderMode_1 = require("./render/RenderMode");
-exports.RenderMode = RenderMode_1.RenderMode;
-var RenderService_1 = require("./render/RenderService");
-exports.RenderService = RenderService_1.RenderService;
-
-},{"./render/DOMRenderer":405,"./render/GLRenderStage":406,"./render/GLRenderer":407,"./render/RenderCamera":408,"./render/RenderMode":409,"./render/RenderService":410}],282:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var FrameGenerator_1 = require("./state/FrameGenerator");
-exports.FrameGenerator = FrameGenerator_1.FrameGenerator;
-var RotationDelta_1 = require("./state/RotationDelta");
-exports.RotationDelta = RotationDelta_1.RotationDelta;
-var State_1 = require("./state/State");
-exports.State = State_1.State;
-var StateBase_1 = require("./state/states/StateBase");
-exports.StateBase = StateBase_1.StateBase;
-var StateContext_1 = require("./state/StateContext");
-exports.StateContext = StateContext_1.StateContext;
-var StateService_1 = require("./state/StateService");
-exports.StateService = StateService_1.StateService;
-var TransitionMode_1 = require("./state/TransitionMode");
-exports.TransitionMode = TransitionMode_1.TransitionMode;
-var EarthState_1 = require("./state/states/EarthState");
-exports.EarthState = EarthState_1.EarthState;
-var InteractiveStateBase_1 = require("./state/states/InteractiveStateBase");
-exports.InteractiveStateBase = InteractiveStateBase_1.InteractiveStateBase;
-var InteractiveWaitingState_1 = require("./state/states/InteractiveWaitingState");
-exports.InteractiveWaitingState = InteractiveWaitingState_1.InteractiveWaitingState;
-var TraversingState_1 = require("./state/states/TraversingState");
-exports.TraversingState = TraversingState_1.TraversingState;
-var WaitingState_1 = require("./state/states/WaitingState");
-exports.WaitingState = WaitingState_1.WaitingState;
-
-},{"./state/FrameGenerator":411,"./state/RotationDelta":412,"./state/State":413,"./state/StateContext":414,"./state/StateService":415,"./state/TransitionMode":416,"./state/states/EarthState":417,"./state/states/InteractiveStateBase":418,"./state/states/InteractiveWaitingState":419,"./state/states/StateBase":420,"./state/states/TraversingState":421,"./state/states/WaitingState":422}],283:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var support = require("./utils/Support");
-/**
- * Test whether the current browser supports the full
- * functionality of MapillaryJS.
- *
- * @description The full functionality includes WebGL rendering.
- *
- * @return {boolean}
- *
- * @example `var supported = Mapillary.isSupported();`
- */
-function isSupported() {
-    return isFallbackSupported() &&
-        support.isWebGLSupportedCached();
-}
-exports.isSupported = isSupported;
-/**
- * Test whether the current browser supports the fallback
- * functionality of MapillaryJS.
- *
- * @description The fallback functionality does not include WebGL
- * rendering, only 2D canvas rendering.
- *
- * @return {boolean}
- *
- * @example `var fallbackSupported = Mapillary.isFallbackSupported();`
- */
-function isFallbackSupported() {
-    return support.isBrowser() &&
-        support.isBlobSupported() &&
-        support.isArraySupported() &&
-        support.isFunctionSupported() &&
-        support.isJSONSupported() &&
-        support.isObjectSupported();
-}
-exports.isFallbackSupported = isFallbackSupported;
-
-},{"./utils/Support":430}],284:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ImageTileLoader_1 = require("./tiles/ImageTileLoader");
-exports.ImageTileLoader = ImageTileLoader_1.ImageTileLoader;
-var ImageTileStore_1 = require("./tiles/ImageTileStore");
-exports.ImageTileStore = ImageTileStore_1.ImageTileStore;
-var TextureProvider_1 = require("./tiles/TextureProvider");
-exports.TextureProvider = TextureProvider_1.TextureProvider;
-var RegionOfInterestCalculator_1 = require("./tiles/RegionOfInterestCalculator");
-exports.RegionOfInterestCalculator = RegionOfInterestCalculator_1.RegionOfInterestCalculator;
-
-},{"./tiles/ImageTileLoader":423,"./tiles/ImageTileStore":424,"./tiles/RegionOfInterestCalculator":425,"./tiles/TextureProvider":426}],285:[function(require,module,exports){
-"use strict";
-function __export(m) {
-    for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
-}
-Object.defineProperty(exports, "__esModule", { value: true });
-var DOM_1 = require("./utils/DOM");
-exports.DOM = DOM_1.DOM;
-var EventEmitter_1 = require("./utils/EventEmitter");
-exports.EventEmitter = EventEmitter_1.EventEmitter;
-var Settings_1 = require("./utils/Settings");
-exports.Settings = Settings_1.Settings;
-__export(require("./utils/Support"));
-var Urls_1 = require("./utils/Urls");
-exports.Urls = Urls_1.Urls;
-
-},{"./utils/DOM":427,"./utils/EventEmitter":428,"./utils/Settings":429,"./utils/Support":430,"./utils/Urls":431}],286:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Alignment_1 = require("./viewer/Alignment");
-exports.Alignment = Alignment_1.Alignment;
-var CacheService_1 = require("./viewer/CacheService");
-exports.CacheService = CacheService_1.CacheService;
-var ComponentController_1 = require("./viewer/ComponentController");
-exports.ComponentController = ComponentController_1.ComponentController;
-var Container_1 = require("./viewer/Container");
-exports.Container = Container_1.Container;
-var Observer_1 = require("./viewer/Observer");
-exports.Observer = Observer_1.Observer;
-var ImageSize_1 = require("./viewer/ImageSize");
-exports.ImageSize = ImageSize_1.ImageSize;
-var KeyboardService_1 = require("./viewer/KeyboardService");
-exports.KeyboardService = KeyboardService_1.KeyboardService;
-var LoadingService_1 = require("./viewer/LoadingService");
-exports.LoadingService = LoadingService_1.LoadingService;
-var MouseService_1 = require("./viewer/MouseService");
-exports.MouseService = MouseService_1.MouseService;
-var Navigator_1 = require("./viewer/Navigator");
-exports.Navigator = Navigator_1.Navigator;
-var PlayService_1 = require("./viewer/PlayService");
-exports.PlayService = PlayService_1.PlayService;
-var Projection_1 = require("./viewer/Projection");
-exports.Projection = Projection_1.Projection;
-var SpriteService_1 = require("./viewer/SpriteService");
-exports.SpriteService = SpriteService_1.SpriteService;
-var TouchService_1 = require("./viewer/TouchService");
-exports.TouchService = TouchService_1.TouchService;
-var Viewer_1 = require("./viewer/Viewer");
-exports.Viewer = Viewer_1.Viewer;
-
-},{"./viewer/Alignment":432,"./viewer/CacheService":433,"./viewer/ComponentController":434,"./viewer/Container":435,"./viewer/ImageSize":436,"./viewer/KeyboardService":437,"./viewer/LoadingService":438,"./viewer/MouseService":439,"./viewer/Navigator":440,"./viewer/Observer":441,"./viewer/PlayService":443,"./viewer/Projection":444,"./viewer/SpriteService":445,"./viewer/TouchService":446,"./viewer/Viewer":447}],287:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var API_1 = require("../API");
-/**
- * @class APIv3
- *
- * @classdesc Provides methods for access of API v3.
- */
-var APIv3 = /** @class */ (function () {
-    /**
-     * Create a new api v3 instance.
-     *
-     * @param {number} clientId - Client id for API requests.
-     * @param {number} [token] - Optional bearer token for API requests of
-     * protected resources.
-     * @param {ModelCreator} [creator] - Optional model creator instance.
-     */
-    function APIv3(clientId, token, creator) {
-        this._clientId = clientId;
-        this._modelCreator = creator != null ? creator : new API_1.ModelCreator();
-        this._model = this._modelCreator.createModel(clientId, token);
-        this._pageCount = 999;
-        this._pathImageByKey = "imageByKey";
-        this._pathImageCloseTo = "imageCloseTo";
-        this._pathImagesByH = "imagesByH";
-        this._pathImageViewAdd = "imageViewAdd";
-        this._pathSequenceByKey = "sequenceByKey";
-        this._pathSequenceViewAdd = "sequenceViewAdd";
-        this._propertiesCore = [
-            "cl",
-            "l",
-            "sequence_key",
-        ];
-        this._propertiesFill = [
-            "captured_at",
-            "captured_with_camera_uuid",
-            "user",
-            "organization_key",
-            "private",
-            "project",
-        ];
-        this._propertiesKey = [
-            "key",
-        ];
-        this._propertiesSequence = [
-            "keys",
-        ];
-        this._propertiesSpatial = [
-            "atomic_scale",
-            "c_rotation",
-            "ca",
-            "calt",
-            "camera_projection_type",
-            "cca",
-            "cfocal",
-            "ck1",
-            "ck2",
-            "gpano",
-            "height",
-            "merge_cc",
-            "merge_version",
-            "orientation",
-            "width",
-        ];
-        this._propertiesUser = [
-            "username",
-        ];
-    }
-    APIv3.prototype.imageByKeyFill$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
-            }
-            return value.json.imageByKey;
-        })), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageByKeyFull$ = function (keys) {
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImageByKey,
-            keys,
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                throw new Error("Images (" + keys.join(", ") + ") could not be found.");
-            }
-            return value.json.imageByKey;
-        })), this._pathImageByKey, keys);
-    };
-    APIv3.prototype.imageCloseTo$ = function (lat, lon) {
-        var lonLat = lon + ":" + lat;
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImageCloseTo,
-            [lonLat],
-            this._propertiesKey
-                .concat(this._propertiesCore)
-                .concat(this._propertiesFill)
-                .concat(this._propertiesSpatial),
-            this._propertiesKey
-                .concat(this._propertiesUser)
-        ])).pipe(operators_1.map(function (value) {
-            return value != null ? value.json.imageCloseTo[lonLat] : null;
-        })), this._pathImageCloseTo, [lonLat]);
-    };
-    APIv3.prototype.imagesByH$ = function (hs) {
-        var _this = this;
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathImagesByH,
-            hs,
-            { from: 0, to: this._pageCount },
-            this._propertiesKey
-                .concat(this._propertiesCore)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                value = { json: { imagesByH: {} } };
-                for (var _i = 0, hs_1 = hs; _i < hs_1.length; _i++) {
-                    var h = hs_1[_i];
-                    value.json.imagesByH[h] = {};
-                    for (var i = 0; i <= _this._pageCount; i++) {
-                        value.json.imagesByH[h][i] = null;
-                    }
-                }
-            }
-            return value.json.imagesByH;
-        })), this._pathImagesByH, hs);
-    };
-    APIv3.prototype.imageViewAdd$ = function (keys) {
-        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathImageViewAdd], [keys])), this._pathImageViewAdd, keys);
-    };
-    APIv3.prototype.invalidateImageByKey = function (keys) {
-        this._invalidateGet(this._pathImageByKey, keys);
-    };
-    APIv3.prototype.invalidateImagesByH = function (hs) {
-        this._invalidateGet(this._pathImagesByH, hs);
-    };
-    APIv3.prototype.invalidateSequenceByKey = function (sKeys) {
-        this._invalidateGet(this._pathSequenceByKey, sKeys);
-    };
-    APIv3.prototype.setToken = function (token) {
-        this._model.invalidate([]);
-        this._model = null;
-        this._model = this._modelCreator.createModel(this._clientId, token);
-    };
-    APIv3.prototype.sequenceByKey$ = function (sequenceKeys) {
-        return this._catchInvalidateGet$(this._wrapModelResponse$(this._model.get([
-            this._pathSequenceByKey,
-            sequenceKeys,
-            this._propertiesKey
-                .concat(this._propertiesSequence)
-        ])).pipe(operators_1.map(function (value) {
-            if (!value) {
-                value = { json: { sequenceByKey: {} } };
-            }
-            for (var _i = 0, sequenceKeys_1 = sequenceKeys; _i < sequenceKeys_1.length; _i++) {
-                var sequenceKey = sequenceKeys_1[_i];
-                if (!(sequenceKey in value.json.sequenceByKey)) {
-                    console.warn("Sequence data missing (" + sequenceKey + ")");
-                    value.json.sequenceByKey[sequenceKey] = { key: sequenceKey, keys: [] };
-                }
-            }
-            return value.json.sequenceByKey;
-        })), this._pathSequenceByKey, sequenceKeys);
-    };
-    APIv3.prototype.sequenceViewAdd$ = function (sequenceKeys) {
-        return this._catchInvalidateCall$(this._wrapCallModelResponse$(this._model.call([this._pathSequenceViewAdd], [sequenceKeys])), this._pathSequenceViewAdd, sequenceKeys);
-    };
-    Object.defineProperty(APIv3.prototype, "clientId", {
-        get: function () {
-            return this._clientId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    APIv3.prototype._catchInvalidateGet$ = function (observable, path, paths) {
-        var _this = this;
-        return observable.pipe(operators_1.catchError(function (error) {
-            _this._invalidateGet(path, paths);
-            throw error;
-        }));
-    };
-    APIv3.prototype._catchInvalidateCall$ = function (observable, path, paths) {
-        var _this = this;
-        return observable.pipe(operators_1.catchError(function (error) {
-            _this._invalidateCall(path, paths);
-            throw error;
-        }));
-    };
-    APIv3.prototype._invalidateGet = function (path, paths) {
-        this._model.invalidate([path, paths]);
-    };
-    APIv3.prototype._invalidateCall = function (path, paths) {
-        this._model.invalidate([path], [paths]);
-    };
-    APIv3.prototype._wrapModelResponse$ = function (modelResponse) {
-        return rxjs_1.Observable
-            .create(function (subscriber) {
-            modelResponse
-                .then(function (value) {
-                subscriber.next(value);
-                subscriber.complete();
-            }, function (error) {
-                subscriber.error(error);
-            });
-        });
-    };
-    APIv3.prototype._wrapCallModelResponse$ = function (modelResponse) {
-        return this._wrapModelResponse$(modelResponse).pipe(operators_1.map(function (value) {
-            return;
-        }));
-    };
-    return APIv3;
-}());
-exports.APIv3 = APIv3;
-exports.default = APIv3;
-
-},{"../API":274,"rxjs":27,"rxjs/operators":225}],288:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var falcor = require("falcor");
-var falcor_http_datasource_1 = require("falcor-http-datasource");
-var Utils_1 = require("../Utils");
-/**
- * @class ModelCreator
- *
- * @classdesc Creates API models.
- */
-var ModelCreator = /** @class */ (function () {
-    function ModelCreator() {
-    }
-    /**
-     * Creates a Falcor model.
-     *
-     * @description Max cache size will be set to 16 MB. Authorization
-     * header will be added if bearer token is supplied.
-     *
-     * @param {number} clientId - Client id for API requests.
-     * @param {number} [token] - Optional bearer token for API requests of
-     * protected resources.
-     * @returns {falcor.Model} Falcor model for HTTP requests.
-     */
-    ModelCreator.prototype.createModel = function (clientId, token) {
-        var configuration = {
-            crossDomain: true,
-            withCredentials: false,
-        };
-        if (token != null) {
-            configuration.headers = { "Authorization": "Bearer " + token };
-        }
-        return new falcor.Model({
-            maxSize: 16 * 1024 * 1024,
-            source: new falcor_http_datasource_1.default(Utils_1.Urls.falcorModel(clientId), configuration),
-        });
-    };
-    return ModelCreator;
-}());
-exports.ModelCreator = ModelCreator;
-exports.default = ModelCreator;
-
-},{"../Utils":285,"falcor":15,"falcor-http-datasource":10}],289:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var Utils_1 = require("../Utils");
-var AttributionComponent = /** @class */ (function (_super) {
-    __extends(AttributionComponent, _super);
-    function AttributionComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    AttributionComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var node = _a[0], size = _a[1];
-            return {
-                name: _this._name,
-                vnode: _this._getAttributionNode(node.username, node.key, node.capturedAt, size.width),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    AttributionComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    AttributionComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    AttributionComponent.prototype._getAttributionNode = function (username, key, capturedAt, width) {
-        var compact = width <= 640;
-        var mapillaryIcon = vd.h("div.AttributionMapillaryLogo", []);
-        var mapillaryLink = vd.h("a.AttributionIconContainer", { href: Utils_1.Urls.explore, target: "_blank" }, [mapillaryIcon]);
-        var imageBy = compact ? "" + username : "image by " + username;
-        var imageByContent = vd.h("div.AttributionUsername", { textContent: imageBy }, []);
-        var date = new Date(capturedAt).toDateString().split(" ");
-        var formatted = (date.length > 3 ?
-            compact ?
-                [date[3]] :
-                [date[1], date[2] + ",", date[3]] :
-            date).join(" ");
-        var dateContent = vd.h("div.AttributionDate", { textContent: formatted }, []);
-        var imageLink = vd.h("a.AttributionImageContainer", { href: Utils_1.Urls.exporeImage(key), target: "_blank" }, [imageByContent, dateContent]);
-        var compactClass = compact ? ".AttributionCompact" : "";
-        return vd.h("div.AttributionContainer" + compactClass, {}, [mapillaryLink, imageLink]);
-    };
-    AttributionComponent.componentName = "attribution";
-    return AttributionComponent;
-}(Component_1.Component));
-exports.AttributionComponent = AttributionComponent;
-Component_1.ComponentService.register(AttributionComponent);
-exports.default = AttributionComponent;
-
-},{"../Component":275,"../Utils":285,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],290:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var BackgroundComponent = /** @class */ (function (_super) {
-    __extends(BackgroundComponent, _super);
-    function BackgroundComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    BackgroundComponent.prototype._activate = function () {
-        this._container.domRenderer.render$
-            .next({ name: this._name, vnode: this._getBackgroundNode("The viewer can't display the given image.") });
-    };
-    BackgroundComponent.prototype._deactivate = function () {
-        return;
-    };
-    BackgroundComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    BackgroundComponent.prototype._getBackgroundNode = function (notice) {
-        // todo: add condition for when to display the DOM node
-        return vd.h("div.BackgroundWrapper", {}, [
-            vd.h("p", { textContent: notice }, []),
-        ]);
-    };
-    BackgroundComponent.componentName = "background";
-    return BackgroundComponent;
-}(Component_1.Component));
-exports.BackgroundComponent = BackgroundComponent;
-Component_1.ComponentService.register(BackgroundComponent);
-exports.default = BackgroundComponent;
-
-},{"../Component":275,"virtual-dom":231}],291:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var UnitBezier = require("@mapbox/unitbezier");
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../Component");
-var Geo_1 = require("../Geo");
-var ViewportCoords_1 = require("../geo/ViewportCoords");
-var ComponentSize_1 = require("./utils/ComponentSize");
-/**
- * @class BearingComponent
- *
- * @classdesc Component for indicating bearing and field of view.
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var bearingComponent = viewer.getComponent("bearing");
- * bearingComponent.configure({ size: Mapillary.ComponentSize.Small });
- * ```
- */
-var BearingComponent = /** @class */ (function (_super) {
-    __extends(BearingComponent, _super);
-    function BearingComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._spatial = new Geo_1.Spatial();
-        _this._viewportCoords = new ViewportCoords_1.default();
-        _this._svgNamespace = "http://www.w3.org/2000/svg";
-        _this._distinctThreshold = Math.PI / 360;
-        _this._animationSpeed = 0.075;
-        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
-        return _this;
-    }
-    BearingComponent.prototype._activate = function () {
-        var _this = this;
-        var cameraBearingFov$ = this._container.renderService.renderCamera$.pipe(operators_1.map(function (rc) {
-            var vFov = _this._spatial.degToRad(rc.perspective.fov);
-            var hFov = rc.perspective.aspect === Number.POSITIVE_INFINITY ?
-                Math.PI :
-                Math.atan(rc.perspective.aspect * Math.tan(0.5 * vFov)) * 2;
-            return [_this._spatial.azimuthalToBearing(rc.rotation.phi), hFov];
-        }), operators_1.distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a2[0] - a1[0]) < _this._distinctThreshold &&
-                Math.abs(a2[1] - a1[1]) < _this._distinctThreshold;
-        }));
-        var nodeFov$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })), this._navigator.panService.panNodes$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], panNodes = _a[1];
-            var node = frame.state.currentNode;
-            var transform = frame.state.currentTransform;
-            if (node.pano) {
-                var panoHFov = 2 * Math.PI * node.gpano.CroppedAreaImageWidthPixels / node.gpano.FullPanoWidthPixels;
-                return [panoHFov / 2, panoHFov / 2];
-            }
-            var currentProjectedPoints = _this._computeProjectedPoints(transform);
-            var hFov = _this._spatial.degToRad(_this._computeHorizontalFov(currentProjectedPoints));
-            var hFovLeft = hFov / 2;
-            var hFovRight = hFov / 2;
-            for (var _i = 0, panNodes_1 = panNodes; _i < panNodes_1.length; _i++) {
-                var _b = panNodes_1[_i], n = _b[0], f = _b[2];
-                var diff = _this._spatial.wrap(n.ca - node.ca, -180, 180);
-                if (diff < 0) {
-                    hFovLeft = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
-                }
-                else {
-                    hFovRight = _this._spatial.degToRad(Math.abs(diff)) + f / 2;
-                }
-            }
-            return [hFovLeft, hFovRight];
-        }), operators_1.distinctUntilChanged(function (_a, _b) {
-            var hFovLeft1 = _a[0], hFovRight1 = _a[1];
-            var hFovLeft2 = _b[0], hFovRight2 = _b[1];
-            return Math.abs(hFovLeft2 - hFovLeft1) < _this._distinctThreshold &&
-                Math.abs(hFovRight2 - hFovRight1) < _this._distinctThreshold;
-        }));
-        var offset$ = rxjs_1.combineLatest(this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        })), this._container.renderService.bearing$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], bearing = _a[1];
-            var offset = _this._spatial.degToRad(frame.state.currentNode.ca - bearing);
-            return offset;
-        }));
-        var nodeFovOperation$ = new rxjs_1.Subject();
-        var smoothNodeFov$ = nodeFovOperation$.pipe(operators_1.scan(function (state, operation) {
-            return operation(state);
-        }, { alpha: 0, curr: [0, 0, 0], prev: [0, 0, 0] }), operators_1.map(function (state) {
-            var alpha = _this._unitBezier.solve(state.alpha);
-            var curr = state.curr;
-            var prev = state.prev;
-            return [
-                _this._interpolate(prev[0], curr[0], alpha),
-                _this._interpolate(prev[1], curr[1], alpha),
-            ];
-        }));
-        this._fovSubscription = nodeFov$.pipe(operators_1.map(function (nbf) {
-            return function (state) {
-                var a = _this._unitBezier.solve(state.alpha);
-                var c = state.curr;
-                var p = state.prev;
-                var prev = [
-                    _this._interpolate(p[0], c[0], a),
-                    _this._interpolate(p[1], c[1], a),
-                ];
-                var curr = nbf.slice();
-                return {
-                    alpha: 0,
-                    curr: curr,
-                    prev: prev,
-                };
-            };
-        }))
-            .subscribe(nodeFovOperation$);
-        this._fovAnimationSubscription = nodeFov$.pipe(operators_1.switchMap(function () {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.skip(1), operators_1.scan(function (alpha) {
-                return alpha + _this._animationSpeed;
-            }, 0), operators_1.takeWhile(function (alpha) {
-                return alpha <= 1 + _this._animationSpeed;
-            }), operators_1.map(function (alpha) {
-                return Math.min(alpha, 1);
-            }));
-        }), operators_1.map(function (alpha) {
-            return function (nbfState) {
-                return {
-                    alpha: alpha,
-                    curr: nbfState.curr.slice(),
-                    prev: nbfState.prev.slice(),
-                };
-            };
-        }))
-            .subscribe(nodeFovOperation$);
-        var nodeBearingFov$ = rxjs_1.combineLatest(offset$, smoothNodeFov$).pipe(operators_1.map(function (_a) {
-            var offset = _a[0], fov = _a[1];
-            return [offset, fov[0], fov[1]];
-        }));
-        this._renderSubscription = rxjs_1.combineLatest(cameraBearingFov$, nodeBearingFov$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var _b = _a[0], cb = _b[0], cf = _b[1], _c = _a[1], no = _c[0], nfl = _c[1], nfr = _c[2], configuration = _a[2], size = _a[3];
-            var background = _this._createBackground(cb);
-            var fovIndicator = _this._createFovIndicator(nfl, nfr, no);
-            var north = _this._createNorth(cb);
-            var cameraSector = _this._createCircleSectorCompass(_this._createCircleSector(Math.max(Math.PI / 20, cf), "#FFF"));
-            var compact = configuration.size === ComponentSize_1.default.Small ||
-                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
-                ".BearingCompact" : "";
-            return {
-                name: _this._name,
-                vnode: vd.h("div.BearingIndicatorContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [
-                    background,
-                    fovIndicator,
-                    north,
-                    cameraSector,
-                ]),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    BearingComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-        this._fovSubscription.unsubscribe();
-        this._fovAnimationSubscription.unsubscribe();
-    };
-    BearingComponent.prototype._getDefaultConfiguration = function () {
-        return { size: ComponentSize_1.default.Automatic };
-    };
-    BearingComponent.prototype._createFovIndicator = function (fovLeft, fovRigth, offset) {
-        var arc = this._createFovArc(fovLeft, fovRigth);
-        var group = vd.h("g", {
-            attributes: { transform: "translate(18,18)" },
-            namespace: this._svgNamespace,
-        }, [arc]);
-        var svg = vd.h("svg", {
-            attributes: { viewBox: "0 0 36 36" },
-            namespace: this._svgNamespace,
-            style: {
-                height: "36px",
-                left: "2px",
-                position: "absolute",
-                top: "2px",
-                transform: "rotateZ(" + this._spatial.radToDeg(offset) + "deg)",
-                width: "36px",
-            },
-        }, [group]);
-        return svg;
-    };
-    BearingComponent.prototype._createFovArc = function (fovLeft, fovRigth) {
-        var radius = 16.75;
-        var strokeWidth = 2.5;
-        var fov = fovLeft + fovRigth;
-        if (fov > 2 * Math.PI - Math.PI / 90) {
-            return vd.h("circle", {
-                attributes: {
-                    cx: "0",
-                    cy: "0",
-                    "fill-opacity": "0",
-                    r: "" + radius,
-                    stroke: "#FFF",
-                    "stroke-width": "" + strokeWidth,
-                },
-                namespace: this._svgNamespace,
-            }, []);
-        }
-        var arcStart = -Math.PI / 2 - fovLeft;
-        var arcEnd = arcStart + fov;
-        var startX = radius * Math.cos(arcStart);
-        var startY = radius * Math.sin(arcStart);
-        var endX = radius * Math.cos(arcEnd);
-        var endY = radius * Math.sin(arcEnd);
-        var largeArc = fov >= Math.PI ? 1 : 0;
-        var description = "M " + startX + " " + startY + " A " + radius + " " + radius + " 0 " + largeArc + " 1 " + endX + " " + endY;
-        return vd.h("path", {
-            attributes: {
-                d: description,
-                "fill-opacity": "0",
-                stroke: "#FFF",
-                "stroke-width": "" + strokeWidth,
-            },
-            namespace: this._svgNamespace,
-        }, []);
-    };
-    BearingComponent.prototype._createCircleSectorCompass = function (cameraSector) {
-        var group = vd.h("g", {
-            attributes: { transform: "translate(1,1)" },
-            namespace: this._svgNamespace,
-        }, [cameraSector]);
-        var svg = vd.h("svg", {
-            attributes: { viewBox: "0 0 2 2" },
-            namespace: this._svgNamespace,
-            style: {
-                height: "26px",
-                left: "7px",
-                position: "absolute",
-                top: "7px",
-                width: "26px",
-            },
-        }, [group]);
-        return svg;
-    };
-    BearingComponent.prototype._createCircleSector = function (fov, fill) {
-        if (fov > 2 * Math.PI - Math.PI / 90) {
-            return vd.h("circle", {
-                attributes: { cx: "0", cy: "0", fill: fill, r: "1" },
-                namespace: this._svgNamespace,
-            }, []);
-        }
-        var arcStart = -Math.PI / 2 - fov / 2;
-        var arcEnd = arcStart + fov;
-        var startX = Math.cos(arcStart);
-        var startY = Math.sin(arcStart);
-        var endX = Math.cos(arcEnd);
-        var endY = Math.sin(arcEnd);
-        var largeArc = fov >= Math.PI ? 1 : 0;
-        var description = "M 0 0 " + startX + " " + startY + " A 1 1 0 " + largeArc + " 1 " + endX + " " + endY;
-        return vd.h("path", {
-            attributes: { d: description, fill: fill },
-            namespace: this._svgNamespace,
-        }, []);
-    };
-    BearingComponent.prototype._createNorth = function (bearing) {
-        var north = vd.h("div.BearingNorth", []);
-        var container = vd.h("div.BearingNorthContainer", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [north]);
-        return container;
-    };
-    BearingComponent.prototype._createBackground = function (bearing) {
-        return vd.h("div.BearingIndicatorBackground", { style: { transform: "rotateZ(" + this._spatial.radToDeg(-bearing) + "deg)" } }, [
-            vd.h("div.BearingIndicatorBackgroundCircle", []),
-            vd.h("div.BearingIndicatorBackgroundArrowContainer", [
-                vd.h("div.BearingIndicatorBackgroundArrow", []),
-            ]),
-        ]);
-    };
-    BearingComponent.prototype._computeProjectedPoints = function (transform) {
-        var vertices = [[1, 0]];
-        var directions = [[0, 0.5]];
-        var pointsPerLine = 12;
-        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
-    };
-    BearingComponent.prototype._computeHorizontalFov = function (projectedPoints) {
-        var _this = this;
-        var fovs = projectedPoints
-            .map(function (projectedPoint) {
-            return _this._coordToFov(projectedPoint[0]);
-        });
-        var fov = Math.min.apply(Math, fovs);
-        return fov;
-    };
-    BearingComponent.prototype._coordToFov = function (x) {
-        return this._spatial.radToDeg(2 * Math.atan(x));
-    };
-    BearingComponent.prototype._interpolate = function (x1, x2, alpha) {
-        return (1 - alpha) * x1 + alpha * x2;
-    };
-    BearingComponent.componentName = "bearing";
-    return BearingComponent;
-}(Component_1.Component));
-exports.BearingComponent = BearingComponent;
-Component_1.ComponentService.register(BearingComponent);
-exports.default = BearingComponent;
-
-
-},{"../Component":275,"../Geo":278,"../geo/ViewportCoords":389,"./utils/ComponentSize":373,"@mapbox/unitbezier":2,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],292:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Edge_1 = require("../Edge");
-var Component_1 = require("../Component");
-var CacheComponent = /** @class */ (function (_super) {
-    __extends(CacheComponent, _super);
-    function CacheComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    /**
-     * Set the cache depth.
-     *
-     * Configures the cache depth. The cache depth can be different for
-     * different edge direction types.
-     *
-     * @param {ICacheDepth} depth - Cache depth structure.
-     */
-    CacheComponent.prototype.setDepth = function (depth) {
-        this.configure({ depth: depth });
-    };
-    CacheComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }), operators_1.filter(function (status) {
-            return status.cached;
-        })), this._configuration$).pipe(operators_1.switchMap(function (nc) {
-            var status = nc[0];
-            var configuration = nc[1];
-            var sequenceDepth = Math.max(0, Math.min(4, configuration.depth.sequence));
-            var next$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Next, sequenceDepth);
-            var prev$ = _this._cache$(status.edges, Edge_1.EdgeDirection.Prev, sequenceDepth);
-            return rxjs_1.merge(next$, prev$).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to cache sequence edges.", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-        this._spatialSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return rxjs_1.combineLatest(rxjs_1.of(node), node.spatialEdges$.pipe(operators_1.filter(function (status) {
-                return status.cached;
-            })));
-        })), this._configuration$).pipe(operators_1.switchMap(function (_a) {
-            var _b = _a[0], node = _b[0], edgeStatus = _b[1], configuration = _a[1];
-            var edges = edgeStatus.edges;
-            var depth = configuration.depth;
-            var panoDepth = Math.max(0, Math.min(2, depth.pano));
-            var stepDepth = node.pano ? 0 : Math.max(0, Math.min(3, depth.step));
-            var turnDepth = node.pano ? 0 : Math.max(0, Math.min(1, depth.turn));
-            var pano$ = _this._cache$(edges, Edge_1.EdgeDirection.Pano, panoDepth);
-            var forward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepForward, stepDepth);
-            var backward$ = _this._cache$(edges, Edge_1.EdgeDirection.StepBackward, stepDepth);
-            var left$ = _this._cache$(edges, Edge_1.EdgeDirection.StepLeft, stepDepth);
-            var right$ = _this._cache$(edges, Edge_1.EdgeDirection.StepRight, stepDepth);
-            var turnLeft$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnLeft, turnDepth);
-            var turnRight$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnRight, turnDepth);
-            var turnU$ = _this._cache$(edges, Edge_1.EdgeDirection.TurnU, turnDepth);
-            return rxjs_1.merge(forward$, backward$, left$, right$, pano$, turnLeft$, turnRight$, turnU$).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to cache spatial edges.", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-    };
-    CacheComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._spatialSubscription.unsubscribe();
-    };
-    CacheComponent.prototype._getDefaultConfiguration = function () {
-        return { depth: { pano: 1, sequence: 2, step: 1, turn: 0 } };
-    };
-    CacheComponent.prototype._cache$ = function (edges, direction, depth) {
-        var _this = this;
-        return rxjs_1.zip(rxjs_1.of(edges), rxjs_1.of(depth)).pipe(operators_1.expand(function (ed) {
-            var es = ed[0];
-            var d = ed[1];
-            var edgesDepths$ = [];
-            if (d > 0) {
-                for (var _i = 0, es_1 = es; _i < es_1.length; _i++) {
-                    var edge = es_1[_i];
-                    if (edge.data.direction === direction) {
-                        edgesDepths$.push(rxjs_1.zip(_this._navigator.graphService.cacheNode$(edge.to).pipe(operators_1.mergeMap(function (n) {
-                            return _this._nodeToEdges$(n, direction);
-                        })), rxjs_1.of(d - 1)));
-                    }
-                }
-            }
-            return rxjs_1.from(edgesDepths$).pipe(operators_1.mergeAll());
-        }), operators_1.skip(1));
-    };
-    CacheComponent.prototype._nodeToEdges$ = function (node, direction) {
-        return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-            node.sequenceEdges$ :
-            node.spatialEdges$).pipe(operators_1.first(function (status) {
-            return status.cached;
-        }), operators_1.map(function (status) {
-            return status.edges;
-        }));
-    };
-    CacheComponent.componentName = "cache";
-    return CacheComponent;
-}(Component_1.Component));
-exports.CacheComponent = CacheComponent;
-Component_1.ComponentService.register(CacheComponent);
-exports.default = CacheComponent;
-
-},{"../Component":275,"../Edge":276,"rxjs":27,"rxjs/operators":225}],293:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Utils_1 = require("../Utils");
-var Component = /** @class */ (function (_super) {
-    __extends(Component, _super);
-    function Component(name, container, navigator) {
-        var _this = _super.call(this) || this;
-        _this._activated$ = new rxjs_1.BehaviorSubject(false);
-        _this._configurationSubject$ = new rxjs_1.Subject();
-        _this._activated = false;
-        _this._container = container;
-        _this._name = name;
-        _this._navigator = navigator;
-        _this._configuration$ =
-            _this._configurationSubject$.pipe(operators_1.startWith(_this.defaultConfiguration), operators_1.scan(function (conf, newConf) {
-                for (var key in newConf) {
-                    if (newConf.hasOwnProperty(key)) {
-                        conf[key] = newConf[key];
-                    }
-                }
-                return conf;
-            }), operators_1.publishReplay(1), operators_1.refCount());
-        _this._configuration$.subscribe(function () { });
-        return _this;
-    }
-    Object.defineProperty(Component.prototype, "activated", {
-        get: function () {
-            return this._activated;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "activated$", {
-        /** @ignore */
-        get: function () {
-            return this._activated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "defaultConfiguration", {
-        /**
-         * Get default configuration.
-         *
-         * @returns {TConfiguration} Default configuration for component.
-         */
-        get: function () {
-            return this._getDefaultConfiguration();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "configuration$", {
-        /** @ignore */
-        get: function () {
-            return this._configuration$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Component.prototype, "name", {
-        /**
-         * Get name.
-         *
-         * @description The name of the component. Used when interacting with the
-         * component through the Viewer's API.
-         */
-        get: function () {
-            return this._name;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Component.prototype.activate = function (conf) {
-        if (this._activated) {
-            return;
-        }
-        if (conf !== undefined) {
-            this._configurationSubject$.next(conf);
-        }
-        this._activated = true;
-        this._activate();
-        this._activated$.next(true);
-    };
-    Component.prototype.configure = function (conf) {
-        this._configurationSubject$.next(conf);
-    };
-    Component.prototype.deactivate = function () {
-        if (!this._activated) {
-            return;
-        }
-        this._activated = false;
-        this._deactivate();
-        this._container.domRenderer.clear(this._name);
-        this._container.glRenderer.clear(this._name);
-        this._activated$.next(false);
-    };
-    /**
-     * Detect the viewer's new width and height and resize the component's
-     * rendered elements accordingly if applicable.
-     *
-     * @ignore
-     */
-    Component.prototype.resize = function () { return; };
-    Component.componentName = "not_worthy";
-    return Component;
-}(Utils_1.EventEmitter));
-exports.Component = Component;
-exports.default = Component;
-
-},{"../Utils":285,"rxjs":27,"rxjs/operators":225}],294:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Error_1 = require("../Error");
-var ComponentService = /** @class */ (function () {
-    function ComponentService(container, navigator) {
-        this._components = {};
-        for (var componentName in ComponentService.registeredComponents) {
-            if (!ComponentService.registeredComponents.hasOwnProperty(componentName)) {
-                continue;
-            }
-            var component = ComponentService.registeredComponents[componentName];
-            this._components[componentName] = {
-                active: false,
-                component: new component(componentName, container, navigator),
-            };
-        }
-        this._coverComponent = new ComponentService.registeredCoverComponent("cover", container, navigator);
-        this._coverComponent.activate();
-        this._coverActivated = true;
-    }
-    ComponentService.register = function (component) {
-        if (ComponentService.registeredComponents[component.componentName] === undefined) {
-            ComponentService.registeredComponents[component.componentName] = component;
-        }
-    };
-    ComponentService.registerCover = function (coverComponent) {
-        ComponentService.registeredCoverComponent = coverComponent;
-    };
-    Object.defineProperty(ComponentService.prototype, "coverActivated", {
-        get: function () {
-            return this._coverActivated;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ComponentService.prototype.activateCover = function () {
-        if (this._coverActivated) {
-            return;
-        }
-        this._coverActivated = true;
-        for (var componentName in this._components) {
-            if (!this._components.hasOwnProperty(componentName)) {
-                continue;
-            }
-            var component = this._components[componentName];
-            if (component.active) {
-                component.component.deactivate();
-            }
-        }
-    };
-    ComponentService.prototype.deactivateCover = function () {
-        if (!this._coverActivated) {
-            return;
-        }
-        this._coverActivated = false;
-        for (var componentName in this._components) {
-            if (!this._components.hasOwnProperty(componentName)) {
-                continue;
-            }
-            var component = this._components[componentName];
-            if (component.active) {
-                component.component.activate();
-            }
-        }
-    };
-    ComponentService.prototype.activate = function (name) {
-        this._checkName(name);
-        this._components[name].active = true;
-        if (!this._coverActivated) {
-            this.get(name).activate();
-        }
-    };
-    ComponentService.prototype.configure = function (name, conf) {
-        this._checkName(name);
-        this.get(name).configure(conf);
-    };
-    ComponentService.prototype.deactivate = function (name) {
-        this._checkName(name);
-        this._components[name].active = false;
-        if (!this._coverActivated) {
-            this.get(name).deactivate();
-        }
-    };
-    ComponentService.prototype.get = function (name) {
-        return this._components[name].component;
-    };
-    ComponentService.prototype.getCover = function () {
-        return this._coverComponent;
-    };
-    ComponentService.prototype._checkName = function (name) {
-        if (!(name in this._components)) {
-            throw new Error_1.ArgumentMapillaryError("Component does not exist: " + name);
-        }
-    };
-    ComponentService.registeredComponents = {};
-    return ComponentService;
-}());
-exports.ComponentService = ComponentService;
-exports.default = ComponentService;
-
-},{"../Error":277}],295:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var Utils_1 = require("../Utils");
-var Viewer_1 = require("../Viewer");
-var CoverComponent = /** @class */ (function (_super) {
-    __extends(CoverComponent, _super);
-    function CoverComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    CoverComponent.prototype._activate = function () {
-        var _this = this;
-        this._configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (configuration) {
-            return configuration.state;
-        }), operators_1.switchMap(function (configuration) {
-            return rxjs_1.combineLatest(rxjs_1.of(configuration.state), _this._navigator.stateService.currentNode$);
-        }), operators_1.switchMap(function (_a) {
-            var state = _a[0], node = _a[1];
-            var keySrc$ = rxjs_1.combineLatest(rxjs_1.of(node.key), node.image$.pipe(operators_1.filter(function (image) {
-                return !!image;
-            }), operators_1.map(function (image) {
-                return image.src;
-            })));
-            return state === Component_1.CoverState.Visible ? keySrc$.pipe(operators_1.first()) : keySrc$;
-        }), operators_1.distinctUntilChanged(function (_a, _b) {
-            var k1 = _a[0], s1 = _a[1];
-            var k2 = _b[0], s2 = _b[1];
-            return k1 === k2 && s1 === s2;
-        }), operators_1.map(function (_a) {
-            var key = _a[0], src = _a[1];
-            return { key: key, src: src };
-        }))
-            .subscribe(this._configurationSubject$);
-        this._renderSubscription = rxjs_1.combineLatest(this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var configuration = _a[0], size = _a[1];
-            if (!configuration.key) {
-                return { name: _this._name, vnode: vd.h("div", []) };
-            }
-            var compactClass = size.width <= 640 || size.height <= 480 ? ".CoverCompact" : "";
-            if (configuration.state === Component_1.CoverState.Hidden) {
-                var doneContainer = vd.h("div.CoverContainer.CoverDone" + compactClass, [_this._getCoverBackgroundVNode(configuration)]);
-                return { name: _this._name, vnode: doneContainer };
-            }
-            var container = vd.h("div.CoverContainer" + compactClass, [_this._getCoverButtonVNode(configuration)]);
-            return { name: _this._name, vnode: container };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    CoverComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-        this._keySubscription.unsubscribe();
-    };
-    CoverComponent.prototype._getDefaultConfiguration = function () {
-        return { state: Component_1.CoverState.Visible };
-    };
-    CoverComponent.prototype._getCoverButtonVNode = function (configuration) {
-        var _this = this;
-        var cover = configuration.state === Component_1.CoverState.Loading ? "div.Cover.CoverLoading" : "div.Cover";
-        var coverButton = vd.h("div.CoverButton", [vd.h("div.CoverButtonIcon", [])]);
-        var coverLogo = vd.h("a.CoverLogo", { href: Utils_1.Urls.explore, target: "_blank" }, []);
-        var coverIndicator = vd.h("div.CoverIndicator", { onclick: function () { _this.configure({ state: Component_1.CoverState.Loading }); } }, []);
-        return vd.h(cover, [
-            this._getCoverBackgroundVNode(configuration),
-            coverIndicator,
-            coverButton,
-            coverLogo,
-        ]);
-    };
-    CoverComponent.prototype._getCoverBackgroundVNode = function (conf) {
-        var url = conf.src != null ?
-            conf.src : Utils_1.Urls.thumbnail(conf.key, Viewer_1.ImageSize.Size640);
-        var properties = { style: { backgroundImage: "url(" + url + ")" } };
-        var children = [];
-        if (conf.state === Component_1.CoverState.Loading) {
-            children.push(vd.h("div.Spinner", {}, []));
-        }
-        return vd.h("div.CoverBackground", properties, children);
-    };
-    CoverComponent.componentName = "cover";
-    return CoverComponent;
-}(Component_1.Component));
-exports.CoverComponent = CoverComponent;
-Component_1.ComponentService.registerCover(CoverComponent);
-exports.default = CoverComponent;
-
-},{"../Component":275,"../Utils":285,"../Viewer":286,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],296:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var DebugComponent = /** @class */ (function (_super) {
-    __extends(DebugComponent, _super);
-    function DebugComponent() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this._open$ = new rxjs_1.BehaviorSubject(false);
-        return _this;
-    }
-    DebugComponent.prototype._activate = function () {
-        var _this = this;
-        this._disposable = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._open$, this._navigator.imageLoadingService.loadstatus$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], open = _a[1], loadStatus = _a[2];
-            return { name: _this._name, vnode: _this._getDebugVNode(open, _this._getDebugInfo(frame, loadStatus)) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    DebugComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-    };
-    DebugComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    DebugComponent.prototype._getDebugInfo = function (frame, loadStatus) {
-        var ret = [];
-        ret.push(vd.h("h2", "Node"));
-        if (frame.state.currentNode) {
-            ret.push(vd.h("p", "currentNode: " + frame.state.currentNode.key));
-        }
-        if (frame.state.previousNode) {
-            ret.push(vd.h("p", "previousNode: " + frame.state.previousNode.key));
-        }
-        ret.push(vd.h("h2", "Loading"));
-        var total = 0;
-        var loaded = 0;
-        var loading = 0;
-        for (var key in loadStatus) {
-            if (!loadStatus.hasOwnProperty(key)) {
-                continue;
-            }
-            var status_1 = loadStatus[key];
-            total += status_1.loaded;
-            if (status_1.loaded !== status_1.total) {
-                loading++;
-            }
-            else {
-                loaded++;
-            }
-        }
-        ret.push(vd.h("p", "Loaded Images: " + loaded));
-        ret.push(vd.h("p", "Loading Images: " + loading));
-        ret.push(vd.h("p", "Total bytes loaded: " + total));
-        ret.push(vd.h("h2", "Camera"));
-        ret.push(vd.h("p", "camera.position.x: " + frame.state.camera.position.x));
-        ret.push(vd.h("p", "camera.position.y: " + frame.state.camera.position.y));
-        ret.push(vd.h("p", "camera.position.z: " + frame.state.camera.position.z));
-        ret.push(vd.h("p", "camera.lookat.x: " + frame.state.camera.lookat.x));
-        ret.push(vd.h("p", "camera.lookat.y: " + frame.state.camera.lookat.y));
-        ret.push(vd.h("p", "camera.lookat.z: " + frame.state.camera.lookat.z));
-        ret.push(vd.h("p", "camera.up.x: " + frame.state.camera.up.x));
-        ret.push(vd.h("p", "camera.up.y: " + frame.state.camera.up.y));
-        ret.push(vd.h("p", "camera.up.z: " + frame.state.camera.up.z));
-        return ret;
-    };
-    DebugComponent.prototype._getDebugVNode = function (open, info) {
-        if (open) {
-            return vd.h("div.Debug", {}, [
-                vd.h("h2", {}, ["Debug"]),
-                this._getDebugVNodeButton(open),
-                vd.h("pre", {}, info),
-            ]);
-        }
-        else {
-            return this._getDebugVNodeButton(open);
-        }
-    };
-    DebugComponent.prototype._getDebugVNodeButton = function (open) {
-        var buttonText = open ? "Disable Debug" : "D";
-        var buttonCssClass = open ? "" : ".DebugButtonFixed";
-        if (open) {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._closeDebugElement.bind(this) }, [buttonText]);
-        }
-        else {
-            return vd.h("button.DebugButton" + buttonCssClass, { onclick: this._openDebugElement.bind(this) }, [buttonText]);
-        }
-    };
-    DebugComponent.prototype._closeDebugElement = function (open) {
-        this._open$.next(false);
-    };
-    DebugComponent.prototype._openDebugElement = function () {
-        this._open$.next(true);
-    };
-    DebugComponent.componentName = "debug";
-    return DebugComponent;
-}(Component_1.Component));
-exports.DebugComponent = DebugComponent;
-Component_1.ComponentService.register(DebugComponent);
-exports.default = DebugComponent;
-
-},{"../Component":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],297:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var Utils_1 = require("../Utils");
-var ImageComponent = /** @class */ (function (_super) {
-    __extends(ImageComponent, _super);
-    function ImageComponent(name, container, navigator, dom) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._canvasId = container.id + "-" + _this._name;
-        _this._dom = !!dom ? dom : new Utils_1.DOM();
-        return _this;
-    }
-    ImageComponent.prototype._activate = function () {
-        var _this = this;
-        var canvasSize$ = this._container.domRenderer.element$.pipe(operators_1.map(function (element) {
-            return _this._dom.document.getElementById(_this._canvasId);
-        }), operators_1.filter(function (canvas) {
-            return !!canvas;
-        }), operators_1.map(function (canvas) {
-            var adaptableDomRenderer = canvas.parentElement;
-            var width = adaptableDomRenderer.offsetWidth;
-            var height = adaptableDomRenderer.offsetHeight;
-            return [canvas, { height: height, width: width }];
-        }), operators_1.distinctUntilChanged(function (s1, s2) {
-            return s1.height === s2.height && s1.width === s2.width;
-        }, function (_a) {
-            var canvas = _a[0], size = _a[1];
-            return size;
-        }));
-        this.drawSubscription = rxjs_1.combineLatest(canvasSize$, this._navigator.stateService.currentNode$)
-            .subscribe(function (_a) {
-            var _b = _a[0], canvas = _b[0], size = _b[1], node = _a[1];
-            canvas.width = size.width;
-            canvas.height = size.height;
-            canvas
-                .getContext("2d")
-                .drawImage(node.image, 0, 0, size.width, size.height);
-        });
-        this._container.domRenderer.renderAdaptive$.next({ name: this._name, vnode: vd.h("canvas#" + this._canvasId, []) });
-    };
-    ImageComponent.prototype._deactivate = function () {
-        this.drawSubscription.unsubscribe();
-    };
-    ImageComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    ImageComponent.componentName = "image";
-    return ImageComponent;
-}(Component_1.Component));
-exports.ImageComponent = ImageComponent;
-Component_1.ComponentService.register(ImageComponent);
-exports.default = ImageComponent;
-
-
-},{"../Component":275,"../Utils":285,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],298:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var LoadingComponent = /** @class */ (function (_super) {
-    __extends(LoadingComponent, _super);
-    function LoadingComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    LoadingComponent.prototype._activate = function () {
-        var _this = this;
-        this._loadingSubscription = this._navigator.loadingService.loading$.pipe(operators_1.switchMap(function (loading) {
-            return loading ?
-                _this._navigator.imageLoadingService.loadstatus$ :
-                rxjs_1.of({});
-        }), operators_1.map(function (loadStatus) {
-            var total = 0;
-            var loaded = 0;
-            for (var key in loadStatus) {
-                if (!loadStatus.hasOwnProperty(key)) {
-                    continue;
-                }
-                var status_1 = loadStatus[key];
-                if (status_1.loaded !== status_1.total) {
-                    loaded += status_1.loaded;
-                    total += status_1.total;
-                }
-            }
-            var percentage = 100;
-            if (total !== 0) {
-                percentage = (loaded / total) * 100;
-            }
-            return { name: _this._name, vnode: _this._getBarVNode(percentage) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    LoadingComponent.prototype._deactivate = function () {
-        this._loadingSubscription.unsubscribe();
-    };
-    LoadingComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    LoadingComponent.prototype._getBarVNode = function (percentage) {
-        var loadingBarStyle = {};
-        var loadingContainerStyle = {};
-        if (percentage !== 100) {
-            loadingBarStyle.width = percentage.toFixed(0) + "%";
-            loadingBarStyle.opacity = "1";
-        }
-        else {
-            loadingBarStyle.width = "100%";
-            loadingBarStyle.opacity = "0";
-        }
-        return vd.h("div.Loading", { style: loadingContainerStyle }, [vd.h("div.LoadingBar", { style: loadingBarStyle }, [])]);
-    };
-    LoadingComponent.componentName = "loading";
-    return LoadingComponent;
-}(Component_1.Component));
-exports.LoadingComponent = LoadingComponent;
-Component_1.ComponentService.register(LoadingComponent);
-exports.default = LoadingComponent;
-
-},{"../Component":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],299:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Edge_1 = require("../Edge");
-var Error_1 = require("../Error");
-var Component_1 = require("../Component");
-/**
- * @class NavigationComponent
- *
- * @classdesc Fallback navigation component for environments without WebGL support.
- *
- * Replaces the functionality in the Direction and Sequence components.
- */
-var NavigationComponent = /** @class */ (function (_super) {
-    __extends(NavigationComponent, _super);
-    /** @ignore */
-    function NavigationComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._seqNames = {};
-        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Prev]] = "Prev";
-        _this._seqNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.Next]] = "Next";
-        _this._spaTopNames = {};
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnLeft]] = "Turnleft";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepLeft]] = "Left";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepForward]] = "Forward";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepRight]] = "Right";
-        _this._spaTopNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnRight]] = "Turnright";
-        _this._spaBottomNames = {};
-        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.TurnU]] = "Turnaround";
-        _this._spaBottomNames[Edge_1.EdgeDirection[Edge_1.EdgeDirection.StepBackward]] = "Backward";
-        return _this;
-    }
-    NavigationComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, this._configuration$).pipe(operators_1.switchMap(function (_a) {
-            var node = _a[0], configuration = _a[1];
-            var sequenceEdges$ = configuration.sequence ?
-                node.sequenceEdges$.pipe(operators_1.map(function (status) {
-                    return status.edges
-                        .map(function (edge) {
-                        return edge.data.direction;
-                    });
-                })) :
-                rxjs_1.of([]);
-            var spatialEdges$ = !node.pano && configuration.spatial ?
-                node.spatialEdges$.pipe(operators_1.map(function (status) {
-                    return status.edges
-                        .map(function (edge) {
-                        return edge.data.direction;
-                    });
-                })) :
-                rxjs_1.of([]);
-            return rxjs_1.combineLatest(sequenceEdges$, spatialEdges$).pipe(operators_1.map(function (_a) {
-                var seq = _a[0], spa = _a[1];
-                return seq.concat(spa);
-            }));
-        }), operators_1.map(function (edgeDirections) {
-            var seqs = _this._createArrowRow(_this._seqNames, edgeDirections);
-            var spaTops = _this._createArrowRow(_this._spaTopNames, edgeDirections);
-            var spaBottoms = _this._createArrowRow(_this._spaBottomNames, edgeDirections);
-            var seqContainer = vd.h("div.NavigationSequence", seqs);
-            var spaTopContainer = vd.h("div.NavigationSpatialTop", spaTops);
-            var spaBottomContainer = vd.h("div.NavigationSpatialBottom", spaBottoms);
-            var spaContainer = vd.h("div.NavigationSpatial", [spaTopContainer, spaBottomContainer]);
-            return { name: _this._name, vnode: vd.h("div.NavigationContainer", [seqContainer, spaContainer]) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    NavigationComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-    };
-    NavigationComponent.prototype._getDefaultConfiguration = function () {
-        return { sequence: true, spatial: true };
-    };
-    NavigationComponent.prototype._createArrowRow = function (arrowNames, edgeDirections) {
-        var arrows = [];
-        for (var arrowName in arrowNames) {
-            if (!(arrowNames.hasOwnProperty(arrowName))) {
-                continue;
-            }
-            var direction = Edge_1.EdgeDirection[arrowName];
-            if (edgeDirections.indexOf(direction) !== -1) {
-                arrows.push(this._createVNode(direction, arrowNames[arrowName], "visible"));
-            }
-            else {
-                arrows.push(this._createVNode(direction, arrowNames[arrowName], "hidden"));
-            }
-        }
-        return arrows;
-    };
-    NavigationComponent.prototype._createVNode = function (direction, name, visibility) {
-        var _this = this;
-        return vd.h("span.Direction.Direction" + name, {
-            onclick: function (ev) {
-                _this._navigator.moveDir$(direction)
-                    .subscribe(undefined, function (error) {
-                    if (!(error instanceof Error_1.AbortMapillaryError)) {
-                        console.error(error);
-                    }
-                });
-            },
-            style: {
-                visibility: visibility,
-            },
-        }, []);
-    };
-    NavigationComponent.componentName = "navigation";
-    return NavigationComponent;
-}(Component_1.Component));
-exports.NavigationComponent = NavigationComponent;
-Component_1.ComponentService.register(NavigationComponent);
-exports.default = NavigationComponent;
-
-},{"../Component":275,"../Edge":276,"../Error":277,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],300:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../Component");
-var DescriptionState = /** @class */ (function () {
-    function DescriptionState() {
-    }
-    return DescriptionState;
-}());
-var RouteState = /** @class */ (function () {
-    function RouteState() {
-    }
-    return RouteState;
-}());
-var RouteTrack = /** @class */ (function () {
-    function RouteTrack() {
-        this.nodeInstructions = [];
-        this.nodeInstructionsOrdered = [];
-    }
-    return RouteTrack;
-}());
-var RouteComponent = /** @class */ (function (_super) {
-    __extends(RouteComponent, _super);
-    function RouteComponent(name, container, navigator) {
-        return _super.call(this, name, container, navigator) || this;
-    }
-    RouteComponent.prototype._activate = function () {
-        var _this = this;
-        var slowedStream$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return (frame.id % 2) === 0;
-        }), operators_1.filter(function (frame) {
-            return frame.state.nodesAhead < 15;
-        }), operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.lastNode.key;
-        }));
-        var routeTrack$ = rxjs_1.combineLatest(this.configuration$.pipe(operators_1.mergeMap(function (conf) {
-            return rxjs_1.from(conf.paths);
-        }), operators_1.distinct(function (p) {
-            return p.sequenceKey;
-        }), operators_1.mergeMap(function (path) {
-            return _this._navigator.apiV3.sequenceByKey$([path.sequenceKey]).pipe(operators_1.map(function (sequenceByKey) {
-                return sequenceByKey[path.sequenceKey];
-            }));
-        })), this.configuration$).pipe(operators_1.map(function (_a) {
-            var sequence = _a[0], conf = _a[1];
-            var i = 0;
-            var instructionPlaces = [];
-            for (var _i = 0, _b = conf.paths; _i < _b.length; _i++) {
-                var path = _b[_i];
-                if (path.sequenceKey === sequence.key) {
-                    var nodeInstructions = [];
-                    var saveKey = false;
-                    for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
-                        var key = _d[_c];
-                        if (path.startKey === key) {
-                            saveKey = true;
-                        }
-                        if (saveKey) {
-                            var description = null;
-                            for (var _e = 0, _f = path.infoKeys; _e < _f.length; _e++) {
-                                var infoKey = _f[_e];
-                                if (infoKey.key === key) {
-                                    description = infoKey.description;
-                                }
-                            }
-                            nodeInstructions.push({ description: description, key: key });
-                        }
-                        if (path.stopKey === key) {
-                            saveKey = false;
-                        }
-                    }
-                    instructionPlaces.push({ nodeInstructions: nodeInstructions, place: i });
-                }
-                i++;
-            }
-            return instructionPlaces;
-        }), operators_1.scan(function (routeTrack, instructionPlaces) {
-            for (var _i = 0, instructionPlaces_1 = instructionPlaces; _i < instructionPlaces_1.length; _i++) {
-                var instructionPlace = instructionPlaces_1[_i];
-                routeTrack.nodeInstructionsOrdered[instructionPlace.place] = instructionPlace.nodeInstructions;
-            }
-            for (var place in routeTrack.nodeInstructionsOrdered) {
-                if (!routeTrack.nodeInstructionsOrdered.hasOwnProperty(place)) {
-                    continue;
-                }
-                var instructionGroup = routeTrack.nodeInstructionsOrdered[place];
-                for (var _a = 0, instructionGroup_1 = instructionGroup; _a < instructionGroup_1.length; _a++) {
-                    var instruction = instructionGroup_1[_a];
-                    routeTrack.nodeInstructions.push(instruction);
-                }
-            }
-            return routeTrack;
-        }, new RouteTrack()));
-        var cacheNode$ = rxjs_1.combineLatest(slowedStream$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], routeTrack = _a[1], conf = _a[2];
-            return { conf: conf, frame: frame, routeTrack: routeTrack };
-        }), operators_1.scan(function (routeState, rtAndFrame) {
-            if (rtAndFrame.conf.playing === undefined || rtAndFrame.conf.playing) {
-                routeState.routeTrack = rtAndFrame.routeTrack;
-                routeState.currentNode = rtAndFrame.frame.state.currentNode;
-                routeState.lastNode = rtAndFrame.frame.state.lastNode;
-                routeState.playing = true;
-            }
-            else {
-                _this._navigator.stateService.cutNodes();
-                routeState.playing = false;
-            }
-            return routeState;
-        }, new RouteState()), operators_1.filter(function (routeState) {
-            return routeState.playing;
-        }), operators_1.filter(function (routeState) {
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (!nodeInstruction) {
-                    continue;
-                }
-                if (nodeInstruction.key === routeState.lastNode.key) {
-                    return true;
-                }
-            }
-            return false;
-        }), operators_1.distinctUntilChanged(undefined, function (routeState) {
-            return routeState.lastNode.key;
-        }), operators_1.mergeMap(function (routeState) {
-            var i = 0;
-            for (var _i = 0, _a = routeState.routeTrack.nodeInstructions; _i < _a.length; _i++) {
-                var nodeInstruction = _a[_i];
-                if (nodeInstruction.key === routeState.lastNode.key) {
-                    break;
-                }
-                i++;
-            }
-            var nextInstruction = routeState.routeTrack.nodeInstructions[i + 1];
-            if (!nextInstruction) {
-                return rxjs_1.of(null);
-            }
-            return _this._navigator.graphService.cacheNode$(nextInstruction.key);
-        }));
-        this._disposable = rxjs_1.combineLatest(cacheNode$, this.configuration$).pipe(operators_1.map(function (_a) {
-            var node = _a[0], conf = _a[1];
-            return { conf: conf, node: node };
-        }), operators_1.filter(function (cAN) {
-            return cAN.node !== null && cAN.conf.playing;
-        }), operators_1.pluck("node"))
-            .subscribe(this._navigator.stateService.appendNode$);
-        this._disposableDescription = rxjs_1.combineLatest(this._navigator.stateService.currentNode$, routeTrack$, this.configuration$).pipe(operators_1.map(function (_a) {
-            var node = _a[0], routeTrack = _a[1], conf = _a[2];
-            if (conf.playing !== undefined && !conf.playing) {
-                return "quit";
-            }
-            var description = null;
-            for (var _i = 0, _b = routeTrack.nodeInstructions; _i < _b.length; _i++) {
-                var nodeInstruction = _b[_i];
-                if (nodeInstruction.key === node.key) {
-                    description = nodeInstruction.description;
-                    break;
-                }
-            }
-            return description;
-        }), operators_1.scan(function (descriptionState, description) {
-            if (description !== descriptionState.description && description !== null) {
-                descriptionState.description = description;
-                descriptionState.showsLeft = 6;
-            }
-            else {
-                descriptionState.showsLeft--;
-            }
-            if (description === "quit") {
-                descriptionState.description = null;
-            }
-            return descriptionState;
-        }, new DescriptionState()), operators_1.map(function (descriptionState) {
-            if (descriptionState.showsLeft > 0 && descriptionState.description) {
-                return { name: _this._name, vnode: _this._getRouteAnnotationNode(descriptionState.description) };
-            }
-            else {
-                return { name: _this._name, vnode: vd.h("div", []) };
-            }
-        }))
-            .subscribe(this._container.domRenderer.render$);
-    };
-    RouteComponent.prototype._deactivate = function () {
-        this._disposable.unsubscribe();
-        this._disposableDescription.unsubscribe();
-    };
-    RouteComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    RouteComponent.prototype.play = function () {
-        this.configure({ playing: true });
-    };
-    RouteComponent.prototype.stop = function () {
-        this.configure({ playing: false });
-    };
-    RouteComponent.prototype._getRouteAnnotationNode = function (description) {
-        return vd.h("div.RouteFrame", {}, [
-            vd.h("p", { textContent: description }, []),
-        ]);
-    };
-    RouteComponent.componentName = "route";
-    return RouteComponent;
-}(Component_1.Component));
-exports.RouteComponent = RouteComponent;
-Component_1.ComponentService.register(RouteComponent);
-exports.default = RouteComponent;
-
-},{"../Component":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],301:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../Component");
-var StatsComponent = /** @class */ (function (_super) {
-    __extends(StatsComponent, _super);
-    function StatsComponent(name, container, navigator, scheduler) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._scheduler = scheduler;
-        return _this;
-    }
-    StatsComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.scan(function (keys, node) {
-            var sKey = node.sequenceKey;
-            keys.report = [];
-            if (!(sKey in keys.reported)) {
-                keys.report = [sKey];
-                keys.reported[sKey] = true;
-            }
-            return keys;
-        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
-            return keys.report.length > 0;
-        }), operators_1.mergeMap(function (keys) {
-            return _this._navigator.apiV3.sequenceViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to report sequence stats (" + keys.report + ")", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-        this._imageSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
-            return node.key;
-        })).pipe(operators_1.buffer(this._navigator.stateService.currentNode$.pipe(operators_1.debounceTime(5000, this._scheduler))), operators_1.scan(function (keys, newKeys) {
-            keys.report = [];
-            for (var _i = 0, newKeys_1 = newKeys; _i < newKeys_1.length; _i++) {
-                var key = newKeys_1[_i];
-                if (!(key in keys.reported)) {
-                    keys.report.push(key);
-                    keys.reported[key] = true;
-                }
-            }
-            return keys;
-        }, { report: [], reported: {} }), operators_1.filter(function (keys) {
-            return keys.report.length > 0;
-        }), operators_1.mergeMap(function (keys) {
-            return _this._navigator.apiV3.imageViewAdd$(keys.report).pipe(operators_1.catchError(function (error, caught) {
-                console.error("Failed to report image stats (" + keys.report + ")", error);
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe(function () { });
-    };
-    StatsComponent.prototype._deactivate = function () {
-        this._sequenceSubscription.unsubscribe();
-        this._imageSubscription.unsubscribe();
-    };
-    StatsComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    StatsComponent.componentName = "stats";
-    return StatsComponent;
-}(Component_1.Component));
-exports.StatsComponent = StatsComponent;
-Component_1.ComponentService.register(StatsComponent);
-exports.default = StatsComponent;
-
-},{"../Component":275,"rxjs":27,"rxjs/operators":225}],302:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * @class DirectionComponent
- * @classdesc Component showing navigation arrows for steps and turns.
- */
-var DirectionComponent = /** @class */ (function (_super) {
-    __extends(DirectionComponent, _super);
-    function DirectionComponent(name, container, navigator, directionDOMRenderer) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._renderer = !!directionDOMRenderer ?
-            directionDOMRenderer :
-            new Component_1.DirectionDOMRenderer(_this.defaultConfiguration, { height: container.element.offsetHeight, width: container.element.offsetWidth });
-        _this._hoveredKeySubject$ = new rxjs_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
-        return _this;
-    }
-    Object.defineProperty(DirectionComponent.prototype, "hoveredKey$", {
-        /**
-         * Get hovered key observable.
-         *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
-         *
-         * @returns {Observable<string>}
-         */
-        get: function () {
-            return this._hoveredKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Set highlight key.
-     *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
-     *
-     * @param {string} highlightKey Key of node to be highlighted if existing
-     * among arrows.
-     */
-    DirectionComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
-    };
-    /**
-     * Set min width of container element.
-     *
-     * @description  Set min width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    DirectionComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
-    };
-    /**
-     * Set max width of container element.
-     *
-     * @description Set max width of the non transformed container element holding
-     * the navigation arrows. If the min width is larger than the max width the
-     * min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    DirectionComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
-    };
-    DirectionComponent.prototype._activate = function () {
-        var _this = this;
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            _this._renderer.setConfiguration(configuration);
-        });
-        this._resizeSubscription = this._container.renderService.size$
-            .subscribe(function (size) {
-            _this._renderer.resize(size);
-        });
-        this._nodeSubscription = this._navigator.stateService.currentNode$.pipe(operators_1.tap(function (node) {
-            _this._container.domRenderer.render$.next({ name: _this._name, vnode: vd.h("div", {}, []) });
-            _this._renderer.setNode(node);
-        }), operators_1.withLatestFrom(this._configuration$), operators_1.switchMap(function (_a) {
-            var node = _a[0], configuration = _a[1];
-            return rxjs_1.combineLatest(node.spatialEdges$, configuration.distinguishSequence ?
-                _this._navigator.graphService
-                    .cacheSequence$(node.sequenceKey).pipe(operators_1.catchError(function (error, caught) {
-                    console.error("Failed to cache sequence (" + node.sequenceKey + ")", error);
-                    return rxjs_1.of(null);
-                })) :
-                rxjs_1.of(null));
-        }))
-            .subscribe(function (_a) {
-            var edgeStatus = _a[0], sequence = _a[1];
-            _this._renderer.setEdges(edgeStatus, sequence);
-        });
-        this._renderCameraSubscription = this._container.renderService.renderCameraFrame$.pipe(operators_1.tap(function (renderCamera) {
-            _this._renderer.setRenderCamera(renderCamera);
-        }), operators_1.map(function () {
-            return _this._renderer;
-        }), operators_1.filter(function (renderer) {
-            return renderer.needsRender;
-        }), operators_1.map(function (renderer) {
-            return { name: _this._name, vnode: renderer.render(_this._navigator) };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._hoveredKeySubscription = rxjs_1.combineLatest(this._container.domRenderer.element$, this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$.pipe(operators_1.startWith(null)), this._container.mouseService.mouseUp$.pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
-            var element = _a[0];
-            var elements = element.getElementsByClassName("DirectionsPerspective");
-            for (var i = 0; i < elements.length; i++) {
-                var hovered = elements.item(i).querySelector(":hover");
-                if (hovered != null && hovered.hasAttribute("data-key")) {
-                    return hovered.getAttribute("data-key");
-                }
-            }
-            return null;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(this._hoveredKeySubject$);
-        this._emitHoveredKeySubscription = this._hoveredKey$
-            .subscribe(function (key) {
-            _this.fire(DirectionComponent.hoveredkeychanged, key);
-        });
-    };
-    DirectionComponent.prototype._deactivate = function () {
-        this._configurationSubscription.unsubscribe();
-        this._emitHoveredKeySubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-        this._nodeSubscription.unsubscribe();
-        this._renderCameraSubscription.unsubscribe();
-    };
-    DirectionComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            distinguishSequence: false,
-            maxWidth: 460,
-            minWidth: 260,
-        };
-    };
-    /** @inheritdoc */
-    DirectionComponent.componentName = "direction";
-    /**
-     * Event fired when the hovered key changes.
-     *
-     * @description Emits the key of the node for the direction
-     * arrow that is being hovered. When the mouse leaves a
-     * direction arrow null is emitted.
-     *
-     * @event DirectionComponent#hoveredkeychanged
-     * @type {string} The hovered key, null if no key is hovered.
-     */
-    DirectionComponent.hoveredkeychanged = "hoveredkeychanged";
-    return DirectionComponent;
-}(Component_1.Component));
-exports.DirectionComponent = DirectionComponent;
-Component_1.ComponentService.register(DirectionComponent);
-exports.default = DirectionComponent;
-
-
-},{"../../Component":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],303:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMCalculator
- * @classdesc Helper class for calculating DOM CSS properties.
- */
-var DirectionDOMCalculator = /** @class */ (function () {
-    function DirectionDOMCalculator(configuration, size) {
-        this._spatial = new Geo_1.Spatial();
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-        this._configure(configuration);
-        this._resize(size);
-        this._reset();
-    }
-    Object.defineProperty(DirectionDOMCalculator.prototype, "minWidth", {
-        get: function () {
-            return this._minWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "maxWidth", {
-        get: function () {
-            return this._maxWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidth", {
-        get: function () {
-            return this._containerWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerWidthCss", {
-        get: function () {
-            return this._containerWidthCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerMarginCss", {
-        get: function () {
-            return this._containerMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerLeftCss", {
-        get: function () {
-            return this._containerLeftCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeight", {
-        get: function () {
-            return this._containerHeight;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerHeightCss", {
-        get: function () {
-            return this._containerHeightCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "containerBottomCss", {
-        get: function () {
-            return this._containerBottomCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSize", {
-        get: function () {
-            return this._stepCircleSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleSizeCss", {
-        get: function () {
-            return this._stepCircleSizeCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "stepCircleMarginCss", {
-        get: function () {
-            return this._stepCircleMarginCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSize", {
-        get: function () {
-            return this._turnCircleSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "turnCircleSizeCss", {
-        get: function () {
-            return this._turnCircleSizeCss;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "outerRadius", {
-        get: function () {
-            return this._outerRadius;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "innerRadius", {
-        get: function () {
-            return this._innerRadius;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DirectionDOMCalculator.prototype, "shadowOffset", {
-        get: function () {
-            return this._shadowOffset;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Configures the min and max width values.
-     *
-     * @param {IDirectionConfiguration} configuration Configuration
-     * with min and max width values.
-     */
-    DirectionDOMCalculator.prototype.configure = function (configuration) {
-        this._configure(configuration);
-        this._reset();
-    };
-    /**
-     * Resizes all properties according to the width and height
-     * of the size object.
-     *
-     * @param {ISize} size The size of the container element.
-     */
-    DirectionDOMCalculator.prototype.resize = function (size) {
-        this._resize(size);
-        this._reset();
-    };
-    /**
-     * Calculates the coordinates on the unit circle for an angle.
-     *
-     * @param {number} angle Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle.
-     */
-    DirectionDOMCalculator.prototype.angleToCoordinates = function (angle) {
-        return [Math.cos(angle), Math.sin(angle)];
-    };
-    /**
-     * Calculates the coordinates on the unit circle for the
-     * relative angle between the first and second angle.
-     *
-     * @param {number} first Angle in radians.
-     * @param {number} second Angle in radians.
-     * @returns {Array<number>} The x and y coordinates on the unit circle
-     * for the relative angle between the first and second angle.
-     */
-    DirectionDOMCalculator.prototype.relativeAngleToCoordiantes = function (first, second) {
-        var relativeAngle = this._spatial.wrapAngle(first - second);
-        return this.angleToCoordinates(relativeAngle);
-    };
-    DirectionDOMCalculator.prototype._configure = function (configuration) {
-        this._minWidth = configuration.minWidth;
-        this._maxWidth = this._getMaxWidth(configuration.minWidth, configuration.maxWidth);
-    };
-    DirectionDOMCalculator.prototype._resize = function (size) {
-        this._elementWidth = size.width;
-        this._elementHeight = size.height;
-    };
-    DirectionDOMCalculator.prototype._reset = function () {
-        this._containerWidth = this._getContainerWidth(this._elementWidth, this._elementHeight);
-        this._containerHeight = this._getContainerHeight(this.containerWidth);
-        this._stepCircleSize = this._getStepCircleDiameter(this._containerHeight);
-        this._turnCircleSize = this._getTurnCircleDiameter(this.containerHeight);
-        this._outerRadius = this._getOuterRadius(this._containerHeight);
-        this._innerRadius = this._getInnerRadius(this._containerHeight);
-        this._shadowOffset = 3;
-        this._containerWidthCss = this._numberToCssPixels(this._containerWidth);
-        this._containerMarginCss = this._numberToCssPixels(-0.5 * this._containerWidth);
-        this._containerLeftCss = this._numberToCssPixels(Math.floor(0.5 * this._elementWidth));
-        this._containerHeightCss = this._numberToCssPixels(this._containerHeight);
-        this._containerBottomCss = this._numberToCssPixels(Math.floor(-0.08 * this._containerHeight));
-        this._stepCircleSizeCss = this._numberToCssPixels(this._stepCircleSize);
-        this._stepCircleMarginCss = this._numberToCssPixels(-0.5 * this._stepCircleSize);
-        this._turnCircleSizeCss = this._numberToCssPixels(this._turnCircleSize);
-    };
-    DirectionDOMCalculator.prototype._getContainerWidth = function (elementWidth, elementHeight) {
-        var relativeWidth = (elementWidth - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (elementHeight - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        coeff = 0.04 * Math.round(25 * coeff);
-        return this._minWidth + coeff * (this._maxWidth - this._minWidth);
-    };
-    DirectionDOMCalculator.prototype._getContainerHeight = function (containerWidth) {
-        return 0.77 * containerWidth;
-    };
-    DirectionDOMCalculator.prototype._getStepCircleDiameter = function (containerHeight) {
-        return 0.34 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._getTurnCircleDiameter = function (containerHeight) {
-        return 0.3 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._getOuterRadius = function (containerHeight) {
-        return 0.31 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._getInnerRadius = function (containerHeight) {
-        return 0.125 * containerHeight;
-    };
-    DirectionDOMCalculator.prototype._numberToCssPixels = function (value) {
-        return value + "px";
-    };
-    DirectionDOMCalculator.prototype._getMaxWidth = function (value, minWidth) {
-        return value > minWidth ? value : minWidth;
-    };
-    return DirectionDOMCalculator;
-}());
-exports.DirectionDOMCalculator = DirectionDOMCalculator;
-exports.default = DirectionDOMCalculator;
-
-
-},{"../../Geo":278}],304:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-var Geo_1 = require("../../Geo");
-/**
- * @class DirectionDOMRenderer
- * @classdesc DOM renderer for direction arrows.
- */
-var DirectionDOMRenderer = /** @class */ (function () {
-    function DirectionDOMRenderer(configuration, size) {
-        this._isEdge = false;
-        this._spatial = new Geo_1.Spatial();
-        this._calculator = new Component_1.DirectionDOMCalculator(configuration, size);
-        this._node = null;
-        this._rotation = { phi: 0, theta: 0 };
-        this._epsilon = 0.5 * Math.PI / 180;
-        this._highlightKey = null;
-        this._distinguishSequence = false;
-        this._needsRender = false;
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        this._stepDirections = [
-            Edge_1.EdgeDirection.StepForward,
-            Edge_1.EdgeDirection.StepBackward,
-            Edge_1.EdgeDirection.StepLeft,
-            Edge_1.EdgeDirection.StepRight,
-        ];
-        this._turnDirections = [
-            Edge_1.EdgeDirection.TurnLeft,
-            Edge_1.EdgeDirection.TurnRight,
-            Edge_1.EdgeDirection.TurnU,
-        ];
-        this._turnNames = {};
-        this._turnNames[Edge_1.EdgeDirection.TurnLeft] = "TurnLeft";
-        this._turnNames[Edge_1.EdgeDirection.TurnRight] = "TurnRight";
-        this._turnNames[Edge_1.EdgeDirection.TurnU] = "TurnAround";
-        // detects IE 8-11, then Edge 20+.
-        var isIE = !!document.documentMode;
-        this._isEdge = !isIE && !!window.StyleMedia;
-    }
-    Object.defineProperty(DirectionDOMRenderer.prototype, "needsRender", {
-        /**
-         * Get needs render.
-         *
-         * @returns {boolean} Value indicating whether render should be called.
-         */
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Renders virtual DOM elements.
-     *
-     * @description Calling render resets the needs render property.
-     */
-    DirectionDOMRenderer.prototype.render = function (navigator) {
-        this._needsRender = false;
-        var rotation = this._rotation;
-        var steps = [];
-        var turns = [];
-        if (this._node.pano) {
-            steps = steps.concat(this._createPanoArrows(navigator, rotation));
-        }
-        else {
-            steps = steps.concat(this._createPerspectiveToPanoArrows(navigator, rotation));
-            steps = steps.concat(this._createStepArrows(navigator, rotation));
-            turns = turns.concat(this._createTurnArrows(navigator));
-        }
-        return this._getContainer(steps, turns, rotation);
-    };
-    DirectionDOMRenderer.prototype.setEdges = function (edgeStatus, sequence) {
-        this._setEdges(edgeStatus, sequence);
-        this._setNeedsRender();
-    };
-    /**
-     * Set node for which to show edges.
-     *
-     * @param {Node} node
-     */
-    DirectionDOMRenderer.prototype.setNode = function (node) {
-        this._node = node;
-        this._clearEdges();
-        this._setNeedsRender();
-    };
-    /**
-     * Set the render camera to use for calculating rotations.
-     *
-     * @param {RenderCamera} renderCamera
-     */
-    DirectionDOMRenderer.prototype.setRenderCamera = function (renderCamera) {
-        var rotation = renderCamera.rotation;
-        if (Math.abs(rotation.phi - this._rotation.phi) < this._epsilon) {
-            return;
-        }
-        this._rotation = rotation;
-        this._setNeedsRender();
-    };
-    /**
-     * Set configuration values.
-     *
-     * @param {IDirectionConfiguration} configuration
-     */
-    DirectionDOMRenderer.prototype.setConfiguration = function (configuration) {
-        var needsRender = false;
-        if (this._highlightKey !== configuration.highlightKey ||
-            this._distinguishSequence !== configuration.distinguishSequence) {
-            this._highlightKey = configuration.highlightKey;
-            this._distinguishSequence = configuration.distinguishSequence;
-            needsRender = true;
-        }
-        if (this._calculator.minWidth !== configuration.minWidth ||
-            this._calculator.maxWidth !== configuration.maxWidth) {
-            this._calculator.configure(configuration);
-            needsRender = true;
-        }
-        if (needsRender) {
-            this._setNeedsRender();
-        }
-    };
-    /**
-     * Detect the element's width and height and resize
-     * elements accordingly.
-     *
-     * @param {ISize} size Size of vßiewer container element.
-     */
-    DirectionDOMRenderer.prototype.resize = function (size) {
-        this._calculator.resize(size);
-        this._setNeedsRender();
-    };
-    DirectionDOMRenderer.prototype._setNeedsRender = function () {
-        if (this._node != null) {
-            this._needsRender = true;
-        }
-    };
-    DirectionDOMRenderer.prototype._clearEdges = function () {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-    };
-    DirectionDOMRenderer.prototype._setEdges = function (edgeStatus, sequence) {
-        this._stepEdges = [];
-        this._turnEdges = [];
-        this._panoEdges = [];
-        this._sequenceEdgeKeys = [];
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            var direction = edge.data.direction;
-            if (this._stepDirections.indexOf(direction) > -1) {
-                this._stepEdges.push(edge);
-                continue;
-            }
-            if (this._turnDirections.indexOf(direction) > -1) {
-                this._turnEdges.push(edge);
-                continue;
-            }
-            if (edge.data.direction === Edge_1.EdgeDirection.Pano) {
-                this._panoEdges.push(edge);
-            }
-        }
-        if (this._distinguishSequence && sequence != null) {
-            var edges = this._panoEdges
-                .concat(this._stepEdges)
-                .concat(this._turnEdges);
-            for (var _b = 0, edges_1 = edges; _b < edges_1.length; _b++) {
-                var edge = edges_1[_b];
-                var edgeKey = edge.to;
-                for (var _c = 0, _d = sequence.keys; _c < _d.length; _c++) {
-                    var sequenceKey = _d[_c];
-                    if (sequenceKey === edgeKey) {
-                        this._sequenceEdgeKeys.push(edgeKey);
-                        break;
-                    }
-                }
-            }
-        }
-    };
-    DirectionDOMRenderer.prototype._createPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.outerRadius, "DirectionsArrowPano"));
-        }
-        for (var _b = 0, _c = this._stepEdges; _b < _c.length; _b++) {
-            var stepEdge = _c[_b];
-            arrows.push(this._createPanoToPerspectiveArrow(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
-        }
-        return arrows;
-    };
-    DirectionDOMRenderer.prototype._createPanoToPerspectiveArrow = function (navigator, key, azimuth, rotation, direction) {
-        var threshold = Math.PI / 8;
-        var relativePhi = rotation.phi;
-        switch (direction) {
-            case Edge_1.EdgeDirection.StepBackward:
-                relativePhi = rotation.phi - Math.PI;
-                break;
-            case Edge_1.EdgeDirection.StepLeft:
-                relativePhi = rotation.phi + Math.PI / 2;
-                break;
-            case Edge_1.EdgeDirection.StepRight:
-                relativePhi = rotation.phi - Math.PI / 2;
-                break;
-            default:
-                break;
-        }
-        if (Math.abs(this._spatial.wrapAngle(azimuth - relativePhi)) < threshold) {
-            return this._createVNodeByKey(navigator, key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep");
-        }
-        return this._createVNodeDisabled(key, azimuth, rotation);
-    };
-    DirectionDOMRenderer.prototype._createPerspectiveToPanoArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._panoEdges; _i < _a.length; _i++) {
-            var panoEdge = _a[_i];
-            arrows.push(this._createVNodeByKey(navigator, panoEdge.to, panoEdge.data.worldMotionAzimuth, rotation, this._calculator.innerRadius, "DirectionsArrowPano", true));
-        }
-        return arrows;
-    };
-    DirectionDOMRenderer.prototype._createStepArrows = function (navigator, rotation) {
-        var arrows = [];
-        for (var _i = 0, _a = this._stepEdges; _i < _a.length; _i++) {
-            var stepEdge = _a[_i];
-            arrows.push(this._createVNodeByDirection(navigator, stepEdge.to, stepEdge.data.worldMotionAzimuth, rotation, stepEdge.data.direction));
-        }
-        return arrows;
-    };
-    DirectionDOMRenderer.prototype._createTurnArrows = function (navigator) {
-        var turns = [];
-        for (var _i = 0, _a = this._turnEdges; _i < _a.length; _i++) {
-            var turnEdge = _a[_i];
-            var direction = turnEdge.data.direction;
-            var name_1 = this._turnNames[direction];
-            turns.push(this._createVNodeByTurn(navigator, turnEdge.to, name_1, direction));
-        }
-        return turns;
-    };
-    DirectionDOMRenderer.prototype._createVNodeByKey = function (navigator, key, azimuth, rotation, offset, className, shiftVertically) {
-        var onClick = function (e) {
-            navigator.moveToKey$(key)
-                .subscribe(undefined, function (error) {
-                if (!(error instanceof Error_1.AbortMapillaryError)) {
-                    console.error(error);
-                }
-            });
-        };
-        return this._createVNode(key, azimuth, rotation, offset, className, "DirectionsCircle", onClick, shiftVertically);
-    };
-    DirectionDOMRenderer.prototype._createVNodeByDirection = function (navigator, key, azimuth, rotation, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(undefined, function (error) {
-                if (!(error instanceof Error_1.AbortMapillaryError)) {
-                    console.error(error);
-                }
-            });
-        };
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowStep", "DirectionsCircle", onClick);
-    };
-    DirectionDOMRenderer.prototype._createVNodeByTurn = function (navigator, key, className, direction) {
-        var onClick = function (e) {
-            navigator.moveDir$(direction)
-                .subscribe(undefined, function (error) {
-                if (!(error instanceof Error_1.AbortMapillaryError)) {
-                    console.error(error);
-                }
-            });
-        };
-        var style = {
-            height: this._calculator.turnCircleSizeCss,
-            transform: "rotate(0)",
-            width: this._calculator.turnCircleSizeCss,
-        };
-        switch (direction) {
-            case Edge_1.EdgeDirection.TurnLeft:
-                style.left = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnRight:
-                style.right = "5px";
-                style.top = "5px";
-                break;
-            case Edge_1.EdgeDirection.TurnU:
-                style.left = "5px";
-                style.bottom = "5px";
-                break;
-            default:
-                break;
-        }
-        var circleProperties = {
-            attributes: {
-                "data-key": key,
-            },
-            onclick: onClick,
-            style: style,
-        };
-        var circleClassName = "TurnCircle";
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
-        }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
-        }
-        var turn = vd.h("div." + className, {}, []);
-        return vd.h("div." + circleClassName, circleProperties, [turn]);
-    };
-    DirectionDOMRenderer.prototype._createVNodeDisabled = function (key, azimuth, rotation) {
-        return this._createVNode(key, azimuth, rotation, this._calculator.outerRadius, "DirectionsArrowDisabled", "DirectionsCircleDisabled");
-    };
-    DirectionDOMRenderer.prototype._createVNode = function (key, azimuth, rotation, radius, className, circleClassName, onClick, shiftVertically) {
-        var translation = this._calculator.angleToCoordinates(azimuth - rotation.phi);
-        // rotate 90 degrees clockwise and flip over X-axis
-        var translationX = Math.round(-radius * translation[1] + 0.5 * this._calculator.containerWidth);
-        var translationY = Math.round(-radius * translation[0] + 0.5 * this._calculator.containerHeight);
-        var shadowTranslation = this._calculator.relativeAngleToCoordiantes(azimuth, rotation.phi);
-        var shadowOffset = this._calculator.shadowOffset;
-        var shadowTranslationX = -shadowOffset * shadowTranslation[1];
-        var shadowTranslationY = shadowOffset * shadowTranslation[0];
-        var filter = "drop-shadow(" + shadowTranslationX + "px " + shadowTranslationY + "px 1px rgba(0,0,0,0.8))";
-        var properties = {
-            style: {
-                "-webkit-filter": filter,
-                filter: filter,
-            },
-        };
-        var chevron = vd.h("div." + className, properties, []);
-        var azimuthDeg = -this._spatial.radToDeg(azimuth - rotation.phi);
-        var circleTransform = shiftVertically ?
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg) translateZ(-0.01px)" :
-            "translate(" + translationX + "px, " + translationY + "px) rotate(" + azimuthDeg + "deg)";
-        var circleProperties = {
-            attributes: { "data-key": key },
-            onclick: onClick,
-            style: {
-                height: this._calculator.stepCircleSizeCss,
-                marginLeft: this._calculator.stepCircleMarginCss,
-                marginTop: this._calculator.stepCircleMarginCss,
-                transform: circleTransform,
-                width: this._calculator.stepCircleSizeCss,
-            },
-        };
-        if (this._sequenceEdgeKeys.indexOf(key) > -1) {
-            circleClassName += "Sequence";
-        }
-        if (this._highlightKey === key) {
-            circleClassName += "Highlight";
-        }
-        return vd.h("div." + circleClassName, circleProperties, [chevron]);
-    };
-    DirectionDOMRenderer.prototype._getContainer = function (steps, turns, rotation) {
-        // edge does not handle hover on perspective transforms.
-        var transform = this._isEdge ?
-            "rotateX(60deg)" :
-            "perspective(" + this._calculator.containerWidthCss + ") rotateX(60deg)";
-        var properties = {
-            oncontextmenu: function (event) { event.preventDefault(); },
-            style: {
-                bottom: this._calculator.containerBottomCss,
-                height: this._calculator.containerHeightCss,
-                left: this._calculator.containerLeftCss,
-                marginLeft: this._calculator.containerMarginCss,
-                transform: transform,
-                width: this._calculator.containerWidthCss,
-            },
-        };
-        return vd.h("div.DirectionsPerspective", properties, turns.concat(steps));
-    };
-    return DirectionDOMRenderer;
-}());
-exports.DirectionDOMRenderer = DirectionDOMRenderer;
-exports.default = DirectionDOMRenderer;
-
-
-},{"../../Component":275,"../../Edge":276,"../../Error":277,"../../Geo":278,"virtual-dom":231}],305:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Viewer_1 = require("../../Viewer");
-var Render_1 = require("../../Render");
-var Tiles_1 = require("../../Tiles");
-var Utils_1 = require("../../Utils");
-var ViewportCoords_1 = require("../../geo/ViewportCoords");
-var Spatial_1 = require("../../geo/Spatial");
-var ImagePlaneComponent = /** @class */ (function (_super) {
-    __extends(ImagePlaneComponent, _super);
-    function ImagePlaneComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
-        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
-        _this._rendererOperation$ = new rxjs_1.Subject();
-        _this._rendererCreator$ = new rxjs_1.Subject();
-        _this._rendererDisposer$ = new rxjs_1.Subject();
-        _this._renderer$ = _this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
-            return operation(renderer);
-        }, null), operators_1.filter(function (renderer) {
-            return renderer != null;
-        }), operators_1.distinctUntilChanged(undefined, function (renderer) {
-            return renderer.frameId;
-        }));
-        _this._rendererCreator$.pipe(operators_1.map(function () {
-            return function (renderer) {
-                if (renderer != null) {
-                    throw new Error("Multiple image plane states can not be created at the same time");
-                }
-                return new Component_1.ImagePlaneGLRenderer();
-            };
-        }))
-            .subscribe(_this._rendererOperation$);
-        _this._rendererDisposer$.pipe(operators_1.map(function () {
-            return function (renderer) {
-                renderer.dispose();
-                return null;
-            };
-        }))
-            .subscribe(_this._rendererOperation$);
-        return _this;
-    }
-    ImagePlaneComponent.prototype._activate = function () {
-        var _this = this;
-        this._rendererSubscription = this._renderer$.pipe(operators_1.map(function (renderer) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: renderer.frameId,
-                    needsRender: renderer.needsRender,
-                    render: renderer.render.bind(renderer),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            renderer.clearNeedsRender();
-            return renderHash;
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        this._rendererCreator$.next(null);
-        this._stateSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return function (renderer) {
-                renderer.updateFrame(frame);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
-            var frame = _a[0], renderer = _a[1], size = _a[2];
-            var state = frame.state;
-            var viewportSize = Math.max(size.width, size.height);
-            var currentNode = state.currentNode;
-            var currentTransform = state.currentTransform;
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
-        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProvider(provider.key, provider);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
-            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
-        }))
-            .subscribe(function (_a) {
-            var provider = _a[0], size = _a[1];
-            var viewportSize = Math.max(size.width, size.height);
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            provider.setTileSize(tileSize);
-        });
-        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
-        });
-        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
-            var camera = _a[0], size = _a[1];
-            return [
-                camera.camera.position.clone(),
-                camera.camera.lookat.clone(),
-                camera.zoom.valueOf(),
-                size.height.valueOf(),
-                size.width.valueOf()
-            ];
-        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        }), operators_1.map(function (pls) {
-            var samePosition = pls[0][0].equals(pls[1][0]);
-            var sameLookat = pls[0][1].equals(pls[1][1]);
-            var sameZoom = pls[0][2] === pls[1][2];
-            var sameHeight = pls[0][3] === pls[1][3];
-            var sameWidth = pls[0][4] === pls[1][4];
-            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
-        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
-            return stalled;
-        }), operators_1.switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
-        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
-        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return roiTrigger$.pipe(operators_1.map(function (_a) {
-                var camera = _a[0], size = _a[1], transform = _a[2];
-                var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, transform, camera.perspective);
-                if (basic[0] < 0 || basic[1] < 0 || basic[0] > 1 || basic[1] > 1) {
-                    return undefined;
-                }
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
-                    provider,
-                ];
-            }), operators_1.filter(function (args) {
-                return !!args;
-            }));
-        }), operators_1.filter(function (args) {
-            return !args[1].disposed;
-        }))
-            .subscribe(function (args) {
-            var roi = args[0];
-            var provider = args[1];
-            provider.setRegionOfInterest(roi);
-        });
-        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return provider.hasTexture$;
-        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
-        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead === 0;
-        }), operators_1.map(function (frame) {
-            return frame.state.currentNode;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
-            return !args[1];
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        }), operators_1.switchMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return rxjs_1.empty();
-            }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
-                return [n.image, n];
-            }));
-            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
-                return hasTexture;
-            }))), operators_1.catchError(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return rxjs_1.empty();
-            }));
-        })).pipe(operators_1.publish(), operators_1.refCount());
-        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
-            .subscribe(function (args) {
-            if (args[0][1].key !== args[1].key ||
-                args[1].disposed) {
-                return;
-            }
-            args[1].updateBackground(args[0][0]);
-        });
-        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        this._clearPeripheryPlaneSubscription = this._navigator.panService.panNodes$.pipe(operators_1.filter(function (panNodes) {
-            return panNodes.length === 0;
-        }), operators_1.map(function () {
-            return function (renderer) {
-                renderer.clearPeripheryPlanes();
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        var cachedPanNodes$ = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
-            return rxjs_1.from(nts).pipe(operators_1.mergeMap(function (_a) {
-                var n = _a[0], t = _a[1];
-                return rxjs_1.combineLatest(_this._navigator.graphService.cacheNode$(n.key).pipe(operators_1.catchError(function (error) {
-                    console.error("Failed to cache periphery node (" + n.key + ")", error);
-                    return rxjs_1.empty();
-                })), rxjs_1.of(t));
-            }));
-        }), operators_1.share());
-        this._addPeripheryPlaneSubscription = cachedPanNodes$.pipe(operators_1.map(function (_a) {
-            var n = _a[0], t = _a[1];
-            return function (renderer) {
-                renderer.addPeripheryPlane(n, t);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        this._updatePeripheryPlaneTextureSubscription = cachedPanNodes$.pipe(operators_1.mergeMap(function (_a) {
-            var n = _a[0];
-            return Viewer_1.ImageSize.Size2048 > Math.max(n.image.width, n.image.height) ?
-                n.cacheImage$(Viewer_1.ImageSize.Size2048).pipe(operators_1.catchError(function () {
-                    return rxjs_1.empty();
-                })) :
-                rxjs_1.empty();
-        }), operators_1.map(function (n) {
-            return function (renderer) {
-                renderer.updateTextureImage(n.image, n);
-                return renderer;
-            };
-        }))
-            .subscribe(this._rendererOperation$);
-        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.alpha < 1;
-        }), operators_1.distinctUntilChanged());
-        var panTrigger$ = rxjs_1.combineLatest(this._container.mouseService.active$, this._container.touchService.active$, this._navigator.stateService.inMotion$, inTransition$).pipe(operators_1.map(function (_a) {
-            var mouseActive = _a[0], touchActive = _a[1], inMotion = _a[2], inTransition = _a[3];
-            return !(mouseActive || touchActive || inMotion || inTransition);
-        }), operators_1.filter(function (trigger) {
-            return trigger;
-        }));
-        this._moveToPeripheryNodeSubscription = this._navigator.panService.panNodes$.pipe(operators_1.switchMap(function (nts) {
-            return panTrigger$.pipe(operators_1.withLatestFrom(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentNode$, _this._navigator.stateService.currentTransform$), operators_1.mergeMap(function (_a) {
-                var renderCamera = _a[1], currentNode = _a[2], currentTransform = _a[3];
-                return rxjs_1.of([
-                    renderCamera,
-                    currentNode,
-                    currentTransform,
-                    nts,
-                ]);
-            }));
-        }), operators_1.switchMap(function (_a) {
-            var camera = _a[0], cn = _a[1], ct = _a[2], nts = _a[3];
-            var direction = camera.camera.lookat.clone().sub(camera.camera.position);
-            var cd = new Spatial_1.default().viewingDirection(cn.rotation);
-            var ca = cd.angleTo(direction);
-            var closest = [ca, undefined];
-            var basic = new ViewportCoords_1.default().viewportToBasic(0, 0, ct, camera.perspective);
-            if (basic[0] >= 0 && basic[0] <= 1 && basic[1] >= 0 && basic[1] <= 1) {
-                closest[0] = Number.NEGATIVE_INFINITY;
-            }
-            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
-                var n = nts_1[_i][0];
-                var d = new Spatial_1.default().viewingDirection(n.rotation);
-                var a = d.angleTo(direction);
-                if (a < closest[0]) {
-                    closest[0] = a;
-                    closest[1] = n.key;
-                }
-            }
-            if (!closest[1]) {
-                return rxjs_1.empty();
-            }
-            return _this._navigator.moveToKey$(closest[1]).pipe(operators_1.catchError(function () {
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe();
-    };
-    ImagePlaneComponent.prototype._deactivate = function () {
-        this._rendererDisposer$.next(null);
-        this._abortTextureProviderSubscription.unsubscribe();
-        this._hasTextureSubscription.unsubscribe();
-        this._rendererSubscription.unsubscribe();
-        this._setRegionOfInterestSubscription.unsubscribe();
-        this._setTextureProviderSubscription.unsubscribe();
-        this._setTileSizeSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._textureProviderSubscription.unsubscribe();
-        this._updateBackgroundSubscription.unsubscribe();
-        this._updateTextureImageSubscription.unsubscribe();
-        this._clearPeripheryPlaneSubscription.unsubscribe();
-        this._addPeripheryPlaneSubscription.unsubscribe();
-        this._updatePeripheryPlaneTextureSubscription.unsubscribe();
-        this._moveToPeripheryNodeSubscription.unsubscribe();
-    };
-    ImagePlaneComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    ImagePlaneComponent.componentName = "imagePlane";
-    return ImagePlaneComponent;
-}(Component_1.Component));
-exports.ImagePlaneComponent = ImagePlaneComponent;
-Component_1.ComponentService.register(ImagePlaneComponent);
-exports.default = ImagePlaneComponent;
-
-},{"../../Component":275,"../../Render":281,"../../Tiles":284,"../../Utils":285,"../../Viewer":286,"../../geo/Spatial":387,"../../geo/ViewportCoords":389,"rxjs":27,"rxjs/operators":225}],306:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../Component");
-var ImagePlaneGLRenderer = /** @class */ (function () {
-    function ImagePlaneGLRenderer() {
-        this._factory = new Component_1.MeshFactory();
-        this._scene = new Component_1.MeshScene();
-        this._alpha = 0;
-        this._alphaOld = 0;
-        this._fadeOutSpeed = 0.05;
-        this._currentKey = null;
-        this._previousKey = null;
-        this._providerDisposers = {};
-        this._frameId = 0;
-        this._needsRender = false;
-    }
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ImagePlaneGLRenderer.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ImagePlaneGLRenderer.prototype.indicateNeedsRender = function () {
-        this._needsRender = true;
-    };
-    ImagePlaneGLRenderer.prototype.addPeripheryPlane = function (node, transform) {
-        var mesh = this._factory.createMesh(node, transform);
-        var planes = {};
-        planes[node.key] = mesh;
-        this._scene.addPeripheryPlanes(planes);
-        this._needsRender = true;
-    };
-    ImagePlaneGLRenderer.prototype.clearPeripheryPlanes = function () {
-        this._scene.setPeripheryPlanes({});
-        this._needsRender = true;
-    };
-    ImagePlaneGLRenderer.prototype.updateFrame = function (frame) {
-        this._updateFrameId(frame.id);
-        this._needsRender = this._updateAlpha(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateAlphaOld(frame.state.alpha) || this._needsRender;
-        this._needsRender = this._updateImagePlanes(frame.state) || this._needsRender;
-    };
-    ImagePlaneGLRenderer.prototype.setTextureProvider = function (key, provider) {
-        var _this = this;
-        if (key !== this._currentKey) {
-            return;
-        }
-        var createdSubscription = provider.textureCreated$
-            .subscribe(function (texture) {
-            _this._updateTexture(texture);
-        });
-        var updatedSubscription = provider.textureUpdated$
-            .subscribe(function (updated) {
-            _this._needsRender = true;
-        });
-        var dispose = function () {
-            createdSubscription.unsubscribe();
-            updatedSubscription.unsubscribe();
-            provider.dispose();
-        };
-        if (key in this._providerDisposers) {
-            var disposeProvider = this._providerDisposers[key];
-            disposeProvider();
-            delete this._providerDisposers[key];
-        }
-        this._providerDisposers[key] = dispose;
-    };
-    ImagePlaneGLRenderer.prototype.updateTextureImage = function (image, node) {
-        this._needsRender = true;
-        var planes = this._extend({}, this._scene.planes, this._scene.planesOld, this._scene.planesPeriphery);
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            if (key !== node.key) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    ImagePlaneGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        var planes = this._scene.planes;
-        var planesOld = this._scene.planesOld;
-        var planesPeriphery = this._scene.planesPeriphery;
-        var planeAlpha = Object.keys(planesOld).length ? 1 : this._alpha;
-        var peripheryAlpha = Object.keys(planesOld).length ? 1 : Math.floor(this._alpha);
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            plane.material.uniforms.opacity.value = planeAlpha;
-        }
-        for (var key in planesOld) {
-            if (!planesOld.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planesOld[key];
-            plane.material.uniforms.opacity.value = this._alphaOld;
-        }
-        for (var key in planesPeriphery) {
-            if (!planesPeriphery.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planesPeriphery[key];
-            plane.material.uniforms.opacity.value = peripheryAlpha;
-        }
-        renderer.render(this._scene.scenePeriphery, perspectiveCamera);
-        renderer.render(this._scene.scene, perspectiveCamera);
-        renderer.render(this._scene.sceneOld, perspectiveCamera);
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            plane.material.uniforms.opacity.value = this._alpha;
-        }
-        renderer.render(this._scene.scene, perspectiveCamera);
-    };
-    ImagePlaneGLRenderer.prototype.clearNeedsRender = function () {
-        this._needsRender = false;
-    };
-    ImagePlaneGLRenderer.prototype.dispose = function () {
-        this._scene.clear();
-    };
-    ImagePlaneGLRenderer.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
-    };
-    ImagePlaneGLRenderer.prototype._updateAlpha = function (alpha) {
-        if (alpha === this._alpha) {
-            return false;
-        }
-        this._alpha = alpha;
-        return true;
-    };
-    ImagePlaneGLRenderer.prototype._updateAlphaOld = function (alpha) {
-        if (alpha < 1 || this._alphaOld === 0) {
-            return false;
-        }
-        this._alphaOld = Math.max(0, this._alphaOld - this._fadeOutSpeed);
-        return true;
-    };
-    ImagePlaneGLRenderer.prototype._updateImagePlanes = function (state) {
-        if (state.currentNode == null || state.currentNode.key === this._currentKey) {
-            return false;
-        }
-        var previousKey = state.previousNode != null ? state.previousNode.key : null;
-        var currentKey = state.currentNode.key;
-        if (this._previousKey !== previousKey &&
-            this._previousKey !== currentKey &&
-            this._previousKey in this._providerDisposers) {
-            var disposeProvider = this._providerDisposers[this._previousKey];
-            disposeProvider();
-            delete this._providerDisposers[this._previousKey];
-        }
-        if (previousKey != null) {
-            if (previousKey !== this._currentKey && previousKey !== this._previousKey) {
-                var previousMesh = this._factory.createMesh(state.previousNode, state.previousTransform);
-                var previousPlanes = {};
-                previousPlanes[previousKey] = previousMesh;
-                this._scene.updateImagePlanes(previousPlanes);
-            }
-            this._previousKey = previousKey;
-        }
-        this._currentKey = currentKey;
-        var currentMesh = this._factory.createMesh(state.currentNode, state.currentTransform);
-        var planes = {};
-        planes[currentKey] = currentMesh;
-        this._scene.updateImagePlanes(planes);
-        this._alphaOld = 1;
-        return true;
-    };
-    ImagePlaneGLRenderer.prototype._updateTexture = function (texture) {
-        this._needsRender = true;
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    ImagePlaneGLRenderer.prototype._extend = function (dest) {
-        var sources = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            sources[_i - 1] = arguments[_i];
-        }
-        for (var _a = 0, sources_1 = sources; _a < sources_1.length; _a++) {
-            var src = sources_1[_a];
-            for (var k in src) {
-                if (!src.hasOwnProperty(k)) {
-                    continue;
-                }
-                dest[k] = src[k];
-            }
-        }
-        return dest;
-    };
-    return ImagePlaneGLRenderer;
-}());
-exports.ImagePlaneGLRenderer = ImagePlaneGLRenderer;
-exports.default = ImagePlaneGLRenderer;
-
-},{"../../Component":275}],307:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var CoverState;
-(function (CoverState) {
-    CoverState[CoverState["Hidden"] = 0] = "Hidden";
-    CoverState[CoverState["Loading"] = 1] = "Loading";
-    CoverState[CoverState["Visible"] = 2] = "Visible";
-})(CoverState = exports.CoverState || (exports.CoverState = {}));
-
-},{}],308:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for slider mode.
- *
- * @enum {number}
- * @readonly
- *
- * @description Modes for specifying how transitions
- * between nodes are performed in slider mode. Only
- * applicable when the slider component determines
- * that transitions with motion is possilble. When it
- * is not, the stationary mode will be applied.
- */
-var SliderMode;
-(function (SliderMode) {
-    /**
-     * Transitions with motion.
-     *
-     * @description The slider component moves the
-     * camera between the node origins.
-     *
-     * In this mode it is not possible to zoom or pan.
-     *
-     * The slider component falls back to stationary
-     * mode when it determines that the pair of nodes
-     * does not have a strong enough relation.
-     */
-    SliderMode[SliderMode["Motion"] = 0] = "Motion";
-    /**
-     * Stationary transitions.
-     *
-     * @description The camera is stationary.
-     *
-     * In this mode it is possible to zoom and pan.
-     */
-    SliderMode[SliderMode["Stationary"] = 1] = "Stationary";
-})(SliderMode = exports.SliderMode || (exports.SliderMode = {}));
-
-},{}],309:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var ICoverConfiguration_1 = require("./ICoverConfiguration");
-exports.CoverState = ICoverConfiguration_1.CoverState;
-var ISliderConfiguration_1 = require("./ISliderConfiguration");
-exports.SliderMode = ISliderConfiguration_1.SliderMode;
-
-},{"./ICoverConfiguration":307,"./ISliderConfiguration":308}],310:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-/**
- * The `KeyPlayHandler` allows the user to control the play behavior
- * using the following key commands:
- *
- * `Spacebar`: Start or stop playing.
- * `SHIFT` + `D`: Switch direction.
- * `<`: Decrease speed.
- * `>`: Increase speed.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keyPlay.disable();
- * keyboardComponent.keyPlay.enable();
- *
- * var isEnabled = keyboardComponent.keyPlay.isEnabled;
- * ```
- */
-var KeyPlayHandler = /** @class */ (function (_super) {
-    __extends(KeyPlayHandler, _super);
-    function KeyPlayHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    KeyPlayHandler.prototype._enable = function () {
-        var _this = this;
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._navigator.playService.playing$, this._navigator.playService.direction$, this._navigator.playService.speed$, this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }))))
-            .subscribe(function (_a) {
-            var event = _a[0], playing = _a[1], direction = _a[2], speed = _a[3], status = _a[4];
-            if (event.altKey || event.ctrlKey || event.metaKey) {
-                return;
-            }
-            switch (event.key) {
-                case "D":
-                    if (!event.shiftKey) {
-                        return;
-                    }
-                    var newDirection = playing ?
-                        null : direction === Edge_1.EdgeDirection.Next ?
-                        Edge_1.EdgeDirection.Prev : direction === Edge_1.EdgeDirection.Prev ?
-                        Edge_1.EdgeDirection.Next : null;
-                    if (newDirection != null) {
-                        _this._navigator.playService.setDirection(newDirection);
-                    }
-                    break;
-                case " ":
-                    if (event.shiftKey) {
-                        return;
-                    }
-                    if (playing) {
-                        _this._navigator.playService.stop();
-                    }
-                    else {
-                        for (var _i = 0, _b = status.edges; _i < _b.length; _i++) {
-                            var edge = _b[_i];
-                            if (edge.data.direction === direction) {
-                                _this._navigator.playService.play();
-                            }
-                        }
-                    }
-                    break;
-                case "<":
-                    _this._navigator.playService.setSpeed(speed - 0.05);
-                    break;
-                case ">":
-                    _this._navigator.playService.setSpeed(speed + 0.05);
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-        });
-    };
-    KeyPlayHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeyPlayHandler.prototype._getConfiguration = function (enable) {
-        return { keyZoom: enable };
-    };
-    return KeyPlayHandler;
-}(Component_1.HandlerBase));
-exports.KeyPlayHandler = KeyPlayHandler;
-exports.default = KeyPlayHandler;
-
-},{"../../Component":275,"../../Edge":276,"rxjs/operators":225}],311:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-/**
- * The `KeySequenceNavigationHandler` allows the user to navigate through a sequence using the
- * following key commands:
- *
- * `ALT` + `Up Arrow`: Navigate to next image in the sequence.
- * `ALT` + `Down Arrow`: Navigate to previous image in sequence.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keySequenceNavigation.disable();
- * keyboardComponent.keySequenceNavigation.enable();
- *
- * var isEnabled = keyboardComponent.keySequenceNavigation.isEnabled;
- * ```
- */
-var KeySequenceNavigationHandler = /** @class */ (function (_super) {
-    __extends(KeySequenceNavigationHandler, _super);
-    function KeySequenceNavigationHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    KeySequenceNavigationHandler.prototype._enable = function () {
-        var _this = this;
-        var sequenceEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }));
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(sequenceEdges$))
-            .subscribe(function (_a) {
-            var event = _a[0], edgeStatus = _a[1];
-            var direction = null;
-            switch (event.keyCode) {
-                case 38: // up
-                    direction = Edge_1.EdgeDirection.Next;
-                    break;
-                case 40: // down
-                    direction = Edge_1.EdgeDirection.Prev;
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-            if (!event.altKey || event.shiftKey || !edgeStatus.cached) {
-                return;
-            }
-            for (var _i = 0, _b = edgeStatus.edges; _i < _b.length; _i++) {
-                var edge = _b[_i];
-                if (edge.data.direction === direction) {
-                    _this._navigator.moveToKey$(edge.to)
-                        .subscribe(undefined, function (error) {
-                        if (!(error instanceof Error_1.AbortMapillaryError)) {
-                            console.error(error);
-                        }
-                    });
-                    return;
-                }
-            }
-        });
-    };
-    KeySequenceNavigationHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeySequenceNavigationHandler.prototype._getConfiguration = function (enable) {
-        return { keySequenceNavigation: enable };
-    };
-    return KeySequenceNavigationHandler;
-}(Component_1.HandlerBase));
-exports.KeySequenceNavigationHandler = KeySequenceNavigationHandler;
-exports.default = KeySequenceNavigationHandler;
-
-},{"../../Component":275,"../../Edge":276,"../../Error":277,"rxjs/operators":225}],312:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-/**
- * The `KeySpatialNavigationHandler` allows the user to navigate through a sequence using the
- * following key commands:
- *
- * `Up Arrow`: Step forward.
- * `Down Arrow`: Step backward.
- * `Left Arrow`: Step to the left.
- * `Rigth Arrow`: Step to the right.
- * `SHIFT` + `Down Arrow`: Turn around.
- * `SHIFT` + `Left Arrow`: Turn to the left.
- * `SHIFT` + `Rigth Arrow`: Turn to the right.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keySpatialNavigation.disable();
- * keyboardComponent.keySpatialNavigation.enable();
- *
- * var isEnabled = keyboardComponent.keySpatialNavigation.isEnabled;
- * ```
- */
-var KeySpatialNavigationHandler = /** @class */ (function (_super) {
-    __extends(KeySpatialNavigationHandler, _super);
-    /** @ignore */
-    function KeySpatialNavigationHandler(component, container, navigator, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        return _this;
-    }
-    KeySpatialNavigationHandler.prototype._enable = function () {
-        var _this = this;
-        var spatialEdges$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.spatialEdges$;
-        }));
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(spatialEdges$, this._navigator.stateService.currentState$))
-            .subscribe(function (_a) {
-            var event = _a[0], edgeStatus = _a[1], frame = _a[2];
-            var pano = frame.state.currentNode.pano;
-            var direction = null;
-            switch (event.keyCode) {
-                case 37: // left
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnLeft : Edge_1.EdgeDirection.StepLeft;
-                    break;
-                case 38: // up
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.Pano : Edge_1.EdgeDirection.StepForward;
-                    break;
-                case 39: // right
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnRight : Edge_1.EdgeDirection.StepRight;
-                    break;
-                case 40: // down
-                    direction = event.shiftKey && !pano ? Edge_1.EdgeDirection.TurnU : Edge_1.EdgeDirection.StepBackward;
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-            if (event.altKey || !edgeStatus.cached ||
-                (event.shiftKey && pano)) {
-                return;
-            }
-            if (!pano) {
-                _this._moveDir(direction, edgeStatus);
-            }
-            else {
-                var shifts = {};
-                shifts[Edge_1.EdgeDirection.StepBackward] = Math.PI;
-                shifts[Edge_1.EdgeDirection.StepForward] = 0;
-                shifts[Edge_1.EdgeDirection.StepLeft] = Math.PI / 2;
-                shifts[Edge_1.EdgeDirection.StepRight] = -Math.PI / 2;
-                var phi = _this._rotationFromCamera(frame.state.camera).phi;
-                var navigationAngle = _this._spatial.wrapAngle(phi + shifts[direction]);
-                var threshold = Math.PI / 4;
-                var edges = edgeStatus.edges.filter(function (e) {
-                    return e.data.direction === Edge_1.EdgeDirection.Pano || e.data.direction === direction;
-                });
-                var smallestAngle = Number.MAX_VALUE;
-                var toKey = null;
-                for (var _i = 0, edges_1 = edges; _i < edges_1.length; _i++) {
-                    var edge = edges_1[_i];
-                    var angle = Math.abs(_this._spatial.wrapAngle(edge.data.worldMotionAzimuth - navigationAngle));
-                    if (angle < Math.min(smallestAngle, threshold)) {
-                        smallestAngle = angle;
-                        toKey = edge.to;
-                    }
-                }
-                if (toKey == null) {
-                    return;
-                }
-                _this._moveToKey(toKey);
-            }
-        });
-    };
-    KeySpatialNavigationHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeySpatialNavigationHandler.prototype._getConfiguration = function (enable) {
-        return { keySpatialNavigation: enable };
-    };
-    KeySpatialNavigationHandler.prototype._moveDir = function (direction, edgeStatus) {
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === direction) {
-                this._moveToKey(edge.to);
-                return;
-            }
-        }
-    };
-    KeySpatialNavigationHandler.prototype._moveToKey = function (key) {
-        this._navigator.moveToKey$(key)
-            .subscribe(undefined, function (error) {
-            if (!(error instanceof Error_1.AbortMapillaryError)) {
-                console.error(error);
-            }
-        });
-    };
-    KeySpatialNavigationHandler.prototype._rotationFromCamera = function (camera) {
-        var direction = camera.lookat.clone().sub(camera.position);
-        var upProjection = direction.clone().dot(camera.up);
-        var planeProjection = direction.clone().sub(camera.up.clone().multiplyScalar(upProjection));
-        var phi = Math.atan2(planeProjection.y, planeProjection.x);
-        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-        return { phi: phi, theta: theta };
-    };
-    return KeySpatialNavigationHandler;
-}(Component_1.HandlerBase));
-exports.KeySpatialNavigationHandler = KeySpatialNavigationHandler;
-exports.default = KeySpatialNavigationHandler;
-
-},{"../../Component":275,"../../Edge":276,"../../Error":277,"rxjs/operators":225}],313:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `KeyZoomHandler` allows the user to zoom in and out using the
- * following key commands:
- *
- * `+`: Zoom in.
- * `-`: Zoom out.
- *
- * @example
- * ```
- * var keyboardComponent = viewer.getComponent("keyboard");
- *
- * keyboardComponent.keyZoom.disable();
- * keyboardComponent.keyZoom.enable();
- *
- * var isEnabled = keyboardComponent.keyZoom.isEnabled;
- * ```
- */
-var KeyZoomHandler = /** @class */ (function (_super) {
-    __extends(KeyZoomHandler, _super);
-    /** @ignore */
-    function KeyZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    KeyZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._keyDownSubscription = this._container.keyboardService.keyDown$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var event = _a[0], render = _a[1], transform = _a[2];
-            if (event.altKey || event.shiftKey || event.ctrlKey || event.metaKey) {
-                return;
-            }
-            var delta = 0;
-            switch (event.key) {
-                case "+":
-                    delta = 1;
-                    break;
-                case "-":
-                    delta = -1;
-                    break;
-                default:
-                    return;
-            }
-            event.preventDefault();
-            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            _this._navigator.stateService.zoomIn(delta, reference);
-        });
-    };
-    KeyZoomHandler.prototype._disable = function () {
-        this._keyDownSubscription.unsubscribe();
-    };
-    KeyZoomHandler.prototype._getConfiguration = function (enable) {
-        return { keyZoom: enable };
-    };
-    return KeyZoomHandler;
-}(Component_1.HandlerBase));
-exports.KeyZoomHandler = KeyZoomHandler;
-exports.default = KeyZoomHandler;
-
-},{"../../Component":275,"rxjs/operators":225}],314:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-/**
- * @class KeyboardComponent
- *
- * @classdesc Component for keyboard event handling.
- *
- * To retrive and use the keyboard component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var keyboardComponent = viewer.getComponent("keyboard");
- * ```
- */
-var KeyboardComponent = /** @class */ (function (_super) {
-    __extends(KeyboardComponent, _super);
-    /** @ignore */
-    function KeyboardComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._keyPlayHandler = new Component_1.KeyPlayHandler(_this, container, navigator);
-        _this._keySequenceNavigationHandler = new Component_1.KeySequenceNavigationHandler(_this, container, navigator);
-        _this._keySpatialNavigationHandler = new Component_1.KeySpatialNavigationHandler(_this, container, navigator, new Geo_1.Spatial());
-        _this._keyZoomHandler = new Component_1.KeyZoomHandler(_this, container, navigator, new Geo_1.ViewportCoords());
-        return _this;
-    }
-    Object.defineProperty(KeyboardComponent.prototype, "keyPlay", {
-        /**
-         * Get key play.
-         *
-         * @returns {KeyPlayHandler} The key play handler.
-         */
-        get: function () {
-            return this._keyPlayHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardComponent.prototype, "keySequenceNavigation", {
-        /**
-         * Get key sequence navigation.
-         *
-         * @returns {KeySequenceNavigationHandler} The key sequence navigation handler.
-         */
-        get: function () {
-            return this._keySequenceNavigationHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardComponent.prototype, "keySpatialNavigation", {
-        /**
-         * Get spatial.
-         *
-         * @returns {KeySpatialNavigationHandler} The spatial handler.
-         */
-        get: function () {
-            return this._keySpatialNavigationHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardComponent.prototype, "keyZoom", {
-        /**
-         * Get key zoom.
-         *
-         * @returns {KeyZoomHandler} The key zoom handler.
-         */
-        get: function () {
-            return this._keyZoomHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    KeyboardComponent.prototype._activate = function () {
-        var _this = this;
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            if (configuration.keyPlay) {
-                _this._keyPlayHandler.enable();
-            }
-            else {
-                _this._keyPlayHandler.disable();
-            }
-            if (configuration.keySequenceNavigation) {
-                _this._keySequenceNavigationHandler.enable();
-            }
-            else {
-                _this._keySequenceNavigationHandler.disable();
-            }
-            if (configuration.keySpatialNavigation) {
-                _this._keySpatialNavigationHandler.enable();
-            }
-            else {
-                _this._keySpatialNavigationHandler.disable();
-            }
-            if (configuration.keyZoom) {
-                _this._keyZoomHandler.enable();
-            }
-            else {
-                _this._keyZoomHandler.disable();
-            }
-        });
-    };
-    KeyboardComponent.prototype._deactivate = function () {
-        this._configurationSubscription.unsubscribe();
-        this._keyPlayHandler.disable();
-        this._keySequenceNavigationHandler.disable();
-        this._keySpatialNavigationHandler.disable();
-        this._keyZoomHandler.disable();
-    };
-    KeyboardComponent.prototype._getDefaultConfiguration = function () {
-        return { keyPlay: true, keySequenceNavigation: true, keySpatialNavigation: true, keyZoom: true };
-    };
-    KeyboardComponent.componentName = "keyboard";
-    return KeyboardComponent;
-}(Component_1.Component));
-exports.KeyboardComponent = KeyboardComponent;
-Component_1.ComponentService.register(KeyboardComponent);
-exports.default = KeyboardComponent;
-
-},{"../../Component":275,"../../Geo":278}],315:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var MarkerComponent_1 = require("./MarkerComponent");
-exports.MarkerComponent = MarkerComponent_1.MarkerComponent;
-var SimpleMarker_1 = require("./marker/SimpleMarker");
-exports.SimpleMarker = SimpleMarker_1.SimpleMarker;
-var CircleMarker_1 = require("./marker/CircleMarker");
-exports.CircleMarker = CircleMarker_1.CircleMarker;
-
-},{"./MarkerComponent":316,"./marker/CircleMarker":319,"./marker/SimpleMarker":321}],316:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var when = require("when");
-var Component_1 = require("../../Component");
-var Render_1 = require("../../Render");
-var Graph_1 = require("../../Graph");
-var Geo_1 = require("../../Geo");
-/**
- * @class MarkerComponent
- *
- * @classdesc Component for showing and editing 3D marker objects.
- *
- * The `add` method is used for adding new markers or replacing
- * markers already in the set.
- *
- * If a marker already in the set has the same
- * id as one of the markers added, the old marker will be removed and
- * the added marker will take its place.
- *
- * It is not possible to update markers in the set by updating any properties
- * directly on the marker object. Markers need to be replaced by
- * re-adding them for updates to geographic position or configuration
- * to be reflected.
- *
- * Markers added to the marker component can be either interactive
- * or non-interactive. Different marker types define their behavior.
- * Markers with interaction support can be configured with options
- * to respond to dragging inside the viewer and be detected when
- * retrieving markers from pixel points with the `getMarkerIdAt` method.
- *
- * To retrive and use the marker component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { marker: true } });
- *
- * var markerComponent = viewer.getComponent("marker");
- * ```
- */
-var MarkerComponent = /** @class */ (function (_super) {
-    __extends(MarkerComponent, _super);
-    /** @ignore */
-    function MarkerComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._relativeGroundAltitude = -2;
-        _this._geoCoords = new Geo_1.GeoCoords();
-        _this._graphCalculator = new Graph_1.GraphCalculator();
-        _this._markerScene = new Component_1.MarkerScene();
-        _this._markerSet = new Component_1.MarkerSet();
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        return _this;
-    }
-    /**
-     * Add markers to the marker set or replace markers in the marker set.
-     *
-     * @description If a marker already in the set has the same
-     * id as one of the markers added, the old marker will be removed
-     * the added marker will take its place.
-     *
-     * Any marker inside the visible bounding bbox
-     * will be initialized and placed in the viewer.
-     *
-     * @param {Array<Marker>} markers - Markers to add.
-     *
-     * @example ```markerComponent.add([marker1, marker2]);```
-     */
-    MarkerComponent.prototype.add = function (markers) {
-        this._markerSet.add(markers);
-    };
-    /**
-     * Returns the marker in the marker set with the specified id, or
-     * undefined if the id matches no marker.
-     *
-     * @param {string} markerId - Id of the marker.
-     *
-     * @example ```var marker = markerComponent.get("markerId");```
-     *
-     */
-    MarkerComponent.prototype.get = function (markerId) {
-        return this._markerSet.get(markerId);
-    };
-    /**
-     * Returns an array of all markers.
-     *
-     * @example ```var markers = markerComponent.getAll();```
-     */
-    MarkerComponent.prototype.getAll = function () {
-        return this._markerSet.getAll();
-    };
-    /**
-     * Returns the id of the interactive marker closest to the current camera
-     * position at the specified point.
-     *
-     * @description Notice that the pixelPoint argument requires x, y
-     * coordinates from pixel space.
-     *
-     * With this function, you can use the coordinates provided by mouse
-     * events to get information out of the marker component.
-     *
-     * If no interactive geometry of an interactive marker exist at the pixel
-     * point, `null` will be returned.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
-     * @returns {string} Id of the interactive marker closest to the camera. If no
-     * interactive marker exist at the pixel point, `null` will be returned.
-     *
-     * @example
-     * ```
-     * markerComponent.getMarkerIdAt([100, 100])
-     *     .then((markerId) => { console.log(markerId); });
-     * ```
-     */
-    MarkerComponent.prototype.getMarkerIdAt = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
-                var viewport = _this._viewportCoords
-                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
-                var id = _this._markerScene.intersectObjects(viewport, render.perspective);
-                return id;
-            }))
-                .subscribe(function (id) {
-                resolve(id);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Check if a marker exist in the marker set.
-     *
-     * @param {string} markerId - Id of the marker.
-     *
-     * @example ```var markerExists = markerComponent.has("markerId");```
-     */
-    MarkerComponent.prototype.has = function (markerId) {
-        return this._markerSet.has(markerId);
-    };
-    /**
-     * Remove markers with the specified ids from the marker set.
-     *
-     * @param {Array<string>} markerIds - Ids for markers to remove.
-     *
-     * @example ```markerComponent.remove(["id-1", "id-2"]);```
-     */
-    MarkerComponent.prototype.remove = function (markerIds) {
-        this._markerSet.remove(markerIds);
-    };
-    /**
-     * Remove all markers from the marker set.
-     *
-     * @example ```markerComponent.removeAll();```
-     */
-    MarkerComponent.prototype.removeAll = function () {
-        this._markerSet.removeAll();
-    };
-    MarkerComponent.prototype._activate = function () {
-        var _this = this;
-        var groundAltitude$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.camera.position.z + _this._relativeGroundAltitude;
-        }), operators_1.distinctUntilChanged(function (a1, a2) {
-            return Math.abs(a1 - a2) < 0.01;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var geoInitiated$ = rxjs_1.combineLatest(groundAltitude$, this._navigator.stateService.reference$).pipe(operators_1.first(), operators_1.map(function () { }), operators_1.publishReplay(1), operators_1.refCount());
-        var clampedConfiguration$ = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return { visibleBBoxSize: Math.max(1, Math.min(200, configuration.visibleBBoxSize)) };
-        }));
-        var currentlatLon$ = this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) { return node.latLon; }), operators_1.publishReplay(1), operators_1.refCount());
-        var visibleBBox$ = rxjs_1.combineLatest(clampedConfiguration$, currentlatLon$).pipe(operators_1.map(function (_a) {
-            var configuration = _a[0], latLon = _a[1];
-            return _this._graphCalculator
-                .boundingBoxCorners(latLon, configuration.visibleBBoxSize / 2);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var visibleMarkers$ = rxjs_1.combineLatest(rxjs_1.concat(rxjs_1.of(this._markerSet), this._markerSet.changed$), visibleBBox$).pipe(operators_1.map(function (_a) {
-            var set = _a[0], bbox = _a[1];
-            return set.search(bbox);
-        }));
-        this._setChangedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
-            return visibleMarkers$.pipe(operators_1.withLatestFrom(_this._navigator.stateService.reference$, groundAltitude$));
-        }))
-            .subscribe(function (_a) {
-            var markers = _a[0], reference = _a[1], alt = _a[2];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            var sceneMarkers = markerScene.markers;
-            var markersToRemove = Object.assign({}, sceneMarkers);
-            for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-                var marker = markers_1[_i];
-                if (marker.id in sceneMarkers) {
-                    delete markersToRemove[marker.id];
-                }
-                else {
-                    var point3d = geoCoords
-                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                    markerScene.add(marker, point3d);
-                }
-            }
-            for (var id in markersToRemove) {
-                if (!markersToRemove.hasOwnProperty(id)) {
-                    continue;
-                }
-                markerScene.remove(id);
-            }
-        });
-        this._markersUpdatedSubscription = geoInitiated$.pipe(operators_1.switchMap(function () {
-            return _this._markerSet.updated$.pipe(operators_1.withLatestFrom(visibleBBox$, _this._navigator.stateService.reference$, groundAltitude$));
-        }))
-            .subscribe(function (_a) {
-            var markers = _a[0], _b = _a[1], sw = _b[0], ne = _b[1], reference = _a[2], alt = _a[3];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            for (var _i = 0, markers_2 = markers; _i < markers_2.length; _i++) {
-                var marker = markers_2[_i];
-                var exists = markerScene.has(marker.id);
-                var visible = marker.latLon.lat > sw.lat &&
-                    marker.latLon.lat < ne.lat &&
-                    marker.latLon.lon > sw.lon &&
-                    marker.latLon.lon < ne.lon;
-                if (visible) {
-                    var point3d = geoCoords
-                        .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                    markerScene.add(marker, point3d);
-                }
-                else if (!visible && exists) {
-                    markerScene.remove(marker.id);
-                }
-            }
-        });
-        this._referenceSubscription = this._navigator.stateService.reference$.pipe(operators_1.skip(1), operators_1.withLatestFrom(groundAltitude$))
-            .subscribe(function (_a) {
-            var reference = _a[0], alt = _a[1];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
-                var marker = _b[_i];
-                var point3d = geoCoords
-                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                markerScene.update(marker.id, point3d);
-            }
-        });
-        this._adjustHeightSubscription = groundAltitude$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._navigator.stateService.reference$, currentlatLon$))
-            .subscribe(function (_a) {
-            var alt = _a[0], reference = _a[1], latLon = _a[2];
-            var geoCoords = _this._geoCoords;
-            var markerScene = _this._markerScene;
-            var position = geoCoords
-                .geodeticToEnu(latLon.lat, latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-            for (var _i = 0, _b = markerScene.getAll(); _i < _b.length; _i++) {
-                var marker = _b[_i];
-                var point3d = geoCoords
-                    .geodeticToEnu(marker.latLon.lat, marker.latLon.lon, reference.alt + alt, reference.lat, reference.lon, reference.alt);
-                var distanceX = point3d[0] - position[0];
-                var distanceY = point3d[1] - position[1];
-                var groundDistance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
-                if (groundDistance > 50) {
-                    continue;
-                }
-                markerScene.lerpAltitude(marker.id, alt, Math.min(1, Math.max(0, 1.2 - 1.2 * groundDistance / 50)));
-            }
-        });
-        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            var scene = _this._markerScene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: scene.needsRender,
-                    render: scene.render.bind(scene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        var hoveredMarkerId$ = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.mouseService.mouseMove$).pipe(operators_1.map(function (_a) {
-            var render = _a[0], event = _a[1];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
-            var markerId = _this._markerScene.intersectObjects(viewport, render.perspective);
-            return markerId;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function (event) {
-            return true;
-        }));
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function (event) {
-            return false;
-        }));
-        var filteredDragging$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.startWith(false));
-        this._dragEventSubscription = rxjs_1.merge(draggingStarted$.pipe(operators_1.withLatestFrom(hoveredMarkerId$)), rxjs_1.combineLatest(draggingStopped$, rxjs_1.of(null))).pipe(operators_1.startWith([false, null]), operators_1.pairwise())
-            .subscribe(function (_a) {
-            var previous = _a[0], current = _a[1];
-            var dragging = current[0];
-            var eventType = dragging ? MarkerComponent.dragstart : MarkerComponent.dragend;
-            var id = dragging ? current[1] : previous[1];
-            var marker = _this._markerScene.get(id);
-            var markerEvent = { marker: marker, target: _this, type: eventType };
-            _this.fire(eventType, markerEvent);
-        });
-        var mouseDown$ = rxjs_1.merge(this._container.mouseService.mouseDown$.pipe(operators_1.map(function (event) { return true; })), this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function (event) { return false; }))).pipe(operators_1.startWith(false));
-        this._mouseClaimSubscription = rxjs_1.combineLatest(this._container.mouseService.active$, hoveredMarkerId$.pipe(operators_1.distinctUntilChanged()), mouseDown$, filteredDragging$).pipe(operators_1.map(function (_a) {
-            var active = _a[0], markerId = _a[1], mouseDown = _a[2], filteredDragging = _a[3];
-            return (!active && markerId != null && mouseDown) || filteredDragging;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (claim) {
-            if (claim) {
-                _this._container.mouseService.claimMouse(_this._name, 1);
-                _this._container.mouseService.claimWheel(_this._name, 1);
-            }
-            else {
-                _this._container.mouseService.unclaimMouse(_this._name);
-                _this._container.mouseService.unclaimWheel(_this._name);
-            }
-        });
-        var offset$ = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDragStart$).pipe(operators_1.withLatestFrom(hoveredMarkerId$, this._container.renderService.renderCamera$), operators_1.map(function (_a) {
-            var e = _a[0], id = _a[1], r = _a[2];
-            var marker = _this._markerScene.get(id);
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.projectToCanvas(marker.geometry.position.toArray(), element, r.perspective), groundCanvasX = _b[0], groundCanvasY = _b[1];
-            var _c = _this._viewportCoords.canvasPosition(e, element), canvasX = _c[0], canvasY = _c[1];
-            var offset = [canvasX - groundCanvasX, canvasY - groundCanvasY];
-            return [marker, offset, r];
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._updateMarkerSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.mouseDrag$).pipe(operators_1.withLatestFrom(offset$, this._navigator.stateService.reference$, clampedConfiguration$))
-            .subscribe(function (_a) {
-            var event = _a[0], _b = _a[1], marker = _b[0], offset = _b[1], render = _b[2], reference = _a[2], configuration = _a[3];
-            if (!_this._markerScene.has(marker.id)) {
-                return;
-            }
-            var element = _this._container.element;
-            var _c = _this._viewportCoords.canvasPosition(event, element), canvasX = _c[0], canvasY = _c[1];
-            var groundX = canvasX - offset[0];
-            var groundY = canvasY - offset[1];
-            var _d = _this._viewportCoords
-                .canvasToViewport(groundX, groundY, element), viewportX = _d[0], viewportY = _d[1];
-            var direction = new THREE.Vector3(viewportX, viewportY, 1)
-                .unproject(render.perspective)
-                .sub(render.perspective.position)
-                .normalize();
-            var distance = Math.min(_this._relativeGroundAltitude / direction.z, configuration.visibleBBoxSize / 2 - 0.1);
-            if (distance < 0) {
-                return;
-            }
-            var intersection = direction
-                .clone()
-                .multiplyScalar(distance)
-                .add(render.perspective.position);
-            intersection.z = render.perspective.position.z + _this._relativeGroundAltitude;
-            var _e = _this._geoCoords
-                .enuToGeodetic(intersection.x, intersection.y, intersection.z, reference.lat, reference.lon, reference.alt), lat = _e[0], lon = _e[1];
-            _this._markerScene.update(marker.id, intersection.toArray(), { lat: lat, lon: lon });
-            _this._markerSet.update(marker);
-            var markerEvent = { marker: marker, target: _this, type: MarkerComponent.changed };
-            _this.fire(MarkerComponent.changed, markerEvent);
-        });
-    };
-    MarkerComponent.prototype._deactivate = function () {
-        this._adjustHeightSubscription.unsubscribe();
-        this._dragEventSubscription.unsubscribe();
-        this._markersUpdatedSubscription.unsubscribe();
-        this._mouseClaimSubscription.unsubscribe();
-        this._referenceSubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._setChangedSubscription.unsubscribe();
-        this._updateMarkerSubscription.unsubscribe();
-        this._markerScene.clear();
-    };
-    MarkerComponent.prototype._getDefaultConfiguration = function () {
-        return { visibleBBoxSize: 100 };
-    };
-    MarkerComponent.componentName = "marker";
-    /**
-     * Fired when the position of a marker is changed.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("changed", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
-     */
-    MarkerComponent.changed = "changed";
-    /**
-     * Fired when a marker drag interaction starts.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("dragstart", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
-     */
-    MarkerComponent.dragstart = "dragstart";
-    /**
-     * Fired when a marker drag interaction ends.
-     * @event
-     * @type {IMarkerEvent} markerEvent - Marker event data.
-     * @example
-     * ```
-     * markerComponent.on("dragend", function(e) {
-     *     console.log(e.marker.id, e.marker.latLon);
-     * });
-     * ```
-     */
-    MarkerComponent.dragend = "dragend";
-    return MarkerComponent;
-}(Component_1.Component));
-exports.MarkerComponent = MarkerComponent;
-Component_1.ComponentService.register(MarkerComponent);
-exports.default = MarkerComponent;
-
-
-},{"../../Component":275,"../../Geo":278,"../../Graph":279,"../../Render":281,"rxjs":27,"rxjs/operators":225,"three":226,"when":272}],317:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var MarkerScene = /** @class */ (function () {
-    function MarkerScene(scene, raycaster) {
-        this._needsRender = false;
-        this._interactiveObjects = [];
-        this._markers = {};
-        this._objectMarkers = {};
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
-        this._scene = !!scene ? scene : new THREE.Scene();
-    }
-    Object.defineProperty(MarkerScene.prototype, "markers", {
-        get: function () {
-            return this._markers;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MarkerScene.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MarkerScene.prototype.add = function (marker, position) {
-        if (marker.id in this._markers) {
-            this._dispose(marker.id);
-        }
-        marker.createGeometry(position);
-        this._scene.add(marker.geometry);
-        this._markers[marker.id] = marker;
-        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
-            var interactiveObject = _a[_i];
-            this._interactiveObjects.push(interactiveObject);
-            this._objectMarkers[interactiveObject.uuid] = marker.id;
-        }
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.clear = function () {
-        for (var id in this._markers) {
-            if (!this._markers.hasOwnProperty) {
-                continue;
-            }
-            this._dispose(id);
-        }
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.get = function (id) {
-        return this._markers[id];
-    };
-    MarkerScene.prototype.getAll = function () {
-        var _this = this;
-        return Object
-            .keys(this._markers)
-            .map(function (id) { return _this._markers[id]; });
-    };
-    MarkerScene.prototype.has = function (id) {
-        return id in this._markers;
-    };
-    MarkerScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            if (intersect.object.uuid in this._objectMarkers) {
-                return this._objectMarkers[intersect.object.uuid];
-            }
-        }
-        return null;
-    };
-    MarkerScene.prototype.lerpAltitude = function (id, alt, alpha) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        this._markers[id].lerpAltitude(alt, alpha);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.remove = function (id) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        this._dispose(id);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    MarkerScene.prototype.update = function (id, position, latLon) {
-        if (!(id in this._markers)) {
-            return;
-        }
-        var marker = this._markers[id];
-        marker.updatePosition(position, latLon);
-        this._needsRender = true;
-    };
-    MarkerScene.prototype._dispose = function (id) {
-        var marker = this._markers[id];
-        this._scene.remove(marker.geometry);
-        for (var _i = 0, _a = marker.getInteractiveObjects(); _i < _a.length; _i++) {
-            var interactiveObject = _a[_i];
-            var index = this._interactiveObjects.indexOf(interactiveObject);
-            if (index !== -1) {
-                this._interactiveObjects.splice(index, 1);
-            }
-            else {
-                console.warn("Object does not exist (" + interactiveObject.id + ") for " + id);
-            }
-            delete this._objectMarkers[interactiveObject.uuid];
-        }
-        marker.disposeGeometry();
-        delete this._markers[id];
-    };
-    return MarkerScene;
-}());
-exports.MarkerScene = MarkerScene;
-exports.default = MarkerScene;
-
-},{"three":226}],318:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rbush = require("rbush");
-var rxjs_1 = require("rxjs");
-var MarkerSet = /** @class */ (function () {
-    function MarkerSet() {
-        this._hash = {};
-        this._index = rbush(16, [".lon", ".lat", ".lon", ".lat"]);
-        this._indexChanged$ = new rxjs_1.Subject();
-        this._updated$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(MarkerSet.prototype, "changed$", {
-        get: function () {
-            return this._indexChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MarkerSet.prototype, "updated$", {
-        get: function () {
-            return this._updated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MarkerSet.prototype.add = function (markers) {
-        var updated = [];
-        var hash = this._hash;
-        var index = this._index;
-        for (var _i = 0, markers_1 = markers; _i < markers_1.length; _i++) {
-            var marker = markers_1[_i];
-            var id = marker.id;
-            if (id in hash) {
-                index.remove(hash[id]);
-                updated.push(marker);
-            }
-            var item = {
-                lat: marker.latLon.lat,
-                lon: marker.latLon.lon,
-                marker: marker,
-            };
-            hash[id] = item;
-            index.insert(item);
-        }
-        if (updated.length > 0) {
-            this._updated$.next(updated);
-        }
-        if (markers.length > updated.length) {
-            this._indexChanged$.next(this);
-        }
-    };
-    MarkerSet.prototype.has = function (id) {
-        return id in this._hash;
-    };
-    MarkerSet.prototype.get = function (id) {
-        return this.has(id) ? this._hash[id].marker : undefined;
-    };
-    MarkerSet.prototype.getAll = function () {
-        return this._index
-            .all()
-            .map(function (indexItem) {
-            return indexItem.marker;
-        });
-    };
-    MarkerSet.prototype.remove = function (ids) {
-        var hash = this._hash;
-        var index = this._index;
-        var changed = false;
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            if (!(id in hash)) {
-                continue;
-            }
-            var item = hash[id];
-            index.remove(item);
-            delete hash[id];
-            changed = true;
-        }
-        if (changed) {
-            this._indexChanged$.next(this);
-        }
-    };
-    MarkerSet.prototype.removeAll = function () {
-        this._hash = {};
-        this._index.clear();
-        this._indexChanged$.next(this);
-    };
-    MarkerSet.prototype.search = function (_a) {
-        var sw = _a[0], ne = _a[1];
-        return this._index
-            .search({ maxX: ne.lon, maxY: ne.lat, minX: sw.lon, minY: sw.lat })
-            .map(function (indexItem) {
-            return indexItem.marker;
-        });
-    };
-    MarkerSet.prototype.update = function (marker) {
-        var hash = this._hash;
-        var index = this._index;
-        var id = marker.id;
-        if (!(id in hash)) {
-            return;
-        }
-        index.remove(hash[id]);
-        var item = {
-            lat: marker.latLon.lat,
-            lon: marker.latLon.lon,
-            marker: marker,
-        };
-        hash[id] = item;
-        index.insert(item);
-    };
-    return MarkerSet;
-}());
-exports.MarkerSet = MarkerSet;
-exports.default = MarkerSet;
-
-},{"rbush":26,"rxjs":27}],319:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-/**
- * @class CircleMarker
- *
- * @classdesc Non-interactive marker with a flat circle shape. The circle
- * marker can not be configured to be interactive.
- *
- * Circle marker properties can not be updated after creation.
- *
- * To create and add one `CircleMarker` with default configuration
- * and one with configuration use
- *
- * @example
- * ```
- * var defaultMarker = new Mapillary.MarkerComponent.CircleMarker(
- *     "id-1",
- *     { lat: 0, lon: 0, });
- *
- * var configuredMarker = new Mapillary.MarkerComponent.CircleMarker(
- *     "id-2",
- *     { lat: 0, lon: 0, },
- *     {
- *         color: "#0Ff",
- *         opacity: 0.3,
- *         radius: 0.7,
- *     });
- *
- * markerComponent.add([defaultMarker, configuredMarker]);
- * ```
- */
-var CircleMarker = /** @class */ (function (_super) {
-    __extends(CircleMarker, _super);
-    function CircleMarker(id, latLon, options) {
-        var _this = _super.call(this, id, latLon) || this;
-        options = !!options ? options : {};
-        _this._color = options.color != null ? options.color : 0xffffff;
-        _this._opacity = options.opacity != null ? options.opacity : 0.4;
-        _this._radius = options.radius != null ? options.radius : 1;
-        return _this;
-    }
-    CircleMarker.prototype._createGeometry = function (position) {
-        var circle = new THREE.Mesh(new THREE.CircleGeometry(this._radius, 16), new THREE.MeshBasicMaterial({
-            color: this._color,
-            opacity: this._opacity,
-            transparent: true,
-        }));
-        circle.up.fromArray([0, 0, 1]);
-        circle.renderOrder = -1;
-        var group = new THREE.Object3D();
-        group.add(circle);
-        group.position.fromArray(position);
-        this._geometry = group;
-    };
-    CircleMarker.prototype._disposeGeometry = function () {
-        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
-            var mesh = _a[_i];
-            mesh.geometry.dispose();
-            mesh.material.dispose();
-        }
-    };
-    CircleMarker.prototype._getInteractiveObjects = function () {
-        return [];
-    };
-    return CircleMarker;
-}(Component_1.Marker));
-exports.CircleMarker = CircleMarker;
-exports.default = CircleMarker;
-
-},{"../../../Component":275,"three":226}],320:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * @class Marker
- *
- * @classdesc Represents an abstract marker class that should be extended
- * by marker implementations used in the marker component.
- */
-var Marker = /** @class */ (function () {
-    function Marker(id, latLon) {
-        this._id = id;
-        this._latLon = latLon;
-    }
-    Object.defineProperty(Marker.prototype, "id", {
-        /**
-         * Get id.
-         * @returns {string} The id of the marker.
-         */
-        get: function () {
-            return this._id;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "geometry", {
-        /**
-         * Get geometry.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Marker.prototype, "latLon", {
-        /**
-         * Get lat lon.
-         * @returns {ILatLon} The geographic coordinates of the marker.
-         */
-        get: function () {
-            return this._latLon;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /** @ignore */
-    Marker.prototype.createGeometry = function (position) {
-        if (!!this._geometry) {
-            return;
-        }
-        this._createGeometry(position);
-        // update matrix world if raycasting occurs before first render
-        this._geometry.updateMatrixWorld(true);
-    };
-    /** @ignore */
-    Marker.prototype.disposeGeometry = function () {
-        if (!this._geometry) {
-            return;
-        }
-        this._disposeGeometry();
-        this._geometry = undefined;
-    };
-    /** @ignore */
-    Marker.prototype.getInteractiveObjects = function () {
-        if (!this._geometry) {
-            return [];
-        }
-        return this._getInteractiveObjects();
-    };
-    /** @ignore */
-    Marker.prototype.lerpAltitude = function (alt, alpha) {
-        if (!this._geometry) {
-            return;
-        }
-        this._geometry.position.z = (1 - alpha) * this._geometry.position.z + alpha * alt;
-    };
-    /** @ignore */
-    Marker.prototype.updatePosition = function (position, latLon) {
-        if (!!latLon) {
-            this._latLon.lat = latLon.lat;
-            this._latLon.lon = latLon.lon;
-        }
-        if (!this._geometry) {
-            return;
-        }
-        this._geometry.position.fromArray(position);
-        this._geometry.updateMatrixWorld(true);
-    };
-    return Marker;
-}());
-exports.Marker = Marker;
-exports.default = Marker;
-
-},{}],321:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-/**
- * @class SimpleMarker
- *
- * @classdesc Interactive marker with ice cream shape. The sphere
- * inside the ice cream can be configured to be interactive.
- *
- * Simple marker properties can not be updated after creation.
- *
- * To create and add one `SimpleMarker` with default configuration
- * (non-interactive) and one interactive with configuration use
- *
- * @example
- * ```
- * var defaultMarker = new Mapillary.MarkerComponent.SimpleMarker(
- *     "id-1",
- *     { lat: 0, lon: 0, });
- *
- * var interactiveMarker = new Mapillary.MarkerComponent.SimpleMarker(
- *     "id-2",
- *     { lat: 0, lon: 0, },
- *     {
- *         ballColor: "#00f",
- *         ballOpacity: 0.5,
- *         color: "#00f",
- *         interactive: true,
- *         opacity: 0.3,
- *         radius: 0.7,
- *     });
- *
- * markerComponent.add([defaultMarker, interactiveMarker]);
- * ```
- */
-var SimpleMarker = /** @class */ (function (_super) {
-    __extends(SimpleMarker, _super);
-    function SimpleMarker(id, latLon, options) {
-        var _this = _super.call(this, id, latLon) || this;
-        options = !!options ? options : {};
-        _this._ballColor = options.ballColor != null ? options.ballColor : 0xff0000;
-        _this._ballOpacity = options.ballOpacity != null ? options.ballOpacity : 0.8;
-        _this._circleToRayAngle = 2;
-        _this._color = options.color != null ? options.color : 0xff0000;
-        _this._interactive = !!options.interactive;
-        _this._opacity = options.opacity != null ? options.opacity : 0.4;
-        _this._radius = options.radius != null ? options.radius : 1;
-        return _this;
-    }
-    SimpleMarker.prototype._createGeometry = function (position) {
-        var radius = this._radius;
-        var cone = new THREE.Mesh(this._markerGeometry(radius, 8, 8), new THREE.MeshBasicMaterial({
-            color: this._color,
-            opacity: this._opacity,
-            transparent: true,
-        }));
-        cone.renderOrder = 1;
-        var ball = new THREE.Mesh(new THREE.SphereGeometry(radius / 2, 8, 8), new THREE.MeshBasicMaterial({
-            color: this._ballColor,
-            opacity: this._ballOpacity,
-            transparent: true,
-        }));
-        ball.position.z = this._markerHeight(radius);
-        var group = new THREE.Object3D();
-        group.add(ball);
-        group.add(cone);
-        group.position.fromArray(position);
-        this._geometry = group;
-    };
-    SimpleMarker.prototype._disposeGeometry = function () {
-        for (var _i = 0, _a = this._geometry.children; _i < _a.length; _i++) {
-            var mesh = _a[_i];
-            mesh.geometry.dispose();
-            mesh.material.dispose();
-        }
-    };
-    SimpleMarker.prototype._getInteractiveObjects = function () {
-        return this._interactive ? [this._geometry.children[0]] : [];
-    };
-    SimpleMarker.prototype._markerHeight = function (radius) {
-        var t = Math.tan(Math.PI - this._circleToRayAngle);
-        return radius * Math.sqrt(1 + t * t);
-    };
-    SimpleMarker.prototype._markerGeometry = function (radius, widthSegments, heightSegments) {
-        var geometry = new THREE.Geometry();
-        widthSegments = Math.max(3, Math.floor(widthSegments) || 8);
-        heightSegments = Math.max(2, Math.floor(heightSegments) || 6);
-        var height = this._markerHeight(radius);
-        var vertices = [];
-        for (var y = 0; y <= heightSegments; ++y) {
-            var verticesRow = [];
-            for (var x = 0; x <= widthSegments; ++x) {
-                var u = x / widthSegments * Math.PI * 2;
-                var v = y / heightSegments * Math.PI;
-                var r = void 0;
-                if (v < this._circleToRayAngle) {
-                    r = radius;
-                }
-                else {
-                    var t = Math.tan(v - this._circleToRayAngle);
-                    r = radius * Math.sqrt(1 + t * t);
-                }
-                var vertex = new THREE.Vector3();
-                vertex.x = r * Math.cos(u) * Math.sin(v);
-                vertex.y = r * Math.sin(u) * Math.sin(v);
-                vertex.z = r * Math.cos(v) + height;
-                geometry.vertices.push(vertex);
-                verticesRow.push(geometry.vertices.length - 1);
-            }
-            vertices.push(verticesRow);
-        }
-        for (var y = 0; y < heightSegments; ++y) {
-            for (var x = 0; x < widthSegments; ++x) {
-                var v1 = vertices[y][x + 1];
-                var v2 = vertices[y][x];
-                var v3 = vertices[y + 1][x];
-                var v4 = vertices[y + 1][x + 1];
-                var n1 = geometry.vertices[v1].clone().normalize();
-                var n2 = geometry.vertices[v2].clone().normalize();
-                var n3 = geometry.vertices[v3].clone().normalize();
-                var n4 = geometry.vertices[v4].clone().normalize();
-                geometry.faces.push(new THREE.Face3(v1, v2, v4, [n1, n2, n4]));
-                geometry.faces.push(new THREE.Face3(v2, v3, v4, [n2.clone(), n3, n4.clone()]));
-            }
-        }
-        geometry.computeFaceNormals();
-        geometry.boundingSphere = new THREE.Sphere(new THREE.Vector3(), radius + height);
-        return geometry;
-    };
-    return SimpleMarker;
-}(Component_1.Marker));
-exports.SimpleMarker = SimpleMarker;
-exports.default = SimpleMarker;
-
-},{"../../../Component":275,"three":226}],322:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `BounceHandler` ensures that the viewer bounces back to the image
- * when drag panning outside of the image edge.
- */
-var BounceHandler = /** @class */ (function (_super) {
-    __extends(BounceHandler, _super);
-    function BounceHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    BounceHandler.prototype._enable = function () {
-        var _this = this;
-        var inTransition$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.alpha < 1;
-        }), operators_1.distinctUntilChanged());
-        this._bounceSubscription = rxjs_1.combineLatest(inTransition$, this._navigator.stateService.inTranslation$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (noForce) {
-            return noForce[0] || noForce[1] || noForce[2] || noForce[3];
-        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (noForce) {
-            return noForce ?
-                rxjs_1.empty() :
-                rxjs_1.combineLatest(_this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$.pipe(operators_1.first()));
-        }), operators_1.withLatestFrom(this._navigator.panService.panNodes$))
-            .subscribe(function (_a) {
-            var _b = _a[0], render = _b[0], transform = _b[1], nts = _a[1];
-            if (!transform.hasValidScale && render.camera.focal < 0.1) {
-                return;
-            }
-            if (render.perspective.aspect === 0 || render.perspective.aspect === Number.POSITIVE_INFINITY) {
-                return;
-            }
-            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
-            var basic = _this._viewportCoords.viewportToBasic(0, 0, transform, render.perspective);
-            if ((basic[0] < 0 || basic[0] > 1) && nts.length > 0) {
-                distances[0] = distances[2] = 0;
-            }
-            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
-                var _c = nts_1[_i], t = _c[1];
-                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
-                for (var i = 1; i < distances.length; i += 2) {
-                    if (d[i] < distances[i]) {
-                        distances[i] = d[i];
-                    }
-                }
-            }
-            if (Math.max.apply(Math, distances) < 0.01) {
-                return;
-            }
-            var horizontalDistance = distances[1] - distances[3];
-            var verticalDistance = distances[0] - distances[2];
-            var currentDirection = _this._viewportCoords
-                .unprojectFromViewport(0, 0, render.perspective)
-                .sub(render.perspective.position);
-            var directionPhi = _this._viewportCoords
-                .unprojectFromViewport(horizontalDistance, 0, render.perspective)
-                .sub(render.perspective.position);
-            var directionTheta = _this._viewportCoords
-                .unprojectFromViewport(0, verticalDistance, render.perspective)
-                .sub(render.perspective.position);
-            var phi = (horizontalDistance > 0 ? 1 : -1) * directionPhi.angleTo(currentDirection);
-            var theta = (verticalDistance > 0 ? 1 : -1) * directionTheta.angleTo(currentDirection);
-            var threshold = Math.PI / 60;
-            var coeff = 1e-1;
-            phi = _this._spatial.clamp(coeff * phi, -threshold, threshold);
-            theta = _this._spatial.clamp(coeff * theta, -threshold, threshold);
-            _this._navigator.stateService.rotateUnbounded({ phi: phi, theta: theta });
-        });
-    };
-    BounceHandler.prototype._disable = function () {
-        this._bounceSubscription.unsubscribe();
-    };
-    BounceHandler.prototype._getConfiguration = function () {
-        return {};
-    };
-    return BounceHandler;
-}(Component_1.HandlerBase));
-exports.BounceHandler = BounceHandler;
-exports.default = BounceHandler;
-
-},{"../../Component":275,"rxjs":27,"rxjs/operators":225}],323:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `DoubleClickZoomHandler` allows the user to zoom the viewer image at a point by double clicking.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.doubleClickZoom.disable();
- * mouseComponent.doubleClickZoom.enable();
- *
- * var isEnabled = mouseComponent.doubleClickZoom.isEnabled;
- * ```
- */
-var DoubleClickZoomHandler = /** @class */ (function (_super) {
-    __extends(DoubleClickZoomHandler, _super);
-    /** @ignore */
-    function DoubleClickZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    DoubleClickZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._zoomSubscription = rxjs_1.merge(this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.dblClick$), this._container.touchService.doubleTap$.pipe(operators_1.map(function (e) {
-            var touch = e.touches[0];
-            return { clientX: touch.clientX, clientY: touch.clientY, shiftKey: e.shiftKey };
-        }))).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var event = _a[0], render = _a[1], transform = _a[2];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var delta = !!event.shiftKey ? -1 : 1;
-            _this._navigator.stateService.zoomIn(delta, reference);
-        });
-    };
-    DoubleClickZoomHandler.prototype._disable = function () {
-        this._zoomSubscription.unsubscribe();
-    };
-    DoubleClickZoomHandler.prototype._getConfiguration = function (enable) {
-        return { doubleClickZoom: enable };
-    };
-    return DoubleClickZoomHandler;
-}(Component_1.HandlerBase));
-exports.DoubleClickZoomHandler = DoubleClickZoomHandler;
-exports.default = DoubleClickZoomHandler;
-
-},{"../../Component":275,"rxjs":27,"rxjs/operators":225}],324:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `DragPanHandler` allows the user to pan the viewer image by clicking and dragging the cursor.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.dragPan.disable();
- * mouseComponent.dragPan.enable();
- *
- * var isEnabled = mouseComponent.dragPan.isEnabled;
- * ```
- */
-var DragPanHandler = /** @class */ (function (_super) {
-    __extends(DragPanHandler, _super);
-    /** @ignore */
-    function DragPanHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    DragPanHandler.prototype._enable = function () {
-        var _this = this;
-        var draggingStarted$ = this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.mouseDragStart$).pipe(operators_1.map(function () {
-            return true;
-        }), operators_1.share());
-        var draggingStopped$ = this._container.mouseService
-            .filtered$(this._component.name, this._container.mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
-            return false;
-        }), operators_1.share());
-        this._activeMouseSubscription = rxjs_1.merge(draggingStarted$, draggingStopped$)
-            .subscribe(this._container.mouseService.activate$);
-        var documentMouseMove$ = rxjs_1.merge(draggingStarted$, draggingStopped$).pipe(operators_1.switchMap(function (dragging) {
-            return dragging ?
-                _this._container.mouseService.documentMouseMove$ :
-                rxjs_1.empty();
-        }));
-        this._preventDefaultSubscription = rxjs_1.merge(documentMouseMove$, this._container.touchService.touchMove$)
-            .subscribe(function (event) {
-            event.preventDefault(); // prevent selection of content outside the viewer
-        });
-        var touchMovingStarted$ = this._container.touchService.singleTouchDragStart$.pipe(operators_1.map(function () {
-            return true;
-        }));
-        var touchMovingStopped$ = this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () {
-            return false;
-        }));
-        this._activeTouchSubscription = rxjs_1.merge(touchMovingStarted$, touchMovingStopped$)
-            .subscribe(this._container.touchService.activate$);
-        var rotation$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.currentNode.fullPano || frame.state.nodesAhead < 1;
-        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (enable) {
-            if (!enable) {
-                return rxjs_1.empty();
-            }
-            var mouseDrag$ = Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService);
-            var singleTouchDrag$ = rxjs_1.merge(_this._container.touchService.singleTouchDragStart$, _this._container.touchService.singleTouchDrag$, _this._container.touchService.singleTouchDragEnd$.pipe(operators_1.map(function () { return null; }))).pipe(operators_1.map(function (event) {
-                return event != null && event.touches.length > 0 ?
-                    event.touches[0] : null;
-            }), operators_1.pairwise(), operators_1.filter(function (pair) {
-                return pair[0] != null && pair[1] != null;
-            }));
-            return rxjs_1.merge(mouseDrag$, singleTouchDrag$);
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, this._navigator.panService.panNodes$), operators_1.map(function (_a) {
-            var events = _a[0], render = _a[1], transform = _a[2], nts = _a[3];
-            var previousEvent = events[0];
-            var event = events[1];
-            var movementX = event.clientX - previousEvent.clientX;
-            var movementY = event.clientY - previousEvent.clientY;
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var currentDirection = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective)
-                .sub(render.perspective.position);
-            var directionX = _this._viewportCoords.unprojectFromCanvas(canvasX - movementX, canvasY, element, render.perspective)
-                .sub(render.perspective.position);
-            var directionY = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY - movementY, element, render.perspective)
-                .sub(render.perspective.position);
-            var phi = (movementX > 0 ? 1 : -1) * directionX.angleTo(currentDirection);
-            var theta = (movementY > 0 ? -1 : 1) * directionY.angleTo(currentDirection);
-            var distances = Component_1.ImageBoundary.viewportDistances(transform, render.perspective, _this._viewportCoords);
-            for (var _i = 0, nts_1 = nts; _i < nts_1.length; _i++) {
-                var _c = nts_1[_i], t = _c[1];
-                var d = Component_1.ImageBoundary.viewportDistances(t, render.perspective, _this._viewportCoords);
-                for (var i = 0; i < distances.length; i++) {
-                    if (d[i] < distances[i]) {
-                        distances[i] = d[i];
-                    }
-                }
-            }
-            if (distances[0] > 0 && theta < 0) {
-                theta /= Math.max(1, 2e2 * distances[0]);
-            }
-            if (distances[2] > 0 && theta > 0) {
-                theta /= Math.max(1, 2e2 * distances[2]);
-            }
-            if (distances[1] > 0 && phi < 0) {
-                phi /= Math.max(1, 2e2 * distances[1]);
-            }
-            if (distances[3] > 0 && phi > 0) {
-                phi /= Math.max(1, 2e2 * distances[3]);
-            }
-            return { phi: phi, theta: theta };
-        }), operators_1.share());
-        this._rotateWithoutInertiaSubscription = rotation$
-            .subscribe(function (rotation) {
-            _this._navigator.stateService.rotateWithoutInertia(rotation);
-        });
-        this._rotateSubscription = rotation$.pipe(operators_1.scan(function (rotationBuffer, rotation) {
-            _this._drainBuffer(rotationBuffer);
-            rotationBuffer.push([Date.now(), rotation]);
-            return rotationBuffer;
-        }, []), operators_1.sample(rxjs_1.merge(this._container.mouseService.filtered$(this._component.name, this._container.mouseService.mouseDragEnd$), this._container.touchService.singleTouchDragEnd$)), operators_1.map(function (rotationBuffer) {
-            var drainedBuffer = _this._drainBuffer(rotationBuffer.slice());
-            var rotation = { phi: 0, theta: 0 };
-            for (var _i = 0, drainedBuffer_1 = drainedBuffer; _i < drainedBuffer_1.length; _i++) {
-                var bufferedRotation = drainedBuffer_1[_i];
-                rotation.phi += bufferedRotation[1].phi;
-                rotation.theta += bufferedRotation[1].theta;
-            }
-            var count = drainedBuffer.length;
-            if (count > 0) {
-                rotation.phi /= count;
-                rotation.theta /= count;
-            }
-            var threshold = Math.PI / 18;
-            rotation.phi = _this._spatial.clamp(rotation.phi, -threshold, threshold);
-            rotation.theta = _this._spatial.clamp(rotation.theta, -threshold, threshold);
-            return rotation;
-        }))
-            .subscribe(function (rotation) {
-            _this._navigator.stateService.rotate(rotation);
-        });
-    };
-    DragPanHandler.prototype._disable = function () {
-        this._activeMouseSubscription.unsubscribe();
-        this._activeTouchSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._rotateSubscription.unsubscribe();
-        this._rotateWithoutInertiaSubscription.unsubscribe();
-        this._activeMouseSubscription = null;
-        this._activeTouchSubscription = null;
-        this._preventDefaultSubscription = null;
-        this._rotateSubscription = null;
-    };
-    DragPanHandler.prototype._getConfiguration = function (enable) {
-        return { dragPan: enable };
-    };
-    DragPanHandler.prototype._drainBuffer = function (buffer) {
-        var cutoff = 50;
-        var now = Date.now();
-        while (buffer.length > 0 && now - buffer[0][0] > cutoff) {
-            buffer.shift();
-        }
-        return buffer;
-    };
-    return DragPanHandler;
-}(Component_1.HandlerBase));
-exports.DragPanHandler = DragPanHandler;
-exports.default = DragPanHandler;
-
-},{"../../Component":275,"rxjs":27,"rxjs/operators":225}],325:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var State_1 = require("../../State");
-var EarthControlHandler = /** @class */ (function (_super) {
-    __extends(EarthControlHandler, _super);
-    function EarthControlHandler(component, container, navigator, viewportCoords, spatial) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._spatial = spatial;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    EarthControlHandler.prototype._enable = function () {
-        var _this = this;
-        var earth$ = this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
-            return state === State_1.State.Earth;
-        }), operators_1.share());
-        this._preventDefaultSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            return earth ?
-                _this._container.mouseService.mouseWheel$ :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._truckSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            if (!earth) {
-                return rxjs_1.empty();
-            }
-            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
-                var e1 = _a[0], e2 = _a[1];
-                return !(e1.ctrlKey && e2.ctrlKey);
-            }));
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var _b = _a[0], previous = _b[0], current = _b[1], render = _a[1], transform = _a[2];
-            var planeNormal = [0, 0, 1];
-            var planePoint = transform.unprojectBasic([0.5, 0.5], 0);
-            planePoint[2] -= 2;
-            var currentIntersection = _this._planeIntersection(current, planeNormal, planePoint, render.perspective, _this._container.element);
-            var previousIntersection = _this._planeIntersection(previous, planeNormal, planePoint, render.perspective, _this._container.element);
-            if (!currentIntersection || !previousIntersection) {
-                return null;
-            }
-            var direction = new THREE.Vector3()
-                .subVectors(currentIntersection, previousIntersection)
-                .multiplyScalar(-1)
-                .toArray();
-            return direction;
-        }), operators_1.filter(function (direction) {
-            return !!direction;
-        }))
-            .subscribe(function (direction) {
-            _this._navigator.stateService.truck(direction);
-        });
-        this._orbitSubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            if (!earth) {
-                return rxjs_1.empty();
-            }
-            return Component_1.MouseOperator.filteredPairwiseMouseDrag$(_this._component.name, _this._container.mouseService).pipe(operators_1.filter(function (_a) {
-                var e1 = _a[0], e2 = _a[1];
-                return e1.ctrlKey && e2.ctrlKey;
-            }));
-        }), operators_1.map(function (_a) {
-            var previous = _a[0], current = _a[1];
-            var _b = _this._eventToViewport(current, _this._container.element), currentX = _b[0], currentY = _b[1];
-            var _c = _this._eventToViewport(previous, _this._container.element), previousX = _c[0], previousY = _c[1];
-            var phi = (previousX - currentX) * Math.PI;
-            var theta = (currentY - previousY) * Math.PI / 2;
-            return { phi: phi, theta: theta };
-        }))
-            .subscribe(function (rotation) {
-            _this._navigator.stateService.orbit(rotation);
-        });
-        this._dollySubscription = earth$.pipe(operators_1.switchMap(function (earth) {
-            if (!earth) {
-                return rxjs_1.empty();
-            }
-            return _this._container.mouseService
-                .filteredWheel$(_this._component.name, _this._container.mouseService.mouseWheel$);
-        }), operators_1.map(function (event) {
-            var delta = event.deltaY;
-            if (event.deltaMode === 1) {
-                delta = 40 * delta;
-            }
-            else if (event.deltaMode === 2) {
-                delta = 800 * delta;
-            }
-            var canvasSize = _this._viewportCoords.containerToCanvas(_this._container.element);
-            return -delta / canvasSize[1];
-        }))
-            .subscribe(function (delta) {
-            _this._navigator.stateService.dolly(delta);
-        });
-    };
-    EarthControlHandler.prototype._disable = function () {
-        this._dollySubscription.unsubscribe();
-        this._orbitSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._truckSubscription.unsubscribe();
-    };
-    EarthControlHandler.prototype._getConfiguration = function () {
-        return {};
-    };
-    EarthControlHandler.prototype._eventToViewport = function (event, element) {
-        var previousCanvas = this._viewportCoords.canvasPosition(event, element);
-        return this._viewportCoords.canvasToViewport(previousCanvas[0], previousCanvas[1], element);
-    };
-    EarthControlHandler.prototype._planeIntersection = function (event, planeNormal, planePoint, camera, element) {
-        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-        var direction = this._viewportCoords
-            .unprojectFromCanvas(canvasX, canvasY, element, camera)
-            .sub(camera.position)
-            .normalize();
-        if (Math.abs(this._spatial.angleToPlane(direction.toArray(), planeNormal)) < Math.PI / 90) {
-            return null;
-        }
-        var l0 = camera.position.clone();
-        var n = new THREE.Vector3().fromArray(planeNormal);
-        var p0 = new THREE.Vector3().fromArray(planePoint);
-        var d = new THREE.Vector3().subVectors(p0, l0).dot(n) / direction.clone().dot(n);
-        var intersection = new THREE.Vector3().addVectors(l0, direction.multiplyScalar(d));
-        if (this._viewportCoords.worldToCamera(intersection.toArray(), camera)[2] > 0) {
-            return null;
-        }
-        return intersection;
-    };
-    return EarthControlHandler;
-}(Component_1.HandlerBase));
-exports.EarthControlHandler = EarthControlHandler;
-exports.default = EarthControlHandler;
-
-},{"../../Component":275,"../../State":282,"rxjs":27,"rxjs/operators":225,"three":226}],326:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Geo_1 = require("../../../src/Geo");
-function basicBoundaryPoints(pointsPerSide) {
-    var points = [];
-    var os = [[0, 0], [1, 0], [1, 1], [0, 1]];
-    var ds = [[1, 0], [0, 1], [-1, 0], [0, -1]];
-    for (var side = 0; side < 4; ++side) {
-        var o = os[side];
-        var d = ds[side];
-        for (var i = 0; i < pointsPerSide; ++i) {
-            points.push([o[0] + d[0] * i / pointsPerSide,
-                o[1] + d[1] * i / pointsPerSide]);
-        }
-    }
-    return points;
-}
-function insideViewport(x, y) {
-    return x >= -1 && x <= 1 && y >= -1 && y <= 1;
-}
-function insideBasic(x, y) {
-    return x >= 0 && x <= 1 && y >= 0 && y <= 1;
-}
-function viewportDistances(transform, perspective, viewportCoords) {
-    var boundaryPointsBasic = basicBoundaryPoints(100);
-    var boundaryPointsViewport = boundaryPointsBasic
-        .map(function (basic) {
-        return viewportCoords.basicToViewportSafe(basic[0], basic[1], transform, perspective);
-    });
-    var visibleBoundaryPoints = [];
-    var viewportSides = [
-        { x: -1, y: 1 },
-        { x: 1, y: 1 },
-        { x: 1, y: -1 },
-        { x: -1, y: -1 }
-    ];
-    var intersections = [false, false, false, false];
-    for (var i = 0; i < boundaryPointsViewport.length; i++) {
-        var p1 = boundaryPointsViewport[i];
-        var p2 = boundaryPointsViewport[(i + 1) % boundaryPointsViewport.length];
-        if (p1 === null) {
-            continue;
-        }
-        if (p2 === null) {
-            if (insideViewport(p1[0], p1[1])) {
-                visibleBoundaryPoints.push(p1);
-            }
-            continue;
-        }
-        var x1 = p1[0], y1 = p1[1];
-        var x2 = p2[0], y2 = p2[1];
-        if (insideViewport(x1, y1)) {
-            if (insideViewport(x2, y2)) {
-                visibleBoundaryPoints.push(p1);
-            }
-            else {
-                for (var side = 0; side < 4; side++) {
-                    var s1 = { p1: { x: x1, y: y1 }, p2: { x: x2, y: y2 } };
-                    var s2 = { p1: viewportSides[side], p2: viewportSides[(side + 1) % 4] };
-                    var intersecting = Geo_1.Lines.segmentsIntersect(s1, s2);
-                    if (intersecting) {
-                        var intersection = Geo_1.Lines.segmentIntersection(s1, s2);
-                        visibleBoundaryPoints.push(p1, [intersection.x, intersection.y]);
-                        intersections[side] = true;
-                    }
-                }
-            }
-        }
-    }
-    var _a = viewportCoords.viewportToBasic(-1, 1, transform, perspective), topLeftBasicX = _a[0], topLeftBasicY = _a[1];
-    var _b = viewportCoords.viewportToBasic(1, 1, transform, perspective), topRightBasicX = _b[0], topRightBasicY = _b[1];
-    var _c = viewportCoords.viewportToBasic(1, -1, transform, perspective), bottomRightBasicX = _c[0], bottomRightBasicY = _c[1];
-    var _d = viewportCoords.viewportToBasic(-1, -1, transform, perspective), bottomLeftBasicX = _d[0], bottomLeftBasicY = _d[1];
-    if (insideBasic(topLeftBasicX, topLeftBasicY)) {
-        intersections[3] = intersections[0] = true;
-    }
-    if (insideBasic(topRightBasicX, topRightBasicY)) {
-        intersections[0] = intersections[1] = true;
-    }
-    if (insideBasic(bottomRightBasicX, bottomRightBasicY)) {
-        intersections[1] = intersections[2] = true;
-    }
-    if (insideBasic(bottomLeftBasicX, bottomLeftBasicY)) {
-        intersections[2] = intersections[3] = true;
-    }
-    var maximums = [-1, -1, 1, 1];
-    for (var _i = 0, visibleBoundaryPoints_1 = visibleBoundaryPoints; _i < visibleBoundaryPoints_1.length; _i++) {
-        var visibleBoundaryPoint = visibleBoundaryPoints_1[_i];
-        var x = visibleBoundaryPoint[0];
-        var y = visibleBoundaryPoint[1];
-        if (x > maximums[1]) {
-            maximums[1] = x;
-        }
-        if (x < maximums[3]) {
-            maximums[3] = x;
-        }
-        if (y > maximums[0]) {
-            maximums[0] = y;
-        }
-        if (y < maximums[2]) {
-            maximums[2] = y;
-        }
-    }
-    var boundary = [1, 1, -1, -1];
-    var distances = [];
-    for (var side = 0; side < 4; side++) {
-        if (intersections[side]) {
-            distances.push(0);
-            continue;
-        }
-        distances.push(Math.abs(boundary[side] - maximums[side]));
-    }
-    return distances;
-}
-exports.viewportDistances = viewportDistances;
-
-},{"../../../src/Geo":278}],327:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-/**
- * @class MouseComponent
- *
- * @classdesc Component handling mouse and touch events for camera movement.
- *
- * To retrive and use the mouse component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var mouseComponent = viewer.getComponent("mouse");
- * ```
- */
-var MouseComponent = /** @class */ (function (_super) {
-    __extends(MouseComponent, _super);
-    /** @ignore */
-    function MouseComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        var spatial = new Geo_1.Spatial();
-        var viewportCoords = new Geo_1.ViewportCoords();
-        _this._bounceHandler = new Component_1.BounceHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._doubleClickZoomHandler = new Component_1.DoubleClickZoomHandler(_this, container, navigator, viewportCoords);
-        _this._dragPanHandler = new Component_1.DragPanHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._earthControlHandler = new Component_1.EarthControlHandler(_this, container, navigator, viewportCoords, spatial);
-        _this._scrollZoomHandler = new Component_1.ScrollZoomHandler(_this, container, navigator, viewportCoords);
-        _this._touchZoomHandler = new Component_1.TouchZoomHandler(_this, container, navigator, viewportCoords);
-        return _this;
-    }
-    Object.defineProperty(MouseComponent.prototype, "doubleClickZoom", {
-        /**
-         * Get double click zoom.
-         *
-         * @returns {DoubleClickZoomHandler} The double click zoom handler.
-         */
-        get: function () {
-            return this._doubleClickZoomHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "dragPan", {
-        /**
-         * Get drag pan.
-         *
-         * @returns {DragPanHandler} The drag pan handler.
-         */
-        get: function () {
-            return this._dragPanHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "scrollZoom", {
-        /**
-         * Get scroll zoom.
-         *
-         * @returns {ScrollZoomHandler} The scroll zoom handler.
-         */
-        get: function () {
-            return this._scrollZoomHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseComponent.prototype, "touchZoom", {
-        /**
-         * Get touch zoom.
-         *
-         * @returns {TouchZoomHandler} The touch zoom handler.
-         */
-        get: function () {
-            return this._touchZoomHandler;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MouseComponent.prototype._activate = function () {
-        var _this = this;
-        this._bounceHandler.enable();
-        this._earthControlHandler.enable();
-        this._configurationSubscription = this._configuration$
-            .subscribe(function (configuration) {
-            if (configuration.doubleClickZoom) {
-                _this._doubleClickZoomHandler.enable();
-            }
-            else {
-                _this._doubleClickZoomHandler.disable();
-            }
-            if (configuration.dragPan) {
-                _this._dragPanHandler.enable();
-            }
-            else {
-                _this._dragPanHandler.disable();
-            }
-            if (configuration.scrollZoom) {
-                _this._scrollZoomHandler.enable();
-            }
-            else {
-                _this._scrollZoomHandler.disable();
-            }
-            if (configuration.touchZoom) {
-                _this._touchZoomHandler.enable();
-            }
-            else {
-                _this._touchZoomHandler.disable();
-            }
-        });
-        this._container.mouseService.claimMouse(this._name, 0);
-    };
-    MouseComponent.prototype._deactivate = function () {
-        this._container.mouseService.unclaimMouse(this._name);
-        this._configurationSubscription.unsubscribe();
-        this._bounceHandler.disable();
-        this._doubleClickZoomHandler.disable();
-        this._dragPanHandler.disable();
-        this._earthControlHandler.disable();
-        this._scrollZoomHandler.disable();
-        this._touchZoomHandler.disable();
-    };
-    MouseComponent.prototype._getDefaultConfiguration = function () {
-        return { doubleClickZoom: false, dragPan: true, scrollZoom: true, touchZoom: true };
-    };
-    /** @inheritdoc */
-    MouseComponent.componentName = "mouse";
-    return MouseComponent;
-}(Component_1.Component));
-exports.MouseComponent = MouseComponent;
-Component_1.ComponentService.register(MouseComponent);
-exports.default = MouseComponent;
-
-},{"../../Component":275,"../../Geo":278}],328:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `ScrollZoomHandler` allows the user to zoom the viewer image by scrolling.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.scrollZoom.disable();
- * mouseComponent.scrollZoom.enable();
- *
- * var isEnabled = mouseComponent.scrollZoom.isEnabled;
- * ```
- */
-var ScrollZoomHandler = /** @class */ (function (_super) {
-    __extends(ScrollZoomHandler, _super);
-    /** @ignore */
-    function ScrollZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    ScrollZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._container.mouseService.claimWheel(this._component.name, 0);
-        this._preventDefaultSubscription = this._container.mouseService.mouseWheel$
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._zoomSubscription = this._container.mouseService
-            .filteredWheel$(this._component.name, this._container.mouseService.mouseWheel$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$, function (w, f) {
-            return [w, f];
-        }), operators_1.filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$, function (w, r, t) {
-            return [w, r, t];
-        }))
-            .subscribe(function (args) {
-            var event = args[0];
-            var render = args[1];
-            var transform = args[2];
-            var element = _this._container.element;
-            var _a = _this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var deltaY = event.deltaY;
-            if (event.deltaMode === 1) {
-                deltaY = 40 * deltaY;
-            }
-            else if (event.deltaMode === 2) {
-                deltaY = 800 * deltaY;
-            }
-            var canvasSize = _this._viewportCoords.containerToCanvas(element);
-            var zoom = -3 * deltaY / canvasSize[1];
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-    };
-    ScrollZoomHandler.prototype._disable = function () {
-        this._container.mouseService.unclaimWheel(this._component.name);
-        this._preventDefaultSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-        this._preventDefaultSubscription = null;
-        this._zoomSubscription = null;
-    };
-    ScrollZoomHandler.prototype._getConfiguration = function (enable) {
-        return { scrollZoom: enable };
-    };
-    return ScrollZoomHandler;
-}(Component_1.HandlerBase));
-exports.ScrollZoomHandler = ScrollZoomHandler;
-exports.default = ScrollZoomHandler;
-
-},{"../../Component":275,"rxjs/operators":225}],329:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-/**
- * The `TouchZoomHandler` allows the user to zoom the viewer image by pinching on a touchscreen.
- *
- * @example
- * ```
- * var mouseComponent = viewer.getComponent("mouse");
- *
- * mouseComponent.touchZoom.disable();
- * mouseComponent.touchZoom.enable();
- *
- * var isEnabled = mouseComponent.touchZoom.isEnabled;
- * ```
- */
-var TouchZoomHandler = /** @class */ (function (_super) {
-    __extends(TouchZoomHandler, _super);
-    /** @ignore */
-    function TouchZoomHandler(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    TouchZoomHandler.prototype._enable = function () {
-        var _this = this;
-        this._preventDefaultSubscription = this._container.touchService.pinch$
-            .subscribe(function (pinch) {
-            pinch.originalEvent.preventDefault();
-        });
-        var pinchStarted$ = this._container.touchService.pinchStart$.pipe(operators_1.map(function (event) {
-            return true;
-        }));
-        var pinchStopped$ = this._container.touchService.pinchEnd$.pipe(operators_1.map(function (event) {
-            return false;
-        }));
-        this._activeSubscription = rxjs_1.merge(pinchStarted$, pinchStopped$)
-            .subscribe(this._container.touchService.activate$);
-        this._zoomSubscription = this._container.touchService.pinch$.pipe(operators_1.withLatestFrom(this._navigator.stateService.currentState$), operators_1.filter(function (args) {
-            var state = args[1].state;
-            return state.currentNode.fullPano || state.nodesAhead < 1;
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var pinch = _a[0], render = _a[1], transform = _a[2];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(pinch, element), canvasX = _b[0], canvasY = _b[1];
-            var unprojected = _this._viewportCoords.unprojectFromCanvas(canvasX, canvasY, element, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            var _c = _this._viewportCoords.containerToCanvas(element), canvasWidth = _c[0], canvasHeight = _c[1];
-            var zoom = 3 * pinch.distanceChange / Math.min(canvasWidth, canvasHeight);
-            _this._navigator.stateService.zoomIn(zoom, reference);
-        });
-    };
-    TouchZoomHandler.prototype._disable = function () {
-        this._activeSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-        this._preventDefaultSubscription = null;
-        this._zoomSubscription = null;
-    };
-    TouchZoomHandler.prototype._getConfiguration = function (enable) {
-        return { touchZoom: enable };
-    };
-    return TouchZoomHandler;
-}(Component_1.HandlerBase));
-exports.TouchZoomHandler = TouchZoomHandler;
-exports.default = TouchZoomHandler;
-
-},{"../../Component":275,"rxjs":27,"rxjs/operators":225}],330:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Popup_1 = require("./popup/Popup");
-exports.Popup = Popup_1.Popup;
-var PopupComponent_1 = require("./PopupComponent");
-exports.PopupComponent = PopupComponent_1.PopupComponent;
-
-},{"./PopupComponent":331,"./popup/Popup":332}],331:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Utils_1 = require("../../Utils");
-/**
- * @class PopupComponent
- *
- * @classdesc Component for showing HTML popup objects.
- *
- * The `add` method is used for adding new popups. Popups are removed by reference.
- *
- * It is not possible to update popups in the set by updating any properties
- * directly on the popup object. Popups need to be replaced by
- * removing them and creating new ones with relevant changed properties and
- * adding those instead.
- *
- * Popups are only relevant to a single image because they are based on
- * 2D basic image coordinates. Popups related to a certain image should
- * be removed when the viewer is moved to another node.
- *
- * To retrive and use the popup component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { popup: true } });
- *
- * var popupComponent = viewer.getComponent("popup");
- * ```
- */
-var PopupComponent = /** @class */ (function (_super) {
-    __extends(PopupComponent, _super);
-    /** @ignore */
-    function PopupComponent(name, container, navigator, dom) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._dom = !!dom ? dom : new Utils_1.DOM();
-        _this._popups = [];
-        _this._added$ = new rxjs_1.Subject();
-        _this._popups$ = new rxjs_1.Subject();
-        return _this;
-    }
-    /**
-     * Add popups to the popups set.
-     *
-     * @description Adding a new popup never replaces an old one
-     * because they are stored by reference. Adding an already
-     * existing popup has no effect.
-     *
-     * @param {Array<Popup>} popups - Popups to add.
-     *
-     * @example ```popupComponent.add([popup1, popup2]);```
-     */
-    PopupComponent.prototype.add = function (popups) {
-        for (var _i = 0, popups_1 = popups; _i < popups_1.length; _i++) {
-            var popup = popups_1[_i];
-            if (this._popups.indexOf(popup) !== -1) {
-                continue;
-            }
-            this._popups.push(popup);
-            if (this._activated) {
-                popup.setParentContainer(this._popupContainer);
-            }
-        }
-        this._added$.next(popups);
-        this._popups$.next(this._popups);
-    };
-    /**
-     * Returns an array of all popups.
-     *
-     * @example ```var popups = popupComponent.getAll();```
-     */
-    PopupComponent.prototype.getAll = function () {
-        return this._popups.slice();
-    };
-    /**
-     * Remove popups based on reference from the popup set.
-     *
-     * @param {Array<Popup>} popups - Popups to remove.
-     *
-     * @example ```popupComponent.remove([popup1, popup2]);```
-     */
-    PopupComponent.prototype.remove = function (popups) {
-        for (var _i = 0, popups_2 = popups; _i < popups_2.length; _i++) {
-            var popup = popups_2[_i];
-            this._remove(popup);
-        }
-        this._popups$.next(this._popups);
-    };
-    /**
-     * Remove all popups from the popup set.
-     *
-     * @example ```popupComponent.removeAll();```
-     */
-    PopupComponent.prototype.removeAll = function () {
-        for (var _i = 0, _a = this._popups.slice(); _i < _a.length; _i++) {
-            var popup = _a[_i];
-            this._remove(popup);
-        }
-        this._popups$.next(this._popups);
-    };
-    PopupComponent.prototype._activate = function () {
-        var _this = this;
-        this._popupContainer = this._dom.createElement("div", "mapillary-js-popup-container", this._container.element);
-        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
-            var popup = _a[_i];
-            popup.setParentContainer(this._popupContainer);
-        }
-        this._updateAllSubscription = rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$)
-            .subscribe(function (_a) {
-            var renderCamera = _a[0], size = _a[1], transform = _a[2];
-            for (var _i = 0, _b = _this._popups; _i < _b.length; _i++) {
-                var popup = _b[_i];
-                popup.update(renderCamera, size, transform);
-            }
-        });
-        var changed$ = this._popups$.pipe(operators_1.startWith(this._popups), operators_1.switchMap(function (popups) {
-            return rxjs_1.from(popups).pipe(operators_1.mergeMap(function (popup) {
-                return popup.changed$;
-            }));
-        }), operators_1.map(function (popup) {
-            return [popup];
-        }));
-        this._updateAddedChangedSubscription = rxjs_1.merge(this._added$, changed$).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._container.renderService.size$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var popups = _a[0], renderCamera = _a[1], size = _a[2], transform = _a[3];
-            for (var _i = 0, popups_3 = popups; _i < popups_3.length; _i++) {
-                var popup = popups_3[_i];
-                popup.update(renderCamera, size, transform);
-            }
-        });
-    };
-    PopupComponent.prototype._deactivate = function () {
-        this._updateAllSubscription.unsubscribe();
-        this._updateAddedChangedSubscription.unsubscribe();
-        for (var _i = 0, _a = this._popups; _i < _a.length; _i++) {
-            var popup = _a[_i];
-            popup.remove();
-        }
-        this._container.element.removeChild(this._popupContainer);
-        delete this._popupContainer;
-    };
-    PopupComponent.prototype._getDefaultConfiguration = function () {
-        return {};
-    };
-    PopupComponent.prototype._remove = function (popup) {
-        var index = this._popups.indexOf(popup);
-        if (index === -1) {
-            return;
-        }
-        var removed = this._popups.splice(index, 1)[0];
-        if (this._activated) {
-            removed.remove();
-        }
-    };
-    PopupComponent.componentName = "popup";
-    return PopupComponent;
-}(Component_1.Component));
-exports.PopupComponent = PopupComponent;
-Component_1.ComponentService.register(PopupComponent);
-exports.default = PopupComponent;
-
-},{"../../Component":275,"../../Utils":285,"rxjs":27,"rxjs/operators":225}],332:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../../../Geo");
-var Utils_1 = require("../../../Utils");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class Popup
- *
- * @classdesc Popup instance for rendering custom HTML content
- * on top of images. Popups are based on 2D basic image coordinates
- * (see the {@link Viewer} class documentation for more information about coordinate
- * systems) and a certain popup is therefore only relevant to a single image.
- * Popups related to a certain image should be removed when moving
- * to another image.
- *
- * A popup must have both its content and its point or rect set to be
- * rendered. Popup options can not be updated after creation but the
- * basic point or rect as well as its content can be changed by calling
- * the appropriate methods.
- *
- * To create and add one `Popup` with default configuration
- * (tooltip visuals and automatic float) and one with specific options
- * use
- *
- * @example
- * ```
- * var defaultSpan = document.createElement('span');
- * defaultSpan.innerHTML = 'hello default';
- *
- * var defaultPopup = new Mapillary.PopupComponent.Popup();
- * defaultPopup.setDOMContent(defaultSpan);
- * defaultPopup.setBasicPoint([0.3, 0.3]);
- *
- * var cleanSpan = document.createElement('span');
- * cleanSpan.innerHTML = 'hello clean';
- *
- * var cleanPopup = new Mapillary.PopupComponent.Popup({
- *     clean: true,
- *     float: Mapillary.Alignment.Top,
- *     offset: 10,
- *     opacity: 0.7,
- * });
- *
- * cleanPopup.setDOMContent(cleanSpan);
- * cleanPopup.setBasicPoint([0.6, 0.6]);
- *
- * popupComponent.add([defaultPopup, cleanPopup]);
- * ```
- *
- * @description Implementation of API methods and API documentation inspired
- * by/used from https://github.com/mapbox/mapbox-gl-js/blob/v0.38.0/src/ui/popup.js
- */
-var Popup = /** @class */ (function () {
-    function Popup(options, viewportCoords, dom) {
-        this._options = {};
-        options = !!options ? options : {};
-        this._options.capturePointer = options.capturePointer === false ?
-            options.capturePointer : true;
-        this._options.clean = options.clean;
-        this._options.float = options.float;
-        this._options.offset = options.offset;
-        this._options.opacity = options.opacity;
-        this._options.position = options.position;
-        this._dom = !!dom ? dom : new Utils_1.DOM();
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._notifyChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(Popup.prototype, "changed$", {
-        /**
-         * @description Internal observable used by the component to
-         * render the popup when its position or content has changed.
-         * @ignore
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * @description Internal method used by the component to
-     * remove all references to the popup.
-     * @ignore
-     */
-    Popup.prototype.remove = function () {
-        if (this._content && this._content.parentNode) {
-            this._content.parentNode.removeChild(this._content);
-        }
-        if (this._container) {
-            this._container.parentNode.removeChild(this._container);
-            delete this._container;
-        }
-        if (this._parentContainer) {
-            delete this._parentContainer;
-        }
-    };
-    /**
-     * Sets a 2D basic image coordinates point to the popup's anchor, and
-     * moves the popup to it.
-     *
-     * @description Overwrites any previously set point or rect.
-     *
-     * @param {Array<number>} basicPoint - Point in 2D basic image coordinates.
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setBasicPoint = function (basicPoint) {
-        this._point = basicPoint.slice();
-        this._rect = null;
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Sets a 2D basic image coordinates rect to the popup's anchor, and
-     * moves the popup to it.
-     *
-     * @description Overwrites any previously set point or rect.
-     *
-     * @param {Array<number>} basicRect - Rect in 2D basic image
-     * coordinates ([topLeftX, topLeftY, bottomRightX, bottomRightY]) .
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicRect([0.3, 0.3, 0.5, 0.6]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setBasicRect = function (basicRect) {
-        this._rect = basicRect.slice();
-        this._point = null;
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Sets the popup's content to the element provided as a DOM node.
-     *
-     * @param {Node} htmlNode - A DOM node to be used as content for the popup.
-     *
-     * @example
-     * ```
-     * var div = document.createElement('div');
-     * div.innerHTML = 'hello image';
-     *
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setDOMContent(div);
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setDOMContent = function (htmlNode) {
-        if (this._content && this._content.parentNode) {
-            this._content.parentNode.removeChild(this._content);
-        }
-        var className = "mapillaryjs-popup-content" +
-            (this._options.clean === true ? "-clean" : "") +
-            (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
-        this._content = this._dom.createElement("div", className, this._container);
-        this._content.appendChild(htmlNode);
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Sets the popup's content to the HTML provided as a string.
-     *
-     * @description This method does not perform HTML filtering or sanitization,
-     * and must be used only with trusted content. Consider Popup#setText if the
-     * content is an untrusted text string.
-     *
-     * @param {string} html - A string representing HTML content for the popup.
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setHTML('<div>hello image</div>');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setHTML = function (html) {
-        var frag = this._dom.document.createDocumentFragment();
-        var temp = this._dom.createElement("body");
-        var child;
-        temp.innerHTML = html;
-        while (true) {
-            child = temp.firstChild;
-            if (!child) {
-                break;
-            }
-            frag.appendChild(child);
-        }
-        this.setDOMContent(frag);
-    };
-    /**
-     * Sets the popup's content to a string of text.
-     *
-     * @description This function creates a Text node in the DOM, so it cannot insert raw HTML.
-     * Use this method for security against XSS if the popup content is user-provided.
-     *
-     * @param {string} text - Textual content for the popup.
-     *
-     * @example
-     * ```
-     * var popup = new Mapillary.PopupComponent.Popup();
-     * popup.setText('hello image');
-     * popup.setBasicPoint([0.3, 0.3]);
-     *
-     * popupComponent.add([popup]);
-     * ```
-     */
-    Popup.prototype.setText = function (text) {
-        this.setDOMContent(this._dom.document.createTextNode(text));
-    };
-    /**
-     * @description Internal method for attaching the popup to
-     * its parent container so that it is rendered in the DOM tree.
-     * @ignore
-     */
-    Popup.prototype.setParentContainer = function (parentContainer) {
-        this._parentContainer = parentContainer;
-    };
-    /**
-     * @description Internal method for updating the rendered
-     * position of the popup called by the popup component.
-     * @ignore
-     */
-    Popup.prototype.update = function (renderCamera, size, transform) {
-        var _a;
-        if (!this._parentContainer || !this._content) {
-            return;
-        }
-        if (!this._point && !this._rect) {
-            return;
-        }
-        if (!this._container) {
-            this._container = this._dom.createElement("div", "mapillaryjs-popup", this._parentContainer);
-            var showTip = this._options.clean !== true &&
-                this._options.float !== Viewer_1.Alignment.Center;
-            if (showTip) {
-                var tipClassName = "mapillaryjs-popup-tip" +
-                    (this._options.capturePointer === true ? " mapillaryjs-popup-capture-pointer" : "");
-                this._tip = this._dom.createElement("div", tipClassName, this._container);
-                this._dom.createElement("div", "mapillaryjs-popup-tip-inner", this._tip);
-            }
-            this._container.appendChild(this._content);
-            this._parentContainer.appendChild(this._container);
-            if (this._options.opacity != null) {
-                this._container.style.opacity = this._options.opacity.toString();
-            }
-        }
-        var pointPixel = null;
-        var position = this._alignmentToPopupAligment(this._options.position);
-        var float = this._alignmentToPopupAligment(this._options.float);
-        var classList = this._container.classList;
-        if (this._point != null) {
-            pointPixel =
-                this._viewportCoords.basicToCanvasSafe(this._point[0], this._point[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-        }
-        else {
-            var alignments = ["center", "top", "bottom", "left", "right", "top-left", "top-right", "bottom-left", "bottom-right"];
-            var appliedPosition = null;
-            for (var _i = 0, alignments_1 = alignments; _i < alignments_1.length; _i++) {
-                var alignment = alignments_1[_i];
-                if (classList.contains("mapillaryjs-popup-float-" + alignment)) {
-                    appliedPosition = alignment;
-                    break;
-                }
-            }
-            _a = this._rectToPixel(this._rect, position, appliedPosition, renderCamera, size, transform), pointPixel = _a[0], position = _a[1];
-            if (!float) {
-                float = position;
-            }
-        }
-        if (pointPixel == null) {
-            this._container.style.display = "none";
-            return;
-        }
-        this._container.style.display = "";
-        if (!float) {
-            var width = this._container.offsetWidth;
-            var height = this._container.offsetHeight;
-            var floats = this._pixelToFloats(pointPixel, size, width, height);
-            float = floats.length === 0 ? "top" : floats.join("-");
-        }
-        var offset = this._normalizeOffset(this._options.offset);
-        pointPixel = [pointPixel[0] + offset[float][0], pointPixel[1] + offset[float][1]];
-        pointPixel = [Math.round(pointPixel[0]), Math.round(pointPixel[1])];
-        var floatTranslate = {
-            "bottom": "translate(-50%,0)",
-            "bottom-left": "translate(-100%,0)",
-            "bottom-right": "translate(0,0)",
-            "center": "translate(-50%,-50%)",
-            "left": "translate(-100%,-50%)",
-            "right": "translate(0,-50%)",
-            "top": "translate(-50%,-100%)",
-            "top-left": "translate(-100%,-100%)",
-            "top-right": "translate(0,-100%)",
-        };
-        for (var key in floatTranslate) {
-            if (!floatTranslate.hasOwnProperty(key)) {
-                continue;
-            }
-            classList.remove("mapillaryjs-popup-float-" + key);
-        }
-        classList.add("mapillaryjs-popup-float-" + float);
-        this._container.style.transform = floatTranslate[float] + " translate(" + pointPixel[0] + "px," + pointPixel[1] + "px)";
-    };
-    Popup.prototype._rectToPixel = function (rect, position, appliedPosition, renderCamera, size, transform) {
-        if (!position) {
-            var width = this._container.offsetWidth;
-            var height = this._container.offsetHeight;
-            var floatOffsets = {
-                "bottom": [0, height / 2],
-                "bottom-left": [-width / 2, height / 2],
-                "bottom-right": [width / 2, height / 2],
-                "left": [-width / 2, 0],
-                "right": [width / 2, 0],
-                "top": [0, -height / 2],
-                "top-left": [-width / 2, -height / 2],
-                "top-right": [width / 2, -height / 2],
-            };
-            var automaticPositions = ["top", "bottom", "left", "right"];
-            var largestVisibleArea = [0, null, null];
-            for (var _i = 0, automaticPositions_1 = automaticPositions; _i < automaticPositions_1.length; _i++) {
-                var automaticPosition = automaticPositions_1[_i];
-                var autoPointBasic = this._pointFromRectPosition(rect, automaticPosition);
-                var autoPointPixel = this._viewportCoords.basicToCanvasSafe(autoPointBasic[0], autoPointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-                if (autoPointPixel == null) {
-                    continue;
-                }
-                var floatOffset = floatOffsets[automaticPosition];
-                var offsetedPosition = [autoPointPixel[0] + floatOffset[0], autoPointPixel[1] + floatOffset[1]];
-                var staticCoeff = appliedPosition != null && appliedPosition === automaticPosition ? 1 : 0.7;
-                var floats = this._pixelToFloats(offsetedPosition, size, width / staticCoeff, height / (2 * staticCoeff));
-                if (floats.length === 0 &&
-                    autoPointPixel[0] > 0 &&
-                    autoPointPixel[0] < size.width &&
-                    autoPointPixel[1] > 0 &&
-                    autoPointPixel[1] < size.height) {
-                    return [autoPointPixel, automaticPosition];
-                }
-                var minX = Math.max(offsetedPosition[0] - width / 2, 0);
-                var maxX = Math.min(offsetedPosition[0] + width / 2, size.width);
-                var minY = Math.max(offsetedPosition[1] - height / 2, 0);
-                var maxY = Math.min(offsetedPosition[1] + height / 2, size.height);
-                var visibleX = Math.max(0, maxX - minX);
-                var visibleY = Math.max(0, maxY - minY);
-                var visibleArea = staticCoeff * visibleX * visibleY;
-                if (visibleArea > largestVisibleArea[0]) {
-                    largestVisibleArea[0] = visibleArea;
-                    largestVisibleArea[1] = autoPointPixel;
-                    largestVisibleArea[2] = automaticPosition;
-                }
-            }
-            if (largestVisibleArea[0] > 0) {
-                return [largestVisibleArea[1], largestVisibleArea[2]];
-            }
-        }
-        var pointBasic = this._pointFromRectPosition(rect, position);
-        var pointPixel = this._viewportCoords.basicToCanvasSafe(pointBasic[0], pointBasic[1], { offsetHeight: size.height, offsetWidth: size.width }, transform, renderCamera.perspective);
-        return [pointPixel, position != null ? position : "top"];
-    };
-    Popup.prototype._alignmentToPopupAligment = function (float) {
-        switch (float) {
-            case Viewer_1.Alignment.Bottom:
-                return "bottom";
-            case Viewer_1.Alignment.BottomLeft:
-                return "bottom-left";
-            case Viewer_1.Alignment.BottomRight:
-                return "bottom-right";
-            case Viewer_1.Alignment.Center:
-                return "center";
-            case Viewer_1.Alignment.Left:
-                return "left";
-            case Viewer_1.Alignment.Right:
-                return "right";
-            case Viewer_1.Alignment.Top:
-                return "top";
-            case Viewer_1.Alignment.TopLeft:
-                return "top-left";
-            case Viewer_1.Alignment.TopRight:
-                return "top-right";
-            default:
-                return null;
-        }
-    };
-    Popup.prototype._normalizeOffset = function (offset) {
-        if (offset == null) {
-            return this._normalizeOffset(0);
-        }
-        if (typeof offset === "number") {
-            // input specifies a radius
-            var sideOffset = offset;
-            var sign = sideOffset >= 0 ? 1 : -1;
-            var cornerOffset = sign * Math.round(Math.sqrt(0.5 * Math.pow(sideOffset, 2)));
-            return {
-                "bottom": [0, sideOffset],
-                "bottom-left": [-cornerOffset, cornerOffset],
-                "bottom-right": [cornerOffset, cornerOffset],
-                "center": [0, 0],
-                "left": [-sideOffset, 0],
-                "right": [sideOffset, 0],
-                "top": [0, -sideOffset],
-                "top-left": [-cornerOffset, -cornerOffset],
-                "top-right": [cornerOffset, -cornerOffset],
-            };
-        }
-        else {
-            // input specifes a value for each position
-            return {
-                "bottom": offset.bottom || [0, 0],
-                "bottom-left": offset.bottomLeft || [0, 0],
-                "bottom-right": offset.bottomRight || [0, 0],
-                "center": offset.center || [0, 0],
-                "left": offset.left || [0, 0],
-                "right": offset.right || [0, 0],
-                "top": offset.top || [0, 0],
-                "top-left": offset.topLeft || [0, 0],
-                "top-right": offset.topRight || [0, 0],
-            };
-        }
-    };
-    Popup.prototype._pixelToFloats = function (pointPixel, size, width, height) {
-        var floats = [];
-        if (pointPixel[1] < height) {
-            floats.push("bottom");
-        }
-        else if (pointPixel[1] > size.height - height) {
-            floats.push("top");
-        }
-        if (pointPixel[0] < width / 2) {
-            floats.push("right");
-        }
-        else if (pointPixel[0] > size.width - width / 2) {
-            floats.push("left");
-        }
-        return floats;
-    };
-    Popup.prototype._pointFromRectPosition = function (rect, position) {
-        var x0 = rect[0];
-        var x1 = rect[0] < rect[2] ? rect[2] : rect[2] + 1;
-        var y0 = rect[1];
-        var y1 = rect[3];
-        switch (position) {
-            case "bottom":
-                return [(x0 + x1) / 2, y1];
-            case "bottom-left":
-                return [x0, y1];
-            case "bottom-right":
-                return [x1, y1];
-            case "center":
-                return [(x0 + x1) / 2, (y0 + y1) / 2];
-            case "left":
-                return [x0, (y0 + y1) / 2];
-            case "right":
-                return [x1, (y0 + y1) / 2];
-            case "top":
-                return [(x0 + x1) / 2, y0];
-            case "top-left":
-                return [x0, y0];
-            case "top-right":
-                return [x1, y0];
-            default:
-                return [(x0 + x1) / 2, y1];
-        }
-    };
-    return Popup;
-}());
-exports.Popup = Popup;
-exports.default = Popup;
-
-
-},{"../../../Geo":278,"../../../Utils":285,"../../../Viewer":286,"rxjs":27}],333:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Graph_1 = require("../../Graph");
-/**
- * @class SequenceComponent
- * @classdesc Component showing navigation arrows for sequence directions
- * as well as playing button. Exposes an API to start and stop play.
- */
-var SequenceComponent = /** @class */ (function (_super) {
-    __extends(SequenceComponent, _super);
-    function SequenceComponent(name, container, navigator, renderer, scheduler) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._sequenceDOMRenderer = !!renderer ? renderer : new Component_1.SequenceDOMRenderer(container);
-        _this._scheduler = scheduler;
-        _this._containerWidth$ = new rxjs_1.Subject();
-        _this._hoveredKeySubject$ = new rxjs_1.Subject();
-        _this._hoveredKey$ = _this._hoveredKeySubject$.pipe(operators_1.share());
-        _this._navigator.playService.playing$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
-            .subscribe(function (_a) {
-            var playing = _a[0], configuration = _a[1];
-            _this.fire(SequenceComponent.playingchanged, playing);
-            if (playing === configuration.playing) {
-                return;
-            }
-            if (playing) {
-                _this.play();
-            }
-            else {
-                _this.stop();
-            }
-        });
-        _this._navigator.playService.direction$.pipe(operators_1.skip(1), operators_1.withLatestFrom(_this._configuration$))
-            .subscribe(function (_a) {
-            var direction = _a[0], configuration = _a[1];
-            if (direction !== configuration.direction) {
-                _this.setDirection(direction);
-            }
-        });
-        return _this;
-    }
-    Object.defineProperty(SequenceComponent.prototype, "hoveredKey$", {
-        /**
-         * Get hovered key observable.
-         *
-         * @description An observable emitting the key of the node for the direction
-         * arrow that is being hovered. When the mouse leaves a direction arrow null
-         * is emitted.
-         *
-         * @returns {Observable<string>}
-         */
-        get: function () {
-            return this._hoveredKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Start playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.play = function () {
-        this.configure({ playing: true });
-    };
-    /**
-     * Stop playing.
-     *
-     * @fires PlayerComponent#playingchanged
-     */
-    SequenceComponent.prototype.stop = function () {
-        this.configure({ playing: false });
-    };
-    /**
-     * Set the direction to follow when playing.
-     *
-     * @param {EdgeDirection} direction - The direction that will be followed when playing.
-     */
-    SequenceComponent.prototype.setDirection = function (direction) {
-        this.configure({ direction: direction });
-    };
-    /**
-     * Set highlight key.
-     *
-     * @description The arrow pointing towards the node corresponding to the
-     * highlight key will be highlighted.
-     *
-     * @param {string} highlightKey Key of node to be highlighted if existing.
-     */
-    SequenceComponent.prototype.setHighlightKey = function (highlightKey) {
-        this.configure({ highlightKey: highlightKey });
-    };
-    /**
-     * Set max width of container element.
-     *
-     * @description Set max width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    SequenceComponent.prototype.setMaxWidth = function (maxWidth) {
-        this.configure({ maxWidth: maxWidth });
-    };
-    /**
-     * Set min width of container element.
-     *
-     * @description Set min width of the container element holding
-     * the sequence navigation elements. If the min width is larger than the
-     * max width the min width value will be used.
-     *
-     * The container element is automatically resized when the resize
-     * method on the Viewer class is called.
-     *
-     * @param {number} minWidth
-     */
-    SequenceComponent.prototype.setMinWidth = function (minWidth) {
-        this.configure({ minWidth: minWidth });
-    };
-    /**
-     * Set the value indicating whether the sequence UI elements should be visible.
-     *
-     * @param {boolean} visible
-     */
-    SequenceComponent.prototype.setVisible = function (visible) {
-        this.configure({ visible: visible });
-    };
-    SequenceComponent.prototype._activate = function () {
-        var _this = this;
-        this._sequenceDOMRenderer.activate();
-        var edgeStatus$ = this._navigator.stateService.currentNode$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var sequence$ = this._navigator.stateService.currentNode$.pipe(operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.sequenceKey;
-        }), operators_1.switchMap(function (node) {
-            return rxjs_1.concat(rxjs_1.of(null), _this._navigator.graphService.cacheSequence$(node.sequenceKey).pipe(operators_1.retry(3), operators_1.catchError(function (e) {
-                console.error("Failed to cache sequence", e);
-                return rxjs_1.of(null);
-            })));
-        }), operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
-        this._sequenceSubscription = sequence$.subscribe();
-        var rendererKey$ = this._sequenceDOMRenderer.index$.pipe(operators_1.withLatestFrom(sequence$), operators_1.map(function (_a) {
-            var index = _a[0], sequence = _a[1];
-            return sequence != null ? sequence.keys[index] : null;
-        }), operators_1.filter(function (key) {
-            return !!key;
-        }), operators_1.distinctUntilChanged(), operators_1.publish(), operators_1.refCount());
-        this._moveSubscription = rxjs_1.merge(rendererKey$.pipe(operators_1.debounceTime(100, this._scheduler)), rendererKey$.pipe(operators_1.auditTime(400, this._scheduler))).pipe(operators_1.distinctUntilChanged(), operators_1.switchMap(function (key) {
-            return _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function (e) {
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe();
-        this._setSequenceGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
-            return changing;
-        }))
-            .subscribe(function () {
-            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Sequence);
-        });
-        this._setSpatialGraphModeSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
-            return !changing;
-        }))
-            .subscribe(function () {
-            _this._navigator.graphService.setGraphMode(Graph_1.GraphMode.Spatial);
-        });
-        this._navigator.graphService.graphMode$.pipe(operators_1.switchMap(function (mode) {
-            return mode === Graph_1.GraphMode.Spatial ?
-                _this._navigator.stateService.currentNode$.pipe(operators_1.take(2)) :
-                rxjs_1.empty();
-        }), operators_1.filter(function (node) {
-            return !node.spatialEdges.cached;
-        }), operators_1.switchMap(function (node) {
-            return _this._navigator.graphService.cacheNode$(node.key).pipe(operators_1.catchError(function (e) {
-                return rxjs_1.empty();
-            }));
-        }))
-            .subscribe();
-        this._stopSubscription = this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.filter(function (changing) {
-            return changing;
-        }))
-            .subscribe(function () {
-            _this._navigator.playService.stop();
-        });
-        this._cacheSequenceNodesSubscription = rxjs_1.combineLatest(this._navigator.graphService.graphMode$, this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged())).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentNode$), operators_1.switchMap(function (_a) {
-            var _b = _a[0], mode = _b[0], changing = _b[1], node = _a[1];
-            return changing && mode === Graph_1.GraphMode.Sequence ?
-                _this._navigator.graphService.cacheSequenceNodes$(node.sequenceKey, node.key).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
-                    console.error("Failed to cache sequence nodes.", error);
-                    return rxjs_1.empty();
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe();
-        var position$ = sequence$.pipe(operators_1.switchMap(function (sequence) {
-            if (!sequence) {
-                return rxjs_1.of({ index: null, max: null });
-            }
-            var firstCurrentKey = true;
-            return _this._sequenceDOMRenderer.changingPositionChanged$.pipe(operators_1.startWith(false), operators_1.distinctUntilChanged(), operators_1.switchMap(function (changingPosition) {
-                var skipCount = !changingPosition && firstCurrentKey ? 0 : 1;
-                firstCurrentKey = false;
-                return changingPosition ?
-                    rendererKey$ :
-                    _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
-                        return node.key;
-                    }), operators_1.distinctUntilChanged(), operators_1.skip(skipCount));
-            }), operators_1.map(function (key) {
-                var index = sequence.keys.indexOf(key);
-                if (index === -1) {
-                    return { index: null, max: null };
-                }
-                return { index: index, max: sequence.keys.length - 1 };
-            }));
-        }));
-        this._renderSubscription = rxjs_1.combineLatest(edgeStatus$, this._configuration$, this._containerWidth$, this._sequenceDOMRenderer.changed$.pipe(operators_1.startWith(this._sequenceDOMRenderer)), this._navigator.playService.speed$, position$).pipe(operators_1.map(function (_a) {
-            var edgeStatus = _a[0], configuration = _a[1], containerWidth = _a[2], renderer = _a[3], speed = _a[4], position = _a[5];
-            var vNode = _this._sequenceDOMRenderer
-                .render(edgeStatus, configuration, containerWidth, speed, position.index, position.max, _this, _this._navigator);
-            return { name: _this._name, vnode: vNode };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._setSpeedSubscription = this._sequenceDOMRenderer.speed$
-            .subscribe(function (speed) {
-            _this._navigator.playService.setSpeed(speed);
-        });
-        this._setDirectionSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.direction;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (direction) {
-            _this._navigator.playService.setDirection(direction);
-        });
-        this._containerWidthSubscription = rxjs_1.combineLatest(this._container.renderService.size$, this._configuration$.pipe(operators_1.distinctUntilChanged(function (value1, value2) {
-            return value1[0] === value2[0] && value1[1] === value2[1];
-        }, function (configuration) {
-            return [configuration.minWidth, configuration.maxWidth];
-        }))).pipe(operators_1.map(function (_a) {
-            var size = _a[0], configuration = _a[1];
-            return _this._sequenceDOMRenderer.getContainerWidth(size, configuration);
-        }))
-            .subscribe(this._containerWidth$);
-        this._playingSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.playing;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (playing) {
-            if (playing) {
-                _this._navigator.playService.play();
-            }
-            else {
-                _this._navigator.playService.stop();
-            }
-        });
-        this._hoveredKeySubscription = this._sequenceDOMRenderer.mouseEnterDirection$.pipe(operators_1.switchMap(function (direction) {
-            var edgeTo$ = edgeStatus$.pipe(operators_1.map(function (edgeStatus) {
-                for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-                    var edge = _a[_i];
-                    if (edge.data.direction === direction) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            }), operators_1.takeUntil(_this._sequenceDOMRenderer.mouseLeaveDirection$));
-            return rxjs_1.concat(edgeTo$, rxjs_1.of(null));
-        }), operators_1.distinctUntilChanged())
-            .subscribe(this._hoveredKeySubject$);
-        this._emitHoveredKeySubscription = this._hoveredKey$
-            .subscribe(function (key) {
-            _this.fire(SequenceComponent.hoveredkeychanged, key);
-        });
-    };
-    SequenceComponent.prototype._deactivate = function () {
-        this._emitHoveredKeySubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._playingSubscription.unsubscribe();
-        this._containerWidthSubscription.unsubscribe();
-        this._hoveredKeySubscription.unsubscribe();
-        this._setSpeedSubscription.unsubscribe();
-        this._setDirectionSubscription.unsubscribe();
-        this._setSequenceGraphModeSubscription.unsubscribe();
-        this._setSpatialGraphModeSubscription.unsubscribe();
-        this._sequenceSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._cacheSequenceNodesSubscription.unsubscribe();
-        this._stopSubscription.unsubscribe();
-        this._sequenceDOMRenderer.deactivate();
-    };
-    SequenceComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            direction: Edge_1.EdgeDirection.Next,
-            maxWidth: 108,
-            minWidth: 70,
-            playing: false,
-            visible: true,
-        };
-    };
-    /** @inheritdoc */
-    SequenceComponent.componentName = "sequence";
-    /**
-     * Event fired when playing starts or stops.
-     *
-     * @event SequenceComponent#playingchanged
-     * @type {boolean} Indicates whether the player is playing.
-     */
-    SequenceComponent.playingchanged = "playingchanged";
-    /**
-     * Event fired when the hovered key changes.
-     *
-     * @description Emits the key of the node for the direction
-     * arrow that is being hovered. When the mouse leaves a
-     * direction arrow null is emitted.
-     *
-     * @event SequenceComponent#hoveredkeychanged
-     * @type {string} The hovered key, null if no key is hovered.
-     */
-    SequenceComponent.hoveredkeychanged = "hoveredkeychanged";
-    return SequenceComponent;
-}(Component_1.Component));
-exports.SequenceComponent = SequenceComponent;
-Component_1.ComponentService.register(SequenceComponent);
-exports.default = SequenceComponent;
-
-},{"../../Component":275,"../../Edge":276,"../../Graph":279,"rxjs":27,"rxjs/operators":225}],334:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-var SequenceDOMRenderer = /** @class */ (function () {
-    function SequenceDOMRenderer(container) {
-        this._container = container;
-        this._minThresholdWidth = 320;
-        this._maxThresholdWidth = 1480;
-        this._minThresholdHeight = 240;
-        this._maxThresholdHeight = 820;
-        this._stepperDefaultWidth = 108;
-        this._controlsDefaultWidth = 88;
-        this._defaultHeight = 30;
-        this._expandControls = false;
-        this._mode = Component_1.SequenceMode.Default;
-        this._speed = 0.5;
-        this._changingSpeed = false;
-        this._index = null;
-        this._changingPosition = false;
-        this._mouseEnterDirection$ = new rxjs_1.Subject();
-        this._mouseLeaveDirection$ = new rxjs_1.Subject();
-        this._notifyChanged$ = new rxjs_1.Subject();
-        this._notifyChangingPositionChanged$ = new rxjs_1.Subject();
-        this._notifySpeedChanged$ = new rxjs_1.Subject();
-        this._notifyIndexChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(SequenceDOMRenderer.prototype, "changed$", {
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "changingPositionChanged$", {
-        get: function () {
-            return this._notifyChangingPositionChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "speed$", {
-        get: function () {
-            return this._notifySpeedChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "index$", {
-        get: function () {
-            return this._notifyIndexChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseEnterDirection$", {
-        get: function () {
-            return this._mouseEnterDirection$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SequenceDOMRenderer.prototype, "mouseLeaveDirection$", {
-        get: function () {
-            return this._mouseLeaveDirection$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    SequenceDOMRenderer.prototype.activate = function () {
-        var _this = this;
-        if (!!this._changingSubscription) {
-            return;
-        }
-        this._changingSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
-            return touchEvent.touches.length === 0;
-        })))
-            .subscribe(function (event) {
-            if (_this._changingSpeed) {
-                _this._changingSpeed = false;
-            }
-            if (_this._changingPosition) {
-                _this._setChangingPosition(false);
-            }
-        });
-    };
-    SequenceDOMRenderer.prototype.deactivate = function () {
-        if (!this._changingSubscription) {
-            return;
-        }
-        this._changingSpeed = false;
-        this._changingPosition = false;
-        this._expandControls = false;
-        this._mode = Component_1.SequenceMode.Default;
-        this._changingSubscription.unsubscribe();
-        this._changingSubscription = null;
-    };
-    SequenceDOMRenderer.prototype.render = function (edgeStatus, configuration, containerWidth, speed, index, max, component, navigator) {
-        if (configuration.visible === false) {
-            return vd.h("div.SequenceContainer", {}, []);
-        }
-        var stepper = this._createStepper(edgeStatus, configuration, containerWidth, component, navigator);
-        var controls = this._createSequenceControls(containerWidth);
-        var playback = this._createPlaybackControls(containerWidth, speed, component, configuration);
-        var timeline = this._createTimelineControls(containerWidth, index, max);
-        return vd.h("div.SequenceContainer", [stepper, controls, playback, timeline]);
-    };
-    SequenceDOMRenderer.prototype.getContainerWidth = function (size, configuration) {
-        var minWidth = configuration.minWidth;
-        var maxWidth = configuration.maxWidth;
-        if (maxWidth < minWidth) {
-            maxWidth = minWidth;
-        }
-        var relativeWidth = (size.width - this._minThresholdWidth) / (this._maxThresholdWidth - this._minThresholdWidth);
-        var relativeHeight = (size.height - this._minThresholdHeight) / (this._maxThresholdHeight - this._minThresholdHeight);
-        var coeff = Math.max(0, Math.min(1, Math.min(relativeWidth, relativeHeight)));
-        return minWidth + coeff * (maxWidth - minWidth);
-    };
-    SequenceDOMRenderer.prototype._createPositionInput = function (index, max) {
-        var _this = this;
-        this._index = index;
-        var onPosition = function (e) {
-            _this._index = Number(e.target.value);
-            _this._notifyIndexChanged$.next(_this._index);
-        };
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 65;
-        var onStart = function (e) {
-            e.stopPropagation();
-            _this._setChangingPosition(true);
-        };
-        var onMove = function (e) {
-            if (_this._changingPosition === true) {
-                e.stopPropagation();
-            }
-        };
-        var onKeyDown = function (e) {
-            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
-                e.key === "ArrowRight" || e.key === "ArrowUp") {
-                e.preventDefault();
-            }
-        };
-        var positionInputProperties = {
-            max: max != null ? max : 1,
-            min: 0,
-            onchange: onPosition,
-            oninput: onPosition,
-            onkeydown: onKeyDown,
-            onmousedown: onStart,
-            onmousemove: onMove,
-            ontouchmove: onMove,
-            ontouchstart: onStart,
-            style: {
-                width: width + "px",
-            },
-            type: "range",
-            value: index != null ? index : 0,
-        };
-        var disabled = index == null || max == null || max <= 1;
-        if (disabled) {
-            positionInputProperties.disabled = "true";
-        }
-        var positionInput = vd.h("input.SequencePosition", positionInputProperties, []);
-        var positionContainerClass = disabled ? ".SequencePositionContainerDisabled" : ".SequencePositionContainer";
-        return vd.h("div" + positionContainerClass, [positionInput]);
-    };
-    SequenceDOMRenderer.prototype._createSpeedInput = function (speed) {
-        var _this = this;
-        this._speed = speed;
-        var onSpeed = function (e) {
-            _this._speed = Number(e.target.value) / 1000;
-            _this._notifySpeedChanged$.next(_this._speed);
-        };
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(276, Math.min(410, 5 + 0.8 * boundingRect.width)) - 160;
-        var onStart = function (e) {
-            _this._changingSpeed = true;
-            e.stopPropagation();
-        };
-        var onMove = function (e) {
-            if (_this._changingSpeed === true) {
-                e.stopPropagation();
-            }
-        };
-        var onKeyDown = function (e) {
-            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
-                e.key === "ArrowRight" || e.key === "ArrowUp") {
-                e.preventDefault();
-            }
-        };
-        var speedInput = vd.h("input.SequenceSpeed", {
-            max: 1000,
-            min: 0,
-            onchange: onSpeed,
-            oninput: onSpeed,
-            onkeydown: onKeyDown,
-            onmousedown: onStart,
-            onmousemove: onMove,
-            ontouchmove: onMove,
-            ontouchstart: onStart,
-            style: {
-                width: width + "px",
-            },
-            type: "range",
-            value: 1000 * speed,
-        }, []);
-        return vd.h("div.SequenceSpeedContainer", [speedInput]);
-    };
-    SequenceDOMRenderer.prototype._createPlaybackControls = function (containerWidth, speed, component, configuration) {
-        var _this = this;
-        if (this._mode !== Component_1.SequenceMode.Playback) {
-            return vd.h("div.SequencePlayback", []);
-        }
-        var switchIcon = vd.h("div.SequenceSwitchIcon.SequenceIconVisible", []);
-        var direction = configuration.direction === Edge_1.EdgeDirection.Next ?
-            Edge_1.EdgeDirection.Prev : Edge_1.EdgeDirection.Next;
-        var playing = configuration.playing;
-        var switchButtonProperties = {
-            onclick: function () {
-                if (!playing) {
-                    component.setDirection(direction);
-                }
-            },
-        };
-        var switchButtonClassName = configuration.playing ? ".SequenceSwitchButtonDisabled" : ".SequenceSwitchButton";
-        var switchButton = vd.h("div" + switchButtonClassName, switchButtonProperties, [switchIcon]);
-        var slowIcon = vd.h("div.SequenceSlowIcon.SequenceIconVisible", []);
-        var slowContainer = vd.h("div.SequenceSlowContainer", [slowIcon]);
-        var fastIcon = vd.h("div.SequenceFastIcon.SequenceIconVisible", []);
-        var fastContainer = vd.h("div.SequenceFastContainer", [fastIcon]);
-        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
-        var closeButtonProperties = {
-            onclick: function () {
-                _this._mode = Component_1.SequenceMode.Default;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
-        var speedInput = this._createSpeedInput(speed);
-        var playbackChildren = [switchButton, slowContainer, speedInput, fastContainer, closeButton];
-        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
-        var playbackProperties = { style: { top: top + "px" } };
-        return vd.h("div.SequencePlayback", playbackProperties, playbackChildren);
-    };
-    SequenceDOMRenderer.prototype._createPlayingButton = function (nextKey, prevKey, configuration, component) {
-        var canPlay = configuration.direction === Edge_1.EdgeDirection.Next && nextKey != null ||
-            configuration.direction === Edge_1.EdgeDirection.Prev && prevKey != null;
-        var onclick = configuration.playing ?
-            function (e) { component.stop(); } :
-            canPlay ? function (e) { component.play(); } : null;
-        var buttonProperties = { onclick: onclick };
-        var iconClass = configuration.playing ?
-            "Stop" :
-            canPlay ? "Play" : "PlayDisabled";
-        var iconProperties = { className: iconClass };
-        if (configuration.direction === Edge_1.EdgeDirection.Prev) {
-            iconProperties.style = {
-                transform: "rotate(180deg) translate(50%, 50%)",
-            };
-        }
-        var icon = vd.h("div.SequenceComponentIcon", iconProperties, []);
-        var buttonClass = canPlay ? "SequencePlay" : "SequencePlayDisabled";
-        return vd.h("div." + buttonClass, buttonProperties, [icon]);
-    };
-    SequenceDOMRenderer.prototype._createSequenceControls = function (containerWidth) {
-        var _this = this;
-        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
-        var expanderProperties = {
-            onclick: function () {
-                _this._expandControls = !_this._expandControls;
-                _this._mode = Component_1.SequenceMode.Default;
-                _this._notifyChanged$.next(_this);
-            },
-            style: {
-                "border-bottom-right-radius": borderRadius + "px",
-                "border-top-right-radius": borderRadius + "px",
-            },
-        };
-        var expanderBar = vd.h("div.SequenceExpanderBar", []);
-        var expander = vd.h("div.SequenceExpanderButton", expanderProperties, [expanderBar]);
-        var fastIconClassName = this._mode === Component_1.SequenceMode.Playback ?
-            ".SequenceFastIconGrey.SequenceIconVisible" : ".SequenceFastIcon";
-        var fastIcon = vd.h("div" + fastIconClassName, []);
-        var playbackProperties = {
-            onclick: function () {
-                _this._mode = _this._mode === Component_1.SequenceMode.Playback ?
-                    Component_1.SequenceMode.Default :
-                    Component_1.SequenceMode.Playback;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var playback = vd.h("div.SequencePlaybackButton", playbackProperties, [fastIcon]);
-        var timelineIconClassName = this._mode === Component_1.SequenceMode.Timeline ?
-            ".SequenceTimelineIconGrey.SequenceIconVisible" : ".SequenceTimelineIcon";
-        var timelineIcon = vd.h("div" + timelineIconClassName, []);
-        var timelineProperties = {
-            onclick: function () {
-                _this._mode = _this._mode === Component_1.SequenceMode.Timeline ?
-                    Component_1.SequenceMode.Default :
-                    Component_1.SequenceMode.Timeline;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var timeline = vd.h("div.SequenceTimelineButton", timelineProperties, [timelineIcon]);
-        var properties = {
-            style: {
-                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
-                transform: "translate(" + (containerWidth / 2 + 2) + "px, 0)",
-                width: (this._controlsDefaultWidth / this._stepperDefaultWidth * containerWidth) + "px",
-            },
-        };
-        var className = ".SequenceControls" +
-            (this._expandControls ? ".SequenceControlsExpanded" : "");
-        return vd.h("div" + className, properties, [playback, timeline, expander]);
-    };
-    SequenceDOMRenderer.prototype._createSequenceArrows = function (nextKey, prevKey, containerWidth, configuration, navigator) {
-        var _this = this;
-        var nextProperties = {
-            onclick: nextKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Next)
-                        .subscribe(undefined, function (error) {
-                        if (!(error instanceof Error_1.AbortMapillaryError)) {
-                            console.error(error);
-                        }
-                    });
-                } :
-                null,
-            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Next); },
-            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Next); },
-        };
-        var borderRadius = Math.round(8 / this._stepperDefaultWidth * containerWidth);
-        var prevProperties = {
-            onclick: prevKey != null ?
-                function (e) {
-                    navigator.moveDir$(Edge_1.EdgeDirection.Prev)
-                        .subscribe(undefined, function (error) {
-                        if (!(error instanceof Error_1.AbortMapillaryError)) {
-                            console.error(error);
-                        }
-                    });
-                } :
-                null,
-            onmouseenter: function (e) { _this._mouseEnterDirection$.next(Edge_1.EdgeDirection.Prev); },
-            onmouseleave: function (e) { _this._mouseLeaveDirection$.next(Edge_1.EdgeDirection.Prev); },
-            style: {
-                "border-bottom-left-radius": borderRadius + "px",
-                "border-top-left-radius": borderRadius + "px",
-            },
-        };
-        var nextClass = this._getStepClassName(Edge_1.EdgeDirection.Next, nextKey, configuration.highlightKey);
-        var prevClass = this._getStepClassName(Edge_1.EdgeDirection.Prev, prevKey, configuration.highlightKey);
-        var nextIcon = vd.h("div.SequenceComponentIcon", []);
-        var prevIcon = vd.h("div.SequenceComponentIcon", []);
-        return [
-            vd.h("div." + prevClass, prevProperties, [prevIcon]),
-            vd.h("div." + nextClass, nextProperties, [nextIcon]),
-        ];
-    };
-    SequenceDOMRenderer.prototype._createStepper = function (edgeStatus, configuration, containerWidth, component, navigator) {
-        var nextKey = null;
-        var prevKey = null;
-        for (var _i = 0, _a = edgeStatus.edges; _i < _a.length; _i++) {
-            var edge = _a[_i];
-            if (edge.data.direction === Edge_1.EdgeDirection.Next) {
-                nextKey = edge.to;
-            }
-            if (edge.data.direction === Edge_1.EdgeDirection.Prev) {
-                prevKey = edge.to;
-            }
-        }
-        var playingButton = this._createPlayingButton(nextKey, prevKey, configuration, component);
-        var buttons = this._createSequenceArrows(nextKey, prevKey, containerWidth, configuration, navigator);
-        buttons.splice(1, 0, playingButton);
-        var containerProperties = {
-            oncontextmenu: function (event) { event.preventDefault(); },
-            style: {
-                height: (this._defaultHeight / this._stepperDefaultWidth * containerWidth) + "px",
-                width: containerWidth + "px",
-            },
-        };
-        return vd.h("div.SequenceStepper", containerProperties, buttons);
-    };
-    SequenceDOMRenderer.prototype._createTimelineControls = function (containerWidth, index, max) {
-        var _this = this;
-        if (this._mode !== Component_1.SequenceMode.Timeline) {
-            return vd.h("div.SequenceTimeline", []);
-        }
-        var positionInput = this._createPositionInput(index, max);
-        var closeIcon = vd.h("div.SequenceCloseIcon.SequenceIconVisible", []);
-        var closeButtonProperties = {
-            onclick: function () {
-                _this._mode = Component_1.SequenceMode.Default;
-                _this._notifyChanged$.next(_this);
-            },
-        };
-        var closeButton = vd.h("div.SequenceCloseButton", closeButtonProperties, [closeIcon]);
-        var top = Math.round(containerWidth / this._stepperDefaultWidth * this._defaultHeight + 10);
-        var playbackProperties = { style: { top: top + "px" } };
-        return vd.h("div.SequenceTimeline", playbackProperties, [positionInput, closeButton]);
-    };
-    SequenceDOMRenderer.prototype._getStepClassName = function (direction, key, highlightKey) {
-        var className = direction === Edge_1.EdgeDirection.Next ?
-            "SequenceStepNext" :
-            "SequenceStepPrev";
-        if (key == null) {
-            className += "Disabled";
-        }
-        else {
-            if (highlightKey === key) {
-                className += "Highlight";
-            }
-        }
-        return className;
-    };
-    SequenceDOMRenderer.prototype._setChangingPosition = function (value) {
-        this._changingPosition = value;
-        this._notifyChangingPositionChanged$.next(value);
-    };
-    return SequenceDOMRenderer;
-}());
-exports.SequenceDOMRenderer = SequenceDOMRenderer;
-exports.default = SequenceDOMRenderer;
-
-},{"../../Component":275,"../../Edge":276,"../../Error":277,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],335:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var SequenceMode;
-(function (SequenceMode) {
-    SequenceMode[SequenceMode["Default"] = 0] = "Default";
-    SequenceMode[SequenceMode["Playback"] = 1] = "Playback";
-    SequenceMode[SequenceMode["Timeline"] = 2] = "Timeline";
-})(SequenceMode = exports.SequenceMode || (exports.SequenceMode = {}));
-exports.default = SequenceMode;
-
-},{}],336:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-
-var path = require("path");
-var Shaders = /** @class */ (function () {
-    function Shaders() {
-    }
-    Shaders.equirectangular = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.equirectangularCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float curtain;\nuniform float opacity;\nuniform float phiLength;\nuniform float phiShift;\nuniform float thetaLength;\nuniform float thetaShift;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lon = atan(b.x, b.z);\n    float x = (lon - phiShift) / phiLength + 0.5;\n    float y = (lat - thetaShift) / thetaLength + 0.5;\n\n    bool inverted = curtain < 0.5;\n\n    float curtainMin = inverted ? curtain + 0.5 : curtain - 0.5;\n    float curtainMax = curtain;\n\n    bool insideCurtain = inverted ?\n        x > curtainMin || x < curtainMax :\n        x > curtainMin && x < curtainMax;\n\n    vec4 baseColor;\n    if (insideCurtain) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.perspective = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.perspectiveCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.fisheye = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r = sqrt(x * x + y * y);\n    float theta = atan(r, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.fisheyeCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r2 = sqrt(x * x + y * y);\n    float theta = atan(r2, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r2;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}",
-    };
-    Shaders.perspectiveDistorted = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
-    };
-    Shaders.perspectiveDistortedCurtain = {
-        fragment: "#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",
-        vertex: "#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n",
-    };
-    return Shaders;
-}());
-exports.Shaders = Shaders;
-
-
-},{"path":23}],337:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var State_1 = require("../../State");
-var Render_1 = require("../../Render");
-var Tiles_1 = require("../../Tiles");
-var Utils_1 = require("../../Utils");
-/**
- * @class SliderComponent
- *
- * @classdesc Component for comparing pairs of images. Renders
- * a slider for adjusting the curtain of the first image.
- *
- * Deactivate the sequence, direction and image plane
- * components when activating the slider component to avoid
- * interfering UI elements.
- *
- * To retrive and use the slider component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * viewer.deactivateComponent("imagePlane");
- * viewer.deactivateComponent("direction");
- * viewer.deactivateComponent("sequence");
- *
- * viewer.activateComponent("slider");
- *
- * var sliderComponent = viewer.getComponent("slider");
- * ```
- */
-var SliderComponent = /** @class */ (function (_super) {
-    __extends(SliderComponent, _super);
-    /** @ignore */
-    function SliderComponent(name, container, navigator, viewportCoords) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        _this._domRenderer = new Component_1.SliderDOMRenderer(container);
-        _this._imageTileLoader = new Tiles_1.ImageTileLoader(Utils_1.Urls.tileScheme, Utils_1.Urls.tileDomain, Utils_1.Urls.origin);
-        _this._roiCalculator = new Tiles_1.RegionOfInterestCalculator();
-        _this._spatial = new Geo_1.Spatial();
-        _this._glRendererOperation$ = new rxjs_1.Subject();
-        _this._glRendererCreator$ = new rxjs_1.Subject();
-        _this._glRendererDisposer$ = new rxjs_1.Subject();
-        _this._glRenderer$ = _this._glRendererOperation$.pipe(operators_1.scan(function (glRenderer, operation) {
-            return operation(glRenderer);
-        }, null), operators_1.filter(function (glRenderer) {
-            return glRenderer != null;
-        }), operators_1.distinctUntilChanged(undefined, function (glRenderer) {
-            return glRenderer.frameId;
-        }));
-        _this._glRendererCreator$.pipe(operators_1.map(function () {
-            return function (glRenderer) {
-                if (glRenderer != null) {
-                    throw new Error("Multiple slider states can not be created at the same time");
-                }
-                return new Component_1.SliderGLRenderer();
-            };
-        }))
-            .subscribe(_this._glRendererOperation$);
-        _this._glRendererDisposer$.pipe(operators_1.map(function () {
-            return function (glRenderer) {
-                glRenderer.dispose();
-                return null;
-            };
-        }))
-            .subscribe(_this._glRendererOperation$);
-        return _this;
-    }
-    /**
-     * Set the initial position.
-     *
-     * @description Configures the intial position of the slider.
-     * The inital position value will be used when the component
-     * is activated.
-     *
-     * @param {number} initialPosition - Initial slider position.
-     */
-    SliderComponent.prototype.setInitialPosition = function (initialPosition) {
-        this.configure({ initialPosition: initialPosition });
-    };
-    /**
-     * Set the image keys.
-     *
-     * @description Configures the component to show the image
-     * planes for the supplied image keys.
-     *
-     * @param {ISliderKeys} keys - Slider keys object specifying
-     * the images to be shown in the foreground and the background.
-     */
-    SliderComponent.prototype.setKeys = function (keys) {
-        this.configure({ keys: keys });
-    };
-    /**
-     * Set the slider mode.
-     *
-     * @description Configures the mode for transitions between
-     * image pairs.
-     *
-     * @param {SliderMode} mode - Slider mode to be set.
-     */
-    SliderComponent.prototype.setSliderMode = function (mode) {
-        this.configure({ mode: mode });
-    };
-    /**
-     * Set the value controlling if the slider is visible.
-     *
-     * @param {boolean} sliderVisible - Value indicating if
-     * the slider should be visible or not.
-     */
-    SliderComponent.prototype.setSliderVisible = function (sliderVisible) {
-        this.configure({ sliderVisible: sliderVisible });
-    };
-    SliderComponent.prototype._activate = function () {
-        var _this = this;
-        this._modeSubcription = this._domRenderer.mode$
-            .subscribe(function (mode) {
-            _this.setSliderMode(mode);
-        });
-        this._glRenderSubscription = this._glRenderer$.pipe(operators_1.map(function (glRenderer) {
-            var renderHash = {
-                name: _this._name,
-                render: {
-                    frameId: glRenderer.frameId,
-                    needsRender: glRenderer.needsRender,
-                    render: glRenderer.render.bind(glRenderer),
-                    stage: Render_1.GLRenderStage.Background,
-                },
-            };
-            return renderHash;
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        var position$ = rxjs_1.concat(this.configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.initialPosition != null ?
-                configuration.initialPosition : 1;
-        }), operators_1.first()), this._domRenderer.position$);
-        var mode$ = this.configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.mode;
-        }), operators_1.distinctUntilChanged());
-        var motionless$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.motionless;
-        }), operators_1.distinctUntilChanged());
-        var fullPano$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.currentNode.fullPano;
-        }), operators_1.distinctUntilChanged());
-        var sliderVisible$ = rxjs_1.combineLatest(this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.sliderVisible;
-        })), this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return !(frame.state.currentNode == null ||
-                frame.state.previousNode == null ||
-                (frame.state.currentNode.pano && !frame.state.currentNode.fullPano) ||
-                (frame.state.previousNode.pano && !frame.state.previousNode.fullPano) ||
-                (frame.state.currentNode.fullPano && !frame.state.previousNode.fullPano));
-        }), operators_1.distinctUntilChanged())).pipe(operators_1.map(function (_a) {
-            var sliderVisible = _a[0], enabledState = _a[1];
-            return sliderVisible && enabledState;
-        }), operators_1.distinctUntilChanged());
-        this._waitSubscription = rxjs_1.combineLatest(mode$, motionless$, fullPano$, sliderVisible$).pipe(operators_1.withLatestFrom(this._navigator.stateService.state$))
-            .subscribe(function (_a) {
-            var _b = _a[0], mode = _b[0], motionless = _b[1], fullPano = _b[2], sliderVisible = _b[3], state = _a[1];
-            var interactive = sliderVisible &&
-                (motionless || mode === Component_1.SliderMode.Stationary || fullPano);
-            if (interactive && state !== State_1.State.WaitingInteractively) {
-                _this._navigator.stateService.waitInteractively();
-            }
-            else if (!interactive && state !== State_1.State.Waiting) {
-                _this._navigator.stateService.wait();
-            }
-        });
-        this._moveSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$)
-            .subscribe(function (_a) {
-            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4];
-            if (motionless || mode === Component_1.SliderMode.Stationary || fullPano) {
-                _this._navigator.stateService.moveTo(1);
-            }
-            else {
-                _this._navigator.stateService.moveTo(position);
-            }
-        });
-        this._domRenderSubscription = rxjs_1.combineLatest(position$, mode$, motionless$, fullPano$, sliderVisible$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var position = _a[0], mode = _a[1], motionless = _a[2], fullPano = _a[3], sliderVisible = _a[4], size = _a[5];
-            return {
-                name: _this._name,
-                vnode: _this._domRenderer.render(position, mode, motionless, fullPano, sliderVisible),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._glRendererCreator$.next(null);
-        this._updateCurtainSubscription = rxjs_1.combineLatest(position$, fullPano$, sliderVisible$, this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.map(function (_a) {
-            var position = _a[0], fullPano = _a[1], visible = _a[2], render = _a[3], transform = _a[4];
-            if (!fullPano) {
-                return visible ? position : 1;
-            }
-            var basicMin = _this._viewportCoords.viewportToBasic(-1.15, 0, transform, render.perspective);
-            var basicMax = _this._viewportCoords.viewportToBasic(1.15, 0, transform, render.perspective);
-            var shiftedMax = basicMax[0] < basicMin[0] ? basicMax[0] + 1 : basicMax[0];
-            var basicPosition = basicMin[0] + position * (shiftedMax - basicMin[0]);
-            return basicPosition > 1 ? basicPosition - 1 : basicPosition;
-        }), operators_1.map(function (position) {
-            return function (glRenderer) {
-                glRenderer.updateCurtain(position);
-                return glRenderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._stateSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, mode$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], mode = _a[1];
-            return function (glRenderer) {
-                glRenderer.update(frame, mode);
-                return glRenderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._setKeysSubscription = this._configuration$.pipe(operators_1.filter(function (configuration) {
-            return configuration.keys != null;
-        }), operators_1.switchMap(function (configuration) {
-            return rxjs_1.zip(rxjs_1.zip(_this._catchCacheNode$(configuration.keys.background), _this._catchCacheNode$(configuration.keys.foreground)).pipe(operators_1.map(function (nodes) {
-                return { background: nodes[0], foreground: nodes[1] };
-            })), _this._navigator.stateService.currentState$.pipe(operators_1.first())).pipe(operators_1.map(function (nf) {
-                return { nodes: nf[0], state: nf[1].state };
-            }));
-        }))
-            .subscribe(function (co) {
-            if (co.state.currentNode != null &&
-                co.state.previousNode != null &&
-                co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.previousNode.key === co.nodes.background.key) {
-                return;
-            }
-            if (co.state.currentNode.key === co.nodes.background.key) {
-                _this._navigator.stateService.setNodes([co.nodes.foreground]);
-                return;
-            }
-            if (co.state.currentNode.key === co.nodes.foreground.key &&
-                co.state.trajectory.length === 1) {
-                _this._navigator.stateService.prependNodes([co.nodes.background]);
-                return;
-            }
-            _this._navigator.stateService.setNodes([co.nodes.background]);
-            _this._navigator.stateService.setNodes([co.nodes.foreground]);
-        }, function (e) {
-            console.error(e);
-        });
-        var previousNode$ = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.previousNode;
-        }), operators_1.filter(function (node) {
-            return node != null;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }));
-        var textureProvider$ = this._navigator.stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
-            var frame = _a[0], renderer = _a[1], size = _a[2];
-            var state = frame.state;
-            var viewportSize = Math.max(size.width, size.height);
-            var currentNode = state.currentNode;
-            var currentTransform = state.currentTransform;
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(currentNode.key, currentTransform.basicWidth, currentTransform.basicHeight, tileSize, currentNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._textureProviderSubscription = textureProvider$.subscribe(function () { });
-        this._setTextureProviderSubscription = textureProvider$.pipe(operators_1.map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProvider(provider.key, provider);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._setTileSizeSubscription = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
-            return rxjs_1.combineLatest(textureProvider$, rxjs_1.of(size)).pipe(operators_1.first());
-        }))
-            .subscribe(function (_a) {
-            var provider = _a[0], size = _a[1];
-            var viewportSize = Math.max(size.width, size.height);
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            provider.setTileSize(tileSize);
-        });
-        this._abortTextureProviderSubscription = textureProvider$.pipe(operators_1.pairwise())
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
-        });
-        var roiTrigger$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
-            var camera = _a[0], size = _a[1];
-            return [
-                camera.camera.position.clone(),
-                camera.camera.lookat.clone(),
-                camera.zoom.valueOf(),
-                size.height.valueOf(),
-                size.width.valueOf()
-            ];
-        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        }), operators_1.map(function (pls) {
-            var samePosition = pls[0][0].equals(pls[1][0]);
-            var sameLookat = pls[0][1].equals(pls[1][1]);
-            var sameZoom = pls[0][2] === pls[1][2];
-            var sameHeight = pls[0][3] === pls[1][3];
-            var sameWidth = pls[0][4] === pls[1][4];
-            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
-        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
-            return stalled;
-        }), operators_1.switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
-        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
-        this._setRegionOfInterestSubscription = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return roiTrigger$.pipe(operators_1.map(function (_a) {
-                var camera = _a[0], size = _a[1], transform = _a[2];
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
-                    provider,
-                ];
-            }));
-        }), operators_1.filter(function (args) {
-            return !args[1].disposed;
-        }))
-            .subscribe(function (args) {
-            var roi = args[0];
-            var provider = args[1];
-            provider.setRegionOfInterest(roi);
-        });
-        var hasTexture$ = textureProvider$.pipe(operators_1.switchMap(function (provider) {
-            return provider.hasTexture$;
-        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasTextureSubscription = hasTexture$.subscribe(function () { });
-        var nodeImage$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead === 0;
-        }), operators_1.map(function (frame) {
-            return frame.state.currentNode;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexture$), operators_1.filter(function (args) {
-            return !args[1];
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        }), operators_1.switchMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return rxjs_1.empty();
-            }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
-                return [n.image, n];
-            }));
-            return image$.pipe(operators_1.takeUntil(hasTexture$.pipe(operators_1.filter(function (hasTexture) {
-                return hasTexture;
-            }))), operators_1.catchError(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return rxjs_1.empty();
-            }));
-        })).pipe(operators_1.publish(), operators_1.refCount());
-        this._updateBackgroundSubscription = nodeImage$.pipe(operators_1.withLatestFrom(textureProvider$))
-            .subscribe(function (args) {
-            if (args[0][1].key !== args[1].key ||
-                args[1].disposed) {
-                return;
-            }
-            args[1].updateBackground(args[0][0]);
-        });
-        this._updateTextureImageSubscription = nodeImage$.pipe(operators_1.map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        var textureProviderPrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return !!frame.state.previousNode;
-        }), operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.previousNode.key;
-        }), operators_1.withLatestFrom(this._container.glRenderer.webGLRenderer$, this._container.renderService.size$), operators_1.map(function (_a) {
-            var frame = _a[0], renderer = _a[1], size = _a[2];
-            var state = frame.state;
-            var viewportSize = Math.max(size.width, size.height);
-            var previousNode = state.previousNode;
-            var previousTransform = state.previousTransform;
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            return new Tiles_1.TextureProvider(previousNode.key, previousTransform.basicWidth, previousTransform.basicHeight, tileSize, previousNode.image, _this._imageTileLoader, new Tiles_1.ImageTileStore(), renderer);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._textureProviderSubscriptionPrev = textureProviderPrev$.subscribe(function () { });
-        this._setTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.map(function (provider) {
-            return function (renderer) {
-                renderer.setTextureProviderPrev(provider.key, provider);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-        this._setTileSizeSubscriptionPrev = this._container.renderService.size$.pipe(operators_1.switchMap(function (size) {
-            return rxjs_1.combineLatest(textureProviderPrev$, rxjs_1.of(size)).pipe(operators_1.first());
-        }))
-            .subscribe(function (_a) {
-            var provider = _a[0], size = _a[1];
-            var viewportSize = Math.max(size.width, size.height);
-            var tileSize = viewportSize > 2048 ? 2048 : viewportSize > 1024 ? 1024 : 512;
-            provider.setTileSize(tileSize);
-        });
-        this._abortTextureProviderSubscriptionPrev = textureProviderPrev$.pipe(operators_1.pairwise())
-            .subscribe(function (pair) {
-            var previous = pair[0];
-            previous.abort();
-        });
-        var roiTriggerPrev$ = rxjs_1.combineLatest(this._container.renderService.renderCameraFrame$, this._container.renderService.size$.pipe(operators_1.debounceTime(250))).pipe(operators_1.map(function (_a) {
-            var camera = _a[0], size = _a[1];
-            return [
-                camera.camera.position.clone(),
-                camera.camera.lookat.clone(),
-                camera.zoom.valueOf(),
-                size.height.valueOf(),
-                size.width.valueOf()
-            ];
-        }), operators_1.pairwise(), operators_1.skipWhile(function (pls) {
-            return pls[1][2] - pls[0][2] < 0 || pls[1][2] === 0;
-        }), operators_1.map(function (pls) {
-            var samePosition = pls[0][0].equals(pls[1][0]);
-            var sameLookat = pls[0][1].equals(pls[1][1]);
-            var sameZoom = pls[0][2] === pls[1][2];
-            var sameHeight = pls[0][3] === pls[1][3];
-            var sameWidth = pls[0][4] === pls[1][4];
-            return samePosition && sameLookat && sameZoom && sameHeight && sameWidth;
-        }), operators_1.distinctUntilChanged(), operators_1.filter(function (stalled) {
-            return stalled;
-        }), operators_1.switchMap(function (stalled) {
-            return _this._container.renderService.renderCameraFrame$.pipe(operators_1.first());
-        }), operators_1.withLatestFrom(this._container.renderService.size$, this._navigator.stateService.currentTransform$));
-        this._setRegionOfInterestSubscriptionPrev = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
-            return roiTriggerPrev$.pipe(operators_1.map(function (_a) {
-                var camera = _a[0], size = _a[1], transform = _a[2];
-                return [
-                    _this._roiCalculator.computeRegionOfInterest(camera, size, transform),
-                    provider,
-                ];
-            }));
-        }), operators_1.filter(function (args) {
-            return !args[1].disposed;
-        }), operators_1.withLatestFrom(this._navigator.stateService.currentState$))
-            .subscribe(function (_a) {
-            var _b = _a[0], roi = _b[0], provider = _b[1], frame = _a[1];
-            var shiftedRoi = null;
-            if (frame.state.previousNode.fullPano) {
-                if (frame.state.currentNode.fullPano) {
-                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
-                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
-                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
-                    var shift = directionDiff / (2 * Math.PI);
-                    var bbox = {
-                        maxX: _this._spatial.wrap(roi.bbox.maxX + shift, 0, 1),
-                        maxY: roi.bbox.maxY,
-                        minX: _this._spatial.wrap(roi.bbox.minX + shift, 0, 1),
-                        minY: roi.bbox.minY,
-                    };
-                    shiftedRoi = {
-                        bbox: bbox,
-                        pixelHeight: roi.pixelHeight,
-                        pixelWidth: roi.pixelWidth,
-                    };
-                }
-                else {
-                    var currentViewingDirection = _this._spatial.viewingDirection(frame.state.currentNode.rotation);
-                    var previousViewingDirection = _this._spatial.viewingDirection(frame.state.previousNode.rotation);
-                    var directionDiff = _this._spatial.angleBetweenVector2(currentViewingDirection.x, currentViewingDirection.y, previousViewingDirection.x, previousViewingDirection.y);
-                    var shiftX = directionDiff / (2 * Math.PI);
-                    var a1 = _this._spatial.angleToPlane(currentViewingDirection.toArray(), [0, 0, 1]);
-                    var a2 = _this._spatial.angleToPlane(previousViewingDirection.toArray(), [0, 0, 1]);
-                    var shiftY = (a2 - a1) / (2 * Math.PI);
-                    var currentTransform = frame.state.currentTransform;
-                    var size = Math.max(currentTransform.basicWidth, currentTransform.basicHeight);
-                    var hFov = size > 0 ?
-                        2 * Math.atan(0.5 * currentTransform.basicWidth / (size * currentTransform.focal)) :
-                        Math.PI / 3;
-                    var vFov = size > 0 ?
-                        2 * Math.atan(0.5 * currentTransform.basicHeight / (size * currentTransform.focal)) :
-                        Math.PI / 3;
-                    var spanningWidth = hFov / (2 * Math.PI);
-                    var spanningHeight = vFov / Math.PI;
-                    var basicWidth = (roi.bbox.maxX - roi.bbox.minX) * spanningWidth;
-                    var basicHeight = (roi.bbox.maxY - roi.bbox.minY) * spanningHeight;
-                    var pixelWidth = roi.pixelWidth * spanningWidth;
-                    var pixelHeight = roi.pixelHeight * spanningHeight;
-                    var zoomShiftX = (roi.bbox.minX + roi.bbox.maxX) / 2 - 0.5;
-                    var zoomShiftY = (roi.bbox.minY + roi.bbox.maxY) / 2 - 0.5;
-                    var minX = 0.5 + shiftX + spanningWidth * zoomShiftX - basicWidth / 2;
-                    var maxX = 0.5 + shiftX + spanningWidth * zoomShiftX + basicWidth / 2;
-                    var minY = 0.5 + shiftY + spanningHeight * zoomShiftY - basicHeight / 2;
-                    var maxY = 0.5 + shiftY + spanningHeight * zoomShiftY + basicHeight / 2;
-                    var bbox = {
-                        maxX: _this._spatial.wrap(maxX, 0, 1),
-                        maxY: maxY,
-                        minX: _this._spatial.wrap(minX, 0, 1),
-                        minY: minY,
-                    };
-                    shiftedRoi = {
-                        bbox: bbox,
-                        pixelHeight: pixelHeight,
-                        pixelWidth: pixelWidth,
-                    };
-                }
-            }
-            else {
-                var currentBasicAspect = frame.state.currentTransform.basicAspect;
-                var previousBasicAspect = frame.state.previousTransform.basicAspect;
-                var _c = _this._getBasicCorners(currentBasicAspect, previousBasicAspect), _d = _c[0], cornerMinX = _d[0], cornerMinY = _d[1], _e = _c[1], cornerMaxX = _e[0], cornerMaxY = _e[1];
-                var basicWidth = cornerMaxX - cornerMinX;
-                var basicHeight = cornerMaxY - cornerMinY;
-                var pixelWidth = roi.pixelWidth / basicWidth;
-                var pixelHeight = roi.pixelHeight / basicHeight;
-                var minX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.minX / basicWidth;
-                var maxX = (basicWidth - 1) / (2 * basicWidth) + roi.bbox.maxX / basicWidth;
-                var minY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.minY / basicHeight;
-                var maxY = (basicHeight - 1) / (2 * basicHeight) + roi.bbox.maxY / basicHeight;
-                var bbox = {
-                    maxX: maxX,
-                    maxY: maxY,
-                    minX: minX,
-                    minY: minY,
-                };
-                _this._clipBoundingBox(bbox);
-                shiftedRoi = {
-                    bbox: bbox,
-                    pixelHeight: pixelHeight,
-                    pixelWidth: pixelWidth,
-                };
-            }
-            provider.setRegionOfInterest(shiftedRoi);
-        });
-        var hasTexturePrev$ = textureProviderPrev$.pipe(operators_1.switchMap(function (provider) {
-            return provider.hasTexture$;
-        }), operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasTextureSubscriptionPrev = hasTexturePrev$.subscribe(function () { });
-        var nodeImagePrev$ = this._navigator.stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead === 0 && !!frame.state.previousNode;
-        }), operators_1.map(function (frame) {
-            return frame.state.previousNode;
-        }), operators_1.distinctUntilChanged(undefined, function (node) {
-            return node.key;
-        }), operators_1.debounceTime(1000), operators_1.withLatestFrom(hasTexturePrev$), operators_1.filter(function (args) {
-            return !args[1];
-        }), operators_1.map(function (args) {
-            return args[0];
-        }), operators_1.filter(function (node) {
-            return node.pano ?
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.maxImageSize > Utils_1.Settings.baseImageSize;
-        }), operators_1.switchMap(function (node) {
-            var baseImageSize = node.pano ?
-                Utils_1.Settings.basePanoramaSize :
-                Utils_1.Settings.baseImageSize;
-            if (Math.max(node.image.width, node.image.height) > baseImageSize) {
-                return rxjs_1.empty();
-            }
-            var image$ = node
-                .cacheImage$(Utils_1.Settings.maxImageSize).pipe(operators_1.map(function (n) {
-                return [n.image, n];
-            }));
-            return image$.pipe(operators_1.takeUntil(hasTexturePrev$.pipe(operators_1.filter(function (hasTexture) {
-                return hasTexture;
-            }))), operators_1.catchError(function (error, caught) {
-                console.error("Failed to fetch high res image (" + node.key + ")", error);
-                return rxjs_1.empty();
-            }));
-        })).pipe(operators_1.publish(), operators_1.refCount());
-        this._updateBackgroundSubscriptionPrev = nodeImagePrev$.pipe(operators_1.withLatestFrom(textureProviderPrev$))
-            .subscribe(function (args) {
-            if (args[0][1].key !== args[1].key ||
-                args[1].disposed) {
-                return;
-            }
-            args[1].updateBackground(args[0][0]);
-        });
-        this._updateTextureImageSubscriptionPrev = nodeImagePrev$.pipe(operators_1.map(function (imn) {
-            return function (renderer) {
-                renderer.updateTextureImage(imn[0], imn[1]);
-                return renderer;
-            };
-        }))
-            .subscribe(this._glRendererOperation$);
-    };
-    SliderComponent.prototype._deactivate = function () {
-        var _this = this;
-        this._waitSubscription.unsubscribe();
-        this._navigator.stateService.state$.pipe(operators_1.first())
-            .subscribe(function (state) {
-            if (state !== State_1.State.Traversing) {
-                _this._navigator.stateService.traverse();
-            }
-        });
-        this._glRendererDisposer$.next(null);
-        this._domRenderer.deactivate();
-        this._modeSubcription.unsubscribe();
-        this._setKeysSubscription.unsubscribe();
-        this._stateSubscription.unsubscribe();
-        this._glRenderSubscription.unsubscribe();
-        this._domRenderSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._updateCurtainSubscription.unsubscribe();
-        this._textureProviderSubscription.unsubscribe();
-        this._setTextureProviderSubscription.unsubscribe();
-        this._setTileSizeSubscription.unsubscribe();
-        this._abortTextureProviderSubscription.unsubscribe();
-        this._setRegionOfInterestSubscription.unsubscribe();
-        this._hasTextureSubscription.unsubscribe();
-        this._updateBackgroundSubscription.unsubscribe();
-        this._updateTextureImageSubscription.unsubscribe();
-        this._textureProviderSubscriptionPrev.unsubscribe();
-        this._setTextureProviderSubscriptionPrev.unsubscribe();
-        this._setTileSizeSubscriptionPrev.unsubscribe();
-        this._abortTextureProviderSubscriptionPrev.unsubscribe();
-        this._setRegionOfInterestSubscriptionPrev.unsubscribe();
-        this._hasTextureSubscriptionPrev.unsubscribe();
-        this._updateBackgroundSubscriptionPrev.unsubscribe();
-        this._updateTextureImageSubscriptionPrev.unsubscribe();
-        this.configure({ keys: null });
-    };
-    SliderComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            initialPosition: 1,
-            mode: Component_1.SliderMode.Motion,
-            sliderVisible: true,
-        };
-    };
-    SliderComponent.prototype._catchCacheNode$ = function (key) {
-        return this._navigator.graphService.cacheNode$(key).pipe(operators_1.catchError(function (error, caught) {
-            console.error("Failed to cache slider node (" + key + ")", error);
-            return rxjs_1.empty();
-        }));
-    };
-    SliderComponent.prototype._getBasicCorners = function (currentAspect, previousAspect) {
-        var offsetX;
-        var offsetY;
-        if (currentAspect > previousAspect) {
-            offsetX = 0.5;
-            offsetY = 0.5 * currentAspect / previousAspect;
-        }
-        else {
-            offsetX = 0.5 * previousAspect / currentAspect;
-            offsetY = 0.5;
-        }
-        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
-    };
-    SliderComponent.prototype._clipBoundingBox = function (bbox) {
-        bbox.minX = Math.max(0, Math.min(1, bbox.minX));
-        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));
-        bbox.minY = Math.max(0, Math.min(1, bbox.minY));
-        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));
-    };
-    SliderComponent.componentName = "slider";
-    return SliderComponent;
-}(Component_1.Component));
-exports.SliderComponent = SliderComponent;
-Component_1.ComponentService.register(SliderComponent);
-exports.default = SliderComponent;
-
-
-},{"../../Component":275,"../../Geo":278,"../../Render":281,"../../State":282,"../../Tiles":284,"../../Utils":285,"rxjs":27,"rxjs/operators":225}],338:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var SliderDOMRenderer = /** @class */ (function () {
-    function SliderDOMRenderer(container) {
-        this._container = container;
-        this._interacting = false;
-        this._notifyModeChanged$ = new rxjs_1.Subject();
-        this._notifyPositionChanged$ = new rxjs_1.Subject();
-        this._stopInteractionSubscription = null;
-    }
-    Object.defineProperty(SliderDOMRenderer.prototype, "mode$", {
-        get: function () {
-            return this._notifyModeChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderDOMRenderer.prototype, "position$", {
-        get: function () {
-            return this._notifyPositionChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    SliderDOMRenderer.prototype.activate = function () {
-        var _this = this;
-        if (!!this._stopInteractionSubscription) {
-            return;
-        }
-        this._stopInteractionSubscription = rxjs_1.merge(this._container.mouseService.documentMouseUp$, this._container.touchService.touchEnd$.pipe(operators_1.filter(function (touchEvent) {
-            return touchEvent.touches.length === 0;
-        })))
-            .subscribe(function (event) {
-            if (_this._interacting) {
-                _this._interacting = false;
-            }
-        });
-    };
-    SliderDOMRenderer.prototype.deactivate = function () {
-        if (!this._stopInteractionSubscription) {
-            return;
-        }
-        this._interacting = false;
-        this._stopInteractionSubscription.unsubscribe();
-        this._stopInteractionSubscription = null;
-    };
-    SliderDOMRenderer.prototype.render = function (position, mode, motionless, pano, visible) {
-        var children = [];
-        if (visible) {
-            children.push(vd.h("div.SliderBorder", []));
-            var modeVisible = !(motionless || pano);
-            if (modeVisible) {
-                children.push(this._createModeButton(mode));
-                children.push(this._createModeButton2d(mode));
-            }
-            children.push(this._createPositionInput(position, modeVisible));
-        }
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(215, Math.min(400, boundingRect.width - 100));
-        return vd.h("div.SliderContainer", { style: { width: width + "px" } }, children);
-    };
-    SliderDOMRenderer.prototype._createModeButton = function (mode) {
-        var _this = this;
-        var properties = {
-            onclick: function () {
-                if (mode === Component_1.SliderMode.Motion) {
-                    return;
-                }
-                _this._notifyModeChanged$.next(Component_1.SliderMode.Motion);
-            },
-        };
-        var className = mode === Component_1.SliderMode.Stationary ?
-            "SliderModeButtonDisabled" :
-            "SliderModeButton";
-        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon", [])]);
-    };
-    SliderDOMRenderer.prototype._createModeButton2d = function (mode) {
-        var _this = this;
-        var properties = {
-            onclick: function () {
-                if (mode === Component_1.SliderMode.Stationary) {
-                    return;
-                }
-                _this._notifyModeChanged$.next(Component_1.SliderMode.Stationary);
-            },
-        };
-        var className = mode === Component_1.SliderMode.Motion ?
-            "SliderModeButton2dDisabled" :
-            "SliderModeButton2d";
-        return vd.h("div." + className, properties, [vd.h("div.SliderModeIcon2d", [])]);
-    };
-    SliderDOMRenderer.prototype._createPositionInput = function (position, modeVisible) {
-        var _this = this;
-        var onChange = function (e) {
-            _this._notifyPositionChanged$.next(Number(e.target.value) / 1000);
-        };
-        var onStart = function (e) {
-            _this._interacting = true;
-            e.stopPropagation();
-        };
-        var onMove = function (e) {
-            if (_this._interacting) {
-                e.stopPropagation();
-            }
-        };
-        var onKeyDown = function (e) {
-            if (e.key === "ArrowDown" || e.key === "ArrowLeft" ||
-                e.key === "ArrowRight" || e.key === "ArrowUp") {
-                e.preventDefault();
-            }
-        };
-        var boundingRect = this._container.domContainer.getBoundingClientRect();
-        var width = Math.max(215, Math.min(400, boundingRect.width - 105)) - 84 + (modeVisible ? 0 : 52);
-        var positionInput = vd.h("input.SliderPosition", {
-            max: 1000,
-            min: 0,
-            onchange: onChange,
-            oninput: onChange,
-            onkeydown: onKeyDown,
-            onmousedown: onStart,
-            onmousemove: onMove,
-            ontouchmove: onMove,
-            ontouchstart: onStart,
-            style: {
-                width: width + "px",
-            },
-            type: "range",
-            value: 1000 * position,
-        }, []);
-        return vd.h("div.SliderPositionContainer", [positionInput]);
-    };
-    return SliderDOMRenderer;
-}());
-exports.SliderDOMRenderer = SliderDOMRenderer;
-exports.default = SliderDOMRenderer;
-
-},{"../../Component":275,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],339:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var SliderGLRenderer = /** @class */ (function () {
-    function SliderGLRenderer() {
-        this._factory = new Component_1.MeshFactory();
-        this._scene = new Component_1.MeshScene();
-        this._spatial = new Geo_1.Spatial();
-        this._currentKey = null;
-        this._previousKey = null;
-        this._disabled = false;
-        this._curtain = 1;
-        this._frameId = 0;
-        this._needsRender = false;
-        this._mode = null;
-        this._currentProviderDisposers = {};
-        this._previousProviderDisposers = {};
-    }
-    Object.defineProperty(SliderGLRenderer.prototype, "disabled", {
-        get: function () {
-            return this._disabled;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderGLRenderer.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SliderGLRenderer.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    SliderGLRenderer.prototype.setTextureProvider = function (key, provider) {
-        this._setTextureProvider(key, this._currentKey, provider, this._currentProviderDisposers, this._updateTexture.bind(this));
-    };
-    SliderGLRenderer.prototype.setTextureProviderPrev = function (key, provider) {
-        this._setTextureProvider(key, this._previousKey, provider, this._previousProviderDisposers, this._updateTexturePrev.bind(this));
-    };
-    SliderGLRenderer.prototype.update = function (frame, mode) {
-        this._updateFrameId(frame.id);
-        this._updateImagePlanes(frame.state, mode);
-    };
-    SliderGLRenderer.prototype.updateCurtain = function (curtain) {
-        if (this._curtain === curtain) {
-            return;
-        }
-        this._curtain = curtain;
-        this._updateCurtain();
-        this._needsRender = true;
-    };
-    SliderGLRenderer.prototype.updateTexture = function (image, node) {
-        var planes = node.key === this._currentKey ?
-            this._scene.planes :
-            node.key === this._previousKey ?
-                this._scene.planesOld :
-                {};
-        if (Object.keys(planes).length === 0) {
-            return;
-        }
-        this._needsRender = true;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    SliderGLRenderer.prototype.updateTextureImage = function (image, node) {
-        if (this._currentKey !== node.key) {
-            return;
-        }
-        this._needsRender = true;
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var texture = material.uniforms.projectorTex.value;
-            texture.image = image;
-            texture.needsUpdate = true;
-        }
-    };
-    SliderGLRenderer.prototype.render = function (perspectiveCamera, renderer) {
-        if (!this.disabled) {
-            renderer.render(this._scene.sceneOld, perspectiveCamera);
-        }
-        renderer.render(this._scene.scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    SliderGLRenderer.prototype.dispose = function () {
-        this._scene.clear();
-        for (var key in this._currentProviderDisposers) {
-            if (!this._currentProviderDisposers.hasOwnProperty(key)) {
-                continue;
-            }
-            this._currentProviderDisposers[key]();
-        }
-        for (var key in this._previousProviderDisposers) {
-            if (!this._previousProviderDisposers.hasOwnProperty(key)) {
-                continue;
-            }
-            this._previousProviderDisposers[key]();
-        }
-        this._currentProviderDisposers = {};
-        this._previousProviderDisposers = {};
-    };
-    SliderGLRenderer.prototype._getBasicCorners = function (currentAspect, previousAspect) {
-        var offsetX;
-        var offsetY;
-        if (currentAspect > previousAspect) {
-            offsetX = 0.5;
-            offsetY = 0.5 * currentAspect / previousAspect;
-        }
-        else {
-            offsetX = 0.5 * previousAspect / currentAspect;
-            offsetY = 0.5;
-        }
-        return [[0.5 - offsetX, 0.5 - offsetY], [0.5 + offsetX, 0.5 + offsetY]];
-    };
-    SliderGLRenderer.prototype._setDisabled = function (state) {
-        this._disabled = state.currentNode == null ||
-            state.previousNode == null ||
-            (state.currentNode.pano && !state.currentNode.fullPano) ||
-            (state.previousNode.pano && !state.previousNode.fullPano) ||
-            (state.currentNode.fullPano && !state.previousNode.fullPano);
-    };
-    SliderGLRenderer.prototype._setTextureProvider = function (key, originalKey, provider, providerDisposers, updateTexture) {
-        var _this = this;
-        if (key !== originalKey) {
-            return;
-        }
-        var createdSubscription = provider.textureCreated$
-            .subscribe(updateTexture);
-        var updatedSubscription = provider.textureUpdated$
-            .subscribe(function (updated) {
-            _this._needsRender = true;
-        });
-        var dispose = function () {
-            createdSubscription.unsubscribe();
-            updatedSubscription.unsubscribe();
-            provider.dispose();
-        };
-        if (key in providerDisposers) {
-            var disposeProvider = providerDisposers[key];
-            disposeProvider();
-            delete providerDisposers[key];
-        }
-        providerDisposers[key] = dispose;
-    };
-    SliderGLRenderer.prototype._updateCurtain = function () {
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var shaderMaterial = plane.material;
-            if (!!shaderMaterial.uniforms.curtain) {
-                shaderMaterial.uniforms.curtain.value = this._curtain;
-            }
-        }
-    };
-    SliderGLRenderer.prototype._updateFrameId = function (frameId) {
-        this._frameId = frameId;
-    };
-    SliderGLRenderer.prototype._updateImagePlanes = function (state, mode) {
-        var currentChanged = state.currentNode != null && this._currentKey !== state.currentNode.key;
-        var previousChanged = state.previousNode != null && this._previousKey !== state.previousNode.key;
-        var modeChanged = this._mode !== mode;
-        if (!(currentChanged || previousChanged || modeChanged)) {
-            return;
-        }
-        this._setDisabled(state);
-        this._needsRender = true;
-        this._mode = mode;
-        var motionless = state.motionless || mode === Component_1.SliderMode.Stationary || state.currentNode.pano;
-        if (this.disabled || previousChanged) {
-            if (this._previousKey in this._previousProviderDisposers) {
-                this._previousProviderDisposers[this._previousKey]();
-                delete this._previousProviderDisposers[this._previousKey];
-            }
-        }
-        if (this.disabled) {
-            this._scene.setImagePlanesOld({});
-        }
-        else {
-            if (previousChanged || modeChanged) {
-                var previousNode = state.previousNode;
-                this._previousKey = previousNode.key;
-                var elements = state.currentTransform.rt.elements;
-                var translation = [elements[12], elements[13], elements[14]];
-                var currentAspect = state.currentTransform.basicAspect;
-                var previousAspect = state.previousTransform.basicAspect;
-                var textureScale = currentAspect > previousAspect ?
-                    [1, previousAspect / currentAspect] :
-                    [currentAspect / previousAspect, 1];
-                var rotation = state.currentNode.rotation;
-                var width = state.currentNode.width;
-                var height = state.currentNode.height;
-                if (previousNode.fullPano) {
-                    rotation = state.previousNode.rotation;
-                    translation = this._spatial
-                        .rotate(this._spatial
-                        .opticalCenter(state.currentNode.rotation, translation)
-                        .toArray(), rotation)
-                        .multiplyScalar(-1)
-                        .toArray();
-                    width = state.previousNode.width;
-                    height = state.previousNode.height;
-                }
-                var transform = new Geo_1.Transform(state.currentNode.orientation, width, height, state.currentNode.focal, state.currentNode.scale, previousNode.gpano, rotation, translation, previousNode.image, textureScale);
-                var mesh = undefined;
-                if (previousNode.fullPano) {
-                    mesh = this._factory.createMesh(previousNode, motionless || state.currentNode.fullPano ? transform : state.previousTransform);
-                }
-                else {
-                    if (motionless) {
-                        var _a = this._getBasicCorners(currentAspect, previousAspect), _b = _a[0], basicX0 = _b[0], basicY0 = _b[1], _c = _a[1], basicX1 = _c[0], basicY1 = _c[1];
-                        mesh = this._factory.createFlatMesh(state.previousNode, transform, basicX0, basicX1, basicY0, basicY1);
-                    }
-                    else {
-                        mesh = this._factory.createMesh(state.previousNode, state.previousTransform);
-                    }
-                }
-                var previousPlanes = {};
-                previousPlanes[previousNode.key] = mesh;
-                this._scene.setImagePlanesOld(previousPlanes);
-            }
-        }
-        if (currentChanged || modeChanged) {
-            if (this._currentKey in this._currentProviderDisposers) {
-                this._currentProviderDisposers[this._currentKey]();
-                delete this._currentProviderDisposers[this._currentKey];
-            }
-            this._currentKey = state.currentNode.key;
-            var planes = {};
-            if (state.currentNode.fullPano) {
-                planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
-            }
-            else if (state.currentNode.pano && !state.currentNode.fullPano) {
-                planes[state.currentNode.key] = this._factory.createMesh(state.currentNode, state.currentTransform);
-            }
-            else {
-                if (motionless) {
-                    planes[state.currentNode.key] = this._factory.createDistortedCurtainMesh(state.currentNode, state.currentTransform);
-                }
-                else {
-                    planes[state.currentNode.key] = this._factory.createCurtainMesh(state.currentNode, state.currentTransform);
-                }
-            }
-            this._scene.setImagePlanes(planes);
-            this._updateCurtain();
-        }
-    };
-    SliderGLRenderer.prototype._updateTexture = function (texture) {
-        this._needsRender = true;
-        var planes = this._scene.planes;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    SliderGLRenderer.prototype._updateTexturePrev = function (texture) {
-        this._needsRender = true;
-        var planes = this._scene.planesOld;
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            var material = plane.material;
-            var oldTexture = material.uniforms.projectorTex.value;
-            material.uniforms.projectorTex.value = null;
-            oldTexture.dispose();
-            material.uniforms.projectorTex.value = texture;
-        }
-    };
-    return SliderGLRenderer;
-}());
-exports.SliderGLRenderer = SliderGLRenderer;
-exports.default = SliderGLRenderer;
-
-
-},{"../../Component":275,"../../Geo":278}],340:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var geohash = require("latlon-geohash");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Error_1 = require("../../Error");
-var Utils_1 = require("../../Utils");
-var SpatialDataCache = /** @class */ (function () {
-    function SpatialDataCache(graphService) {
-        this._graphService = graphService;
-        this._tiles = {};
-        this._cacheRequests = {};
-        this._reconstructions = {};
-        this._cachingReconstructions$ = {};
-        this._cachingTiles$ = {};
-    }
-    SpatialDataCache.prototype.cacheReconstructions$ = function (hash) {
-        var _this = this;
-        if (!this.hasTile(hash)) {
-            throw new Error("Cannot cache reconstructions of a non-existing tile.");
-        }
-        if (this.hasReconstructions(hash)) {
-            throw new Error("Cannot cache reconstructions that already exists.");
-        }
-        if (this.isCachingReconstructions(hash)) {
-            return this._cachingReconstructions$[hash];
-        }
-        var tile = [];
-        if (hash in this._reconstructions) {
-            var reconstructionKeys = this.getReconstructions(hash)
-                .map(function (reconstruction) {
-                return reconstruction.data.key;
-            });
-            for (var _i = 0, _a = this.getTile(hash); _i < _a.length; _i++) {
-                var node = _a[_i];
-                if (reconstructionKeys.indexOf(node.key) === -1) {
-                    tile.push(node);
-                }
-            }
-        }
-        else {
-            tile.push.apply(tile, this.getTile(hash));
-            this._reconstructions[hash] = [];
-        }
-        this._cacheRequests[hash] = [];
-        this._cachingReconstructions$[hash] = rxjs_1.from(tile).pipe(operators_1.mergeMap(function (nodeData) {
-            return !_this._cacheRequests[hash] ?
-                rxjs_1.empty() :
-                rxjs_1.zip(rxjs_1.of(nodeData), _this._getAtomicReconstruction(nodeData.key, _this._cacheRequests[hash]))
-                    .pipe(operators_1.catchError(function (error) {
-                    if (error instanceof Error_1.AbortMapillaryError) {
-                        return rxjs_1.empty();
-                    }
-                    console.error(error);
-                    return rxjs_1.of([nodeData, null]);
-                }));
-        }, 6), operators_1.map(function (_a) {
-            var nodeData = _a[0], reconstruction = _a[1];
-            return { data: nodeData, reconstruction: reconstruction };
-        }), operators_1.filter(function () {
-            return hash in _this._reconstructions;
-        }), operators_1.tap(function (data) {
-            _this._reconstructions[hash].push(data);
-        }), operators_1.filter(function (data) {
-            return !!data.reconstruction;
-        }), operators_1.finalize(function () {
-            if (hash in _this._cachingReconstructions$) {
-                delete _this._cachingReconstructions$[hash];
-            }
-            if (hash in _this._cacheRequests) {
-                delete _this._cacheRequests[hash];
-            }
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingReconstructions$[hash];
-    };
-    SpatialDataCache.prototype.cacheTile$ = function (hash) {
-        var _this = this;
-        if (hash.length !== 8) {
-            throw new Error("Hash needs to be level 8.");
-        }
-        if (this.hasTile(hash)) {
-            throw new Error("Cannot cache tile that already exists.");
-        }
-        if (this.hasTile(hash)) {
-            return this._cachingTiles$[hash];
-        }
-        var bounds = geohash.bounds(hash);
-        var sw = { lat: bounds.sw.lat, lon: bounds.sw.lon };
-        var ne = { lat: bounds.ne.lat, lon: bounds.ne.lon };
-        this._tiles[hash] = [];
-        this._cachingTiles$[hash] = this._graphService.cacheBoundingBox$(sw, ne).pipe(operators_1.catchError(function (error) {
-            console.error(error);
-            delete _this._tiles[hash];
-            return rxjs_1.empty();
-        }), operators_1.map(function (nodes) {
-            return nodes
-                .map(function (n) {
-                return _this._createNodeData(n);
-            });
-        }), operators_1.filter(function () {
-            return hash in _this._tiles;
-        }), operators_1.tap(function (nodeData) {
-            var _a;
-            (_a = _this._tiles[hash]).push.apply(_a, nodeData);
-            delete _this._cachingTiles$[hash];
-        }), operators_1.finalize(function () {
-            if (hash in _this._cachingTiles$) {
-                delete _this._cachingTiles$[hash];
-            }
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingTiles$[hash];
-    };
-    SpatialDataCache.prototype.isCachingReconstructions = function (hash) {
-        return hash in this._cachingReconstructions$;
-    };
-    SpatialDataCache.prototype.isCachingTile = function (hash) {
-        return hash in this._cachingTiles$;
-    };
-    SpatialDataCache.prototype.hasReconstructions = function (hash) {
-        return !(hash in this._cachingReconstructions$) &&
-            hash in this._reconstructions &&
-            this._reconstructions[hash].length === this._tiles[hash].length;
-    };
-    SpatialDataCache.prototype.hasTile = function (hash) {
-        return !(hash in this._cachingTiles$) && hash in this._tiles;
-    };
-    SpatialDataCache.prototype.getReconstructions = function (hash) {
-        return hash in this._reconstructions ?
-            this._reconstructions[hash]
-                .filter(function (data) {
-                return !!data.reconstruction;
-            }) :
-            [];
-    };
-    SpatialDataCache.prototype.getTile = function (hash) {
-        return hash in this._tiles ? this._tiles[hash] : [];
-    };
-    SpatialDataCache.prototype.uncache = function (keepHashes) {
-        for (var _i = 0, _a = Object.keys(this._cacheRequests); _i < _a.length; _i++) {
-            var hash = _a[_i];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            for (var _b = 0, _c = this._cacheRequests[hash]; _b < _c.length; _b++) {
-                var request = _c[_b];
-                request.abort();
-            }
-            delete this._cacheRequests[hash];
-        }
-        for (var _d = 0, _e = Object.keys(this._reconstructions); _d < _e.length; _d++) {
-            var hash = _e[_d];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            delete this._reconstructions[hash];
-        }
-        for (var _f = 0, _g = Object.keys(this._tiles); _f < _g.length; _f++) {
-            var hash = _g[_f];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            delete this._tiles[hash];
-        }
-    };
-    SpatialDataCache.prototype._createNodeData = function (node) {
-        return {
-            alt: node.alt,
-            cameraProjection: node.cameraProjection,
-            focal: node.focal,
-            gpano: node.gpano,
-            height: node.height,
-            k1: node.ck1,
-            k2: node.ck2,
-            key: node.key,
-            lat: node.latLon.lat,
-            lon: node.latLon.lon,
-            mergeCC: node.mergeCC,
-            orientation: node.orientation,
-            originalLat: node.originalLatLon.lat,
-            originalLon: node.originalLatLon.lon,
-            rotation: [node.rotation[0], node.rotation[1], node.rotation[2]],
-            scale: node.scale,
-            width: node.width,
-        };
-    };
-    SpatialDataCache.prototype._getAtomicReconstruction = function (key, requests) {
-        return rxjs_1.Observable.create(function (subscriber) {
-            var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", Utils_1.Urls.atomicReconstruction(key), true);
-            xmlHTTP.responseType = "json";
-            xmlHTTP.timeout = 15000;
-            xmlHTTP.onload = function () {
-                if (!xmlHTTP.response) {
-                    subscriber.error(new Error("Atomic reconstruction does not exist (" + key + ")"));
-                }
-                else {
-                    subscriber.next(xmlHTTP.response);
-                    subscriber.complete();
-                }
-            };
-            xmlHTTP.onerror = function () {
-                subscriber.error(new Error("Failed to get atomic reconstruction (" + key + ")"));
-            };
-            xmlHTTP.ontimeout = function () {
-                subscriber.error(new Error("Atomic reconstruction request timed out (" + key + ")"));
-            };
-            xmlHTTP.onabort = function () {
-                subscriber.error(new Error_1.AbortMapillaryError("Atomic reconstruction request was aborted (" + key + ")"));
-            };
-            requests.push(xmlHTTP);
-            xmlHTTP.send(null);
-        });
-    };
-    return SpatialDataCache;
-}());
-exports.SpatialDataCache = SpatialDataCache;
-exports.default = SpatialDataCache;
-
-},{"../../Error":277,"../../Utils":285,"latlon-geohash":21,"rxjs":27,"rxjs/operators":225}],341:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var geohash = require("latlon-geohash");
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var Render_1 = require("../../Render");
-var PlayService_1 = require("../../viewer/PlayService");
-var State_1 = require("../../state/State");
-var SpatialDataComponent = /** @class */ (function (_super) {
-    __extends(SpatialDataComponent, _super);
-    function SpatialDataComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._cache = new Component_1.SpatialDataCache(navigator.graphService);
-        _this._scene = new Component_1.SpatialDataScene(_this._getDefaultConfiguration());
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._geoCoords = new Geo_1.GeoCoords();
-        return _this;
-    }
-    SpatialDataComponent.prototype._activate = function () {
-        var _this = this;
-        this._earthControlsSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.earthControls;
-        }), operators_1.distinctUntilChanged(), operators_1.withLatestFrom(this._navigator.stateService.state$))
-            .subscribe(function (_a) {
-            var earth = _a[0], state = _a[1];
-            if (earth && state !== State_1.default.Earth) {
-                _this._navigator.stateService.earth();
-            }
-            else if (!earth && state === State_1.default.Earth) {
-                _this._navigator.stateService.traverse();
-            }
-        });
-        var direction$ = this._container.renderService.bearing$.pipe(operators_1.map(function (bearing) {
-            var direction = "";
-            if (bearing > 292.5 || bearing <= 67.5) {
-                direction += "n";
-            }
-            if (bearing > 112.5 && bearing <= 247.5) {
-                direction += "s";
-            }
-            if (bearing > 22.5 && bearing <= 157.5) {
-                direction += "e";
-            }
-            if (bearing > 202.5 && bearing <= 337.5) {
-                direction += "w";
-            }
-            return direction;
-        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        var hash$ = this._navigator.stateService.reference$.pipe(operators_1.tap(function () {
-            _this._scene.uncache();
-        }), operators_1.switchMap(function () {
-            return _this._navigator.stateService.currentNode$.pipe(operators_1.map(function (node) {
-                return geohash.encode(node.latLon.lat, node.latLon.lon, 8);
-            }), operators_1.distinctUntilChanged());
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var sequencePlay$ = rxjs_1.combineLatest(this._navigator.playService.playing$, this._navigator.playService.speed$).pipe(operators_1.map(function (_a) {
-            var playing = _a[0], speed = _a[1];
-            return playing && speed > PlayService_1.default.sequenceSpeed;
-        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._addSubscription = rxjs_1.combineLatest(this._navigator.stateService.state$.pipe(operators_1.map(function (state) {
-            return state === State_1.default.Earth;
-        }), operators_1.distinctUntilChanged()), hash$, sequencePlay$, direction$).pipe(operators_1.distinctUntilChanged(function (_a, _b) {
-            var e1 = _a[0], h1 = _a[1], s1 = _a[2], d1 = _a[3];
-            var e2 = _b[0], h2 = _b[1], s2 = _b[2], d2 = _b[3];
-            if (e1 !== e2) {
-                return false;
-            }
-            if (e1) {
-                return h1 === h2 && s1 === s2;
-            }
-            return h1 === h2 && s1 === s2 && d1 === d2;
-        }), operators_1.concatMap(function (_a) {
-            var earth = _a[0], hash = _a[1], sequencePlay = _a[2], direction = _a[3];
-            if (earth) {
-                return sequencePlay ?
-                    rxjs_1.of([hash]) :
-                    rxjs_1.of(_this._adjacentComponent(hash, 4));
-            }
-            return sequencePlay ?
-                rxjs_1.of([hash, geohash.neighbours(hash)[direction]]) :
-                rxjs_1.of(_this._computeTiles(hash, direction));
-        }), operators_1.switchMap(function (hashes) {
-            return rxjs_1.from(hashes).pipe(operators_1.mergeMap(function (h) {
-                var tile$;
-                if (_this._cache.hasTile(h)) {
-                    tile$ = rxjs_1.of(_this._cache.getTile(h));
-                }
-                else if (_this._cache.isCachingTile(h)) {
-                    tile$ = _this._cache.cacheTile$(h).pipe(operators_1.last(null, {}), operators_1.switchMap(function () {
-                        return rxjs_1.of(_this._cache.getTile(h));
-                    }));
-                }
-                else {
-                    tile$ = _this._cache.cacheTile$(h);
-                }
-                return rxjs_1.combineLatest(rxjs_1.of(h), tile$);
-            }, 1), operators_1.map(function (_a) {
-                var hash = _a[0];
-                return hash;
-            }));
-        }), operators_1.concatMap(function (hash) {
-            var reconstructions$;
-            if (_this._cache.hasReconstructions(hash)) {
-                reconstructions$ = rxjs_1.from(_this._cache.getReconstructions(hash));
-            }
-            else if (_this._cache.isCachingReconstructions(hash)) {
-                reconstructions$ = _this._cache.cacheReconstructions$(hash).pipe(operators_1.last(null, {}), operators_1.switchMap(function () {
-                    return rxjs_1.from(_this._cache.getReconstructions(hash));
-                }));
-            }
-            else if (_this._cache.hasTile(hash)) {
-                reconstructions$ = _this._cache.cacheReconstructions$(hash);
-            }
-            else {
-                reconstructions$ = rxjs_1.empty();
-            }
-            return rxjs_1.combineLatest(rxjs_1.of(hash), reconstructions$);
-        }), operators_1.withLatestFrom(this._navigator.stateService.reference$), operators_1.tap(function (_a) {
-            var hash = _a[0][0], reference = _a[1];
-            if (_this._scene.hasTile(hash)) {
-                return;
-            }
-            _this._scene.addTile(_this._computeTileBBox(hash, reference), hash);
-        }), operators_1.filter(function (_a) {
-            var _b = _a[0], hash = _b[0], data = _b[1];
-            return !_this._scene.hasReconstruction(data.reconstruction.main_shot, hash);
-        }), operators_1.map(function (_a) {
-            var _b = _a[0], hash = _b[0], data = _b[1], reference = _a[1];
-            return [
-                data,
-                _this._createTransform(data.data, reference),
-                _this._computeOriginalPosition(data.data, reference),
-                hash
-            ];
-        }))
-            .subscribe(function (_a) {
-            var data = _a[0], transform = _a[1], position = _a[2], hash = _a[3];
-            _this._scene.addReconstruction(data.reconstruction, transform, position, !!data.data.mergeCC ? data.data.mergeCC.toString() : "", hash);
-        });
-        this._cameraVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.camerasVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setCameraVisibility(visible);
-        });
-        this._pointVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.pointsVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setPointVisibility(visible);
-        });
-        this._positionVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.positionsVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setPositionVisibility(visible);
-        });
-        this._tileVisibilitySubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.tilesVisible;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visible) {
-            _this._scene.setTileVisibility(visible);
-        });
-        this._visualizeConnectedComponentSubscription = this._configuration$.pipe(operators_1.map(function (configuration) {
-            return configuration.connectedComponents;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (visualize) {
-            _this._scene.setConnectedComponentVisualization(visualize);
-        });
-        this._uncacheSubscription = hash$
-            .subscribe(function (hash) {
-            var keepHashes = _this._adjacentComponent(hash, 4);
-            _this._scene.uncache(keepHashes);
-            _this._cache.uncache(keepHashes);
-        });
-        this._moveSubscription = this._navigator.playService.playing$.pipe(operators_1.switchMap(function (playing) {
-            return playing ?
-                rxjs_1.empty() :
-                _this._container.mouseService.dblClick$;
-        }), operators_1.withLatestFrom(this._container.renderService.renderCamera$), operators_1.switchMap(function (_a) {
-            var event = _a[0], render = _a[1];
-            var element = _this._container.element;
-            var _b = _this._viewportCoords.canvasPosition(event, element), canvasX = _b[0], canvasY = _b[1];
-            var viewport = _this._viewportCoords.canvasToViewport(canvasX, canvasY, element);
-            var key = _this._scene.intersectObjects(viewport, render.perspective);
-            return !!key ?
-                _this._navigator.moveToKey$(key).pipe(operators_1.catchError(function () {
-                    return rxjs_1.empty();
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe();
-        this._renderSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            var scene = _this._scene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: scene.needsRender,
-                    render: scene.render.bind(scene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        }))
-            .subscribe(this._container.glRenderer.render$);
-    };
-    SpatialDataComponent.prototype._deactivate = function () {
-        var _this = this;
-        this._cache.uncache();
-        this._scene.uncache();
-        this._addSubscription.unsubscribe();
-        this._cameraVisibilitySubscription.unsubscribe();
-        this._earthControlsSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._pointVisibilitySubscription.unsubscribe();
-        this._positionVisibilitySubscription.unsubscribe();
-        this._renderSubscription.unsubscribe();
-        this._tileVisibilitySubscription.unsubscribe();
-        this._uncacheSubscription.unsubscribe();
-        this._visualizeConnectedComponentSubscription.unsubscribe();
-        this._navigator.stateService.state$.pipe(operators_1.first())
-            .subscribe(function (state) {
-            if (state === State_1.default.Earth) {
-                _this._navigator.stateService.traverse();
-            }
-        });
-    };
-    SpatialDataComponent.prototype._getDefaultConfiguration = function () {
-        return { camerasVisible: false, pointsVisible: true, positionsVisible: false, tilesVisible: false };
-    };
-    SpatialDataComponent.prototype._adjacentComponent = function (hash, depth) {
-        var hashSet = new Set();
-        hashSet.add(hash);
-        this._adjacentComponentRecursive(hashSet, [hash], 0, depth);
-        return this._setToArray(hashSet);
-    };
-    SpatialDataComponent.prototype._adjacentComponentRecursive = function (hashSet, currentHashes, currentDepth, maxDepth) {
-        if (currentDepth === maxDepth) {
-            return;
-        }
-        var neighbours = [];
-        for (var _i = 0, currentHashes_1 = currentHashes; _i < currentHashes_1.length; _i++) {
-            var hash = currentHashes_1[_i];
-            var hashNeighbours = geohash.neighbours(hash);
-            for (var direction in hashNeighbours) {
-                if (!hashNeighbours.hasOwnProperty(direction)) {
-                    continue;
-                }
-                neighbours.push(hashNeighbours[direction]);
-            }
-        }
-        var newHashes = [];
-        for (var _a = 0, neighbours_1 = neighbours; _a < neighbours_1.length; _a++) {
-            var neighbour = neighbours_1[_a];
-            if (!hashSet.has(neighbour)) {
-                hashSet.add(neighbour);
-                newHashes.push(neighbour);
-            }
-        }
-        this._adjacentComponentRecursive(hashSet, newHashes, currentDepth + 1, maxDepth);
-    };
-    SpatialDataComponent.prototype._computeOriginalPosition = function (data, reference) {
-        return this._geoCoords.geodeticToEnu(data.originalLat, data.originalLon, data.alt, reference.lat, reference.lon, reference.alt);
-    };
-    SpatialDataComponent.prototype._computeTileBBox = function (hash, reference) {
-        var bounds = geohash.bounds(hash);
-        var sw = this._geoCoords.geodeticToEnu(bounds.sw.lat, bounds.sw.lon, 0, reference.lat, reference.lon, reference.alt);
-        var ne = this._geoCoords.geodeticToEnu(bounds.ne.lat, bounds.ne.lon, 0, reference.lat, reference.lon, reference.alt);
-        return [sw, ne];
-    };
-    SpatialDataComponent.prototype._createTransform = function (data, reference) {
-        var translation = Geo_1.Geo.computeTranslation({ alt: data.alt, lat: data.lat, lon: data.lon }, data.rotation, reference);
-        var transform = new Geo_1.Transform(data.orientation, data.width, data.height, data.focal, data.scale, data.gpano, data.rotation, translation, undefined, undefined, data.k1, data.k2, data.cameraProjection);
-        return transform;
-    };
-    SpatialDataComponent.prototype._computeTiles = function (hash, direction) {
-        var hashSet = new Set();
-        var directions = ["n", "ne", "e", "se", "s", "sw", "w", "nw"];
-        this._computeTilesRecursive(hashSet, hash, direction, directions, 0, 2);
-        return this._setToArray(hashSet);
-    };
-    SpatialDataComponent.prototype._computeTilesRecursive = function (hashSet, currentHash, direction, directions, currentDepth, maxDepth) {
-        hashSet.add(currentHash);
-        if (currentDepth === maxDepth) {
-            return;
-        }
-        var neighbours = geohash.neighbours(currentHash);
-        var directionIndex = directions.indexOf(direction);
-        var length = directions.length;
-        var directionNeighbours = [
-            neighbours[directions[this._modulo((directionIndex - 1), length)]],
-            neighbours[direction],
-            neighbours[directions[this._modulo((directionIndex + 1), length)]],
-        ];
-        for (var _i = 0, directionNeighbours_1 = directionNeighbours; _i < directionNeighbours_1.length; _i++) {
-            var directionNeighbour = directionNeighbours_1[_i];
-            this._computeTilesRecursive(hashSet, directionNeighbour, direction, directions, currentDepth + 1, maxDepth);
-        }
-    };
-    SpatialDataComponent.prototype._modulo = function (a, n) {
-        return ((a % n) + n) % n;
-    };
-    SpatialDataComponent.prototype._setToArray = function (s) {
-        var a = [];
-        s.forEach(function (value) {
-            a.push(value);
-        });
-        return a;
-    };
-    SpatialDataComponent.componentName = "spatialData";
-    return SpatialDataComponent;
-}(Component_1.Component));
-exports.SpatialDataComponent = SpatialDataComponent;
-Component_1.ComponentService.register(SpatialDataComponent);
-exports.default = SpatialDataComponent;
-
-},{"../../Component":275,"../../Geo":278,"../../Render":281,"../../state/State":413,"../../viewer/PlayService":443,"latlon-geohash":21,"rxjs":27,"rxjs/operators":225}],342:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var SpatialDataScene = /** @class */ (function () {
-    function SpatialDataScene(configuration, scene, raycaster) {
-        this._scene = !!scene ? scene : new THREE.Scene();
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster(undefined, undefined, 0.8);
-        this._connectedComponentColors = {};
-        this._needsRender = false;
-        this._interactiveObjects = [];
-        this._reconstructions = {};
-        this._tiles = {};
-        this._camerasVisible = configuration.camerasVisible;
-        this._pointsVisible = configuration.pointsVisible;
-        this._positionsVisible = configuration.positionsVisible;
-        this._tilesVisible = configuration.tilesVisible;
-        this._visualizeConnectedComponents = configuration.connectedComponents;
-    }
-    Object.defineProperty(SpatialDataScene.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    SpatialDataScene.prototype.addReconstruction = function (reconstruction, transform, originalPosition, connectedComponent, hash) {
-        if (!(hash in this._reconstructions)) {
-            this._reconstructions[hash] = {
-                cameraKeys: {},
-                cameras: new THREE.Object3D(),
-                connectedComponents: {},
-                keys: [],
-                points: new THREE.Object3D(),
-                positions: new THREE.Object3D(),
-            };
-            this._reconstructions[hash].cameras.visible = this._camerasVisible;
-            this._reconstructions[hash].points.visible = this._pointsVisible;
-            this._reconstructions[hash].positions.visible = this._positionsVisible;
-            this._scene.add(this._reconstructions[hash].cameras, this._reconstructions[hash].points, this._reconstructions[hash].positions);
-        }
-        if (!(connectedComponent in this._reconstructions[hash].connectedComponents)) {
-            this._reconstructions[hash].connectedComponents[connectedComponent] = [];
-        }
-        if (transform.hasValidScale) {
-            this._reconstructions[hash].points.add(this._createPoints(reconstruction, transform));
-        }
-        var camera = this._createCamera(transform);
-        this._reconstructions[hash].cameras.add(camera);
-        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
-            var child = _a[_i];
-            this._reconstructions[hash].cameraKeys[child.uuid] = reconstruction.main_shot;
-            this._interactiveObjects.push(child);
-        }
-        this._reconstructions[hash].connectedComponents[connectedComponent].push(camera);
-        var color = this._getColor(connectedComponent, this._visualizeConnectedComponents);
-        this._setCameraColor(color, camera);
-        this._reconstructions[hash].positions.add(this._createPosition(transform, originalPosition));
-        this._reconstructions[hash].keys.push(reconstruction.main_shot);
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.addTile = function (tileBBox, hash) {
-        if (this.hasTile(hash)) {
-            return;
-        }
-        var sw = tileBBox[0];
-        var ne = tileBBox[1];
-        var geometry = new THREE.Geometry();
-        geometry.vertices.push(new THREE.Vector3().fromArray(sw), new THREE.Vector3(sw[0], ne[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(ne), new THREE.Vector3(ne[0], sw[1], (sw[2] + ne[2]) / 2), new THREE.Vector3().fromArray(sw));
-        var tile = new THREE.Line(geometry, new THREE.LineBasicMaterial());
-        this._tiles[hash] = new THREE.Object3D();
-        this._tiles[hash].visible = this._tilesVisible;
-        this._tiles[hash].add(tile);
-        this._scene.add(this._tiles[hash]);
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.uncache = function (keepHashes) {
-        for (var _i = 0, _a = Object.keys(this._reconstructions); _i < _a.length; _i++) {
-            var hash = _a[_i];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            this._disposeReconstruction(hash);
-        }
-        for (var _b = 0, _c = Object.keys(this._tiles); _b < _c.length; _b++) {
-            var hash = _c[_b];
-            if (!!keepHashes && keepHashes.indexOf(hash) !== -1) {
-                continue;
-            }
-            this._disposeTile(hash);
-        }
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.hasReconstruction = function (key, hash) {
-        return hash in this._reconstructions && this._reconstructions[hash].keys.indexOf(key) !== -1;
-    };
-    SpatialDataScene.prototype.hasTile = function (hash) {
-        return hash in this._tiles;
-    };
-    SpatialDataScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        if (!this._camerasVisible) {
-            return null;
-        }
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._interactiveObjects);
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            for (var hash in this._reconstructions) {
-                if (!this._reconstructions.hasOwnProperty(hash)) {
-                    continue;
-                }
-                if (intersect.object.uuid in this._reconstructions[hash].cameraKeys) {
-                    return this._reconstructions[hash].cameraKeys[intersect.object.uuid];
-                }
-            }
-        }
-        return null;
-    };
-    SpatialDataScene.prototype.setCameraVisibility = function (visible) {
-        if (visible === this._camerasVisible) {
-            return;
-        }
-        for (var hash in this._reconstructions) {
-            if (!this._reconstructions.hasOwnProperty(hash)) {
-                continue;
-            }
-            this._reconstructions[hash].cameras.visible = visible;
-        }
-        this._camerasVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setPointVisibility = function (visible) {
-        if (visible === this._pointsVisible) {
-            return;
-        }
-        for (var hash in this._reconstructions) {
-            if (!this._reconstructions.hasOwnProperty(hash)) {
-                continue;
-            }
-            this._reconstructions[hash].points.visible = visible;
-        }
-        this._pointsVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setPositionVisibility = function (visible) {
-        if (visible === this._positionsVisible) {
-            return;
-        }
-        for (var hash in this._reconstructions) {
-            if (!this._reconstructions.hasOwnProperty(hash)) {
-                continue;
-            }
-            this._reconstructions[hash].positions.visible = visible;
-        }
-        this._positionsVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setTileVisibility = function (visible) {
-        if (visible === this._tilesVisible) {
-            return;
-        }
-        for (var hash in this._tiles) {
-            if (!this._tiles.hasOwnProperty(hash)) {
-                continue;
-            }
-            this._tiles[hash].visible = visible;
-        }
-        this._tilesVisible = visible;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.setConnectedComponentVisualization = function (visualize) {
-        if (visualize === this._visualizeConnectedComponents) {
-            return;
-        }
-        for (var hash in this._reconstructions) {
-            if (!this._reconstructions.hasOwnProperty(hash)) {
-                continue;
-            }
-            var connectedComponents = this._reconstructions[hash].connectedComponents;
-            for (var connectedComponent in connectedComponents) {
-                if (!connectedComponents.hasOwnProperty(connectedComponent)) {
-                    continue;
-                }
-                var color = this._getColor(connectedComponent, visualize);
-                for (var _i = 0, _a = connectedComponents[connectedComponent]; _i < _a.length; _i++) {
-                    var camera = _a[_i];
-                    this._setCameraColor(color, camera);
-                }
-            }
-        }
-        this._visualizeConnectedComponents = visualize;
-        this._needsRender = true;
-    };
-    SpatialDataScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    SpatialDataScene.prototype._arrayToFloatArray = function (a, columns) {
-        var n = a.length;
-        var f = new Float32Array(n * columns);
-        for (var i = 0; i < n; i++) {
-            var item = a[i];
-            var index = 3 * i;
-            f[index + 0] = item[0];
-            f[index + 1] = item[1];
-            f[index + 2] = item[2];
-        }
-        return f;
-    };
-    SpatialDataScene.prototype._createAxis = function (transform) {
-        var north = transform.unprojectBasic([0.5, 0], 0.22);
-        var south = transform.unprojectBasic([0.5, 1], 0.16);
-        var axis = new THREE.BufferGeometry();
-        axis.addAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray([north, south], 3), 3));
-        return new THREE.Line(axis, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createCamera = function (transform) {
-        return !!transform.gpano ?
-            this._createPanoCamera(transform) :
-            this._createPrespectiveCamera(transform);
-    };
-    SpatialDataScene.prototype._createDiagonals = function (transform, depth) {
-        var origin = transform.unprojectBasic([0, 0], 0, true);
-        var topLeft = transform.unprojectBasic([0, 0], depth, true);
-        var topRight = transform.unprojectBasic([1, 0], depth, true);
-        var bottomRight = transform.unprojectBasic([1, 1], depth, true);
-        var bottomLeft = transform.unprojectBasic([0, 1], depth, true);
-        var vertices = [
-            origin, topLeft,
-            origin, topRight,
-            origin, bottomRight,
-            origin, bottomLeft,
-        ];
-        var diagonals = new THREE.BufferGeometry();
-        diagonals.addAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
-        return new THREE.LineSegments(diagonals, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createFrame = function (transform, depth) {
-        var vertices2d = [];
-        vertices2d.push.apply(vertices2d, this._subsample([0, 1], [0, 0], 20));
-        vertices2d.push.apply(vertices2d, this._subsample([0, 0], [1, 0], 20));
-        vertices2d.push.apply(vertices2d, this._subsample([1, 0], [1, 1], 20));
-        var vertices3d = vertices2d
-            .map(function (basic) {
-            return transform.unprojectBasic(basic, depth, true);
-        });
-        var frame = new THREE.BufferGeometry();
-        frame.addAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices3d, 3), 3));
-        return new THREE.Line(frame, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createLatitude = function (basicY, numVertices, transform) {
-        var positions = new Float32Array((numVertices + 1) * 3);
-        for (var i = 0; i <= numVertices; i++) {
-            var position = transform.unprojectBasic([i / numVertices, basicY], 0.16);
-            var index = 3 * i;
-            positions[index + 0] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        var latitude = new THREE.BufferGeometry();
-        latitude.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createLongitude = function (basicX, numVertices, transform) {
-        var positions = new Float32Array((numVertices + 1) * 3);
-        for (var i = 0; i <= numVertices; i++) {
-            var position = transform.unprojectBasic([basicX, i / numVertices], 0.16);
-            var index = 3 * i;
-            positions[index + 0] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        var latitude = new THREE.BufferGeometry();
-        latitude.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        return new THREE.Line(latitude, new THREE.LineBasicMaterial());
-    };
-    SpatialDataScene.prototype._createPanoCamera = function (transform) {
-        var camera = new THREE.Object3D();
-        camera.children.push(this._createAxis(transform));
-        camera.children.push(this._createLatitude(0.5, 10, transform));
-        camera.children.push(this._createLongitude(0, 6, transform));
-        camera.children.push(this._createLongitude(0.25, 6, transform));
-        camera.children.push(this._createLongitude(0.5, 6, transform));
-        camera.children.push(this._createLongitude(0.75, 6, transform));
-        return camera;
-    };
-    SpatialDataScene.prototype._createPoints = function (reconstruction, transform) {
-        var srtInverse = new THREE.Matrix4().getInverse(transform.srt);
-        var points = Object
-            .keys(reconstruction.points)
-            .map(function (key) {
-            return reconstruction.points[key];
-        });
-        var numPoints = points.length;
-        var positions = new Float32Array(numPoints * 3);
-        var colors = new Float32Array(numPoints * 3);
-        for (var i = 0; i < numPoints; i++) {
-            var index = 3 * i;
-            var coords = points[i].coordinates;
-            var point = new THREE.Vector3(coords[0], coords[1], coords[2])
-                .applyMatrix4(srtInverse);
-            positions[index + 0] = point.x;
-            positions[index + 1] = point.y;
-            positions[index + 2] = point.z;
-            var color = points[i].color;
-            colors[index + 0] = color[0] / 255.0;
-            colors[index + 1] = color[1] / 255.0;
-            colors[index + 2] = color[2] / 255.0;
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.addAttribute("color", new THREE.BufferAttribute(colors, 3));
-        var material = new THREE.PointsMaterial({
-            size: 0.1,
-            vertexColors: THREE.VertexColors,
-        });
-        return new THREE.Points(geometry, material);
-    };
-    SpatialDataScene.prototype._createPosition = function (transform, originalPosition) {
-        var computedPosition = transform.unprojectBasic([0, 0], 0);
-        var vertices = [originalPosition, computedPosition];
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(this._arrayToFloatArray(vertices, 3), 3));
-        return new THREE.Line(geometry, new THREE.LineBasicMaterial({ color: new THREE.Color(1, 0, 0) }));
-    };
-    SpatialDataScene.prototype._createPrespectiveCamera = function (transform) {
-        var depth = 0.2;
-        var camera = new THREE.Object3D();
-        camera.children.push(this._createDiagonals(transform, depth));
-        camera.children.push(this._createFrame(transform, depth));
-        return camera;
-    };
-    SpatialDataScene.prototype._disposeCameras = function (hash) {
-        var tileCameras = this._reconstructions[hash].cameras;
-        for (var _i = 0, _a = tileCameras.children.slice(); _i < _a.length; _i++) {
-            var camera = _a[_i];
-            for (var _b = 0, _c = camera.children; _b < _c.length; _b++) {
-                var child = _c[_b];
-                child.geometry.dispose();
-                child.material.dispose();
-                var index = this._interactiveObjects.indexOf(child);
-                if (index !== -1) {
-                    this._interactiveObjects.splice(index, 1);
-                }
-                else {
-                    console.warn("Object does not exist (" + child.id + ") for " + hash);
-                }
-            }
-            tileCameras.remove(camera);
-        }
-        this._scene.remove(tileCameras);
-    };
-    SpatialDataScene.prototype._disposePoints = function (hash) {
-        var tilePoints = this._reconstructions[hash].points;
-        for (var _i = 0, _a = tilePoints.children.slice(); _i < _a.length; _i++) {
-            var points = _a[_i];
-            points.geometry.dispose();
-            points.material.dispose();
-            tilePoints.remove(points);
-        }
-        this._scene.remove(tilePoints);
-    };
-    SpatialDataScene.prototype._disposePositions = function (hash) {
-        var tilePositions = this._reconstructions[hash].positions;
-        for (var _i = 0, _a = tilePositions.children.slice(); _i < _a.length; _i++) {
-            var position = _a[_i];
-            position.geometry.dispose();
-            position.material.dispose();
-            tilePositions.remove(position);
-        }
-        this._scene.remove(tilePositions);
-    };
-    SpatialDataScene.prototype._disposeReconstruction = function (hash) {
-        this._disposeCameras(hash);
-        this._disposePoints(hash);
-        this._disposePositions(hash);
-        delete this._reconstructions[hash];
-    };
-    SpatialDataScene.prototype._disposeTile = function (hash) {
-        var tile = this._tiles[hash];
-        for (var _i = 0, _a = tile.children.slice(); _i < _a.length; _i++) {
-            var line = _a[_i];
-            line.geometry.dispose();
-            line.material.dispose();
-            tile.remove(line);
-        }
-        this._scene.remove(tile);
-        delete this._tiles[hash];
-    };
-    SpatialDataScene.prototype._getColor = function (connectedComponent, visualizeConnectedComponents) {
-        return visualizeConnectedComponents ?
-            this._getConnectedComponentColor(connectedComponent) :
-            "#FFFFFF";
-    };
-    SpatialDataScene.prototype._getConnectedComponentColor = function (connectedComponent) {
-        if (!(connectedComponent in this._connectedComponentColors)) {
-            this._connectedComponentColors[connectedComponent] = this._randomColor();
-        }
-        return this._connectedComponentColors[connectedComponent];
-    };
-    SpatialDataScene.prototype._interpolate = function (a, b, alpha) {
-        return a + alpha * (b - a);
-    };
-    SpatialDataScene.prototype._randomColor = function () {
-        return "hsl(" + Math.floor(360 * Math.random()) + ", 100%, 65%)";
-    };
-    SpatialDataScene.prototype._setCameraColor = function (color, camera) {
-        for (var _i = 0, _a = camera.children; _i < _a.length; _i++) {
-            var child = _a[_i];
-            child.material.color = new THREE.Color(color);
-        }
-    };
-    SpatialDataScene.prototype._subsample = function (p1, p2, subsamples) {
-        if (subsamples < 1) {
-            return [p1, p2];
-        }
-        var samples = [];
-        for (var i = 0; i <= subsamples + 1; i++) {
-            var p = [];
-            for (var j = 0; j < 3; j++) {
-                p.push(this._interpolate(p1[j], p2[j], i / (subsamples + 1)));
-            }
-            samples.push(p);
-        }
-        return samples;
-    };
-    return SpatialDataScene;
-}());
-exports.SpatialDataScene = SpatialDataScene;
-exports.default = SpatialDataScene;
-
-},{"three":226}],343:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var GeometryTagError_1 = require("./error/GeometryTagError");
-exports.GeometryTagError = GeometryTagError_1.GeometryTagError;
-var PointGeometry_1 = require("./geometry/PointGeometry");
-exports.PointGeometry = PointGeometry_1.PointGeometry;
-var RectGeometry_1 = require("./geometry/RectGeometry");
-exports.RectGeometry = RectGeometry_1.RectGeometry;
-var PolygonGeometry_1 = require("./geometry/PolygonGeometry");
-exports.PolygonGeometry = PolygonGeometry_1.PolygonGeometry;
-var OutlineTag_1 = require("./tag/OutlineTag");
-exports.OutlineTag = OutlineTag_1.OutlineTag;
-var SpotTag_1 = require("./tag/SpotTag");
-exports.SpotTag = SpotTag_1.SpotTag;
-var TagDomain_1 = require("./tag/TagDomain");
-exports.TagDomain = TagDomain_1.TagDomain;
-var TagComponent_1 = require("./TagComponent");
-exports.TagComponent = TagComponent_1.TagComponent;
-var TagMode_1 = require("./TagMode");
-exports.TagMode = TagMode_1.TagMode;
-
-},{"./TagComponent":344,"./TagMode":347,"./error/GeometryTagError":351,"./geometry/PointGeometry":353,"./geometry/PolygonGeometry":354,"./geometry/RectGeometry":355,"./tag/OutlineTag":367,"./tag/SpotTag":370,"./tag/TagDomain":372}],344:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var when = require("when");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var Render_1 = require("../../Render");
-/**
- * @class TagComponent
- *
- * @classdesc Component for showing and editing tags with different
- * geometries composed from 2D basic image coordinates (see the
- * {@link Viewer} class documentation for more information about coordinate
- * systems).
- *
- * The `add` method is used for adding new tags or replacing
- * tags already in the set. Tags are removed by id.
- *
- * If a tag already in the set has the same
- * id as one of the tags added, the old tag will be removed and
- * the added tag will take its place.
- *
- * The tag component mode can be set to either be non interactive or
- * to be in creating mode of a certain geometry type.
- *
- * The tag properties can be updated at any time and the change will
- * be visibile immediately.
- *
- * Tags are only relevant to a single image because they are based on
- * 2D basic image coordinates. Tags related to a certain image should
- * be removed when the viewer is moved to another node.
- *
- * To retrive and use the tag component
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>",
- *     { component: { tag: true } });
- *
- * var tagComponent = viewer.getComponent("tag");
- * ```
- */
-var TagComponent = /** @class */ (function (_super) {
-    __extends(TagComponent, _super);
-    /** @ignore */
-    function TagComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._tagDomRenderer = new Component_1.TagDOMRenderer();
-        _this._tagScene = new Component_1.TagScene();
-        _this._tagSet = new Component_1.TagSet();
-        _this._tagCreator = new Component_1.TagCreator(_this, navigator);
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._createHandlers = {
-            "CreatePoint": new Component_1.CreatePointHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "CreatePolygon": new Component_1.CreatePolygonHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "CreateRect": new Component_1.CreateRectHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "CreateRectDrag": new Component_1.CreateRectDragHandler(_this, container, navigator, _this._viewportCoords, _this._tagCreator),
-            "Default": undefined,
-        };
-        _this._editVertexHandler = new Component_1.EditVertexHandler(_this, container, navigator, _this._viewportCoords, _this._tagSet);
-        _this._renderTags$ = _this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
-            var tags = tagSet.getAll();
-            // ensure that tags are always rendered in the same order
-            // to avoid hover tracking problems on first resize.
-            tags.sort(function (t1, t2) {
-                var id1 = t1.tag.id;
-                var id2 = t2.tag.id;
-                if (id1 < id2) {
-                    return -1;
-                }
-                if (id1 > id2) {
-                    return 1;
-                }
-                return 0;
-            });
-            return tags;
-        }), operators_1.share());
-        _this._tagChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
-            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
-                return rxjs_1.merge(tag.tag.changed$, tag.tag.geometryChanged$);
-            }));
-        }), operators_1.share());
-        _this._renderTagGLChanged$ = _this._renderTags$.pipe(operators_1.switchMap(function (tags) {
-            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
-                return tag.glObjectsChanged$;
-            }));
-        }), operators_1.share());
-        _this._createGeometryChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return tag != null ?
-                tag.geometryChanged$ :
-                rxjs_1.empty();
-        }), operators_1.share());
-        _this._createGLObjectsChanged$ = _this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return tag != null ?
-                tag.glObjectsChanged$ :
-                rxjs_1.empty();
-        }), operators_1.share());
-        _this._creatingConfiguration$ = _this._configuration$.pipe(operators_1.distinctUntilChanged(function (c1, c2) {
-            return c1.mode === c2.mode;
-        }, function (configuration) {
-            return {
-                createColor: configuration.createColor,
-                mode: configuration.mode,
-            };
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        _this._creatingConfiguration$
-            .subscribe(function (configuration) {
-            _this.fire(TagComponent.modechanged, configuration.mode);
-        });
-        return _this;
-    }
-    /**
-     * Add tags to the tag set or replace tags in the tag set.
-     *
-     * @description If a tag already in the set has the same
-     * id as one of the tags added, the old tag will be removed
-     * the added tag will take its place.
-     *
-     * @param {Array<Tag>} tags - Tags to add.
-     *
-     * @example ```tagComponent.add([tag1, tag2]);```
-     */
-    TagComponent.prototype.add = function (tags) {
-        var _this = this;
-        if (this._activated) {
-            this._navigator.stateService.currentTransform$.pipe(operators_1.first())
-                .subscribe(function (transform) {
-                _this._tagSet.add(tags, transform);
-                var renderTags = tags
-                    .map(function (tag) {
-                    return _this._tagSet.get(tag.id);
-                });
-                _this._tagScene.add(renderTags);
-            });
-        }
-        else {
-            this._tagSet.addDeactivated(tags);
-        }
-    };
-    /**
-     * Change the current tag mode.
-     *
-     * @description Change the tag mode to one of the create modes for creating new geometries.
-     *
-     * @param {TagMode} mode - New tag mode.
-     *
-     * @fires TagComponent#modechanged
-     *
-     * @example ```tagComponent.changeMode(Mapillary.TagComponent.TagMode.CreateRect);```
-     */
-    TagComponent.prototype.changeMode = function (mode) {
-        this.configure({ mode: mode });
-    };
-    /**
-     * Returns the tag in the tag set with the specified id, or
-     * undefined if the id matches no tag.
-     *
-     * @param {string} tagId - Id of the tag.
-     *
-     * @example ```var tag = tagComponent.get("tagId");```
-     */
-    TagComponent.prototype.get = function (tagId) {
-        if (this._activated) {
-            var renderTag = this._tagSet.get(tagId);
-            return renderTag !== undefined ? renderTag.tag : undefined;
-        }
-        else {
-            return this._tagSet.getDeactivated(tagId);
-        }
-    };
-    /**
-     * Returns an array of all tags.
-     *
-     * @example ```var tags = tagComponent.getAll();```
-     */
-    TagComponent.prototype.getAll = function () {
-        if (this.activated) {
-            return this._tagSet
-                .getAll()
-                .map(function (renderTag) {
-                return renderTag.tag;
-            });
-        }
-        else {
-            return this._tagSet.getAllDeactivated();
-        }
-    };
-    /**
-     * Returns an array of tag ids for tags that contain the specified point.
-     *
-     * @description The pixel point must lie inside the polygon or rectangle
-     * of an added tag for the tag id to be returned. Tag ids for
-     * tags that do not have a fill will also be returned if the point is inside
-     * the geometry of the tag. Tags with point geometries can not be retrieved.
-     *
-     * No tag ids will be returned for polygons rendered in cropped panoramas or
-     * rectangles rendered in panoramas.
-     *
-     * Notice that the pixelPoint argument requires x, y coordinates from pixel space.
-     *
-     * With this function, you can use the coordinates provided by mouse
-     * events to get information out of the tag component.
-     *
-     * If no tag at exist the pixel point, an empty array will be returned.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates on the viewer element.
-     * @returns {Array<string>} Ids of the tags that contain the specified pixel point.
-     *
-     * @example
-     * ```
-     * tagComponent.getTagIdsAt([100, 100])
-     *     .then((tagIds) => { console.log(tagIds); });
-     * ```
-     */
-    TagComponent.prototype.getTagIdsAt = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.renderCamera$.pipe(operators_1.first(), operators_1.map(function (render) {
-                var viewport = _this._viewportCoords
-                    .canvasToViewport(pixelPoint[0], pixelPoint[1], _this._container.element);
-                var ids = _this._tagScene.intersectObjects(viewport, render.perspective);
-                return ids;
-            }))
-                .subscribe(function (ids) {
-                resolve(ids);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Check if a tag exist in the tag set.
-     *
-     * @param {string} tagId - Id of the tag.
-     *
-     * @example ```var tagExists = tagComponent.has("tagId");```
-     */
-    TagComponent.prototype.has = function (tagId) {
-        return this._activated ? this._tagSet.has(tagId) : this._tagSet.hasDeactivated(tagId);
-    };
-    /**
-     * Remove tags with the specified ids from the tag set.
-     *
-     * @param {Array<string>} tagIds - Ids for tags to remove.
-     *
-     * @example ```tagComponent.remove(["id-1", "id-2"]);```
-     */
-    TagComponent.prototype.remove = function (tagIds) {
-        if (this._activated) {
-            this._tagSet.remove(tagIds);
-            this._tagScene.remove(tagIds);
-        }
-        else {
-            this._tagSet.removeDeactivated(tagIds);
-        }
-    };
-    /**
-     * Remove all tags from the tag set.
-     *
-     * @example ```tagComponent.removeAll();```
-     */
-    TagComponent.prototype.removeAll = function () {
-        if (this._activated) {
-            this._tagSet.removeAll();
-            this._tagScene.removeAll();
-        }
-        else {
-            this._tagSet.removeAllDeactivated();
-        }
-    };
-    TagComponent.prototype._activate = function () {
-        var _this = this;
-        this._editVertexHandler.enable();
-        var handlerGeometryCreated$ = rxjs_1.from(Object.keys(this._createHandlers)).pipe(operators_1.map(function (key) {
-            return _this._createHandlers[key];
-        }), operators_1.filter(function (handler) {
-            return !!handler;
-        }), operators_1.mergeMap(function (handler) {
-            return handler.geometryCreated$;
-        }), operators_1.share());
-        this._fireGeometryCreatedSubscription = handlerGeometryCreated$
-            .subscribe(function (geometry) {
-            _this.fire(TagComponent.geometrycreated, geometry);
-        });
-        this._fireCreateGeometryEventSubscription = this._tagCreator.tag$.pipe(operators_1.skipWhile(function (tag) {
-            return tag == null;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (tag) {
-            var eventType = tag != null ?
-                TagComponent.creategeometrystart :
-                TagComponent.creategeometryend;
-            _this.fire(eventType, _this);
-        });
-        this._handlerStopCreateSubscription = handlerGeometryCreated$
-            .subscribe(function () {
-            _this.changeMode(Component_1.TagMode.Default);
-        });
-        this._handlerEnablerSubscription = this._creatingConfiguration$
-            .subscribe(function (configuration) {
-            _this._disableCreateHandlers();
-            var mode = Component_1.TagMode[configuration.mode];
-            var handler = _this._createHandlers[mode];
-            if (!!handler) {
-                handler.enable();
-            }
-        });
-        this._fireTagsChangedSubscription = this._renderTags$
-            .subscribe(function (tags) {
-            _this.fire(TagComponent.tagschanged, _this);
-        });
-        this._stopCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return tag != null ?
-                tag.aborted$.pipe(operators_1.map(function (t) { return null; })) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function () { _this.changeMode(Component_1.TagMode.Default); });
-        this._setGLCreateTagSubscription = this._tagCreator.tag$
-            .subscribe(function (tag) {
-            if (_this._tagScene.hasCreateTag()) {
-                _this._tagScene.removeCreateTag();
-            }
-            if (tag != null) {
-                _this._tagScene.addCreateTag(tag);
-            }
-        });
-        this._createGLObjectsChangedSubscription = this._createGLObjectsChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.updateCreateTagObjects(tag);
-        });
-        this._updateGLObjectsSubscription = this._renderTagGLChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.updateObjects(tag);
-        });
-        this._updateTagSceneSubscription = this._tagChanged$
-            .subscribe(function (tag) {
-            _this._tagScene.update();
-        });
-        this._domSubscription = rxjs_1.combineLatest(this._renderTags$.pipe(operators_1.startWith([]), operators_1.tap(function (tags) {
-            _this._container.domRenderer.render$.next({
-                name: _this._name,
-                vnode: _this._tagDomRenderer.clear(),
-            });
-        })), this._container.renderService.renderCamera$, this._container.spriteService.spriteAtlas$, this._container.renderService.size$, this._tagChanged$.pipe(operators_1.startWith(null)), rxjs_1.merge(this._tagCreator.tag$, this._createGeometryChanged$).pipe(operators_1.startWith(null))).pipe(operators_1.map(function (_a) {
-            var renderTags = _a[0], rc = _a[1], atlas = _a[2], size = _a[3], tag = _a[4], ct = _a[5];
-            return {
-                name: _this._name,
-                vnode: _this._tagDomRenderer.render(renderTags, ct, atlas, rc.perspective, size),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._glSubscription = this._navigator.stateService.currentState$.pipe(operators_1.map(function (frame) {
-            var tagScene = _this._tagScene;
-            return {
-                name: _this._name,
-                render: {
-                    frameId: frame.id,
-                    needsRender: tagScene.needsRender,
-                    render: tagScene.render.bind(tagScene),
-                    stage: Render_1.GLRenderStage.Foreground,
-                },
-            };
-        }))
-            .subscribe(this._container.glRenderer.render$);
-        this._navigator.stateService.currentTransform$.pipe(operators_1.first())
-            .subscribe(function (transform) {
-            _this._tagSet.activate(transform);
-            _this._tagScene.add(_this._tagSet.getAll());
-        });
-    };
-    TagComponent.prototype._deactivate = function () {
-        this._editVertexHandler.disable();
-        this._disableCreateHandlers();
-        this._tagScene.clear();
-        this._tagSet.deactivate();
-        this._tagCreator.delete$.next(null);
-        this._updateGLObjectsSubscription.unsubscribe();
-        this._updateTagSceneSubscription.unsubscribe();
-        this._stopCreateSubscription.unsubscribe();
-        this._setGLCreateTagSubscription.unsubscribe();
-        this._createGLObjectsChangedSubscription.unsubscribe();
-        this._domSubscription.unsubscribe();
-        this._glSubscription.unsubscribe();
-        this._fireCreateGeometryEventSubscription.unsubscribe();
-        this._fireGeometryCreatedSubscription.unsubscribe();
-        this._fireTagsChangedSubscription.unsubscribe();
-        this._handlerStopCreateSubscription.unsubscribe();
-        this._handlerEnablerSubscription.unsubscribe();
-        this._container.element.classList.remove("component-tag-create");
-    };
-    TagComponent.prototype._getDefaultConfiguration = function () {
-        return {
-            createColor: 0xFFFFFF,
-            mode: Component_1.TagMode.Default,
-        };
-    };
-    TagComponent.prototype._disableCreateHandlers = function () {
-        var createHandlers = this._createHandlers;
-        for (var key in createHandlers) {
-            if (!createHandlers.hasOwnProperty(key)) {
-                continue;
-            }
-            var handler = createHandlers[key];
-            if (!!handler) {
-                handler.disable();
-            }
-        }
-    };
-    /** @inheritdoc */
-    TagComponent.componentName = "tag";
-    /**
-     * Event fired when an interaction to create a geometry ends.
-     *
-     * @description A create interaction can by a geometry being created
-     * or by the creation being aborted.
-     *
-     * @event TagComponent#creategeometryend
-     * @type {TagComponent} Tag component.
-     * @example
-     * ```
-     * tagComponent.on("creategeometryend", function(component) {
-     *     console.log(component);
-     * });
-     * ```
-     */
-    TagComponent.creategeometryend = "creategeometryend";
-    /**
-     * Event fired when an interaction to create a geometry starts.
-     *
-     * @description A create interaction starts when the first vertex
-     * is created in the geometry.
-     *
-     * @event TagComponent#creategeometrystart
-     * @type {TagComponent} Tag component.
-     * @example
-     * ```
-     * tagComponent.on("creategeometrystart", function(component) {
-     *     console.log(component);
-     * });
-     * ```
-     */
-    TagComponent.creategeometrystart = "creategeometrystart";
-    /**
-     * Event fired when the create mode is changed.
-     *
-     * @event TagComponent#modechanged
-     * @type {TagMode} Tag mode
-     * @example
-     * ```
-     * tagComponent.on("modechanged", function(mode) {
-     *     console.log(mode);
-     * });
-     * ```
-     */
-    TagComponent.modechanged = "modechanged";
-    /**
-     * Event fired when a geometry has been created.
-     *
-     * @event TagComponent#geometrycreated
-     * @type {Geometry} Created geometry.
-     * @example
-     * ```
-     * tagComponent.on("geometrycreated", function(geometry) {
-     *     console.log(geometry);
-     * });
-     * ```
-     */
-    TagComponent.geometrycreated = "geometrycreated";
-    /**
-     * Event fired when the tags collection has changed.
-     *
-     * @event TagComponent#tagschanged
-     * @type {TagComponent} Tag component.
-     * @example
-     * ```
-     * tagComponent.on("tagschanged", function(component) {
-     *     console.log(component.getAll());
-     * });
-     * ```
-     */
-    TagComponent.tagschanged = "tagschanged";
-    return TagComponent;
-}(Component_1.Component));
-exports.TagComponent = TagComponent;
-Component_1.ComponentService.register(TagComponent);
-exports.default = TagComponent;
-
-},{"../../Component":275,"../../Geo":278,"../../Render":281,"rxjs":27,"rxjs/operators":225,"when":272}],345:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../Component");
-var TagCreator = /** @class */ (function () {
-    function TagCreator(component, navigator) {
-        this._component = component;
-        this._navigator = navigator;
-        this._tagOperation$ = new rxjs_1.Subject();
-        this._createPolygon$ = new rxjs_1.Subject();
-        this._createRect$ = new rxjs_1.Subject();
-        this._delete$ = new rxjs_1.Subject();
-        this._tag$ = this._tagOperation$.pipe(operators_1.scan(function (tag, operation) {
-            return operation(tag);
-        }, null), operators_1.share());
-        this._createRect$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var coord = _a[0], conf = _a[1], transform = _a[2];
-            return function (tag) {
-                var geometry = new Component_1.RectGeometry([
-                    coord[0],
-                    coord[1],
-                    coord[0],
-                    coord[1],
-                ]);
-                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
-            };
-        }))
-            .subscribe(this._tagOperation$);
-        this._createPolygon$.pipe(operators_1.withLatestFrom(this._component.configuration$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var coord = _a[0], conf = _a[1], transform = _a[2];
-            return function (tag) {
-                var geometry = new Component_1.PolygonGeometry([
-                    [coord[0], coord[1]],
-                    [coord[0], coord[1]],
-                    [coord[0], coord[1]],
-                ]);
-                return new Component_1.OutlineCreateTag(geometry, { color: conf.createColor }, transform);
-            };
-        }))
-            .subscribe(this._tagOperation$);
-        this._delete$.pipe(operators_1.map(function () {
-            return function (tag) {
-                return null;
-            };
-        }))
-            .subscribe(this._tagOperation$);
-    }
-    Object.defineProperty(TagCreator.prototype, "createRect$", {
-        get: function () {
-            return this._createRect$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "createPolygon$", {
-        get: function () {
-            return this._createPolygon$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "delete$", {
-        get: function () {
-            return this._delete$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagCreator.prototype, "tag$", {
-        get: function () {
-            return this._tag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return TagCreator;
-}());
-exports.TagCreator = TagCreator;
-exports.default = TagCreator;
-
-},{"../../Component":275,"rxjs":27,"rxjs/operators":225}],346:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var TagDOMRenderer = /** @class */ (function () {
-    function TagDOMRenderer() {
-    }
-    TagDOMRenderer.prototype.render = function (tags, createTag, atlas, camera, size) {
-        var vNodes = [];
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            vNodes = vNodes.concat(tag.getDOMObjects(atlas, camera, size));
-        }
-        if (createTag != null) {
-            vNodes = vNodes.concat(createTag.getDOMObjects(camera, size));
-        }
-        return vd.h("div.TagContainer", {}, vNodes);
-    };
-    TagDOMRenderer.prototype.clear = function () {
-        return vd.h("div", {}, []);
-    };
-    return TagDOMRenderer;
-}());
-exports.TagDOMRenderer = TagDOMRenderer;
-
-},{"virtual-dom":231}],347:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for tag modes
- * @enum {number}
- * @readonly
- * @description Modes for the interaction in the tag component.
- */
-var TagMode;
-(function (TagMode) {
-    /**
-     * Disables creating tags.
-     */
-    TagMode[TagMode["Default"] = 0] = "Default";
-    /**
-     * Create a point geometry through a click.
-     */
-    TagMode[TagMode["CreatePoint"] = 1] = "CreatePoint";
-    /**
-     * Create a polygon geometry through clicks.
-     */
-    TagMode[TagMode["CreatePolygon"] = 2] = "CreatePolygon";
-    /**
-     * Create a rect geometry through clicks.
-     */
-    TagMode[TagMode["CreateRect"] = 3] = "CreateRect";
-    /**
-     * Create a rect geometry through drag.
-     *
-     * @description Claims the mouse which results in mouse handlers like
-     * drag pan and scroll zoom becoming inactive.
-     */
-    TagMode[TagMode["CreateRectDrag"] = 4] = "CreateRectDrag";
-})(TagMode = exports.TagMode || (exports.TagMode = {}));
-exports.default = TagMode;
-
-},{}],348:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var TagOperation;
-(function (TagOperation) {
-    TagOperation[TagOperation["None"] = 0] = "None";
-    TagOperation[TagOperation["Centroid"] = 1] = "Centroid";
-    TagOperation[TagOperation["Vertex"] = 2] = "Vertex";
-})(TagOperation = exports.TagOperation || (exports.TagOperation = {}));
-exports.default = TagOperation;
-
-},{}],349:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var TagScene = /** @class */ (function () {
-    function TagScene(scene, raycaster) {
-        this._createTag = null;
-        this._needsRender = false;
-        this._raycaster = !!raycaster ? raycaster : new THREE.Raycaster();
-        this._scene = !!scene ? scene : new THREE.Scene();
-        this._objectTags = {};
-        this._retrievableObjects = [];
-        this._tags = {};
-    }
-    Object.defineProperty(TagScene.prototype, "needsRender", {
-        get: function () {
-            return this._needsRender;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    TagScene.prototype.add = function (tags) {
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            if (tag.tag.id in this._tags) {
-                this._remove(tag.tag.id);
-            }
-            this._add(tag);
-        }
-        this._needsRender = true;
-    };
-    TagScene.prototype.addCreateTag = function (tag) {
-        for (var _i = 0, _a = tag.glObjects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.add(object);
-        }
-        this._createTag = { tag: tag, objects: tag.glObjects };
-        this._needsRender = true;
-    };
-    TagScene.prototype.clear = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            this._remove(id);
-        }
-        this._needsRender = false;
-    };
-    TagScene.prototype.get = function (id) {
-        return this.has(id) ? this._tags[id].tag : undefined;
-    };
-    TagScene.prototype.has = function (id) {
-        return id in this._tags;
-    };
-    TagScene.prototype.hasCreateTag = function () {
-        return this._createTag != null;
-    };
-    TagScene.prototype.intersectObjects = function (_a, camera) {
-        var viewportX = _a[0], viewportY = _a[1];
-        this._raycaster.setFromCamera(new THREE.Vector2(viewportX, viewportY), camera);
-        var intersects = this._raycaster.intersectObjects(this._retrievableObjects);
-        var intersectedIds = [];
-        for (var _i = 0, intersects_1 = intersects; _i < intersects_1.length; _i++) {
-            var intersect = intersects_1[_i];
-            if (intersect.object.uuid in this._objectTags) {
-                intersectedIds.push(this._objectTags[intersect.object.uuid]);
-            }
-        }
-        return intersectedIds;
-    };
-    TagScene.prototype.remove = function (ids) {
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            this._remove(id);
-        }
-        this._needsRender = true;
-    };
-    TagScene.prototype.removeAll = function () {
-        for (var _i = 0, _a = Object.keys(this._tags); _i < _a.length; _i++) {
-            var id = _a[_i];
-            this._remove(id);
-        }
-        this._needsRender = true;
-    };
-    TagScene.prototype.removeCreateTag = function () {
-        if (this._createTag == null) {
-            return;
-        }
-        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        this._createTag.tag.dispose();
-        this._createTag = null;
-        this._needsRender = true;
-    };
-    TagScene.prototype.render = function (perspectiveCamera, renderer) {
-        renderer.render(this._scene, perspectiveCamera);
-        this._needsRender = false;
-    };
-    TagScene.prototype.update = function () {
-        this._needsRender = true;
-    };
-    TagScene.prototype.updateCreateTagObjects = function (tag) {
-        if (this._createTag.tag !== tag) {
-            throw new Error("Create tags do not have the same reference.");
-        }
-        for (var _i = 0, _a = this._createTag.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        for (var _b = 0, _c = tag.glObjects; _b < _c.length; _b++) {
-            var object = _c[_b];
-            this._scene.add(object);
-        }
-        this._createTag.objects = tag.glObjects;
-        this._needsRender = true;
-    };
-    TagScene.prototype.updateObjects = function (tag) {
-        var id = tag.tag.id;
-        if (this._tags[id].tag !== tag) {
-            throw new Error("Tags do not have the same reference.");
-        }
-        var tagObjects = this._tags[id];
-        this._removeObjects(tagObjects);
-        delete this._tags[id];
-        this._add(tag);
-        this._needsRender = true;
-    };
-    TagScene.prototype._add = function (tag) {
-        var id = tag.tag.id;
-        var tagObjects = { tag: tag, objects: [], retrievableObjects: [] };
-        this._tags[id] = tagObjects;
-        for (var _i = 0, _a = tag.getGLObjects(); _i < _a.length; _i++) {
-            var object = _a[_i];
-            tagObjects.objects.push(object);
-            this._scene.add(object);
-        }
-        for (var _b = 0, _c = tag.getRetrievableObjects(); _b < _c.length; _b++) {
-            var retrievableObject = _c[_b];
-            tagObjects.retrievableObjects.push(retrievableObject);
-            this._retrievableObjects.push(retrievableObject);
-            this._objectTags[retrievableObject.uuid] = tag.tag.id;
-        }
-    };
-    TagScene.prototype._remove = function (id) {
-        var tagObjects = this._tags[id];
-        this._removeObjects(tagObjects);
-        tagObjects.tag.dispose();
-        delete this._tags[id];
-    };
-    TagScene.prototype._removeObjects = function (tagObjects) {
-        for (var _i = 0, _a = tagObjects.objects; _i < _a.length; _i++) {
-            var object = _a[_i];
-            this._scene.remove(object);
-        }
-        for (var _b = 0, _c = tagObjects.retrievableObjects; _b < _c.length; _b++) {
-            var retrievableObject = _c[_b];
-            var index = this._retrievableObjects.indexOf(retrievableObject);
-            if (index !== -1) {
-                this._retrievableObjects.splice(index, 1);
-            }
-        }
-    };
-    return TagScene;
-}());
-exports.TagScene = TagScene;
-exports.default = TagScene;
-
-},{"three":226}],350:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../Component");
-var TagSet = /** @class */ (function () {
-    function TagSet() {
-        this._active = false;
-        this._hash = {};
-        this._hashDeactivated = {};
-        this._notifyChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(TagSet.prototype, "active", {
-        get: function () {
-            return this._active;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TagSet.prototype, "changed$", {
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    TagSet.prototype.activate = function (transform) {
-        if (this._active) {
-            return;
-        }
-        for (var id in this._hashDeactivated) {
-            if (!this._hashDeactivated.hasOwnProperty(id)) {
-                continue;
-            }
-            var tag = this._hashDeactivated[id];
-            this._add(tag, transform);
-        }
-        this._hashDeactivated = {};
-        this._active = true;
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.deactivate = function () {
-        if (!this._active) {
-            return;
-        }
-        for (var id in this._hash) {
-            if (!this._hash.hasOwnProperty(id)) {
-                continue;
-            }
-            this._hashDeactivated[id] = this._hash[id].tag;
-        }
-        this._hash = {};
-        this._active = false;
-    };
-    TagSet.prototype.add = function (tags, transform) {
-        this._assertActivationState(true);
-        for (var _i = 0, tags_1 = tags; _i < tags_1.length; _i++) {
-            var tag = tags_1[_i];
-            this._add(tag, transform);
-        }
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.addDeactivated = function (tags) {
-        this._assertActivationState(false);
-        for (var _i = 0, tags_2 = tags; _i < tags_2.length; _i++) {
-            var tag = tags_2[_i];
-            if (!(tag instanceof Component_1.OutlineTag || tag instanceof Component_1.SpotTag)) {
-                throw new Error("Tag type not supported");
-            }
-            this._hashDeactivated[tag.id] = tag;
-        }
-    };
-    TagSet.prototype.get = function (id) {
-        return this.has(id) ? this._hash[id] : undefined;
-    };
-    TagSet.prototype.getAll = function () {
-        var hash = this._hash;
-        return Object.keys(hash)
-            .map(function (id) {
-            return hash[id];
-        });
-    };
-    TagSet.prototype.getAllDeactivated = function () {
-        var hashDeactivated = this._hashDeactivated;
-        return Object.keys(hashDeactivated)
-            .map(function (id) {
-            return hashDeactivated[id];
-        });
-    };
-    TagSet.prototype.getDeactivated = function (id) {
-        return this.hasDeactivated(id) ? this._hashDeactivated[id] : undefined;
-    };
-    TagSet.prototype.has = function (id) {
-        return id in this._hash;
-    };
-    TagSet.prototype.hasDeactivated = function (id) {
-        return id in this._hashDeactivated;
-    };
-    TagSet.prototype.remove = function (ids) {
-        this._assertActivationState(true);
-        var hash = this._hash;
-        for (var _i = 0, ids_1 = ids; _i < ids_1.length; _i++) {
-            var id = ids_1[_i];
-            if (!(id in hash)) {
-                continue;
-            }
-            delete hash[id];
-        }
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.removeAll = function () {
-        this._assertActivationState(true);
-        this._hash = {};
-        this._notifyChanged$.next(this);
-    };
-    TagSet.prototype.removeAllDeactivated = function () {
-        this._assertActivationState(false);
-        this._hashDeactivated = {};
-    };
-    TagSet.prototype.removeDeactivated = function (ids) {
-        this._assertActivationState(false);
-        var hashDeactivated = this._hashDeactivated;
-        for (var _i = 0, ids_2 = ids; _i < ids_2.length; _i++) {
-            var id = ids_2[_i];
-            if (!(id in hashDeactivated)) {
-                continue;
-            }
-            delete hashDeactivated[id];
-        }
-    };
-    TagSet.prototype._add = function (tag, transform) {
-        if (tag instanceof Component_1.OutlineTag) {
-            this._hash[tag.id] = new Component_1.OutlineRenderTag(tag, transform);
-        }
-        else if (tag instanceof Component_1.SpotTag) {
-            this._hash[tag.id] = new Component_1.SpotRenderTag(tag, transform);
-        }
-        else {
-            throw new Error("Tag type not supported");
-        }
-    };
-    TagSet.prototype._assertActivationState = function (should) {
-        if (should !== this._active) {
-            throw new Error("Tag set not in correct state for operation.");
-        }
-    };
-    return TagSet;
-}());
-exports.TagSet = TagSet;
-exports.default = TagSet;
-
-},{"../../Component":275,"rxjs":27}],351:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Error_1 = require("../../../Error");
-var GeometryTagError = /** @class */ (function (_super) {
-    __extends(GeometryTagError, _super);
-    function GeometryTagError(message) {
-        var _this = _super.call(this, message != null ? message : "The provided geometry value is incorrect") || this;
-        _this.name = "GeometryTagError";
-        return _this;
-    }
-    return GeometryTagError;
-}(Error_1.MapillaryError));
-exports.GeometryTagError = GeometryTagError;
-exports.default = Error_1.MapillaryError;
-
-},{"../../../Error":277}],352:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-/**
- * @class Geometry
- * @abstract
- * @classdesc Represents a geometry.
- */
-var Geometry = /** @class */ (function () {
-    /**
-     * Create a geometry.
-     *
-     * @constructor
-     * @ignore
-     */
-    function Geometry() {
-        this._notifyChanged$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(Geometry.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         *
-         * @description Emits the geometry itself every time the geometry
-         * has changed.
-         *
-         * @returns {Observable<Geometry>} Observable emitting the geometry instance.
-         * @ignore
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Geometry;
-}());
-exports.Geometry = Geometry;
-exports.default = Geometry;
-
-},{"rxjs":27}],353:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../../Component");
-/**
- * @class PointGeometry
- *
- * @classdesc Represents a point geometry in the 2D basic image coordinate system.
- *
- * @example
- * ```
- * var basicPoint = [0.5, 0.7];
- * var pointGeometry = new Mapillary.TagComponent.PointGeometry(basicPoint);
- * ```
- */
-var PointGeometry = /** @class */ (function (_super) {
-    __extends(PointGeometry, _super);
-    /**
-     * Create a point geometry.
-     *
-     * @constructor
-     * @param {Array<number>} point - An array representing the basic coordinates of
-     * the point.
-     *
-     * @throws {GeometryTagError} Point coordinates must be valid basic coordinates.
-     */
-    function PointGeometry(point) {
-        var _this = _super.call(this) || this;
-        var x = point[0];
-        var y = point[1];
-        if (x < 0 || x > 1 || y < 0 || y > 1) {
-            throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-        }
-        _this._point = point.slice();
-        return _this;
-    }
-    Object.defineProperty(PointGeometry.prototype, "point", {
-        /**
-         * Get point property.
-         * @returns {Array<number>} Array representing the basic coordinates of the point.
-         */
-        get: function () {
-            return this._point;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Get the 2D basic coordinates for the centroid of the point, i.e. the 2D
-     * basic coordinates of the point itself.
-     *
-     * @returns {Array<number>} 2D basic coordinates representing the centroid.
-     * @ignore
-     */
-    PointGeometry.prototype.getCentroid2d = function () {
-        return this._point.slice();
-    };
-    /**
-     * Get the 3D world coordinates for the centroid of the point, i.e. the 3D
-     * world coordinates of the point itself.
-     *
-     * @param {Transform} transform - The transform of the node related to the point.
-     * @returns {Array<number>} 3D world coordinates representing the centroid.
-     * @ignore
-     */
-    PointGeometry.prototype.getCentroid3d = function (transform) {
-        return transform.unprojectBasic(this._point, 200);
-    };
-    /**
-     * Set the centroid of the point, i.e. the point coordinates.
-     *
-     * @param {Array<number>} value - The new value of the centroid.
-     * @param {Transform} transform - The transform of the node related to the point.
-     * @ignore
-     */
-    PointGeometry.prototype.setCentroid2d = function (value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        this._point[0] = changed[0];
-        this._point[1] = changed[1];
-        this._notifyChanged$.next(this);
-    };
-    return PointGeometry;
-}(Component_1.Geometry));
-exports.PointGeometry = PointGeometry;
-
-},{"../../../Component":275}],354:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../../Component");
-/**
- * @class PolygonGeometry
- *
- * @classdesc Represents a polygon geometry in the 2D basic image coordinate system.
- * All polygons and holes provided to the constructor needs to be closed.
- *
- * @example
- * ```
- * var basicPolygon = [[0.5, 0.3], [0.7, 0.3], [0.6, 0.5], [0.5, 0.3]];
- * var polygonGeometry = new Mapillary.TagComponent.PolygonGeometry(basicPolygon);
- * ```
- */
-var PolygonGeometry = /** @class */ (function (_super) {
-    __extends(PolygonGeometry, _super);
-    /**
-     * Create a polygon geometry.
-     *
-     * @constructor
-     * @param {Array<Array<number>>} polygon - Array of polygon vertices. Must be closed.
-     * @param {Array<Array<Array<number>>>} [holes] - Array of arrays of hole vertices.
-     * Each array of holes vertices must be closed.
-     *
-     * @throws {GeometryTagError} Polygon coordinates must be valid basic coordinates.
-     */
-    function PolygonGeometry(polygon, holes) {
-        var _this = _super.call(this) || this;
-        var polygonLength = polygon.length;
-        if (polygonLength < 3) {
-            throw new Component_1.GeometryTagError("A polygon must have three or more positions.");
-        }
-        if (polygon[0][0] !== polygon[polygonLength - 1][0] ||
-            polygon[0][1] !== polygon[polygonLength - 1][1]) {
-            throw new Component_1.GeometryTagError("First and last positions must be equivalent.");
-        }
-        _this._polygon = [];
-        for (var _i = 0, polygon_1 = polygon; _i < polygon_1.length; _i++) {
-            var vertex = polygon_1[_i];
-            if (vertex[0] < 0 || vertex[0] > 1 ||
-                vertex[1] < 0 || vertex[1] > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates of polygon must be on the interval [0, 1].");
-            }
-            _this._polygon.push(vertex.slice());
-        }
-        _this._holes = [];
-        if (holes == null) {
-            return _this;
-        }
-        for (var i = 0; i < holes.length; i++) {
-            var hole = holes[i];
-            var holeLength = hole.length;
-            if (holeLength < 3) {
-                throw new Component_1.GeometryTagError("A polygon hole must have three or more positions.");
-            }
-            if (hole[0][0] !== hole[holeLength - 1][0] ||
-                hole[0][1] !== hole[holeLength - 1][1]) {
-                throw new Component_1.GeometryTagError("First and last positions of hole must be equivalent.");
-            }
-            _this._holes.push([]);
-            for (var _a = 0, hole_1 = hole; _a < hole_1.length; _a++) {
-                var vertex = hole_1[_a];
-                if (vertex[0] < 0 || vertex[0] > 1 ||
-                    vertex[1] < 0 || vertex[1] > 1) {
-                    throw new Component_1.GeometryTagError("Basic coordinates of hole must be on the interval [0, 1].");
-                }
-                _this._holes[i].push(vertex.slice());
-            }
-        }
-        return _this;
-    }
-    Object.defineProperty(PolygonGeometry.prototype, "polygon", {
-        /**
-         * Get polygon property.
-         * @returns {Array<Array<number>>} Closed 2d polygon.
-         */
-        get: function () {
-            return this._polygon;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(PolygonGeometry.prototype, "holes", {
-        /**
-         * Get holes property.
-         * @returns {Array<Array<Array<number>>>} Holes of 2d polygon.
-         */
-        get: function () {
-            return this._holes;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Add a vertex to the polygon by appending it after the last vertex.
-     *
-     * @param {Array<number>} vertex - Vertex to add.
-     * @ignore
-     */
-    PolygonGeometry.prototype.addVertex2d = function (vertex) {
-        var clamped = [
-            Math.max(0, Math.min(1, vertex[0])),
-            Math.max(0, Math.min(1, vertex[1])),
-        ];
-        this._polygon.splice(this._polygon.length - 1, 0, clamped);
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     * @ignore
-     */
-    PolygonGeometry.prototype.getVertex2d = function (index) {
-        return this._polygon[index].slice();
-    };
-    /**
-     * Remove a vertex from the polygon.
-     *
-     * @param {number} index - The index of the vertex to remove.
-     * @ignore
-     */
-    PolygonGeometry.prototype.removeVertex2d = function (index) {
-        if (index < 0 ||
-            index >= this._polygon.length ||
-            this._polygon.length < 4) {
-            throw new Component_1.GeometryTagError("Index for removed vertex must be valid.");
-        }
-        if (index > 0 && index < this._polygon.length - 1) {
-            this._polygon.splice(index, 1);
-        }
-        else {
-            this._polygon.splice(0, 1);
-            this._polygon.pop();
-            var closing = this._polygon[0].slice();
-            this._polygon.push(closing);
-        }
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        if (index === 0 || index === this._polygon.length - 1) {
-            this._polygon[0] = changed.slice();
-            this._polygon[this._polygon.length - 1] = changed.slice();
-        }
-        else {
-            this._polygon[index] = changed.slice();
-        }
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.setCentroid2d = function (value, transform) {
-        var xs = this._polygon.map(function (point) { return point[0]; });
-        var ys = this._polygon.map(function (point) { return point[1]; });
-        var minX = Math.min.apply(Math, xs);
-        var maxX = Math.max.apply(Math, xs);
-        var minY = Math.min.apply(Math, ys);
-        var maxY = Math.max.apply(Math, ys);
-        var centroid = this.getCentroid2d();
-        var minTranslationX = -minX;
-        var maxTranslationX = 1 - maxX;
-        var minTranslationY = -minY;
-        var maxTranslationY = 1 - maxY;
-        var translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centroid[0]));
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centroid[1]));
-        for (var _i = 0, _a = this._polygon; _i < _a.length; _i++) {
-            var point = _a[_i];
-            point[0] += translationX;
-            point[1] += translationY;
-        }
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints3d(this._subsample(this._polygon), transform);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._polygon[index], 200);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getVertices2d = function () {
-        return this._polygon.slice();
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getVertices3d = function (transform) {
-        return this._getPoints3d(this._polygon, transform);
-    };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of each hole
-     * of the geometry. Line segments between vertices will possibly be subsampled
-     * resulting in a larger number of points than the total number of vertices.
-     *
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
-     * representing the vertices of each hole of the geometry.
-     * @ignore
-     */
-    PolygonGeometry.prototype.getHolePoints3d = function (transform) {
-        var _this = this;
-        return this._holes
-            .map(function (hole2d) {
-            return _this._getPoints3d(_this._subsample(hole2d), transform);
-        });
-    };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of each hole
-     * of the geometry.
-     *
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<Array<number>>>} Array of hole polygons in 3D world coordinates
-     * representing the vertices of each hole of the geometry.
-     * @ignore
-     */
-    PolygonGeometry.prototype.getHoleVertices3d = function (transform) {
-        var _this = this;
-        return this._holes
-            .map(function (hole2d) {
-            return _this._getPoints3d(hole2d, transform);
-        });
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getCentroid2d = function () {
-        var polygon = this._polygon;
-        var area = 0;
-        var centroidX = 0;
-        var centroidY = 0;
-        for (var i = 0; i < polygon.length - 1; i++) {
-            var xi = polygon[i][0];
-            var yi = polygon[i][1];
-            var xi1 = polygon[i + 1][0];
-            var yi1 = polygon[i + 1][1];
-            var a = xi * yi1 - xi1 * yi;
-            area += a;
-            centroidX += (xi + xi1) * a;
-            centroidY += (yi + yi1) * a;
-        }
-        area /= 2;
-        centroidX /= 6 * area;
-        centroidY /= 6 * area;
-        return [centroidX, centroidY];
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this.getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.get3dDomainTriangles3d = function (transform) {
-        var _this = this;
-        return this._triangulate(this._project(this._polygon, transform), this.getVertices3d(transform), this._holes
-            .map(function (hole2d) {
-            return _this._project(hole2d, transform);
-        }), this.getHoleVertices3d(transform));
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getTriangles3d = function (transform) {
-        var _this = this;
-        if (transform.fullPano) {
-            return this._triangulatePano(this._polygon.slice(), this.holes.slice(), transform);
-        }
-        var points2d = this._project(this._subsample(this._polygon), transform);
-        var points3d = this.getPoints3d(transform);
-        var holes2d = this._holes
-            .map(function (hole) {
-            return _this._project(_this._subsample(hole), transform);
-        });
-        var holes3d = this.getHolePoints3d(transform);
-        return this._triangulate(points2d, points3d, holes2d, holes3d);
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getPoleOfInaccessibility2d = function () {
-        return this._getPoleOfInaccessibility2d(this._polygon.slice());
-    };
-    /** @ignore */
-    PolygonGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
-        var pole2d = this._getPoleOfInaccessibility2d(this._polygon.slice());
-        return transform.unprojectBasic(pole2d, 200);
-    };
-    PolygonGeometry.prototype._getPoints3d = function (points2d, transform) {
-        return points2d
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
-    };
-    return PolygonGeometry;
-}(Component_1.VertexGeometry));
-exports.PolygonGeometry = PolygonGeometry;
-exports.default = PolygonGeometry;
-
-},{"../../../Component":275}],355:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../../Component");
-/**
- * @class RectGeometry
- *
- * @classdesc Represents a rectangle geometry in the 2D basic image coordinate system.
- *
- * @example
- * ```
- * var basicRect = [0.5, 0.3, 0.7, 0.4];
- * var rectGeometry = new Mapillary.TagComponent.RectGeometry(basicRect);
- * ```
- */
-var RectGeometry = /** @class */ (function (_super) {
-    __extends(RectGeometry, _super);
-    /**
-     * Create a rectangle geometry.
-     *
-     * @constructor
-     * @param {Array<number>} rect - An array representing the top-left and bottom-right
-     * corners of the rectangle in basic coordinates. Ordered according to [x0, y0, x1, y1].
-     *
-     * @throws {GeometryTagError} Rectangle coordinates must be valid basic coordinates.
-     */
-    function RectGeometry(rect) {
-        var _this = _super.call(this) || this;
-        if (rect[1] > rect[3]) {
-            throw new Component_1.GeometryTagError("Basic Y coordinates values can not be inverted.");
-        }
-        for (var _i = 0, rect_1 = rect; _i < rect_1.length; _i++) {
-            var coord = rect_1[_i];
-            if (coord < 0 || coord > 1) {
-                throw new Component_1.GeometryTagError("Basic coordinates must be on the interval [0, 1].");
-            }
-        }
-        _this._anchorIndex = undefined;
-        _this._rect = rect.slice(0, 4);
-        _this._inverted = _this._rect[0] > _this._rect[2];
-        return _this;
-    }
-    Object.defineProperty(RectGeometry.prototype, "anchorIndex", {
-        /**
-         * Get anchor index property.
-         *
-         * @returns {number} Index representing the current anchor property if
-         * achoring indexing has been initialized. If anchor indexing has not been
-         * initialized or has been terminated undefined will be returned.
-         * @ignore
-         */
-        get: function () {
-            return this._anchorIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RectGeometry.prototype, "inverted", {
-        /**
-         * Get inverted property.
-         *
-         * @returns {boolean} Boolean determining whether the rect geometry is
-         * inverted. For panoramas the rect geometrye may be inverted.
-         * @ignore
-         */
-        get: function () {
-            return this._inverted;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RectGeometry.prototype, "rect", {
-        /**
-         * Get rect property.
-         *
-         * @returns {Array<number>} Array representing the top-left and bottom-right
-         * corners of the rectangle in basic coordinates.
-         */
-        get: function () {
-            return this._rect;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Initialize anchor indexing to enable setting opposite vertex.
-     *
-     * @param {number} [index] - The index of the vertex to use as anchor.
-     *
-     * @throws {Error} If anchor indexing has already been initialized.
-     * @throws {Error} If index is not valid (0 to 3).
-     * @ignore
-     */
-    RectGeometry.prototype.initializeAnchorIndexing = function (index) {
-        if (this._anchorIndex !== undefined) {
-            throw new Error("Anchor indexing is already initialized.");
-        }
-        if (index < 0 || index > 3) {
-            throw new Error("Invalid anchor index: " + index + ".");
-        }
-        this._anchorIndex = index === undefined ? 0 : index;
-    };
-    /**
-     * Terminate anchor indexing to disable setting pposite vertex.
-     * @ignore
-     */
-    RectGeometry.prototype.terminateAnchorIndexing = function () {
-        this._anchorIndex = undefined;
-    };
-    /**
-     * Set the value of the vertex opposite to the anchor in the polygon
-     * representation of the rectangle.
-     *
-     * @description Setting the opposite vertex may change the anchor index.
-     *
-     * @param {Array<number>} opposite - The new value of the vertex opposite to the anchor.
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     *
-     * @throws {Error} When anchor indexing has not been initialized.
-     * @ignore
-     */
-    RectGeometry.prototype.setOppositeVertex2d = function (opposite, transform) {
-        if (this._anchorIndex === undefined) {
-            throw new Error("Anchor indexing needs to be initialized.");
-        }
-        var changed = [
-            Math.max(0, Math.min(1, opposite[0])),
-            Math.max(0, Math.min(1, opposite[1])),
-        ];
-        var original = this._rect.slice();
-        var anchor = this._anchorIndex === 0 ? [original[0], original[3]] :
-            this._anchorIndex === 1 ? [original[0], original[1]] :
-                this._anchorIndex === 2 ? [original[2], original[1]] :
-                    [original[2], original[3]];
-        if (transform.fullPano) {
-            var deltaX = this._anchorIndex < 2 ?
-                changed[0] - original[2] :
-                changed[0] - original[0];
-            if (!this._inverted && this._anchorIndex < 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
-                // right side passes boundary rightward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-            }
-            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[2] > 0.75 && deltaX < -0.5) {
-                // left side passes right side and boundary rightward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-            }
-            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < 0.25 && original[0] > 0.75 && deltaX < -0.5) {
-                this._inverted = false;
-                if (anchor[0] > changed[0]) {
-                    // left side passes boundary rightward
-                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-                }
-                else {
-                    // left side passes right side and boundary rightward
-                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-                }
-            }
-            else if (!this._inverted && this._anchorIndex >= 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
-                // left side passes boundary leftward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-            }
-            else if (!this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[0] < 0.25 && deltaX > 0.5) {
-                // right side passes left side and boundary leftward
-                this._inverted = true;
-                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-            }
-            else if (this._inverted && this._anchorIndex < 2 && changed[0] > 0.75 && original[2] < 0.25 && deltaX > 0.5) {
-                this._inverted = false;
-                if (anchor[0] > changed[0]) {
-                    // right side passes boundary leftward
-                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-                }
-                else {
-                    // right side passes left side and boundary leftward
-                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-                }
-            }
-            else if (this._inverted && this._anchorIndex < 2 && changed[0] > original[0]) {
-                // inverted and right side passes left side completing a loop
-                this._inverted = false;
-                this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-            }
-            else if (this._inverted && this._anchorIndex >= 2 && changed[0] < original[2]) {
-                // inverted and left side passes right side completing a loop
-                this._inverted = false;
-                this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-            }
-            else if (this._inverted) {
-                // if still inverted only top and bottom can switch
-                if (this._anchorIndex < 2) {
-                    this._anchorIndex = anchor[1] > changed[1] ? 0 : 1;
-                }
-                else {
-                    this._anchorIndex = anchor[1] > changed[1] ? 3 : 2;
-                }
-            }
-            else {
-                // if still not inverted treat as non full pano
-                if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
-                    this._anchorIndex = 0;
-                }
-                else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
-                    this._anchorIndex = 1;
-                }
-                else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
-                    this._anchorIndex = 2;
-                }
-                else {
-                    this._anchorIndex = 3;
-                }
-            }
-            var rect = [];
-            if (this._anchorIndex === 0) {
-                rect[0] = anchor[0];
-                rect[1] = changed[1];
-                rect[2] = changed[0];
-                rect[3] = anchor[1];
-            }
-            else if (this._anchorIndex === 1) {
-                rect[0] = anchor[0];
-                rect[1] = anchor[1];
-                rect[2] = changed[0];
-                rect[3] = changed[1];
-            }
-            else if (this._anchorIndex === 2) {
-                rect[0] = changed[0];
-                rect[1] = anchor[1];
-                rect[2] = anchor[0];
-                rect[3] = changed[1];
-            }
-            else {
-                rect[0] = changed[0];
-                rect[1] = changed[1];
-                rect[2] = anchor[0];
-                rect[3] = anchor[1];
-            }
-            if (!this._inverted && rect[0] > rect[2] ||
-                this._inverted && rect[0] < rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-            if (rect[1] > rect[3]) {
-                rect[1] = original[1];
-                rect[3] = original[3];
-            }
-            this._rect[0] = rect[0];
-            this._rect[1] = rect[1];
-            this._rect[2] = rect[2];
-            this._rect[3] = rect[3];
-        }
-        else {
-            if (anchor[0] <= changed[0] && anchor[1] > changed[1]) {
-                this._anchorIndex = 0;
-            }
-            else if (anchor[0] <= changed[0] && anchor[1] <= changed[1]) {
-                this._anchorIndex = 1;
-            }
-            else if (anchor[0] > changed[0] && anchor[1] <= changed[1]) {
-                this._anchorIndex = 2;
-            }
-            else {
-                this._anchorIndex = 3;
-            }
-            var rect = [];
-            if (this._anchorIndex === 0) {
-                rect[0] = anchor[0];
-                rect[1] = changed[1];
-                rect[2] = changed[0];
-                rect[3] = anchor[1];
-            }
-            else if (this._anchorIndex === 1) {
-                rect[0] = anchor[0];
-                rect[1] = anchor[1];
-                rect[2] = changed[0];
-                rect[3] = changed[1];
-            }
-            else if (this._anchorIndex === 2) {
-                rect[0] = changed[0];
-                rect[1] = anchor[1];
-                rect[2] = anchor[0];
-                rect[3] = changed[1];
-            }
-            else {
-                rect[0] = changed[0];
-                rect[1] = changed[1];
-                rect[2] = anchor[0];
-                rect[3] = anchor[1];
-            }
-            if (rect[0] > rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-            if (rect[1] > rect[3]) {
-                rect[1] = original[1];
-                rect[3] = original[3];
-            }
-            this._rect[0] = rect[0];
-            this._rect[1] = rect[1];
-            this._rect[2] = rect[2];
-            this._rect[3] = rect[3];
-        }
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Set the value of a vertex in the polygon representation of the rectangle.
-     *
-     * @description The polygon is defined to have the first vertex at the
-     * bottom-left corner with the rest of the vertices following in clockwise order.
-     *
-     * @param {number} index - The index of the vertex to be set.
-     * @param {Array<number>} value - The new value of the vertex.
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     * @ignore
-     */
-    RectGeometry.prototype.setVertex2d = function (index, value, transform) {
-        var original = this._rect.slice();
-        var changed = [
-            Math.max(0, Math.min(1, value[0])),
-            Math.max(0, Math.min(1, value[1])),
-        ];
-        var rect = [];
-        if (index === 0) {
-            rect[0] = changed[0];
-            rect[1] = original[1];
-            rect[2] = original[2];
-            rect[3] = changed[1];
-        }
-        else if (index === 1) {
-            rect[0] = changed[0];
-            rect[1] = changed[1];
-            rect[2] = original[2];
-            rect[3] = original[3];
-        }
-        else if (index === 2) {
-            rect[0] = original[0];
-            rect[1] = changed[1];
-            rect[2] = changed[0];
-            rect[3] = original[3];
-        }
-        else if (index === 3) {
-            rect[0] = original[0];
-            rect[1] = original[1];
-            rect[2] = changed[0];
-            rect[3] = changed[1];
-        }
-        if (transform.fullPano) {
-            var passingBoundaryLeftward = index < 2 && changed[0] > 0.75 && original[0] < 0.25 ||
-                index >= 2 && this._inverted && changed[0] > 0.75 && original[2] < 0.25;
-            var passingBoundaryRightward = index < 2 && this._inverted && changed[0] < 0.25 && original[0] > 0.75 ||
-                index >= 2 && changed[0] < 0.25 && original[2] > 0.75;
-            if (passingBoundaryLeftward || passingBoundaryRightward) {
-                this._inverted = !this._inverted;
-            }
-            else {
-                if (rect[0] - original[0] < -0.25) {
-                    rect[0] = original[0];
-                }
-                if (rect[2] - original[2] > 0.25) {
-                    rect[2] = original[2];
-                }
-            }
-            if (!this._inverted && rect[0] > rect[2] ||
-                this._inverted && rect[0] < rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        else {
-            if (rect[0] > rect[2]) {
-                rect[0] = original[0];
-                rect[2] = original[2];
-            }
-        }
-        if (rect[1] > rect[3]) {
-            rect[1] = original[1];
-            rect[3] = original[3];
-        }
-        this._rect[0] = rect[0];
-        this._rect[1] = rect[1];
-        this._rect[2] = rect[2];
-        this._rect[3] = rect[3];
-        this._notifyChanged$.next(this);
-    };
-    /** @ignore */
-    RectGeometry.prototype.setCentroid2d = function (value, transform) {
-        var original = this._rect.slice();
-        var x0 = original[0];
-        var x1 = this._inverted ? original[2] + 1 : original[2];
-        var y0 = original[1];
-        var y1 = original[3];
-        var centerX = x0 + (x1 - x0) / 2;
-        var centerY = y0 + (y1 - y0) / 2;
-        var translationX = 0;
-        if (transform.gpano != null &&
-            transform.gpano.CroppedAreaImageWidthPixels === transform.gpano.FullPanoWidthPixels) {
-            translationX = this._inverted ? value[0] + 1 - centerX : value[0] - centerX;
-        }
-        else {
-            var minTranslationX = -x0;
-            var maxTranslationX = 1 - x1;
-            translationX = Math.max(minTranslationX, Math.min(maxTranslationX, value[0] - centerX));
-        }
-        var minTranslationY = -y0;
-        var maxTranslationY = 1 - y1;
-        var translationY = Math.max(minTranslationY, Math.min(maxTranslationY, value[1] - centerY));
-        this._rect[0] = original[0] + translationX;
-        this._rect[1] = original[1] + translationY;
-        this._rect[2] = original[2] + translationX;
-        this._rect[3] = original[3] + translationY;
-        if (this._rect[0] < 0) {
-            this._rect[0] += 1;
-            this._inverted = !this._inverted;
-        }
-        else if (this._rect[0] > 1) {
-            this._rect[0] -= 1;
-            this._inverted = !this._inverted;
-        }
-        if (this._rect[2] < 0) {
-            this._rect[2] += 1;
-            this._inverted = !this._inverted;
-        }
-        else if (this._rect[2] > 1) {
-            this._rect[2] -= 1;
-            this._inverted = !this._inverted;
-        }
-        this._notifyChanged$.next(this);
-    };
-    /**
-     * Get the 3D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @param {Transform} transform - The transform of the node related to
-     * the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates
-     * representing the rectangle.
-     * @ignore
-     */
-    RectGeometry.prototype.getPoints3d = function (transform) {
-        return this._getPoints2d()
-            .map(function (point) {
-            return transform.unprojectBasic(point, 200);
-        });
-    };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order. The method shifts the right side
-     * coordinates of the rectangle by one unit to ensure that the vertices are ordered
-     * clockwise.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertex2d = function (index) {
-        return this._rectToVertices2d(this._rect)[index];
-    };
-    /**
-     * Get the coordinates of a vertex from the polygon representation of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order. The coordinates will not be shifted
-     * so they may not appear in clockwise order when layed out on the plane.
-     *
-     * @param {number} index - Vertex index.
-     * @returns {Array<number>} Array representing the 2D basic coordinates of the vertex.
-     * @ignore
-     */
-    RectGeometry.prototype.getNonAdjustedVertex2d = function (index) {
-        return this._rectToNonAdjustedVertices2d(this._rect)[index];
-    };
-    /**
-     * Get a vertex from the polygon representation of the 3D coordinates for the
-     * vertices of the geometry.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {number} index - Vertex index.
-     * @param {Transform} transform - The transform of the node related to the geometry.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the vertices of the geometry.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertex3d = function (index, transform) {
-        return transform.unprojectBasic(this._rectToVertices2d(this._rect)[index], 200);
-    };
-    /**
-     * Get a polygon representation of the 2D basic coordinates for the vertices of the rectangle.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates representing
-     * the rectangle vertices.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertices2d = function () {
-        return this._rectToVertices2d(this._rect);
-    };
-    /**
-     * Get a polygon representation of the 3D coordinates for the vertices of the rectangle.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order.
-     *
-     * @param {Transform} transform - The transform of the node related to the rectangle.
-     * @returns {Array<Array<number>>} Polygon array of 3D world coordinates representing
-     * the rectangle vertices.
-     * @ignore
-     */
-    RectGeometry.prototype.getVertices3d = function (transform) {
-        return this._rectToVertices2d(this._rect)
-            .map(function (vertex) {
-            return transform.unprojectBasic(vertex, 200);
-        });
-    };
-    /** @ignore */
-    RectGeometry.prototype.getCentroid2d = function () {
-        var rect = this._rect;
-        var x0 = rect[0];
-        var x1 = this._inverted ? rect[2] + 1 : rect[2];
-        var y0 = rect[1];
-        var y1 = rect[3];
-        var centroidX = (x0 + x1) / 2;
-        var centroidY = (y0 + y1) / 2;
-        return [centroidX, centroidY];
-    };
-    /** @ignore */
-    RectGeometry.prototype.getCentroid3d = function (transform) {
-        var centroid2d = this.getCentroid2d();
-        return transform.unprojectBasic(centroid2d, 200);
-    };
-    /**
-     * @ignore
-     */
-    RectGeometry.prototype.getPoleOfInaccessibility2d = function () {
-        return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
-    };
-    /** @ignore */
-    RectGeometry.prototype.getPoleOfInaccessibility3d = function (transform) {
-        var pole2d = this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));
-        return transform.unprojectBasic(pole2d, 200);
-    };
-    /** @ignore */
-    RectGeometry.prototype.getTriangles3d = function (transform) {
-        return transform.fullPano ?
-            [] :
-            this._triangulate(this._project(this._getPoints2d(), transform), this.getPoints3d(transform));
-    };
-    /**
-     * Check if a particular bottom-right value is valid according to the current
-     * rectangle coordinates.
-     *
-     * @param {Array<number>} bottomRight - The bottom-right coordinates to validate
-     * @returns {boolean} Value indicating whether the provided bottom-right coordinates
-     * are valid.
-     * @ignore
-     */
-    RectGeometry.prototype.validate = function (bottomRight) {
-        var rect = this._rect;
-        if (!this._inverted && bottomRight[0] < rect[0] ||
-            bottomRight[0] - rect[2] > 0.25 ||
-            bottomRight[1] < rect[1]) {
-            return false;
-        }
-        return true;
-    };
-    /**
-     * Get the 2D coordinates for the vertices of the rectangle with
-     * interpolated points along the lines.
-     *
-     * @returns {Array<Array<number>>} Polygon array of 2D basic coordinates
-     * representing the rectangle.
-     */
-    RectGeometry.prototype._getPoints2d = function () {
-        var vertices2d = this._rectToVertices2d(this._rect);
-        var sides = vertices2d.length - 1;
-        var sections = 10;
-        var points2d = [];
-        for (var i = 0; i < sides; ++i) {
-            var startX = vertices2d[i][0];
-            var startY = vertices2d[i][1];
-            var endX = vertices2d[i + 1][0];
-            var endY = vertices2d[i + 1][1];
-            var intervalX = (endX - startX) / (sections - 1);
-            var intervalY = (endY - startY) / (sections - 1);
-            for (var j = 0; j < sections; ++j) {
-                var point = [
-                    startX + j * intervalX,
-                    startY + j * intervalY,
-                ];
-                points2d.push(point);
-            }
-        }
-        return points2d;
-    };
-    /**
-     * Convert the top-left, bottom-right representation of a rectangle to a polygon
-     * representation of the vertices starting at the bottom-left corner going
-     * clockwise.
-     *
-     * @description The method shifts the right side coordinates of the rectangle
-     * by one unit to ensure that the vertices are ordered clockwise.
-     *
-     * @param {Array<number>} rect - Top-left, bottom-right representation of a
-     * rectangle.
-     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
-     * rectangle.
-     */
-    RectGeometry.prototype._rectToVertices2d = function (rect) {
-        return [
-            [rect[0], rect[3]],
-            [rect[0], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[1]],
-            [this._inverted ? rect[2] + 1 : rect[2], rect[3]],
-            [rect[0], rect[3]],
-        ];
-    };
-    /**
-     * Convert the top-left, bottom-right representation of a rectangle to a polygon
-     * representation of the vertices starting at the bottom-left corner going
-     * clockwise.
-     *
-     * @description The first vertex represents the bottom-left corner with the rest of
-     * the vertices following in clockwise order. The coordinates will not be shifted
-     * to ensure that the vertices are ordered clockwise when layed out on the plane.
-     *
-     * @param {Array<number>} rect - Top-left, bottom-right representation of a
-     * rectangle.
-     * @returns {Array<Array<number>>} Polygon representation of the vertices of the
-     * rectangle.
-     */
-    RectGeometry.prototype._rectToNonAdjustedVertices2d = function (rect) {
-        return [
-            [rect[0], rect[3]],
-            [rect[0], rect[1]],
-            [rect[2], rect[1]],
-            [rect[2], rect[3]],
-            [rect[0], rect[3]],
-        ];
-    };
-    return RectGeometry;
-}(Component_1.VertexGeometry));
-exports.RectGeometry = RectGeometry;
-exports.default = RectGeometry;
-
-},{"../../../Component":275}],356:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var earcut_1 = require("earcut");
-var martinez = require("martinez-polygon-clipping");
-var polylabel = require("@mapbox/polylabel");
-var THREE = require("three");
-var Component_1 = require("../../../Component");
-/**
- * @class VertexGeometry
- * @abstract
- * @classdesc Represents a vertex geometry.
- */
-var VertexGeometry = /** @class */ (function (_super) {
-    __extends(VertexGeometry, _super);
-    /**
-     * Create a vertex geometry.
-     *
-     * @constructor
-     * @ignore
-     */
-    function VertexGeometry() {
-        var _this = _super.call(this) || this;
-        _this._subsampleThreshold = 0.005;
-        return _this;
-    }
-    /**
-     * Finds the polygon pole of inaccessibility, the most distant internal
-     * point from the polygon outline.
-     *
-     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
-     * @returns {Array<number>} Point of inaccessibility.
-     * @ignore
-     */
-    VertexGeometry.prototype._getPoleOfInaccessibility2d = function (points2d) {
-        var pole2d = polylabel([points2d], 3e-2);
-        return pole2d;
-    };
-    VertexGeometry.prototype._project = function (points2d, transform) {
-        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectSfM([0, 0], 10));
-        return this._deunproject(points2d, transform, camera);
-    };
-    VertexGeometry.prototype._subsample = function (points2d, threshold) {
-        if (threshold === void 0) { threshold = this._subsampleThreshold; }
-        var subsampled = [];
-        var length = points2d.length;
-        for (var index = 0; index < length; index++) {
-            var p1 = points2d[index];
-            var p2 = points2d[(index + 1) % length];
-            subsampled.push(p1);
-            var dist = Math.sqrt(Math.pow((p2[0] - p1[0]), 2) + Math.pow((p2[1] - p1[1]), 2));
-            var subsamples = Math.floor(dist / threshold);
-            var coeff = 1 / (subsamples + 1);
-            for (var i = 1; i <= subsamples; i++) {
-                var alpha = i * coeff;
-                var subsample = [
-                    (1 - alpha) * p1[0] + alpha * p2[0],
-                    (1 - alpha) * p1[1] + alpha * p2[1],
-                ];
-                subsampled.push(subsample);
-            }
-        }
-        return subsampled;
-    };
-    /**
-     * Triangulates a 2d polygon and returns the triangle
-     * representation as a flattened array of 3d points.
-     *
-     * @param {Array<Array<number>>} points2d - 2d points of outline to triangulate.
-     * @param {Array<Array<number>>} points3d - 3d points of outline corresponding to the 2d points.
-     * @param {Array<Array<Array<number>>>} [holes2d] - 2d points of holes to triangulate.
-     * @param {Array<Array<Array<number>>>} [holes3d] - 3d points of holes corresponding to the 2d points.
-     * @returns {Array<number>} Flattened array of 3d points ordered based on the triangles.
-     * @ignore
-     */
-    VertexGeometry.prototype._triangulate = function (points2d, points3d, holes2d, holes3d) {
-        var data = [points2d.slice(0, -1)];
-        for (var _i = 0, _a = holes2d != null ? holes2d : []; _i < _a.length; _i++) {
-            var hole2d = _a[_i];
-            data.push(hole2d.slice(0, -1));
-        }
-        var points = points3d.slice(0, -1);
-        for (var _b = 0, _c = holes3d != null ? holes3d : []; _b < _c.length; _b++) {
-            var hole3d = _c[_b];
-            points = points.concat(hole3d.slice(0, -1));
-        }
-        var flattened = earcut_1.default.flatten(data);
-        var indices = earcut_1.default(flattened.vertices, flattened.holes, flattened.dimensions);
-        var triangles = [];
-        for (var i = 0; i < indices.length; ++i) {
-            var point = points[indices[i]];
-            triangles.push(point[0]);
-            triangles.push(point[1]);
-            triangles.push(point[2]);
-        }
-        return triangles;
-    };
-    VertexGeometry.prototype._triangulatePano = function (points2d, holes2d, transform) {
-        var triangles = [];
-        var epsilon = 1e-9;
-        var subareasX = 3;
-        var subareasY = 3;
-        for (var x = 0; x < subareasX; x++) {
-            for (var y = 0; y < subareasY; y++) {
-                var epsilonX0 = x === 0 ? -epsilon : epsilon;
-                var epsilonY0 = y === 0 ? -epsilon : epsilon;
-                var x0 = x / subareasX + epsilonX0;
-                var y0 = y / subareasY + epsilonY0;
-                var x1 = (x + 1) / subareasX + epsilon;
-                var y1 = (y + 1) / subareasY + epsilon;
-                var bbox2d = [
-                    [x0, y0],
-                    [x0, y1],
-                    [x1, y1],
-                    [x1, y0],
-                    [x0, y0],
-                ];
-                var lookat2d = [
-                    (2 * x + 1) / (2 * subareasX),
-                    (2 * y + 1) / (2 * subareasY),
-                ];
-                triangles.push.apply(triangles, this._triangulateSubarea(points2d, holes2d, bbox2d, lookat2d, transform));
-            }
-        }
-        return triangles;
-    };
-    VertexGeometry.prototype._unproject = function (points2d, transform, distance) {
-        if (distance === void 0) { distance = 200; }
-        return points2d
-            .map(function (point) {
-            return transform.unprojectBasic(point, distance);
-        });
-    };
-    VertexGeometry.prototype._createCamera = function (upVector, position, lookAt) {
-        var camera = new THREE.Camera();
-        camera.up.copy(new THREE.Vector3().fromArray(upVector));
-        camera.position.copy(new THREE.Vector3().fromArray(position));
-        camera.lookAt(new THREE.Vector3().fromArray(lookAt));
-        camera.updateMatrix();
-        camera.updateMatrixWorld(true);
-        return camera;
-    };
-    VertexGeometry.prototype._deunproject = function (points2d, transform, camera) {
-        return points2d
-            .map(function (point2d) {
-            var pointWorld = transform.unprojectBasic(point2d, 10000);
-            var pointCamera = new THREE.Vector3(pointWorld[0], pointWorld[1], pointWorld[2])
-                .applyMatrix4(camera.matrixWorldInverse);
-            return [pointCamera.x / pointCamera.z, pointCamera.y / pointCamera.z];
-        });
-    };
-    VertexGeometry.prototype._triangulateSubarea = function (points2d, holes2d, bbox2d, lookat2d, transform) {
-        var intersections = martinez.intersection([points2d].concat(holes2d), [bbox2d]);
-        if (!intersections) {
-            return [];
-        }
-        var triangles = [];
-        var threshold = this._subsampleThreshold;
-        var camera = this._createCamera(transform.upVector().toArray(), transform.unprojectSfM([0, 0], 0), transform.unprojectBasic(lookat2d, 10));
-        for (var _i = 0, intersections_1 = intersections; _i < intersections_1.length; _i++) {
-            var intersection = intersections_1[_i];
-            var subsampledPolygon2d = this._subsample(intersection[0], threshold);
-            var polygon2d = this._deunproject(subsampledPolygon2d, transform, camera);
-            var polygon3d = this._unproject(subsampledPolygon2d, transform);
-            var polygonHoles2d = [];
-            var polygonHoles3d = [];
-            for (var i = 1; i < intersection.length; i++) {
-                var subsampledHole2d = this._subsample(intersection[i], threshold);
-                var hole2d = this._deunproject(subsampledHole2d, transform, camera);
-                var hole3d = this._unproject(subsampledHole2d, transform);
-                polygonHoles2d.push(hole2d);
-                polygonHoles3d.push(hole3d);
-            }
-            triangles.push.apply(triangles, this._triangulate(polygon2d, polygon3d, polygonHoles2d, polygonHoles3d));
-        }
-        return triangles;
-    };
-    return VertexGeometry;
-}(Component_1.Geometry));
-exports.VertexGeometry = VertexGeometry;
-exports.default = VertexGeometry;
-
-},{"../../../Component":275,"@mapbox/polylabel":1,"earcut":8,"martinez-polygon-clipping":22,"three":226}],357:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../../Component");
-var CreateHandlerBase = /** @class */ (function (_super) {
-    __extends(CreateHandlerBase, _super);
-    function CreateHandlerBase(component, container, navigator, viewportCoords, tagCreator) {
-        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
-        _this._tagCreator = tagCreator;
-        _this._geometryCreated$ = new rxjs_1.Subject();
-        return _this;
-    }
-    Object.defineProperty(CreateHandlerBase.prototype, "geometryCreated$", {
-        get: function () {
-            return this._geometryCreated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    CreateHandlerBase.prototype._enable = function () {
-        this._enableCreate();
-        this._container.element.classList.add("component-tag-create");
-    };
-    CreateHandlerBase.prototype._disable = function () {
-        this._container.element.classList.remove("component-tag-create");
-        this._disableCreate();
-    };
-    CreateHandlerBase.prototype._validateBasic = function (basic) {
-        var x = basic[0];
-        var y = basic[1];
-        return 0 <= x && x <= 1 && 0 <= y && y <= 1;
-    };
-    CreateHandlerBase.prototype._mouseEventToBasic$ = function (mouseEvent$) {
-        var _this = this;
-        return mouseEvent$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var event = _a[0], camera = _a[1], transform = _a[2];
-            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-        }));
-    };
-    return CreateHandlerBase;
-}(Component_1.TagHandlerBase));
-exports.CreateHandlerBase = CreateHandlerBase;
-exports.default = CreateHandlerBase;
-
-},{"../../../Component":275,"rxjs":27,"rxjs/operators":225}],358:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreatePointHandler = /** @class */ (function (_super) {
-    __extends(CreatePointHandler, _super);
-    function CreatePointHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    CreatePointHandler.prototype._enableCreate = function () {
-        this._container.mouseService.deferPixels(this._name, 4);
-        this._geometryCreatedSubscription = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.filter(this._validateBasic), operators_1.map(function (basic) {
-            return new Component_1.PointGeometry(basic);
-        }))
-            .subscribe(this._geometryCreated$);
-    };
-    CreatePointHandler.prototype._disableCreate = function () {
-        this._container.mouseService.undeferPixels(this._name);
-        this._geometryCreatedSubscription.unsubscribe();
-    };
-    CreatePointHandler.prototype._getNameExtension = function () {
-        return "create-point";
-    };
-    return CreatePointHandler;
-}(Component_1.CreateHandlerBase));
-exports.CreatePointHandler = CreatePointHandler;
-exports.default = CreatePointHandler;
-
-},{"../../../Component":275,"rxjs/operators":225}],359:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../../Component");
-var CreatePolygonHandler = /** @class */ (function (_super) {
-    __extends(CreatePolygonHandler, _super);
-    function CreatePolygonHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    CreatePolygonHandler.prototype._addPoint = function (tag, basicPoint) {
-        tag.addPoint(basicPoint);
-    };
-    Object.defineProperty(CreatePolygonHandler.prototype, "_create$", {
-        get: function () {
-            return this._tagCreator.createPolygon$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    CreatePolygonHandler.prototype._getNameExtension = function () {
-        return "create-polygon";
-    };
-    CreatePolygonHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
-        tag.geometry.setVertex2d(tag.geometry.polygon.length - 2, basicPoint, transform);
-    };
-    return CreatePolygonHandler;
-}(Component_1.CreateVertexHandler));
-exports.CreatePolygonHandler = CreatePolygonHandler;
-exports.default = CreatePolygonHandler;
-
-},{"../../../Component":275}],360:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreateRectDragHandler = /** @class */ (function (_super) {
-    __extends(CreateRectDragHandler, _super);
-    function CreateRectDragHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    CreateRectDragHandler.prototype._enableCreate = function () {
-        var _this = this;
-        this._container.mouseService.claimMouse(this._name, 2);
-        this._deleteSubscription = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function (transform) { return null; }), operators_1.skip(1))
-            .subscribe(this._tagCreator.delete$);
-        this._createSubscription = this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDragStart$)).pipe(operators_1.filter(this._validateBasic))
-            .subscribe(this._tagCreator.createRect$);
-        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
-            return !!tag;
-        }))
-            .subscribe(function (tag) {
-            tag.geometry.initializeAnchorIndexing();
-        });
-        var basicMouse$ = rxjs_1.combineLatest(rxjs_1.merge(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseMove$), this._container.mouseService.filtered$(this._name, this._container.mouseService.domMouseMove$)), this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var _b = _a[0], event = _b[0], camera = _b[1], transform = _a[1];
-            return _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-        }));
-        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouse$, _this._navigator.stateService.currentTransform$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], basicPoint = _a[1], transform = _a[2];
-            tag.geometry.setOppositeVertex2d(basicPoint, transform);
-        });
-        var basicMouseDragEnd$ = this._container.mouseService.mouseDragEnd$.pipe(operators_1.withLatestFrom(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name, this._container.mouseService.mouseDrag$)).pipe(operators_1.filter(this._validateBasic)), function (event, basicPoint) {
-            return basicPoint;
-        }), operators_1.share());
-        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), basicMouseDragEnd$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], basicPoint = _a[1];
-            var rectGeometry = tag.geometry;
-            if (!rectGeometry.validate(basicPoint)) {
-                basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
-            }
-            tag.addPoint(basicPoint);
-        });
-        this._geometryCreatedSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                tag.created$.pipe(operators_1.map(function (t) {
-                    return t.geometry;
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe(this._geometryCreated$);
-    };
-    CreateRectDragHandler.prototype._disableCreate = function () {
-        this._container.mouseService.unclaimMouse(this._name);
-        this._tagCreator.delete$.next(null);
-        this._addPointSubscription.unsubscribe();
-        this._createSubscription.unsubscribe();
-        this._deleteSubscription.unsubscribe();
-        this._geometryCreatedSubscription.unsubscribe();
-        this._initializeAnchorIndexingSubscription.unsubscribe();
-        this._setVertexSubscription.unsubscribe();
-    };
-    CreateRectDragHandler.prototype._getNameExtension = function () {
-        return "create-rect-drag";
-    };
-    return CreateRectDragHandler;
-}(Component_1.CreateHandlerBase));
-exports.CreateRectDragHandler = CreateRectDragHandler;
-exports.default = CreateRectDragHandler;
-
-},{"../../../Component":275,"rxjs":27,"rxjs/operators":225}],361:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreateRectHandler = /** @class */ (function (_super) {
-    __extends(CreateRectHandler, _super);
-    function CreateRectHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    Object.defineProperty(CreateRectHandler.prototype, "_create$", {
-        get: function () {
-            return this._tagCreator.createRect$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    CreateRectHandler.prototype._addPoint = function (tag, basicPoint) {
-        var rectGeometry = tag.geometry;
-        if (!rectGeometry.validate(basicPoint)) {
-            basicPoint = rectGeometry.getNonAdjustedVertex2d(3);
-        }
-        tag.addPoint(basicPoint);
-    };
-    CreateRectHandler.prototype._enable = function () {
-        _super.prototype._enable.call(this);
-        this._initializeAnchorIndexingSubscription = this._tagCreator.tag$.pipe(operators_1.filter(function (tag) {
-            return !!tag;
-        }))
-            .subscribe(function (tag) {
-            tag.geometry.initializeAnchorIndexing();
-        });
-    };
-    CreateRectHandler.prototype._disable = function () {
-        _super.prototype._disable.call(this);
-        this._initializeAnchorIndexingSubscription.unsubscribe();
-    };
-    CreateRectHandler.prototype._getNameExtension = function () {
-        return "create-rect";
-    };
-    CreateRectHandler.prototype._setVertex2d = function (tag, basicPoint, transform) {
-        tag.geometry.setOppositeVertex2d(basicPoint, transform);
-    };
-    return CreateRectHandler;
-}(Component_1.CreateVertexHandler));
-exports.CreateRectHandler = CreateRectHandler;
-exports.default = CreateRectHandler;
-
-},{"../../../Component":275,"rxjs/operators":225}],362:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var CreateVertexHandler = /** @class */ (function (_super) {
-    __extends(CreateVertexHandler, _super);
-    function CreateVertexHandler() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    CreateVertexHandler.prototype._enableCreate = function () {
-        var _this = this;
-        this._container.mouseService.deferPixels(this._name, 4);
-        var transformChanged$ = this._navigator.stateService.currentTransform$.pipe(operators_1.map(function (transform) { }), operators_1.publishReplay(1), operators_1.refCount());
-        this._deleteSubscription = transformChanged$.pipe(operators_1.skip(1))
-            .subscribe(this._tagCreator.delete$);
-        var basicClick$ = this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(operators_1.share());
-        this._createSubscription = transformChanged$.pipe(operators_1.switchMap(function () {
-            return basicClick$.pipe(operators_1.filter(_this._validateBasic), operators_1.take(1));
-        }))
-            .subscribe(this._create$);
-        this._setVertexSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), rxjs_1.merge(_this._container.mouseService.mouseMove$, _this._container.mouseService.domMouseMove$), _this._container.renderService.renderCamera$, _this._navigator.stateService.currentTransform$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], event = _a[1], camera = _a[2], transform = _a[3];
-            var basicPoint = _this._mouseEventToBasic(event, _this._container.element, camera, transform);
-            _this._setVertex2d(tag, basicPoint, transform);
-        });
-        this._addPointSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                rxjs_1.combineLatest(rxjs_1.of(tag), basicClick$) :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (_a) {
-            var tag = _a[0], basicPoint = _a[1];
-            _this._addPoint(tag, basicPoint);
-        });
-        this._geometryCreateSubscription = this._tagCreator.tag$.pipe(operators_1.switchMap(function (tag) {
-            return !!tag ?
-                tag.created$.pipe(operators_1.map(function (t) {
-                    return t.geometry;
-                })) :
-                rxjs_1.empty();
-        }))
-            .subscribe(this._geometryCreated$);
-    };
-    CreateVertexHandler.prototype._disableCreate = function () {
-        this._container.mouseService.undeferPixels(this._name);
-        this._tagCreator.delete$.next(null);
-        this._addPointSubscription.unsubscribe();
-        this._createSubscription.unsubscribe();
-        this._deleteSubscription.unsubscribe();
-        this._geometryCreateSubscription.unsubscribe();
-        this._setVertexSubscription.unsubscribe();
-    };
-    return CreateVertexHandler;
-}(Component_1.CreateHandlerBase));
-exports.CreateVertexHandler = CreateVertexHandler;
-exports.default = CreateVertexHandler;
-
-},{"../../../Component":275,"rxjs":27,"rxjs/operators":225}],363:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../../../Component");
-var EditVertexHandler = /** @class */ (function (_super) {
-    __extends(EditVertexHandler, _super);
-    function EditVertexHandler(component, container, navigator, viewportCoords, tagSet) {
-        var _this = _super.call(this, component, container, navigator, viewportCoords) || this;
-        _this._tagSet = tagSet;
-        return _this;
-    }
-    EditVertexHandler.prototype._enable = function () {
-        var _this = this;
-        var interaction$ = this._tagSet.changed$.pipe(operators_1.map(function (tagSet) {
-            return tagSet.getAll();
-        }), operators_1.switchMap(function (tags) {
-            return rxjs_1.from(tags).pipe(operators_1.mergeMap(function (tag) {
-                return tag.interact$;
-            }));
-        }), operators_1.switchMap(function (interaction) {
-            return rxjs_1.concat(rxjs_1.of(interaction), _this._container.mouseService.documentMouseUp$.pipe(operators_1.map(function () {
-                return { offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: null };
-            }), operators_1.first()));
-        }), operators_1.share());
-        var mouseMove$ = rxjs_1.merge(this._container.mouseService.mouseMove$, this._container.mouseService.domMouseMove$).pipe(operators_1.share());
-        this._claimMouseSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
-            return !!interaction.tag ? _this._container.mouseService.domMouseDragStart$ : rxjs_1.empty();
-        }))
-            .subscribe(function () {
-            _this._container.mouseService.claimMouse(_this._name, 3);
-        });
-        this._cursorSubscription = interaction$.pipe(operators_1.map(function (interaction) {
-            return interaction.cursor;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (cursor) {
-            var interactionCursors = ["crosshair", "move", "nesw-resize", "nwse-resize"];
-            for (var _i = 0, interactionCursors_1 = interactionCursors; _i < interactionCursors_1.length; _i++) {
-                var interactionCursor = interactionCursors_1[_i];
-                _this._container.element.classList.remove("component-tag-edit-" + interactionCursor);
-            }
-            if (!!cursor) {
-                _this._container.element.classList.add("component-tag-edit-" + cursor);
-            }
-        });
-        this._unclaimMouseSubscription = this._container.mouseService
-            .filtered$(this._name, this._container.mouseService.domMouseDragEnd$)
-            .subscribe(function (e) {
-            _this._container.mouseService.unclaimMouse(_this._name);
-        });
-        this._preventDefaultSubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
-            return !!interaction.tag ?
-                _this._container.mouseService.documentMouseMove$ :
-                rxjs_1.empty();
-        }))
-            .subscribe(function (event) {
-            event.preventDefault(); // prevent selection of content outside the viewer
-        });
-        this._updateGeometrySubscription = interaction$.pipe(operators_1.switchMap(function (interaction) {
-            if (interaction.operation === Component_1.TagOperation.None || !interaction.tag) {
-                return rxjs_1.empty();
-            }
-            var mouseDrag$ = _this._container.mouseService
-                .filtered$(_this._name, _this._container.mouseService.domMouseDrag$).pipe(operators_1.filter(function (event) {
-                return _this._viewportCoords.insideElement(event, _this._container.element);
-            }));
-            return rxjs_1.combineLatest(mouseDrag$, _this._container.renderService.renderCamera$).pipe(operators_1.withLatestFrom(rxjs_1.of(interaction), _this._navigator.stateService.currentTransform$, function (_a, i, transform) {
-                var event = _a[0], render = _a[1];
-                return [event, render, i, transform];
-            }));
-        }))
-            .subscribe(function (_a) {
-            var mouseEvent = _a[0], renderCamera = _a[1], interaction = _a[2], transform = _a[3];
-            var basic = _this._mouseEventToBasic(mouseEvent, _this._container.element, renderCamera, transform, interaction.offsetX, interaction.offsetY);
-            var geometry = interaction.tag.geometry;
-            if (interaction.operation === Component_1.TagOperation.Centroid) {
-                geometry.setCentroid2d(basic, transform);
-            }
-            else if (interaction.operation === Component_1.TagOperation.Vertex) {
-                geometry.setVertex2d(interaction.vertexIndex, basic, transform);
-            }
-        });
-    };
-    EditVertexHandler.prototype._disable = function () {
-        this._claimMouseSubscription.unsubscribe();
-        this._cursorSubscription.unsubscribe();
-        this._preventDefaultSubscription.unsubscribe();
-        this._unclaimMouseSubscription.unsubscribe();
-        this._updateGeometrySubscription.unsubscribe();
-    };
-    EditVertexHandler.prototype._getNameExtension = function () {
-        return "edit-vertex";
-    };
-    return EditVertexHandler;
-}(Component_1.TagHandlerBase));
-exports.EditVertexHandler = EditVertexHandler;
-exports.default = EditVertexHandler;
-
-
-},{"../../../Component":275,"rxjs":27,"rxjs/operators":225}],364:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../../Component");
-var TagHandlerBase = /** @class */ (function (_super) {
-    __extends(TagHandlerBase, _super);
-    function TagHandlerBase(component, container, navigator, viewportCoords) {
-        var _this = _super.call(this, component, container, navigator) || this;
-        _this._name = _this._component.name + "-" + _this._getNameExtension();
-        _this._viewportCoords = viewportCoords;
-        return _this;
-    }
-    TagHandlerBase.prototype._getConfiguration = function (enable) {
-        return {};
-    };
-    TagHandlerBase.prototype._mouseEventToBasic = function (event, element, camera, transform, offsetX, offsetY) {
-        offsetX = offsetX != null ? offsetX : 0;
-        offsetY = offsetY != null ? offsetY : 0;
-        var _a = this._viewportCoords.canvasPosition(event, element), canvasX = _a[0], canvasY = _a[1];
-        var basic = this._viewportCoords.canvasToBasic(canvasX - offsetX, canvasY - offsetY, element, transform, camera.perspective);
-        return basic;
-    };
-    return TagHandlerBase;
-}(Component_1.HandlerBase));
-exports.TagHandlerBase = TagHandlerBase;
-exports.default = TagHandlerBase;
-
-
-},{"../../../Component":275}],365:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var vd = require("virtual-dom");
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../../Component");
-var Geo_1 = require("../../../Geo");
-var OutlineCreateTag = /** @class */ (function () {
-    function OutlineCreateTag(geometry, options, transform, viewportCoords) {
-        var _this = this;
-        this._geometry = geometry;
-        this._options = { color: options.color == null ? 0xFFFFFF : options.color };
-        this._transform = transform;
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._outline = this._createOutine();
-        this._glObjects = [this._outline];
-        this._aborted$ = new rxjs_1.Subject();
-        this._created$ = new rxjs_1.Subject();
-        this._glObjectsChanged$ = new rxjs_1.Subject();
-        this._geometryChangedSubscription = this._geometry.changed$
-            .subscribe(function (vertexGeometry) {
-            _this._disposeOutline();
-            _this._outline = _this._createOutine();
-            _this._glObjects = [_this._outline];
-            _this._glObjectsChanged$.next(_this);
-        });
-    }
-    Object.defineProperty(OutlineCreateTag.prototype, "geometry", {
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "glObjects", {
-        get: function () {
-            return this._glObjects;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "aborted$", {
-        get: function () {
-            return this._aborted$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "created$", {
-        get: function () {
-            return this._created$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "glObjectsChanged$", {
-        get: function () {
-            return this._glObjectsChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineCreateTag.prototype, "geometryChanged$", {
-        get: function () {
-            var _this = this;
-            return this._geometry.changed$.pipe(operators_1.map(function (geometry) {
-                return _this;
-            }));
-        },
-        enumerable: true,
-        configurable: true
-    });
-    OutlineCreateTag.prototype.dispose = function () {
-        this._disposeOutline();
-        this._geometryChangedSubscription.unsubscribe();
-    };
-    OutlineCreateTag.prototype.getDOMObjects = function (camera, size) {
-        var _this = this;
-        var vNodes = [];
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        var abort = function (e) {
-            e.stopPropagation();
-            _this._aborted$.next(_this);
-        };
-        if (this._geometry instanceof Component_1.RectGeometry) {
-            var anchorIndex = this._geometry.anchorIndex;
-            var vertexIndex = anchorIndex === undefined ? 1 : anchorIndex;
-            var _a = this._geometry.getVertex2d(vertexIndex), basicX = _a[0], basicY = _a[1];
-            var canvasPoint = this._viewportCoords.basicToCanvasSafe(basicX, basicY, container, this._transform, camera);
-            if (canvasPoint != null) {
-                var background = this._colorToBackground(this._options.color);
-                var transform = this._canvasToTransform(canvasPoint);
-                var pointProperties = {
-                    style: { background: background, transform: transform },
-                };
-                var completerProperties = {
-                    onclick: abort,
-                    style: { transform: transform },
-                };
-                vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
-                vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-            }
-        }
-        else if (this._geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry_1 = this._geometry;
-            var _b = polygonGeometry_1.getVertex2d(0), firstVertexBasicX = _b[0], firstVertexBasicY = _b[1];
-            var firstVertexCanvas = this._viewportCoords.basicToCanvasSafe(firstVertexBasicX, firstVertexBasicY, container, this._transform, camera);
-            if (firstVertexCanvas != null) {
-                var firstOnclick = polygonGeometry_1.polygon.length > 4 ?
-                    function (e) {
-                        e.stopPropagation();
-                        polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 2);
-                        _this._created$.next(_this);
-                    } :
-                    abort;
-                var transform = this._canvasToTransform(firstVertexCanvas);
-                var completerProperties = {
-                    onclick: firstOnclick,
-                    style: { transform: transform },
-                };
-                var firstClass = polygonGeometry_1.polygon.length > 4 ?
-                    "TagCompleter" :
-                    "TagInteractor";
-                vNodes.push(vd.h("div." + firstClass, completerProperties, []));
-            }
-            if (polygonGeometry_1.polygon.length > 3) {
-                var _c = polygonGeometry_1.getVertex2d(polygonGeometry_1.polygon.length - 3), lastVertexBasicX = _c[0], lastVertexBasicY = _c[1];
-                var lastVertexCanvas = this._viewportCoords.basicToCanvasSafe(lastVertexBasicX, lastVertexBasicY, container, this._transform, camera);
-                if (lastVertexCanvas != null) {
-                    var remove = function (e) {
-                        e.stopPropagation();
-                        polygonGeometry_1.removeVertex2d(polygonGeometry_1.polygon.length - 3);
-                    };
-                    var transform = this._canvasToTransform(lastVertexCanvas);
-                    var completerProperties = {
-                        onclick: remove,
-                        style: { transform: transform },
-                    };
-                    vNodes.push(vd.h("div.TagInteractor", completerProperties, []));
-                }
-            }
-            var verticesBasic = polygonGeometry_1.polygon.slice();
-            verticesBasic.splice(-2, 2);
-            for (var _i = 0, verticesBasic_1 = verticesBasic; _i < verticesBasic_1.length; _i++) {
-                var vertexBasic = verticesBasic_1[_i];
-                var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasic[0], vertexBasic[1], container, this._transform, camera);
-                if (vertexCanvas != null) {
-                    var background = this._colorToBackground(this._options.color);
-                    var transform = this._canvasToTransform(vertexCanvas);
-                    var pointProperties = {
-                        style: {
-                            background: background,
-                            transform: transform,
-                        },
-                    };
-                    vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-                }
-            }
-        }
-        return vNodes;
-    };
-    OutlineCreateTag.prototype.addPoint = function (point) {
-        if (this._geometry instanceof Component_1.RectGeometry) {
-            var rectGeometry = this._geometry;
-            if (!rectGeometry.validate(point)) {
-                return;
-            }
-            this._created$.next(this);
-        }
-        else if (this._geometry instanceof Component_1.PolygonGeometry) {
-            var polygonGeometry = this._geometry;
-            polygonGeometry.addVertex2d(point);
-        }
-    };
-    OutlineCreateTag.prototype._canvasToTransform = function (canvas) {
-        var canvasX = Math.round(canvas[0]);
-        var canvasY = Math.round(canvas[1]);
-        var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
-        return transform;
-    };
-    OutlineCreateTag.prototype._colorToBackground = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
-    };
-    OutlineCreateTag.prototype._createOutine = function () {
-        var polygon3d = this._geometry instanceof Component_1.RectGeometry ?
-            this._geometry.getPoints3d(this._transform) :
-            this._geometry.getVertices3d(this._transform);
-        var positions = this._getLinePositions(polygon3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        var material = new THREE.LineBasicMaterial({
-            color: this._options.color,
-            linewidth: 1,
-        });
-        return new THREE.Line(geometry, material);
-    };
-    OutlineCreateTag.prototype._disposeOutline = function () {
-        if (this._outline == null) {
-            return;
-        }
-        var line = this._outline;
-        line.geometry.dispose();
-        line.material.dispose();
-        this._outline = null;
-        this._glObjects = [];
-    };
-    OutlineCreateTag.prototype._getLinePositions = function (polygon3d) {
-        var length = polygon3d.length;
-        var positions = new Float32Array(length * 3);
-        for (var i = 0; i < length; ++i) {
-            var index = 3 * i;
-            var position = polygon3d[i];
-            positions[index] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        return positions;
-    };
-    return OutlineCreateTag;
-}());
-exports.OutlineCreateTag = OutlineCreateTag;
-exports.default = OutlineCreateTag;
-
-
-},{"../../../Component":275,"../../../Geo":278,"rxjs":27,"rxjs/operators":225,"three":226,"virtual-dom":231}],366:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-/**
- * @class OutlineRenderTag
- * @classdesc Tag visualizing the properties of an OutlineTag.
- */
-var OutlineRenderTag = /** @class */ (function (_super) {
-    __extends(OutlineRenderTag, _super);
-    function OutlineRenderTag(tag, transform) {
-        var _this = _super.call(this, tag, transform) || this;
-        _this._fill = !transform.gpano ?
-            _this._createFill() :
-            transform.fullPano &&
-                tag.domain === Component_1.TagDomain.TwoDimensional &&
-                tag.geometry instanceof Component_1.PolygonGeometry ?
-                _this._createFill() :
-                null;
-        _this._holes = _this._tag.lineWidth >= 1 ?
-            _this._createHoles() :
-            [];
-        _this._outline = _this._tag.lineWidth >= 1 ?
-            _this._createOutline() :
-            null;
-        _this._geometryChangedSubscription = _this._tag.geometry.changed$
-            .subscribe(function () {
-            if (_this._fill != null) {
-                _this._updateFillGeometry();
-            }
-            if (_this._holes.length > 0) {
-                _this._updateHoleGeometries();
-            }
-            if (_this._outline != null) {
-                _this._updateOulineGeometry();
-            }
-        });
-        _this._changedSubscription = _this._tag.changed$
-            .subscribe(function () {
-            var glObjectsChanged = false;
-            if (_this._fill != null) {
-                _this._updateFillMaterial(_this._fill.material);
-            }
-            if (_this._outline == null) {
-                if (_this._tag.lineWidth >= 1) {
-                    _this._holes = _this._createHoles();
-                    _this._outline = _this._createOutline();
-                    glObjectsChanged = true;
-                }
-            }
-            else {
-                _this._updateHoleMaterials();
-                _this._updateOutlineMaterial();
-            }
-            if (glObjectsChanged) {
-                _this._glObjectsChanged$.next(_this);
-            }
-        });
-        return _this;
-    }
-    OutlineRenderTag.prototype.dispose = function () {
-        this._disposeFill();
-        this._disposeHoles();
-        this._disposeOutline();
-        this._changedSubscription.unsubscribe();
-        this._geometryChangedSubscription.unsubscribe();
-    };
-    OutlineRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
-        var _this = this;
-        var vNodes = [];
-        var isRect = this._tag.geometry instanceof Component_1.RectGeometry;
-        var isPerspective = !this._transform.gpano;
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        if (this._tag.icon != null && (isRect || isPerspective)) {
-            var _a = this._tag.geometry instanceof Component_1.RectGeometry ?
-                this._tag.geometry.getVertex2d(this._tag.iconIndex) :
-                this._tag.geometry.getPoleOfInaccessibility2d(), iconBasicX = _a[0], iconBasicY = _a[1];
-            var iconCanvas = this._viewportCoords.basicToCanvasSafe(iconBasicX, iconBasicY, container, this._transform, camera);
-            if (iconCanvas != null) {
-                var interact = function (e) {
-                    _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-                };
-                if (atlas.loaded) {
-                    var sprite = atlas.getDOMSprite(this._tag.icon, this._tag.iconFloat);
-                    var iconCanvasX = Math.round(iconCanvas[0]);
-                    var iconCanvasY = Math.round(iconCanvas[1]);
-                    var transform = "translate(" + iconCanvasX + "px," + iconCanvasY + "px)";
-                    var click = function (e) {
-                        e.stopPropagation();
-                        _this._tag.click$.next(_this._tag);
-                    };
-                    var properties = {
-                        onclick: click,
-                        onmousedown: interact,
-                        style: { transform: transform },
-                    };
-                    vNodes.push(vd.h("div.TagSymbol", properties, [sprite]));
-                }
-            }
-        }
-        else if (this._tag.text != null && (isRect || isPerspective)) {
-            var _b = this._tag.geometry instanceof Component_1.RectGeometry ?
-                this._tag.geometry.getVertex2d(3) :
-                this._tag.geometry.getPoleOfInaccessibility2d(), textBasicX = _b[0], textBasicY = _b[1];
-            var textCanvas = this._viewportCoords.basicToCanvasSafe(textBasicX, textBasicY, container, this._transform, camera);
-            if (textCanvas != null) {
-                var textCanvasX = Math.round(textCanvas[0]);
-                var textCanvasY = Math.round(textCanvas[1]);
-                var transform = this._tag.geometry instanceof Component_1.RectGeometry ?
-                    "translate(" + textCanvasX + "px," + textCanvasY + "px)" :
-                    "translate(-50%, -50%) translate(" + textCanvasX + "px," + textCanvasY + "px)";
-                var interact = function (e) {
-                    _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: _this._tag });
-                };
-                var properties = {
-                    onmousedown: interact,
-                    style: {
-                        color: this._colorToCss(this._tag.textColor),
-                        transform: transform,
-                    },
-                    textContent: this._tag.text,
-                };
-                vNodes.push(vd.h("span.TagSymbol", properties, []));
-            }
-        }
-        if (!this._tag.editable) {
-            return vNodes;
-        }
-        var lineColor = this._colorToCss(this._tag.lineColor);
-        if (this._tag.geometry instanceof Component_1.RectGeometry) {
-            var _c = this._tag.geometry.getCentroid2d(), centroidBasicX = _c[0], centroidBasicY = _c[1];
-            var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
-            if (centroidCanvas != null) {
-                var interact = this._interact(Component_1.TagOperation.Centroid, "move");
-                var centroidCanvasX = Math.round(centroidCanvas[0]);
-                var centroidCanvasY = Math.round(centroidCanvas[1]);
-                var transform = "translate(-50%, -50%) translate(" + centroidCanvasX + "px," + centroidCanvasY + "px)";
-                var properties = {
-                    onmousedown: interact,
-                    style: { background: lineColor, transform: transform },
-                };
-                vNodes.push(vd.h("div.TagMover", properties, []));
-            }
-        }
-        var vertices2d = this._tag.geometry.getVertices2d();
-        for (var i = 0; i < vertices2d.length - 1; i++) {
-            if (isRect &&
-                ((this._tag.icon != null && i === this._tag.iconIndex) ||
-                    (this._tag.icon == null && this._tag.text != null && i === 3))) {
-                continue;
-            }
-            var _d = vertices2d[i], vertexBasicX = _d[0], vertexBasicY = _d[1];
-            var vertexCanvas = this._viewportCoords.basicToCanvasSafe(vertexBasicX, vertexBasicY, container, this._transform, camera);
-            if (vertexCanvas == null) {
-                continue;
-            }
-            var cursor = isRect ?
-                i % 2 === 0 ? "nesw-resize" : "nwse-resize" :
-                "crosshair";
-            var interact = this._interact(Component_1.TagOperation.Vertex, cursor, i);
-            var vertexCanvasX = Math.round(vertexCanvas[0]);
-            var vertexCanvasY = Math.round(vertexCanvas[1]);
-            var transform = "translate(-50%, -50%) translate(" + vertexCanvasX + "px," + vertexCanvasY + "px)";
-            var properties = {
-                onmousedown: interact,
-                style: { background: lineColor, transform: transform, cursor: cursor },
-            };
-            vNodes.push(vd.h("div.TagResizer", properties, []));
-            if (!this._tag.indicateVertices) {
-                continue;
-            }
-            var pointProperties = {
-                style: { background: lineColor, transform: transform },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        }
-        return vNodes;
-    };
-    OutlineRenderTag.prototype.getGLObjects = function () {
-        var glObjects = [];
-        if (this._fill != null) {
-            glObjects.push(this._fill);
-        }
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            glObjects.push(hole);
-        }
-        if (this._outline != null) {
-            glObjects.push(this._outline);
-        }
-        return glObjects;
-    };
-    OutlineRenderTag.prototype.getRetrievableObjects = function () {
-        return this._fill != null ? [this._fill] : [];
-    };
-    OutlineRenderTag.prototype._colorToCss = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
-    };
-    OutlineRenderTag.prototype._createFill = function () {
-        var triangles = this._getTriangles();
-        var positions = new Float32Array(triangles);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.MeshBasicMaterial({ side: THREE.DoubleSide, transparent: true });
-        this._updateFillMaterial(material);
-        return new THREE.Mesh(geometry, material);
-    };
-    OutlineRenderTag.prototype._createHoles = function () {
-        var holes = [];
-        if (this._tag.geometry instanceof Component_1.PolygonGeometry) {
-            var holes3d = this._getHoles3d();
-            for (var _i = 0, holes3d_1 = holes3d; _i < holes3d_1.length; _i++) {
-                var holePoints3d = holes3d_1[_i];
-                var hole = this._createLine(holePoints3d);
-                holes.push(hole);
-            }
-        }
-        return holes;
-    };
-    OutlineRenderTag.prototype._createLine = function (points3d) {
-        var positions = this._getLinePositions(points3d);
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.computeBoundingSphere();
-        var material = new THREE.LineBasicMaterial();
-        this._updateLineBasicMaterial(material);
-        var line = new THREE.Line(geometry, material);
-        line.renderOrder = 1;
-        return line;
-    };
-    OutlineRenderTag.prototype._createOutline = function () {
-        return this._createLine(this._getPoints3d());
-    };
-    OutlineRenderTag.prototype._disposeFill = function () {
-        if (this._fill == null) {
-            return;
-        }
-        this._fill.geometry.dispose();
-        this._fill.material.dispose();
-        this._fill = null;
-    };
-    OutlineRenderTag.prototype._disposeHoles = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            hole.geometry.dispose();
-            hole.material.dispose();
-        }
-        this._holes = [];
-    };
-    OutlineRenderTag.prototype._disposeOutline = function () {
-        if (this._outline == null) {
-            return;
-        }
-        this._outline.geometry.dispose();
-        this._outline.material.dispose();
-        this._outline = null;
-    };
-    OutlineRenderTag.prototype._getLinePositions = function (points3d) {
-        var length = points3d.length;
-        var positions = new Float32Array(length * 3);
-        for (var i = 0; i < length; ++i) {
-            var index = 3 * i;
-            var position = points3d[i];
-            positions[index + 0] = position[0];
-            positions[index + 1] = position[1];
-            positions[index + 2] = position[2];
-        }
-        return positions;
-    };
-    OutlineRenderTag.prototype._getHoles3d = function () {
-        var polygonGeometry = this._tag.geometry;
-        return this._in3dDomain() ?
-            polygonGeometry.getHoleVertices3d(this._transform) :
-            polygonGeometry.getHolePoints3d(this._transform);
-    };
-    OutlineRenderTag.prototype._getPoints3d = function () {
-        return this._in3dDomain() ?
-            this._tag.geometry.getVertices3d(this._transform) :
-            this._tag.geometry.getPoints3d(this._transform);
-    };
-    OutlineRenderTag.prototype._getTriangles = function () {
-        return this._in3dDomain() ?
-            this._tag.geometry.get3dDomainTriangles3d(this._transform) :
-            this._tag.geometry.getTriangles3d(this._transform);
-    };
-    OutlineRenderTag.prototype._in3dDomain = function () {
-        return this._tag.geometry instanceof Component_1.PolygonGeometry && this._tag.domain === Component_1.TagDomain.ThreeDimensional;
-    };
-    OutlineRenderTag.prototype._interact = function (operation, cursor, vertexIndex) {
-        var _this = this;
-        return function (e) {
-            var offsetX = e.offsetX - e.target.offsetWidth / 2;
-            var offsetY = e.offsetY - e.target.offsetHeight / 2;
-            _this._interact$.next({
-                cursor: cursor,
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: _this._tag,
-                vertexIndex: vertexIndex,
-            });
-        };
-    };
-    OutlineRenderTag.prototype._updateFillGeometry = function () {
-        var triangles = this._getTriangles();
-        var positions = new Float32Array(triangles);
-        var geometry = this._fill.geometry;
-        var attribute = geometry.getAttribute("position");
-        if (attribute.array.length === positions.length) {
-            attribute.set(positions);
-            attribute.needsUpdate = true;
-        }
-        else {
-            geometry.removeAttribute("position");
-            geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        }
-        geometry.computeBoundingSphere();
-    };
-    OutlineRenderTag.prototype._updateFillMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.fillColor);
-        material.opacity = this._tag.fillOpacity;
-        material.needsUpdate = true;
-    };
-    OutlineRenderTag.prototype._updateHoleGeometries = function () {
-        var holes3d = this._getHoles3d();
-        if (holes3d.length !== this._holes.length) {
-            throw new Error("Changing the number of holes is not supported.");
-        }
-        for (var i = 0; i < this._holes.length; i++) {
-            var holePoints3d = holes3d[i];
-            var hole = this._holes[i];
-            this._updateLine(hole, holePoints3d);
-        }
-    };
-    OutlineRenderTag.prototype._updateHoleMaterials = function () {
-        for (var _i = 0, _a = this._holes; _i < _a.length; _i++) {
-            var hole = _a[_i];
-            var material = hole.material;
-            this._updateLineBasicMaterial(material);
-        }
-    };
-    OutlineRenderTag.prototype._updateLine = function (line, points3d) {
-        var positions = this._getLinePositions(points3d);
-        var geometry = line.geometry;
-        var attribute = geometry.getAttribute("position");
-        attribute.set(positions);
-        attribute.needsUpdate = true;
-        geometry.computeBoundingSphere();
-    };
-    OutlineRenderTag.prototype._updateOulineGeometry = function () {
-        this._updateLine(this._outline, this._getPoints3d());
-    };
-    OutlineRenderTag.prototype._updateOutlineMaterial = function () {
-        var material = this._outline.material;
-        this._updateLineBasicMaterial(material);
-    };
-    OutlineRenderTag.prototype._updateLineBasicMaterial = function (material) {
-        material.color = new THREE.Color(this._tag.lineColor);
-        material.linewidth = Math.max(this._tag.lineWidth, 1);
-        material.visible = this._tag.lineWidth >= 1 && this._tag.lineOpacity > 0;
-        material.opacity = this._tag.lineOpacity;
-        material.transparent = this._tag.lineOpacity < 1;
-        material.needsUpdate = true;
-    };
-    return OutlineRenderTag;
-}(Component_1.RenderTag));
-exports.OutlineRenderTag = OutlineRenderTag;
-
-
-},{"../../../Component":275,"three":226,"virtual-dom":231}],367:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class OutlineTag
- *
- * @classdesc Tag holding properties for visualizing a geometry outline.
- *
- * @example
- * ```
- * var geometry = new Mapillary.TagComponent.RectGeometry([0.3, 0.3, 0.5, 0.4]);
- * var tag = new Mapillary.TagComponent.OutlineTag(
- *     "id-1",
- *     geometry
- *     { editable: true, lineColor: 0xff0000 });
- *
- * tagComponent.add([tag]);
- * ```
- */
-var OutlineTag = /** @class */ (function (_super) {
-    __extends(OutlineTag, _super);
-    /**
-     * Create an outline tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id - Unique identifier of the tag.
-     * @param {VertexGeometry} geometry - Geometry defining vertices of tag.
-     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
-     * behavior of the outline tag.
-     */
-    function OutlineTag(id, geometry, options) {
-        var _this = _super.call(this, id, geometry) || this;
-        options = !!options ? options : {};
-        var domain = options.domain != null && geometry instanceof Component_1.PolygonGeometry ?
-            options.domain : Component_1.TagDomain.TwoDimensional;
-        var twoDimensionalPolygon = _this._twoDimensionalPolygon(domain, geometry);
-        _this._domain = domain;
-        _this._editable = options.editable == null || twoDimensionalPolygon ? false : options.editable;
-        _this._fillColor = options.fillColor == null ? 0xFFFFFF : options.fillColor;
-        _this._fillOpacity = options.fillOpacity == null ? 0.0 : options.fillOpacity;
-        _this._icon = options.icon === undefined ? null : options.icon;
-        _this._iconFloat = options.iconFloat == null ? Viewer_1.Alignment.Center : options.iconFloat;
-        _this._iconIndex = options.iconIndex == null ? 3 : options.iconIndex;
-        _this._indicateVertices = options.indicateVertices == null ? true : options.indicateVertices;
-        _this._lineColor = options.lineColor == null ? 0xFFFFFF : options.lineColor;
-        _this._lineOpacity = options.lineOpacity == null ? 1 : options.lineOpacity;
-        _this._lineWidth = options.lineWidth == null ? 1 : options.lineWidth;
-        _this._text = options.text === undefined ? null : options.text;
-        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
-        _this._click$ = new rxjs_1.Subject();
-        _this._click$
-            .subscribe(function (t) {
-            _this.fire(OutlineTag.click, _this);
-        });
-        return _this;
-    }
-    Object.defineProperty(OutlineTag.prototype, "click$", {
-        /**
-         * Click observable.
-         *
-         * @description An observable emitting the tag when the icon of the
-         * tag has been clicked.
-         *
-         * @returns {Observable<Tag>}
-         */
-        get: function () {
-            return this._click$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "domain", {
-        /**
-         * Get domain property.
-         *
-         * @description Readonly property that can only be set in constructor.
-         *
-         * @returns Value indicating the domain of the tag.
-         */
-        get: function () {
-            return this._domain;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "editable", {
-        /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
-         */
-        get: function () {
-            return this._editable;
-        },
-        /**
-         * Set editable property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            if (this._twoDimensionalPolygon(this._domain, this._geometry)) {
-                return;
-            }
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "fillColor", {
-        /**
-         * Get fill color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._fillColor;
-        },
-        /**
-         * Set fill color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._fillColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "fillOpacity", {
-        /**
-         * Get fill opacity property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._fillOpacity;
-        },
-        /**
-         * Set fill opacity property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._fillOpacity = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "geometry", {
-        /** @inheritdoc */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "icon", {
-        /**
-         * Get icon property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._icon;
-        },
-        /**
-         * Set icon property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._icon = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "iconFloat", {
-        /**
-         * Get icon float property.
-         * @returns {Alignment}
-         */
-        get: function () {
-            return this._iconFloat;
-        },
-        /**
-         * Set icon float property.
-         * @param {Alignment}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._iconFloat = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "iconIndex", {
-        /**
-         * Get icon index property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._iconIndex;
-        },
-        /**
-         * Set icon index property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._iconIndex = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "indicateVertices", {
-        /**
-         * Get indicate vertices property.
-         * @returns {boolean} Value indicating if vertices should be indicated
-         * when tag is editable.
-         */
-        get: function () {
-            return this._indicateVertices;
-        },
-        /**
-         * Set indicate vertices property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._indicateVertices = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "lineColor", {
-        /**
-         * Get line color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineColor;
-        },
-        /**
-         * Set line color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "lineOpacity", {
-        /**
-         * Get line opacity property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineOpacity;
-        },
-        /**
-         * Set line opacity property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineOpacity = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "lineWidth", {
-        /**
-         * Get line width property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._lineWidth;
-        },
-        /**
-         * Set line width property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._lineWidth = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "text", {
-        /**
-         * Get text property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._text;
-        },
-        /**
-         * Set text property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._text = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(OutlineTag.prototype, "textColor", {
-        /**
-         * Get text color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._textColor;
-        },
-        /**
-         * Set text color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._textColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keeps
-     * the rest of the values as is.
-     *
-     * @param {IOutlineTagOptions} options - Outline tag options
-     *
-     * @fires {Tag#changed}
-     */
-    OutlineTag.prototype.setOptions = function (options) {
-        var twoDimensionalPolygon = this._twoDimensionalPolygon(this._domain, this._geometry);
-        this._editable = twoDimensionalPolygon || options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._iconFloat = options.iconFloat == null ? this._iconFloat : options.iconFloat;
-        this._iconIndex = options.iconIndex == null ? this._iconIndex : options.iconIndex;
-        this._indicateVertices = options.indicateVertices == null ? this._indicateVertices : options.indicateVertices;
-        this._lineColor = options.lineColor == null ? this._lineColor : options.lineColor;
-        this._lineWidth = options.lineWidth == null ? this._lineWidth : options.lineWidth;
-        this._fillColor = options.fillColor == null ? this._fillColor : options.fillColor;
-        this._fillOpacity = options.fillOpacity == null ? this._fillOpacity : options.fillOpacity;
-        this._text = options.text === undefined ? this._text : options.text;
-        this._textColor = options.textColor == null ? this._textColor : options.textColor;
-        this._notifyChanged$.next(this);
-    };
-    OutlineTag.prototype._twoDimensionalPolygon = function (domain, geometry) {
-        return domain !== Component_1.TagDomain.ThreeDimensional && geometry instanceof Component_1.PolygonGeometry;
-    };
-    /**
-     * Event fired when the icon of the outline tag is clicked.
-     *
-     * @event OutlineTag#click
-     * @type {OutlineTag} The tag instance that was clicked.
-     */
-    OutlineTag.click = "click";
-    return OutlineTag;
-}(Component_1.Tag));
-exports.OutlineTag = OutlineTag;
-exports.default = OutlineTag;
-
-},{"../../../Component":275,"../../../Viewer":286,"rxjs":27}],368:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../../../Geo");
-var RenderTag = /** @class */ (function () {
-    function RenderTag(tag, transform, viewportCoords) {
-        this._tag = tag;
-        this._transform = transform;
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-        this._glObjectsChanged$ = new rxjs_1.Subject();
-        this._interact$ = new rxjs_1.Subject();
-    }
-    Object.defineProperty(RenderTag.prototype, "glObjectsChanged$", {
-        get: function () {
-            return this._glObjectsChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderTag.prototype, "interact$", {
-        get: function () {
-            return this._interact$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderTag.prototype, "tag", {
-        get: function () {
-            return this._tag;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return RenderTag;
-}());
-exports.RenderTag = RenderTag;
-exports.default = RenderTag;
-
-},{"../../../Geo":278,"rxjs":27}],369:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var vd = require("virtual-dom");
-var Component_1 = require("../../../Component");
-var Viewer_1 = require("../../../Viewer");
-/**
- * @class SpotRenderTag
- * @classdesc Tag visualizing the properties of a SpotTag.
- */
-var SpotRenderTag = /** @class */ (function (_super) {
-    __extends(SpotRenderTag, _super);
-    function SpotRenderTag() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    SpotRenderTag.prototype.dispose = function () { };
-    SpotRenderTag.prototype.getDOMObjects = function (atlas, camera, size) {
-        var _this = this;
-        var tag = this._tag;
-        var container = {
-            offsetHeight: size.height, offsetWidth: size.width,
-        };
-        var vNodes = [];
-        var _a = tag.geometry.getCentroid2d(), centroidBasicX = _a[0], centroidBasicY = _a[1];
-        var centroidCanvas = this._viewportCoords.basicToCanvasSafe(centroidBasicX, centroidBasicY, container, this._transform, camera);
-        if (centroidCanvas != null) {
-            var interactNone = function (e) {
-                _this._interact$.next({ offsetX: 0, offsetY: 0, operation: Component_1.TagOperation.None, tag: tag });
-            };
-            var canvasX = Math.round(centroidCanvas[0]);
-            var canvasY = Math.round(centroidCanvas[1]);
-            if (tag.icon != null) {
-                if (atlas.loaded) {
-                    var sprite = atlas.getDOMSprite(tag.icon, Viewer_1.Alignment.Bottom);
-                    var iconTransform = "translate(" + canvasX + "px," + (canvasY + 8) + "px)";
-                    var properties = {
-                        onmousedown: interactNone,
-                        style: {
-                            pointerEvents: "all",
-                            transform: iconTransform,
-                        },
-                    };
-                    vNodes.push(vd.h("div", properties, [sprite]));
-                }
-            }
-            else if (tag.text != null) {
-                var textTransform = "translate(-50%,0%) translate(" + canvasX + "px," + (canvasY + 8) + "px)";
-                var properties = {
-                    onmousedown: interactNone,
-                    style: {
-                        color: this._colorToCss(tag.textColor),
-                        transform: textTransform,
-                    },
-                    textContent: tag.text,
-                };
-                vNodes.push(vd.h("span.TagSymbol", properties, []));
-            }
-            var interact = this._interact(Component_1.TagOperation.Centroid, tag, "move");
-            var background = this._colorToCss(tag.color);
-            var transform = "translate(-50%,-50%) translate(" + canvasX + "px," + canvasY + "px)";
-            if (tag.editable) {
-                var interactorProperties = {
-                    onmousedown: interact,
-                    style: {
-                        background: background,
-                        transform: transform,
-                    },
-                };
-                vNodes.push(vd.h("div.TagSpotInteractor", interactorProperties, []));
-            }
-            var pointProperties = {
-                style: {
-                    background: background,
-                    transform: transform,
-                },
-            };
-            vNodes.push(vd.h("div.TagVertex", pointProperties, []));
-        }
-        return vNodes;
-    };
-    SpotRenderTag.prototype.getGLObjects = function () { return []; };
-    SpotRenderTag.prototype.getRetrievableObjects = function () { return []; };
-    SpotRenderTag.prototype._colorToCss = function (color) {
-        return "#" + ("000000" + color.toString(16)).substr(-6);
-    };
-    SpotRenderTag.prototype._interact = function (operation, tag, cursor, vertexIndex) {
-        var _this = this;
-        return function (e) {
-            var offsetX = e.offsetX - e.target.offsetWidth / 2;
-            var offsetY = e.offsetY - e.target.offsetHeight / 2;
-            _this._interact$.next({
-                cursor: cursor,
-                offsetX: offsetX,
-                offsetY: offsetY,
-                operation: operation,
-                tag: tag,
-                vertexIndex: vertexIndex,
-            });
-        };
-    };
-    return SpotRenderTag;
-}(Component_1.RenderTag));
-exports.SpotRenderTag = SpotRenderTag;
-
-
-},{"../../../Component":275,"../../../Viewer":286,"virtual-dom":231}],370:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var Component_1 = require("../../../Component");
-/**
- * @class SpotTag
- *
- * @classdesc Tag holding properties for visualizing the centroid of a geometry.
- *
- * @example
- * ```
- * var geometry = new Mapillary.TagComponent.PointGeometry([0.3, 0.3]);
- * var tag = new Mapillary.TagComponent.SpotTag(
- *     "id-1",
- *     geometry
- *     { editable: true, color: 0xff0000 });
- *
- * tagComponent.add([tag]);
- * ```
- */
-var SpotTag = /** @class */ (function (_super) {
-    __extends(SpotTag, _super);
-    /**
-     * Create a spot tag.
-     *
-     * @override
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     * @param {IOutlineTagOptions} options - Options defining the visual appearance and
-     * behavior of the spot tag.
-     */
-    function SpotTag(id, geometry, options) {
-        var _this = _super.call(this, id, geometry) || this;
-        options = !!options ? options : {};
-        _this._color = options.color == null ? 0xFFFFFF : options.color;
-        _this._editable = options.editable == null ? false : options.editable;
-        _this._icon = options.icon === undefined ? null : options.icon;
-        _this._text = options.text === undefined ? null : options.text;
-        _this._textColor = options.textColor == null ? 0xFFFFFF : options.textColor;
-        return _this;
-    }
-    Object.defineProperty(SpotTag.prototype, "color", {
-        /**
-         * Get color property.
-         * @returns {number} The color of the spot as a hexagonal number;
-         */
-        get: function () {
-            return this._color;
-        },
-        /**
-         * Set color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._color = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "editable", {
-        /**
-         * Get editable property.
-         * @returns {boolean} Value indicating if tag is editable.
-         */
-        get: function () {
-            return this._editable;
-        },
-        /**
-         * Set editable property.
-         * @param {boolean}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._editable = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "icon", {
-        /**
-         * Get icon property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._icon;
-        },
-        /**
-         * Set icon property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._icon = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "text", {
-        /**
-         * Get text property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._text;
-        },
-        /**
-         * Set text property.
-         * @param {string}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._text = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpotTag.prototype, "textColor", {
-        /**
-         * Get text color property.
-         * @returns {number}
-         */
-        get: function () {
-            return this._textColor;
-        },
-        /**
-         * Set text color property.
-         * @param {number}
-         *
-         * @fires Tag#changed
-         */
-        set: function (value) {
-            this._textColor = value;
-            this._notifyChanged$.next(this);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Set options for tag.
-     *
-     * @description Sets all the option properties provided and keps
-     * the rest of the values as is.
-     *
-     * @param {ISpotTagOptions} options - Spot tag options
-     *
-     * @fires {Tag#changed}
-     */
-    SpotTag.prototype.setOptions = function (options) {
-        this._color = options.color == null ? this._color : options.color;
-        this._editable = options.editable == null ? this._editable : options.editable;
-        this._icon = options.icon === undefined ? this._icon : options.icon;
-        this._text = options.text === undefined ? this._text : options.text;
-        this._textColor = options.textColor == null ? this._textColor : options.textColor;
-        this._notifyChanged$.next(this);
-    };
-    return SpotTag;
-}(Component_1.Tag));
-exports.SpotTag = SpotTag;
-exports.default = SpotTag;
-
-},{"../../../Component":275}],371:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Utils_1 = require("../../../Utils");
-/**
- * @class Tag
- * @abstract
- * @classdesc Abstract class representing the basic functionality of for a tag.
- */
-var Tag = /** @class */ (function (_super) {
-    __extends(Tag, _super);
-    /**
-     * Create a tag.
-     *
-     * @constructor
-     * @param {string} id
-     * @param {Geometry} geometry
-     */
-    function Tag(id, geometry) {
-        var _this = _super.call(this) || this;
-        _this._id = id;
-        _this._geometry = geometry;
-        _this._notifyChanged$ = new rxjs_1.Subject();
-        _this._notifyChanged$
-            .subscribe(function (t) {
-            _this.fire(Tag.changed, _this);
-        });
-        _this._geometry.changed$
-            .subscribe(function (g) {
-            _this.fire(Tag.geometrychanged, _this);
-        });
-        return _this;
-    }
-    Object.defineProperty(Tag.prototype, "id", {
-        /**
-         * Get id property.
-         * @returns {string}
-         */
-        get: function () {
-            return this._id;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometry", {
-        /**
-         * Get geometry property.
-         * @returns {Geometry} The geometry of the tag.
-         */
-        get: function () {
-            return this._geometry;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "changed$", {
-        /**
-         * Get changed observable.
-         * @returns {Observable<Tag>}
-         * @ignore
-         */
-        get: function () {
-            return this._notifyChanged$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Tag.prototype, "geometryChanged$", {
-        /**
-         * Get geometry changed observable.
-         * @returns {Observable<Tag>}
-         * @ignore
-         */
-        get: function () {
-            var _this = this;
-            return this._geometry.changed$.pipe(operators_1.map(function (geometry) {
-                return _this;
-            }), operators_1.share());
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Event fired when a property related to the visual appearance of the
-     * tag has changed.
-     *
-     * @event Tag#changed
-     * @type {Tag} The tag instance that has changed.
-     */
-    Tag.changed = "changed";
-    /**
-     * Event fired when the geometry of the tag has changed.
-     *
-     * @event Tag#geometrychanged
-     * @type {Tag} The tag instance whose geometry has changed.
-     */
-    Tag.geometrychanged = "geometrychanged";
-    return Tag;
-}(Utils_1.EventEmitter));
-exports.Tag = Tag;
-exports.default = Tag;
-
-},{"../../../Utils":285,"rxjs":27,"rxjs/operators":225}],372:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for tag domains.
- * @enum {number}
- * @readonly
- * @description Defines where lines between two vertices are treated
- * as straight.
- *
- * Only applicable for polygons. For rectangles lines between
- * vertices are always treated as straight in the distorted 2D
- * projection and bended in the undistorted 3D space.
- */
-var TagDomain;
-(function (TagDomain) {
-    /**
-     * Treats lines between two vertices as straight in the
-     * distorted 2D projection, i.e. on the image. If the image
-     * is distorted this will result in bended lines when rendered
-     * in the undistorted 3D space.
-     */
-    TagDomain[TagDomain["TwoDimensional"] = 0] = "TwoDimensional";
-    /**
-     * Treats lines as straight in the undistorted 3D space. If the
-     * image is distorted this will result in bended lines when rendered
-     * on the distorted 2D projection of the image.
-     */
-    TagDomain[TagDomain["ThreeDimensional"] = 1] = "ThreeDimensional";
-})(TagDomain = exports.TagDomain || (exports.TagDomain = {}));
-exports.default = TagDomain;
-
-},{}],373:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for component size.
- * @enum {number}
- * @readonly
- * @description May be used by a component to allow for resizing
- * of the UI elements rendered by the component.
- */
-var ComponentSize;
-(function (ComponentSize) {
-    /**
-     * Automatic size. The size of the elements will automatically
-     * change at a predefined threshold.
-     */
-    ComponentSize[ComponentSize["Automatic"] = 0] = "Automatic";
-    /**
-     * Large size. The size of the elements will be fixed until another
-     * component size is configured.
-     */
-    ComponentSize[ComponentSize["Large"] = 1] = "Large";
-    /**
-     * Small size. The size of the elements will be fixed until another
-     * component size is configured.
-     */
-    ComponentSize[ComponentSize["Small"] = 2] = "Small";
-})(ComponentSize = exports.ComponentSize || (exports.ComponentSize = {}));
-exports.default = ComponentSize;
-
-},{}],374:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var HandlerBase = /** @class */ (function () {
-    /** @ignore */
-    function HandlerBase(component, container, navigator) {
-        this._component = component;
-        this._container = container;
-        this._navigator = navigator;
-        this._enabled = false;
-    }
-    Object.defineProperty(HandlerBase.prototype, "isEnabled", {
-        /**
-         * Returns a Boolean indicating whether the interaction is enabled.
-         *
-         * @returns {boolean} `true` if the interaction is enabled.
-         */
-        get: function () {
-            return this._enabled;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Enables the interaction.
-     *
-     * @example ```<component-name>.<handler-name>.enable();```
-     */
-    HandlerBase.prototype.enable = function () {
-        if (this._enabled || !this._component.activated) {
-            return;
-        }
-        this._enable();
-        this._enabled = true;
-        this._component.configure(this._getConfiguration(true));
-    };
-    /**
-     * Disables the interaction.
-     *
-     * @example ```<component-name>.<handler-name>.disable();```
-     */
-    HandlerBase.prototype.disable = function () {
-        if (!this._enabled) {
-            return;
-        }
-        this._disable();
-        this._enabled = false;
-        if (this._component.activated) {
-            this._component.configure(this._getConfiguration(false));
-        }
-    };
-    return HandlerBase;
-}());
-exports.HandlerBase = HandlerBase;
-exports.default = HandlerBase;
-
-},{}],375:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Component_1 = require("../../Component");
-var MeshFactory = /** @class */ (function () {
-    function MeshFactory(imagePlaneDepth, imageSphereRadius) {
-        this._imagePlaneDepth = imagePlaneDepth != null ? imagePlaneDepth : 200;
-        this._imageSphereRadius = imageSphereRadius != null ? imageSphereRadius : 200;
-    }
-    MeshFactory.prototype.createMesh = function (node, transform) {
-        if (node.pano) {
-            return this._createImageSphere(node, transform);
-        }
-        else if (transform.cameraProjection === "fisheye") {
-            return this._createImagePlaneFisheye(node, transform);
-        }
-        else {
-            return this._createImagePlane(node, transform);
-        }
-    };
-    MeshFactory.prototype.createFlatMesh = function (node, transform, basicX0, basicX1, basicY0, basicY1) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createDistortedPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._getFlatImagePlaneGeoFromBasic(transform, basicX0, basicX1, basicY0, basicY1);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype.createCurtainMesh = function (node, transform) {
-        if (node.pano && !node.fullPano) {
-            throw new Error("Cropped panoramas cannot have curtain.");
-        }
-        if (node.pano) {
-            return this._createSphereCurtainMesh(node, transform);
-        }
-        else if (transform.cameraProjection === "fisheye") {
-            return this._createCurtainMeshFisheye(node, transform);
-        }
-        else {
-            return this._createCurtainMesh(node, transform);
-        }
-    };
-    MeshFactory.prototype.createDistortedCurtainMesh = function (node, transform) {
-        if (node.pano) {
-            throw new Error("Cropped panoramas cannot have curtain.");
-        }
-        return this._createDistortedCurtainMesh(node, transform);
-    };
-    MeshFactory.prototype._createCurtainMesh = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createCurtainPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeo(transform, node) :
-            this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createCurtainMeshFisheye = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createCurtainPlaneMaterialParametersFisheye(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeoFisheye(transform, node) :
-            this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createDistortedCurtainMesh = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createDistortedCurtainPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createSphereCurtainMesh = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createCurtainSphereMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        return this._useMesh(transform, node) ?
-            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
-            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
-    };
-    MeshFactory.prototype._createImageSphere = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createSphereMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var mesh = this._useMesh(transform, node) ?
-            new THREE.Mesh(this._getImageSphereGeo(transform, node), material) :
-            new THREE.Mesh(this._getFlatImageSphereGeo(transform), material);
-        return mesh;
-    };
-    MeshFactory.prototype._createImagePlane = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createPlaneMaterialParameters(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeo(transform, node) :
-            this._getRegularFlatImagePlaneGeo(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createImagePlaneFisheye = function (node, transform) {
-        var texture = this._createTexture(node.image);
-        var materialParameters = this._createPlaneMaterialParametersFisheye(transform, texture);
-        var material = new THREE.ShaderMaterial(materialParameters);
-        var geometry = this._useMesh(transform, node) ?
-            this._getImagePlaneGeoFisheye(transform, node) :
-            this._getRegularFlatImagePlaneGeoFisheye(transform);
-        return new THREE.Mesh(geometry, material);
-    };
-    MeshFactory.prototype._createSphereMaterialParameters = function (transform, texture) {
-        var gpano = transform.gpano;
-        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
-        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
-        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.equirectangular.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                phiLength: {
-                    type: "f",
-                    value: phiLength,
-                },
-                phiShift: {
-                    type: "f",
-                    value: phiShift,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.rt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                thetaLength: {
-                    type: "f",
-                    value: thetaLength,
-                },
-                thetaShift: {
-                    type: "f",
-                    value: thetaShift,
-                },
-            },
-            vertexShader: Component_1.Shaders.equirectangular.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createCurtainSphereMaterialParameters = function (transform, texture) {
-        var gpano = transform.gpano;
-        var halfCroppedWidth = (gpano.FullPanoWidthPixels - gpano.CroppedAreaImageWidthPixels) / 2;
-        var phiShift = 2 * Math.PI * (gpano.CroppedAreaLeftPixels - halfCroppedWidth) / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var halfCroppedHeight = (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels) / 2;
-        var thetaShift = Math.PI * (halfCroppedHeight - gpano.CroppedAreaTopPixels) / gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.equirectangularCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: {
-                    type: "f",
-                    value: 1,
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                phiLength: {
-                    type: "f",
-                    value: phiLength,
-                },
-                phiShift: {
-                    type: "f",
-                    value: phiShift,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.rt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                thetaLength: {
-                    type: "f",
-                    value: thetaLength,
-                },
-                thetaShift: {
-                    type: "f",
-                    value: thetaShift,
-                },
-            },
-            vertexShader: Component_1.Shaders.equirectangularCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspective.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                focal: {
-                    type: "f",
-                    value: transform.focal,
-                },
-                k1: {
-                    type: "f",
-                    value: transform.ck1,
-                },
-                k2: {
-                    type: "f",
-                    value: transform.ck2,
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.basicRt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                radial_peak: {
-                    type: "f",
-                    value: !!transform.radialPeak ? transform.radialPeak : 0,
-                },
-                scale_x: {
-                    type: "f",
-                    value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth,
-                },
-                scale_y: {
-                    type: "f",
-                    value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight,
-                },
-            },
-            vertexShader: Component_1.Shaders.perspective.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createPlaneMaterialParametersFisheye = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.fisheye.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                focal: {
-                    type: "f",
-                    value: transform.focal,
-                },
-                k1: {
-                    type: "f",
-                    value: transform.ck1,
-                },
-                k2: {
-                    type: "f",
-                    value: transform.ck2,
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.basicRt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                radial_peak: {
-                    type: "f",
-                    value: !!transform.radialPeak ? transform.radialPeak : 0,
-                },
-                scale_x: {
-                    type: "f",
-                    value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth,
-                },
-                scale_y: {
-                    type: "f",
-                    value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight,
-                },
-            },
-            vertexShader: Component_1.Shaders.fisheye.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createCurtainPlaneMaterialParametersFisheye = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.fisheyeCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: {
-                    type: "f",
-                    value: 1,
-                },
-                focal: {
-                    type: "f",
-                    value: transform.focal,
-                },
-                k1: {
-                    type: "f",
-                    value: transform.ck1,
-                },
-                k2: {
-                    type: "f",
-                    value: transform.ck2,
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.basicRt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                radial_peak: {
-                    type: "f",
-                    value: !!transform.radialPeak ? transform.radialPeak : 0,
-                },
-                scale_x: {
-                    type: "f",
-                    value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth,
-                },
-                scale_y: {
-                    type: "f",
-                    value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight,
-                },
-            },
-            vertexShader: Component_1.Shaders.fisheyeCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createCurtainPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspectiveCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: {
-                    type: "f",
-                    value: 1,
-                },
-                focal: {
-                    type: "f",
-                    value: transform.focal,
-                },
-                k1: {
-                    type: "f",
-                    value: transform.ck1,
-                },
-                k2: {
-                    type: "f",
-                    value: transform.ck2,
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.basicRt,
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-                radial_peak: {
-                    type: "f",
-                    value: !!transform.radialPeak ? transform.radialPeak : 0,
-                },
-                scale_x: {
-                    type: "f",
-                    value: Math.max(transform.basicHeight, transform.basicWidth) / transform.basicWidth,
-                },
-                scale_y: {
-                    type: "f",
-                    value: Math.max(transform.basicWidth, transform.basicHeight) / transform.basicHeight,
-                },
-            },
-            vertexShader: Component_1.Shaders.perspectiveCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createDistortedCurtainPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspectiveDistortedCurtain.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                curtain: {
-                    type: "f",
-                    value: 1,
-                },
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.projectorMatrix(),
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-            },
-            vertexShader: Component_1.Shaders.perspectiveDistortedCurtain.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createDistortedPlaneMaterialParameters = function (transform, texture) {
-        var materialParameters = {
-            depthWrite: false,
-            fragmentShader: Component_1.Shaders.perspectiveDistorted.fragment,
-            side: THREE.DoubleSide,
-            transparent: true,
-            uniforms: {
-                opacity: {
-                    type: "f",
-                    value: 1,
-                },
-                projectorMat: {
-                    type: "m4",
-                    value: transform.projectorMatrix(),
-                },
-                projectorTex: {
-                    type: "t",
-                    value: texture,
-                },
-            },
-            vertexShader: Component_1.Shaders.perspectiveDistorted.vertex,
-        };
-        return materialParameters;
-    };
-    MeshFactory.prototype._createTexture = function (image) {
-        var texture = new THREE.Texture(image);
-        texture.minFilter = THREE.LinearFilter;
-        texture.needsUpdate = true;
-        return texture;
-    };
-    MeshFactory.prototype._useMesh = function (transform, node) {
-        return node.mesh.vertices.length && transform.hasValidScale;
-    };
-    MeshFactory.prototype._getImageSphereGeo = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imageSphereRadius * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var l = Math.sqrt(x * x + y * y + z * z);
-            var boundedL = Math.max(minZ, Math.min(l, maxZ));
-            var factor = boundedL / l;
-            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
-        }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    MeshFactory.prototype._getImagePlaneGeo = function (transform, node) {
-        var undistortionMarginFactor = 3;
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imagePlaneDepth * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            if (i < 4) {
-                x *= undistortionMarginFactor;
-                y *= undistortionMarginFactor;
-            }
-            var boundedZ = Math.max(minZ, Math.min(z, maxZ));
-            var factor = boundedZ / z;
-            var p = new THREE.Vector3(x * factor, y * factor, boundedZ);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
-        }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    MeshFactory.prototype._getImagePlaneGeoFisheye = function (transform, node) {
-        var t = new THREE.Matrix4().getInverse(transform.srt);
-        // push everything at least 5 meters in front of the camera
-        var minZ = 5.0 * transform.scale;
-        var maxZ = this._imagePlaneDepth * transform.scale;
-        var vertices = node.mesh.vertices;
-        var numVertices = vertices.length / 3;
-        var positions = new Float32Array(vertices.length);
-        for (var i = 0; i < numVertices; ++i) {
-            var index = 3 * i;
-            var x = vertices[index + 0];
-            var y = vertices[index + 1];
-            var z = vertices[index + 2];
-            var l = Math.sqrt(x * x + y * y + z * z);
-            var boundedL = Math.max(minZ, Math.min(l, maxZ));
-            var factor = boundedL / l;
-            var p = new THREE.Vector3(x * factor, y * factor, z * factor);
-            p.applyMatrix4(t);
-            positions[index + 0] = p.x;
-            positions[index + 1] = p.y;
-            positions[index + 2] = p.z;
-        }
-        var faces = node.mesh.faces;
-        var indices = new Uint16Array(faces.length);
-        for (var i = 0; i < faces.length; ++i) {
-            indices[i] = faces[i];
-        }
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    MeshFactory.prototype._getFlatImageSphereGeo = function (transform) {
-        var gpano = transform.gpano;
-        var phiStart = 2 * Math.PI * gpano.CroppedAreaLeftPixels / gpano.FullPanoWidthPixels;
-        var phiLength = 2 * Math.PI * gpano.CroppedAreaImageWidthPixels / gpano.FullPanoWidthPixels;
-        var thetaStart = Math.PI *
-            (gpano.FullPanoHeightPixels - gpano.CroppedAreaImageHeightPixels - gpano.CroppedAreaTopPixels) /
-            gpano.FullPanoHeightPixels;
-        var thetaLength = Math.PI * gpano.CroppedAreaImageHeightPixels / gpano.FullPanoHeightPixels;
-        var geometry = new THREE.SphereGeometry(this._imageSphereRadius, 20, 40, phiStart - Math.PI / 2, phiLength, thetaStart, thetaLength);
-        geometry.applyMatrix(new THREE.Matrix4().getInverse(transform.rt));
-        return geometry;
-    };
-    MeshFactory.prototype._getRegularFlatImagePlaneGeo = function (transform) {
-        var width = transform.width;
-        var height = transform.height;
-        var size = Math.max(width, height);
-        var dx = width / 2.0 / size;
-        var dy = height / 2.0 / size;
-        return this._getFlatImagePlaneGeo(transform, dx, dy);
-    };
-    MeshFactory.prototype._getFlatImagePlaneGeo = function (transform, dx, dy) {
-        var vertices = [];
-        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
-        return this._createFlatGeometry(vertices);
-    };
-    MeshFactory.prototype._getRegularFlatImagePlaneGeoFisheye = function (transform) {
-        var width = transform.width;
-        var height = transform.height;
-        var size = Math.max(width, height);
-        var dx = width / 2.0 / size;
-        var dy = height / 2.0 / size;
-        return this._getFlatImagePlaneGeoFisheye(transform, dx, dy);
-    };
-    MeshFactory.prototype._getFlatImagePlaneGeoFisheye = function (transform, dx, dy) {
-        var vertices = [];
-        vertices.push(transform.unprojectSfM([-dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, -dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([dx, dy], this._imagePlaneDepth));
-        vertices.push(transform.unprojectSfM([-dx, dy], this._imagePlaneDepth));
-        return this._createFlatGeometry(vertices);
-    };
-    MeshFactory.prototype._getFlatImagePlaneGeoFromBasic = function (transform, basicX0, basicX1, basicY0, basicY1) {
-        var vertices = [];
-        vertices.push(transform.unprojectBasic([basicX0, basicY0], this._imagePlaneDepth));
-        vertices.push(transform.unprojectBasic([basicX1, basicY0], this._imagePlaneDepth));
-        vertices.push(transform.unprojectBasic([basicX1, basicY1], this._imagePlaneDepth));
-        vertices.push(transform.unprojectBasic([basicX0, basicY1], this._imagePlaneDepth));
-        return this._createFlatGeometry(vertices);
-    };
-    MeshFactory.prototype._createFlatGeometry = function (vertices) {
-        var positions = new Float32Array(12);
-        for (var i = 0; i < vertices.length; i++) {
-            var index = 3 * i;
-            positions[index + 0] = vertices[i][0];
-            positions[index + 1] = vertices[i][1];
-            positions[index + 2] = vertices[i][2];
-        }
-        var indices = new Uint16Array(6);
-        indices[0] = 0;
-        indices[1] = 1;
-        indices[2] = 3;
-        indices[3] = 1;
-        indices[4] = 2;
-        indices[5] = 3;
-        var geometry = new THREE.BufferGeometry();
-        geometry.addAttribute("position", new THREE.BufferAttribute(positions, 3));
-        geometry.setIndex(new THREE.BufferAttribute(indices, 1));
-        return geometry;
-    };
-    return MeshFactory;
-}());
-exports.MeshFactory = MeshFactory;
-exports.default = MeshFactory;
-
-},{"../../Component":275,"three":226}],376:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var MeshScene = /** @class */ (function () {
-    function MeshScene() {
-        this._planes = {};
-        this._planesOld = {};
-        this._planesPeriphery = {};
-        this._scene = new THREE.Scene();
-        this._sceneOld = new THREE.Scene();
-        this._scenePeriphery = new THREE.Scene();
-    }
-    Object.defineProperty(MeshScene.prototype, "planes", {
-        get: function () {
-            return this._planes;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "planesOld", {
-        get: function () {
-            return this._planesOld;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "planesPeriphery", {
-        get: function () {
-            return this._planesPeriphery;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "scene", {
-        get: function () {
-            return this._scene;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "sceneOld", {
-        get: function () {
-            return this._sceneOld;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MeshScene.prototype, "scenePeriphery", {
-        get: function () {
-            return this._scenePeriphery;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MeshScene.prototype.updateImagePlanes = function (planes) {
-        this._dispose(this._planesOld, this.sceneOld);
-        for (var key in this._planes) {
-            if (!this._planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = this._planes[key];
-            this._scene.remove(plane);
-            this._sceneOld.add(plane);
-        }
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            this._scene.add(planes[key]);
-        }
-        this._planesOld = this._planes;
-        this._planes = planes;
-    };
-    MeshScene.prototype.addImagePlanes = function (planes) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            this._scene.add(plane);
-            this._planes[key] = plane;
-        }
-    };
-    MeshScene.prototype.addImagePlanesOld = function (planes) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            this._sceneOld.add(plane);
-            this._planesOld[key] = plane;
-        }
-    };
-    MeshScene.prototype.setImagePlanes = function (planes) {
-        this._clear();
-        this.addImagePlanes(planes);
-    };
-    MeshScene.prototype.addPeripheryPlanes = function (planes) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            this._scenePeriphery.add(plane);
-            this._planesPeriphery[key] = plane;
-        }
-    };
-    MeshScene.prototype.setPeripheryPlanes = function (planes) {
-        this._clearPeriphery();
-        this.addPeripheryPlanes(planes);
-    };
-    MeshScene.prototype.setImagePlanesOld = function (planes) {
-        this._clearOld();
-        this.addImagePlanesOld(planes);
-    };
-    MeshScene.prototype.clear = function () {
-        this._clear();
-        this._clearOld();
-    };
-    MeshScene.prototype._clear = function () {
-        this._dispose(this._planes, this._scene);
-        this._planes = {};
-    };
-    MeshScene.prototype._clearOld = function () {
-        this._dispose(this._planesOld, this._sceneOld);
-        this._planesOld = {};
-    };
-    MeshScene.prototype._clearPeriphery = function () {
-        this._dispose(this._planesPeriphery, this._scenePeriphery);
-        this._planesPeriphery = {};
-    };
-    MeshScene.prototype._dispose = function (planes, scene) {
-        for (var key in planes) {
-            if (!planes.hasOwnProperty(key)) {
-                continue;
-            }
-            var plane = planes[key];
-            scene.remove(plane);
-            plane.geometry.dispose();
-            plane.material.dispose();
-            var texture = plane.material.uniforms.projectorTex.value;
-            if (texture != null) {
-                texture.dispose();
-            }
-        }
-    };
-    return MeshScene;
-}());
-exports.MeshScene = MeshScene;
-exports.default = MeshScene;
-
-},{"three":226}],377:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var MouseOperator = /** @class */ (function () {
-    function MouseOperator() {
-    }
-    MouseOperator.filteredPairwiseMouseDrag$ = function (name, mouseService) {
-        return mouseService
-            .filtered$(name, mouseService.mouseDragStart$).pipe(operators_1.switchMap(function (mouseDragStart) {
-            var mouseDragging$ = rxjs_1.concat(rxjs_1.of(mouseDragStart), mouseService
-                .filtered$(name, mouseService.mouseDrag$));
-            var mouseDragEnd$ = mouseService
-                .filtered$(name, mouseService.mouseDragEnd$).pipe(operators_1.map(function () {
-                return null;
-            }));
-            return rxjs_1.merge(mouseDragging$, mouseDragEnd$).pipe(operators_1.takeWhile(function (e) {
-                return !!e;
-            }), operators_1.startWith(null));
-        }), operators_1.pairwise(), operators_1.filter(function (pair) {
-            return pair[0] != null && pair[1] != null;
-        }));
-    };
-    return MouseOperator;
-}());
-exports.MouseOperator = MouseOperator;
-exports.default = MouseOperator;
-
-},{"rxjs":27,"rxjs/operators":225}],378:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var Component_1 = require("../../Component");
-var Geo_1 = require("../../Geo");
-var State_1 = require("../../State");
-var ComponentSize_1 = require("../utils/ComponentSize");
-/**
- * @class ZoomComponent
- *
- * @classdesc Component rendering UI elements used for zooming.
- *
- * @example
- * ```
- * var viewer = new Mapillary.Viewer(
- *     "<element-id>",
- *     "<client-id>",
- *     "<my key>");
- *
- * var zoomComponent = viewer.getComponent("zoom");
- * zoomComponent.configure({ size: Mapillary.ComponentSize.Small });
- * ```
- */
-var ZoomComponent = /** @class */ (function (_super) {
-    __extends(ZoomComponent, _super);
-    function ZoomComponent(name, container, navigator) {
-        var _this = _super.call(this, name, container, navigator) || this;
-        _this._viewportCoords = new Geo_1.ViewportCoords();
-        _this._zoomDelta$ = new rxjs_1.Subject();
-        return _this;
-    }
-    ZoomComponent.prototype._activate = function () {
-        var _this = this;
-        this._renderSubscription = rxjs_1.combineLatest(this._navigator.stateService.currentState$, this._navigator.stateService.state$, this._configuration$, this._container.renderService.size$).pipe(operators_1.map(function (_a) {
-            var frame = _a[0], state = _a[1], configuration = _a[2], size = _a[3];
-            var zoom = frame.state.zoom;
-            var zoomInIcon = vd.h("div.ZoomInIcon", []);
-            var zoomInButton = zoom >= 3 || state === State_1.State.Waiting ?
-                vd.h("div.ZoomInButtonDisabled", [zoomInIcon]) :
-                vd.h("div.ZoomInButton", { onclick: function () { _this._zoomDelta$.next(1); } }, [zoomInIcon]);
-            var zoomOutIcon = vd.h("div.ZoomOutIcon", []);
-            var zoomOutButton = zoom <= 0 || state === State_1.State.Waiting ?
-                vd.h("div.ZoomOutButtonDisabled", [zoomOutIcon]) :
-                vd.h("div.ZoomOutButton", { onclick: function () { _this._zoomDelta$.next(-1); } }, [zoomOutIcon]);
-            var compact = configuration.size === ComponentSize_1.default.Small ||
-                configuration.size === ComponentSize_1.default.Automatic && size.width < 640 ?
-                ".ZoomCompact" : "";
-            return {
-                name: _this._name,
-                vnode: vd.h("div.ZoomContainer" + compact, { oncontextmenu: function (event) { event.preventDefault(); } }, [zoomInButton, zoomOutButton]),
-            };
-        }))
-            .subscribe(this._container.domRenderer.render$);
-        this._zoomSubscription = this._zoomDelta$.pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$))
-            .subscribe(function (_a) {
-            var zoomDelta = _a[0], render = _a[1], transform = _a[2];
-            var unprojected = _this._viewportCoords.unprojectFromViewport(0, 0, render.perspective);
-            var reference = transform.projectBasic(unprojected.toArray());
-            _this._navigator.stateService.zoomIn(zoomDelta, reference);
-        });
-    };
-    ZoomComponent.prototype._deactivate = function () {
-        this._renderSubscription.unsubscribe();
-        this._zoomSubscription.unsubscribe();
-    };
-    ZoomComponent.prototype._getDefaultConfiguration = function () {
-        return { size: ComponentSize_1.default.Automatic };
-    };
-    ZoomComponent.componentName = "zoom";
-    return ZoomComponent;
-}(Component_1.Component));
-exports.ZoomComponent = ZoomComponent;
-Component_1.ComponentService.register(ZoomComponent);
-exports.default = ZoomComponent;
-
-},{"../../Component":275,"../../Geo":278,"../../State":282,"../utils/ComponentSize":373,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],379:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var MapillaryError_1 = require("./MapillaryError");
-/**
- * @class AbortMapillaryError
- *
- * @classdesc Error thrown when a move to request has been
- * aborted before completing because of a subsequent request.
- */
-var AbortMapillaryError = /** @class */ (function (_super) {
-    __extends(AbortMapillaryError, _super);
-    function AbortMapillaryError(message) {
-        var _this = _super.call(this, message != null ? message : "The request was aborted.") || this;
-        Object.setPrototypeOf(_this, AbortMapillaryError.prototype);
-        _this.name = "AbortMapillaryError";
-        return _this;
-    }
-    return AbortMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.AbortMapillaryError = AbortMapillaryError;
-exports.default = AbortMapillaryError;
-
-},{"./MapillaryError":382}],380:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var MapillaryError_1 = require("./MapillaryError");
-var ArgumentMapillaryError = /** @class */ (function (_super) {
-    __extends(ArgumentMapillaryError, _super);
-    function ArgumentMapillaryError(message) {
-        var _this = _super.call(this, message != null ? message : "The argument is not valid.") || this;
-        Object.setPrototypeOf(_this, ArgumentMapillaryError.prototype);
-        _this.name = "ArgumentMapillaryError";
-        return _this;
-    }
-    return ArgumentMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.ArgumentMapillaryError = ArgumentMapillaryError;
-exports.default = ArgumentMapillaryError;
-
-},{"./MapillaryError":382}],381:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var MapillaryError_1 = require("./MapillaryError");
-var GraphMapillaryError = /** @class */ (function (_super) {
-    __extends(GraphMapillaryError, _super);
-    function GraphMapillaryError(message) {
-        var _this = _super.call(this, message) || this;
-        Object.setPrototypeOf(_this, GraphMapillaryError.prototype);
-        _this.name = "GraphMapillaryError";
-        return _this;
-    }
-    return GraphMapillaryError;
-}(MapillaryError_1.MapillaryError));
-exports.GraphMapillaryError = GraphMapillaryError;
-exports.default = GraphMapillaryError;
-
-},{"./MapillaryError":382}],382:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var MapillaryError = /** @class */ (function (_super) {
-    __extends(MapillaryError, _super);
-    function MapillaryError(message) {
-        var _this = _super.call(this, message) || this;
-        Object.setPrototypeOf(_this, MapillaryError.prototype);
-        _this.name = "MapillaryError";
-        return _this;
-    }
-    return MapillaryError;
-}(Error));
-exports.MapillaryError = MapillaryError;
-exports.default = MapillaryError;
-
-},{}],383:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-/**
- * @class Camera
- *
- * @classdesc Holds information about a camera.
- */
-var Camera = /** @class */ (function () {
-    /**
-     * Create a new camera instance.
-     * @param {Transform} [transform] - Optional transform instance.
-     */
-    function Camera(transform) {
-        if (transform != null) {
-            this._position = new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 0));
-            this._lookat = new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 10));
-            this._up = transform.upVector();
-            this._focal = this._getFocal(transform);
-        }
-        else {
-            this._position = new THREE.Vector3(0, 0, 0);
-            this._lookat = new THREE.Vector3(0, 0, 1);
-            this._up = new THREE.Vector3(0, -1, 0);
-            this._focal = 1;
-        }
-    }
-    Object.defineProperty(Camera.prototype, "position", {
-        /**
-         * Get position.
-         * @returns {THREE.Vector3} The position vector.
-         */
-        get: function () {
-            return this._position;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "lookat", {
-        /**
-         * Get lookat.
-         * @returns {THREE.Vector3} The lookat vector.
-         */
-        get: function () {
-            return this._lookat;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "up", {
-        /**
-         * Get up.
-         * @returns {THREE.Vector3} The up vector.
-         */
-        get: function () {
-            return this._up;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Camera.prototype, "focal", {
-        /**
-         * Get focal.
-         * @returns {number} The focal length.
-         */
-        get: function () {
-            return this._focal;
-        },
-        /**
-         * Set focal.
-         */
-        set: function (value) {
-            this._focal = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Update this camera to the linearly interpolated value of two other cameras.
-     *
-     * @param {Camera} a - First camera.
-     * @param {Camera} b - Second camera.
-     * @param {number} alpha - Interpolation value on the interval [0, 1].
-     */
-    Camera.prototype.lerpCameras = function (a, b, alpha) {
-        this._position.subVectors(b.position, a.position).multiplyScalar(alpha).add(a.position);
-        this._lookat.subVectors(b.lookat, a.lookat).multiplyScalar(alpha).add(a.lookat);
-        this._up.subVectors(b.up, a.up).multiplyScalar(alpha).add(a.up);
-        this._focal = (1 - alpha) * a.focal + alpha * b.focal;
-    };
-    /**
-     * Copy the properties of another camera to this camera.
-     *
-     * @param {Camera} other - Another camera.
-     */
-    Camera.prototype.copy = function (other) {
-        this._position.copy(other.position);
-        this._lookat.copy(other.lookat);
-        this._up.copy(other.up);
-        this._focal = other.focal;
-    };
-    /**
-     * Clone this camera.
-     *
-     * @returns {Camera} A camera with cloned properties equal to this camera.
-     */
-    Camera.prototype.clone = function () {
-        var camera = new Camera();
-        camera.position.copy(this._position);
-        camera.lookat.copy(this._lookat);
-        camera.up.copy(this._up);
-        camera.focal = this._focal;
-        return camera;
-    };
-    /**
-     * Determine the distance between this camera and another camera.
-     *
-     * @param {Camera} other - Another camera.
-     * @returns {number} The distance between the cameras.
-     */
-    Camera.prototype.diff = function (other) {
-        var pd = this._position.distanceToSquared(other.position);
-        var ld = this._lookat.distanceToSquared(other.lookat);
-        var ud = this._up.distanceToSquared(other.up);
-        var fd = 100 * Math.abs(this._focal - other.focal);
-        return Math.max(pd, ld, ud, fd);
-    };
-    /**
-     * Get the focal length based on the transform.
-     *
-     * @description Returns the focal length of the transform if gpano info is not available.
-     * Returns a focal length corresponding to a vertical fov clamped to [45, 90] degrees based on
-     * the gpano information if available.
-     *
-     * @returns {number} Focal length.
-     */
-    Camera.prototype._getFocal = function (transform) {
-        if (transform.gpano == null) {
-            return transform.focal;
-        }
-        var vFov = Math.PI * transform.gpano.CroppedAreaImageHeightPixels / transform.gpano.FullPanoHeightPixels;
-        var focal = 0.5 / Math.tan(vFov / 2);
-        return Math.min(1 / (2 * (Math.sqrt(2) - 1)), Math.max(0.5, focal));
-    };
-    return Camera;
-}());
-exports.Camera = Camera;
-
-},{"three":226}],384:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var geoCoords = new Geo_1.GeoCoords();
-var spatial = new Geo_1.Spatial();
-function computeTranslation(position, rotation, reference) {
-    var C = geoCoords.geodeticToEnu(position.lat, position.lon, position.alt, reference.lat, reference.lon, reference.alt);
-    var RC = spatial.rotate(C, rotation);
-    var translation = [-RC.x, -RC.y, -RC.z];
-    return translation;
-}
-exports.computeTranslation = computeTranslation;
-function computeProjectedPoints(transform, basicVertices, basicDirections, pointsPerLine, viewportCoords) {
-    var basicPoints = [];
-    for (var side = 0; side < basicVertices.length; ++side) {
-        var v = basicVertices[side];
-        var d = basicDirections[side];
-        for (var i = 0; i <= pointsPerLine; ++i) {
-            basicPoints.push([v[0] + d[0] * i / pointsPerLine,
-                v[1] + d[1] * i / pointsPerLine]);
-        }
-    }
-    var camera = new THREE.Camera();
-    camera.up.copy(transform.upVector());
-    camera.position.copy(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 0)));
-    camera.lookAt(new THREE.Vector3().fromArray(transform.unprojectSfM([0, 0], 10)));
-    camera.updateMatrix();
-    camera.updateMatrixWorld(true);
-    var projectedPoints = basicPoints
-        .map(function (basicPoint) {
-        var worldPoint = transform.unprojectBasic(basicPoint, 10000);
-        var cameraPoint = viewportCoords.worldToCamera(worldPoint, camera);
-        return [
-            Math.abs(cameraPoint[0] / cameraPoint[2]),
-            Math.abs(cameraPoint[1] / cameraPoint[2]),
-        ];
-    });
-    return projectedPoints;
-}
-exports.computeProjectedPoints = computeProjectedPoints;
-
-},{"../Geo":278,"three":226}],385:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * @class GeoCoords
- *
- * @classdesc Converts coordinates between the geodetic (WGS84),
- * Earth-Centered, Earth-Fixed (ECEF) and local topocentric
- * East, North, Up (ENU) reference frames.
- *
- * The WGS84 has latitude (degrees), longitude (degrees) and
- * altitude (meters) values.
- *
- * The ECEF Z-axis pierces the north pole and the
- * XY-axis defines the equatorial plane. The X-axis extends
- * from the geocenter to the intersection of the Equator and
- * the Greenwich Meridian. All values in meters.
- *
- * The WGS84 parameters are:
- *
- * a = 6378137
- * b = a * (1 - f)
- * f = 1 / 298.257223563
- * e = Math.sqrt((a^2 - b^2) / a^2)
- * e' = Math.sqrt((a^2 - b^2) / b^2)
- *
- * The WGS84 to ECEF conversion is performed using the following:
- *
- * X = (N - h) * cos(phi) * cos(lambda)
- * Y = (N + h) * cos(phi) * sin(lambda)
- * Z = (b^2 * N / a^2 + h) * sin(phi)
- *
- * where
- *
- * phi = latitude
- * lambda = longitude
- * h = height above ellipsoid (altitude)
- * N = Radius of curvature (meters)
- *   = a / Math.sqrt(1 - e^2 * sin(phi)^2)
- *
- * The ECEF to WGS84 conversion is performed using the following:
- *
- * phi = arctan((Z + e'^2 * b * sin(theta)^3) / (p - e^2 * a * cos(theta)^3))
- * lambda = arctan(Y / X)
- * h = p / cos(phi) - N
- *
- * where
- *
- * p = Math.sqrt(X^2 + Y^2)
- * theta = arctan(Z * a / p * b)
- *
- * In the ENU reference frame the x-axis points to the
- * East, the y-axis to the North and the z-axis Up. All values
- * in meters.
- *
- * The ECEF to ENU conversion is performed using the following:
- *
- * | x |   |       -sin(lambda_r)                cos(lambda_r)             0      | | X - X_r |
- * | y | = | -sin(phi_r) * cos(lambda_r)  -sin(phi_r) * sin(lambda_r)  cos(phi_r) | | Y - Y_r |
- * | z |   |  cos(phi_r) * cos(lambda_r)   cos(phi_r) * sin(lambda_r)  sin(phi_r) | | Z - Z_r |
- *
- * where
- *
- * phi_r = latitude of reference
- * lambda_r = longitude of reference
- * X_r, Y_r, Z_r = ECEF coordinates of reference
- *
- * The ENU to ECEF conversion is performed by solving the above equation for X, Y, Z.
- *
- * WGS84 to ENU and ENU to WGS84 are two step conversions with ECEF calculated in
- * the first step for both conversions.
- */
-var GeoCoords = /** @class */ (function () {
-    function GeoCoords() {
-        this._wgs84a = 6378137.0;
-        this._wgs84b = 6356752.31424518;
-    }
-    /**
-     * Convert coordinates from geodetic (WGS84) reference to local topocentric
-     * (ENU) reference.
-     *
-     * @param {number} lat Latitude in degrees.
-     * @param {number} lon Longitude in degrees.
-     * @param {number} alt Altitude in meters.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The x, y, z local topocentric ENU coordinates.
-     */
-    GeoCoords.prototype.geodeticToEnu = function (lat, lon, alt, refLat, refLon, refAlt) {
-        var ecef = this.geodeticToEcef(lat, lon, alt);
-        return this.ecefToEnu(ecef[0], ecef[1], ecef[2], refLat, refLon, refAlt);
-    };
-    /**
-     * Convert coordinates from local topocentric (ENU) reference to
-     * geodetic (WGS84) reference.
-     *
-     * @param {number} x Topocentric ENU coordinate in East direction.
-     * @param {number} y Topocentric ENU coordinate in North direction.
-     * @param {number} z Topocentric ENU coordinate in Up direction.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The latitude and longitude in degrees
-     *                          as well as altitude in meters.
-     */
-    GeoCoords.prototype.enuToGeodetic = function (x, y, z, refLat, refLon, refAlt) {
-        var ecef = this.enuToEcef(x, y, z, refLat, refLon, refAlt);
-        return this.ecefToGeodetic(ecef[0], ecef[1], ecef[2]);
-    };
-    /**
-     * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference
-     * to local topocentric (ENU) reference.
-     *
-     * @param {number} X ECEF X-value.
-     * @param {number} Y ECEF Y-value.
-     * @param {number} Z ECEF Z-value.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The x, y, z topocentric ENU coordinates in East, North
-     * and Up directions respectively.
-     */
-    GeoCoords.prototype.ecefToEnu = function (X, Y, Z, refLat, refLon, refAlt) {
-        var refEcef = this.geodeticToEcef(refLat, refLon, refAlt);
-        var V = [X - refEcef[0], Y - refEcef[1], Z - refEcef[2]];
-        refLat = refLat * Math.PI / 180.0;
-        refLon = refLon * Math.PI / 180.0;
-        var cosLat = Math.cos(refLat);
-        var sinLat = Math.sin(refLat);
-        var cosLon = Math.cos(refLon);
-        var sinLon = Math.sin(refLon);
-        var x = -sinLon * V[0] + cosLon * V[1];
-        var y = -sinLat * cosLon * V[0] - sinLat * sinLon * V[1] + cosLat * V[2];
-        var z = cosLat * cosLon * V[0] + cosLat * sinLon * V[1] + sinLat * V[2];
-        return [x, y, z];
-    };
-    /**
-     * Convert coordinates from local topocentric (ENU) reference
-     * to Earth-Centered, Earth-Fixed (ECEF) reference.
-     *
-     * @param {number} x Topocentric ENU coordinate in East direction.
-     * @param {number} y Topocentric ENU coordinate in North direction.
-     * @param {number} z Topocentric ENU coordinate in Up direction.
-     * @param {number} refLat Reference latitude in degrees.
-     * @param {number} refLon Reference longitude in degrees.
-     * @param {number} refAlt Reference altitude in meters.
-     * @returns {Array<number>} The X, Y, Z ECEF coordinates.
-     */
-    GeoCoords.prototype.enuToEcef = function (x, y, z, refLat, refLon, refAlt) {
-        var refEcef = this.geodeticToEcef(refLat, refLon, refAlt);
-        refLat = refLat * Math.PI / 180.0;
-        refLon = refLon * Math.PI / 180.0;
-        var cosLat = Math.cos(refLat);
-        var sinLat = Math.sin(refLat);
-        var cosLon = Math.cos(refLon);
-        var sinLon = Math.sin(refLon);
-        var X = -sinLon * x - sinLat * cosLon * y + cosLat * cosLon * z + refEcef[0];
-        var Y = cosLon * x - sinLat * sinLon * y + cosLat * sinLon * z + refEcef[1];
-        var Z = cosLat * y + sinLat * z + refEcef[2];
-        return [X, Y, Z];
-    };
-    /**
-     * Convert coordinates from geodetic reference (WGS84) to Earth-Centered,
-     * Earth-Fixed (ECEF) reference.
-     *
-     * @param {number} lat Latitude in degrees.
-     * @param {number} lon Longitude in degrees.
-     * @param {number} alt Altitude in meters.
-     * @returns {Array<number>} The X, Y, Z ECEF coordinates.
-     */
-    GeoCoords.prototype.geodeticToEcef = function (lat, lon, alt) {
-        var a = this._wgs84a;
-        var b = this._wgs84b;
-        lat = lat * Math.PI / 180.0;
-        lon = lon * Math.PI / 180.0;
-        var cosLat = Math.cos(lat);
-        var sinLat = Math.sin(lat);
-        var cosLon = Math.cos(lon);
-        var sinLon = Math.sin(lon);
-        var a2 = a * a;
-        var b2 = b * b;
-        var L = 1.0 / Math.sqrt(a2 * cosLat * cosLat + b2 * sinLat * sinLat);
-        var nhcl = (a2 * L + alt) * cosLat;
-        var X = nhcl * cosLon;
-        var Y = nhcl * sinLon;
-        var Z = (b2 * L + alt) * sinLat;
-        return [X, Y, Z];
-    };
-    /**
-     * Convert coordinates from Earth-Centered, Earth-Fixed (ECEF) reference
-     * to geodetic reference (WGS84).
-     *
-     * @param {number} X ECEF X-value.
-     * @param {number} Y ECEF Y-value.
-     * @param {number} Z ECEF Z-value.
-     * @returns {Array<number>} The latitude and longitude in degrees
-     *                          as well as altitude in meters.
-     */
-    GeoCoords.prototype.ecefToGeodetic = function (X, Y, Z) {
-        var a = this._wgs84a;
-        var b = this._wgs84b;
-        var a2 = a * a;
-        var b2 = b * b;
-        var a2mb2 = a2 - b2;
-        var ea = Math.sqrt(a2mb2 / a2);
-        var eb = Math.sqrt(a2mb2 / b2);
-        var p = Math.sqrt(X * X + Y * Y);
-        var theta = Math.atan2(Z * a, p * b);
-        var sinTheta = Math.sin(theta);
-        var cosTheta = Math.cos(theta);
-        var lon = Math.atan2(Y, X);
-        var lat = Math.atan2(Z + eb * eb * b * sinTheta * sinTheta * sinTheta, p - ea * ea * a * cosTheta * cosTheta * cosTheta);
-        var sinLat = Math.sin(lat);
-        var cosLat = Math.cos(lat);
-        var N = a / Math.sqrt(1 - ea * ea * sinLat * sinLat);
-        var alt = p / cosLat - N;
-        return [lat * 180.0 / Math.PI, lon * 180.0 / Math.PI, alt];
-    };
-    return GeoCoords;
-}());
-exports.GeoCoords = GeoCoords;
-exports.default = GeoCoords;
-
-},{}],386:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function sign(n) {
-    return n > 0 ? 1 : n < 0 ? -1 : 0;
-}
-function colinearPointOnSegment(p, s) {
-    return p.x <= Math.max(s.p1.x, s.p2.x) &&
-        p.x >= Math.min(s.p1.x, s.p2.x) &&
-        p.y >= Math.max(s.p1.y, s.p2.y) &&
-        p.y >= Math.min(s.p1.y, s.p2.y);
-}
-function parallel(s1, s2) {
-    var ux = s1.p2.x - s1.p1.x;
-    var uy = s1.p2.y - s1.p1.y;
-    var vx = s2.p2.x - s2.p1.x;
-    var vy = s2.p2.y - s2.p1.y;
-    var cross = ux * vy - uy * vx;
-    var u2 = ux * ux + uy * uy;
-    var v2 = vx * vx + vy * vy;
-    var epsilon2 = 1e-10;
-    return cross * cross < epsilon2 * u2 * v2;
-}
-function tripletOrientation(p1, p2, p3) {
-    var orientation = (p2.y - p1.y) * (p3.x - p2.x) -
-        (p3.y - p2.y) * (p2.x - p1.x);
-    return sign(orientation);
-}
-function segmentsIntersect(s1, s2) {
-    if (parallel(s1, s2)) {
-        return false;
-    }
-    var o1 = tripletOrientation(s1.p1, s1.p2, s2.p1);
-    var o2 = tripletOrientation(s1.p1, s1.p2, s2.p2);
-    var o3 = tripletOrientation(s2.p1, s2.p2, s1.p1);
-    var o4 = tripletOrientation(s2.p1, s2.p2, s1.p2);
-    if (o1 !== o2 && o3 !== o4) {
-        return true;
-    }
-    if (o1 === 0 && colinearPointOnSegment(s2.p1, s1)) {
-        return true;
-    }
-    if (o2 === 0 && colinearPointOnSegment(s2.p2, s1)) {
-        return true;
-    }
-    if (o3 === 0 && colinearPointOnSegment(s1.p1, s2)) {
-        return true;
-    }
-    if (o4 === 0 && colinearPointOnSegment(s1.p2, s2)) {
-        return true;
-    }
-    return false;
-}
-exports.segmentsIntersect = segmentsIntersect;
-function segmentIntersection(s1, s2) {
-    if (parallel(s1, s2)) {
-        return undefined;
-    }
-    var x1 = s1.p1.x;
-    var x2 = s1.p2.x;
-    var y1 = s1.p1.y;
-    var y2 = s1.p2.y;
-    var x3 = s2.p1.x;
-    var x4 = s2.p2.x;
-    var y3 = s2.p1.y;
-    var y4 = s2.p2.y;
-    var den = (x1 - x2) * (y3 - y4) - (y1 - y2) * (x3 - x4);
-    var xNum = (x1 * y2 - y1 * x2) * (x3 - x4) - (x1 - x2) * (x3 * y4 - y3 * x4);
-    var yNum = (x1 * y2 - y1 * x2) * (y3 - y4) - (y1 - y2) * (x3 * y4 - y3 * x4);
-    return { x: xNum / den, y: yNum / den };
-}
-exports.segmentIntersection = segmentIntersection;
-
-},{}],387:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-/**
- * @class Spatial
- *
- * @classdesc Provides methods for scalar, vector and matrix calculations.
- */
-var Spatial = /** @class */ (function () {
-    function Spatial() {
-        this._epsilon = 1e-9;
-    }
-    /**
-     * Converts azimuthal phi rotation (counter-clockwise with origin on X-axis) to
-     * bearing (clockwise with origin at north or Y-axis).
-     *
-     * @param {number} phi - Azimuthal phi angle in radians.
-     * @returns {number} Bearing in radians.
-     */
-    Spatial.prototype.azimuthalToBearing = function (phi) {
-        return -phi + Math.PI / 2;
-    };
-    /**
-     * Converts degrees to radians.
-     *
-     * @param {number} deg - Degrees.
-     * @returns {number} Radians.
-     */
-    Spatial.prototype.degToRad = function (deg) {
-        return Math.PI * deg / 180;
-    };
-    /**
-     * Converts radians to degrees.
-     *
-     * @param {number} rad - Radians.
-     * @returns {number} Degrees.
-     */
-    Spatial.prototype.radToDeg = function (rad) {
-        return 180 * rad / Math.PI;
-    };
-    /**
-     * Creates a rotation matrix from an angle-axis vector.
-     *
-     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.
-     * @returns {THREE.Matrix4} Rotation matrix.
-     */
-    Spatial.prototype.rotationMatrix = function (angleAxis) {
-        var axis = new THREE.Vector3(angleAxis[0], angleAxis[1], angleAxis[2]);
-        var angle = axis.length();
-        if (angle > 0) {
-            axis.normalize();
-        }
-        return new THREE.Matrix4().makeRotationAxis(axis, angle);
-    };
-    /**
-     * Rotates a vector according to a angle-axis rotation vector.
-     *
-     * @param {Array<number>} vector - Vector to rotate.
-     * @param {Array<number>} angleAxis - Angle-axis representation of a rotation.
-     * @returns {THREE.Vector3} Rotated vector.
-     */
-    Spatial.prototype.rotate = function (vector, angleAxis) {
-        var v = new THREE.Vector3(vector[0], vector[1], vector[2]);
-        var rotationMatrix = this.rotationMatrix(angleAxis);
-        v.applyMatrix4(rotationMatrix);
-        return v;
-    };
-    /**
-     * Calculates the optical center from a rotation vector
-     * on the angle-axis representation and a translation vector
-     * according to C = -R^T t.
-     *
-     * @param {Array<number>} rotation - Angle-axis representation of a rotation.
-     * @param {Array<number>} translation - Translation vector.
-     * @returns {THREE.Vector3} Optical center.
-     */
-    Spatial.prototype.opticalCenter = function (rotation, translation) {
-        var angleAxis = [-rotation[0], -rotation[1], -rotation[2]];
-        var vector = [-translation[0], -translation[1], -translation[2]];
-        return this.rotate(vector, angleAxis);
-    };
-    /**
-     * Calculates the viewing direction from a rotation vector
-     * on the angle-axis representation.
-     *
-     * @param {number[]} rotation - Angle-axis representation of a rotation.
-     * @returns {THREE.Vector3} Viewing direction.
-     */
-    Spatial.prototype.viewingDirection = function (rotation) {
-        var angleAxis = [-rotation[0], -rotation[1], -rotation[2]];
-        return this.rotate([0, 0, 1], angleAxis);
-    };
-    /**
-     * Wrap a number on the interval [min, max].
-     *
-     * @param {number} value - Value to wrap.
-     * @param {number} min - Lower endpoint of interval.
-     * @param {number} max - Upper endpoint of interval.
-     * @returns {number} The wrapped number.
-     */
-    Spatial.prototype.wrap = function (value, min, max) {
-        if (max < min) {
-            throw new Error("Invalid arguments: max must be larger than min.");
-        }
-        var interval = (max - min);
-        while (value > max || value < min) {
-            if (value > max) {
-                value = value - interval;
-            }
-            else if (value < min) {
-                value = value + interval;
-            }
-        }
-        return value;
-    };
-    /**
-     * Wrap an angle on the interval [-Pi, Pi].
-     *
-     * @param {number} angle - Value to wrap.
-     * @returns {number} Wrapped angle.
-     */
-    Spatial.prototype.wrapAngle = function (angle) {
-        return this.wrap(angle, -Math.PI, Math.PI);
-    };
-    /**
-     * Limit the value to the interval [min, max] by changing the value to
-     * the nearest available one when it is outside the interval.
-     *
-     * @param {number} value - Value to clamp.
-     * @param {number} min - Minimum of the interval.
-     * @param {number} max - Maximum of the interval.
-     * @returns {number} Clamped value.
-     */
-    Spatial.prototype.clamp = function (value, min, max) {
-        if (value < min) {
-            return min;
-        }
-        if (value > max) {
-            return max;
-        }
-        return value;
-    };
-    /**
-     * Calculates the counter-clockwise angle from the first
-     * vector (x1, y1)^T to the second (x2, y2)^T.
-     *
-     * @param {number} x1 - X coordinate of first vector.
-     * @param {number} y1 - Y coordinate of first vector.
-     * @param {number} x2 - X coordinate of second vector.
-     * @param {number} y2 - Y coordinate of second vector.
-     * @returns {number} Counter clockwise angle between the vectors.
-     */
-    Spatial.prototype.angleBetweenVector2 = function (x1, y1, x2, y2) {
-        var angle = Math.atan2(y2, x2) - Math.atan2(y1, x1);
-        return this.wrapAngle(angle);
-    };
-    /**
-     * Calculates the minimum (absolute) angle change for rotation
-     * from one angle to another on the [-Pi, Pi] interval.
-     *
-     * @param {number} angle1 - Start angle.
-     * @param {number} angle2 - Destination angle.
-     * @returns {number} Absolute angle change between angles.
-     */
-    Spatial.prototype.angleDifference = function (angle1, angle2) {
-        var angle = angle2 - angle1;
-        return this.wrapAngle(angle);
-    };
-    /**
-     * Calculates the relative rotation angle between two
-     * angle-axis vectors.
-     *
-     * @param {number} rotation1 - First angle-axis vector.
-     * @param {number} rotation2 - Second angle-axis vector.
-     * @returns {number} Relative rotation angle.
-     */
-    Spatial.prototype.relativeRotationAngle = function (rotation1, rotation2) {
-        var R1T = this.rotationMatrix([-rotation1[0], -rotation1[1], -rotation1[2]]);
-        var R2 = this.rotationMatrix(rotation2);
-        var R = R1T.multiply(R2);
-        var elements = R.elements;
-        // from Tr(R) = 1 + 2 * cos(theta)
-        var tr = elements[0] + elements[5] + elements[10];
-        var theta = Math.acos(Math.max(Math.min((tr - 1) / 2, 1), -1));
-        return theta;
-    };
-    /**
-     * Calculates the angle from a vector to a plane.
-     *
-     * @param {Array<number>} vector - The vector.
-     * @param {Array<number>} planeNormal - Normal of the plane.
-     * @returns {number} Angle from between plane and vector.
-     */
-    Spatial.prototype.angleToPlane = function (vector, planeNormal) {
-        var v = new THREE.Vector3().fromArray(vector);
-        var norm = v.length();
-        if (norm < this._epsilon) {
-            return 0;
-        }
-        var projection = v.dot(new THREE.Vector3().fromArray(planeNormal));
-        return Math.asin(projection / norm);
-    };
-    Spatial.prototype.azimuthal = function (direction, up) {
-        var directionVector = new THREE.Vector3().fromArray(direction);
-        var upVector = new THREE.Vector3().fromArray(up);
-        var upProjection = directionVector.clone().dot(upVector);
-        var planeProjection = directionVector.clone().sub(upVector.clone().multiplyScalar(upProjection));
-        return Math.atan2(planeProjection.y, planeProjection.x);
-    };
-    /**
-     * Calculates the distance between two coordinates
-     * (latitude longitude pairs) in meters according to
-     * the haversine formula.
-     *
-     * @param {number} lat1 - Latitude of the first coordinate in degrees.
-     * @param {number} lon1 - Longitude of the first coordinate in degrees.
-     * @param {number} lat2 - Latitude of the second coordinate in degrees.
-     * @param {number} lon2 - Longitude of the second coordinate in degrees.
-     * @returns {number} Distance between lat lon positions in meters.
-     */
-    Spatial.prototype.distanceFromLatLon = function (lat1, lon1, lat2, lon2) {
-        var r = 6371000;
-        var dLat = this.degToRad(lat2 - lat1);
-        var dLon = this.degToRad(lon2 - lon1);
-        var hav = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
-            Math.cos(this.degToRad(lat1)) * Math.cos(this.degToRad(lat2)) *
-                Math.sin(dLon / 2) * Math.sin(dLon / 2);
-        var d = 2 * r * Math.atan2(Math.sqrt(hav), Math.sqrt(1 - hav));
-        return d;
-    };
-    return Spatial;
-}());
-exports.Spatial = Spatial;
-exports.default = Spatial;
-
-},{"three":226}],388:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-/**
- * @class Transform
- *
- * @classdesc Class used for calculating coordinate transformations
- * and projections.
- */
-var Transform = /** @class */ (function () {
-    /**
-     * Create a new transform instance.
-     * @param {number} orientation - Image orientation.
-     * @param {number} width - Image height.
-     * @param {number} height - Image width.
-     * @param {number} focal - Focal length.
-     * @param {number} scale - Atomic scale.
-     * @param {IGPano} gpano - Panorama properties.
-     * @param {Array<number>} rotation - Rotation vector in three dimensions.
-     * @param {Array<number>} translation - Translation vector in three dimensions.
-     * @param {HTMLImageElement} image - Image for fallback size calculations.
-     */
-    function Transform(orientation, width, height, focal, scale, gpano, rotation, translation, image, textureScale, ck1, ck2, cameraProjection) {
-        this._orientation = this._getValue(orientation, 1);
-        var imageWidth = image != null ? image.width : 4;
-        var imageHeight = image != null ? image.height : 3;
-        var keepOrientation = this._orientation < 5;
-        this._width = this._getValue(width, keepOrientation ? imageWidth : imageHeight);
-        this._height = this._getValue(height, keepOrientation ? imageHeight : imageWidth);
-        this._basicAspect = keepOrientation ?
-            this._width / this._height :
-            this._height / this._width;
-        this._basicWidth = keepOrientation ? width : height;
-        this._basicHeight = keepOrientation ? height : width;
-        this._focal = this._getValue(focal, 1);
-        this._scale = this._getValue(scale, 0);
-        this._gpano = gpano != null ? gpano : null;
-        this._rt = this._getRt(rotation, translation);
-        this._srt = this._getSrt(this._rt, this._scale);
-        this._basicRt = this._getBasicRt(this._rt, orientation);
-        this._textureScale = !!textureScale ? textureScale : [1, 1];
-        this._ck1 = !!ck1 ? ck1 : 0;
-        this._ck2 = !!ck2 ? ck2 : 0;
-        this._cameraProjection = !!cameraProjection ?
-            cameraProjection :
-            !!gpano ?
-                "equirectangular" :
-                "perspective";
-        this._radialPeak = this._getRadialPeak(this._ck1, this._ck2);
-    }
-    Object.defineProperty(Transform.prototype, "ck1", {
-        get: function () {
-            return this._ck1;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "ck2", {
-        get: function () {
-            return this._ck2;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "cameraProjection", {
-        get: function () {
-            return this._cameraProjection;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicAspect", {
-        /**
-         * Get basic aspect.
-         * @returns {number} The orientation adjusted aspect ratio.
-         */
-        get: function () {
-            return this._basicAspect;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicHeight", {
-        /**
-         * Get basic height.
-         *
-         * @description Does not fall back to node image height but
-         * uses original value from API so can be faulty.
-         *
-         * @returns {number} The height of the basic version image
-         * (adjusted for orientation).
-         */
-        get: function () {
-            return this._basicHeight;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicRt", {
-        get: function () {
-            return this._basicRt;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "basicWidth", {
-        /**
-         * Get basic width.
-         *
-         * @description Does not fall back to node image width but
-         * uses original value from API so can be faulty.
-         *
-         * @returns {number} The width of the basic version image
-         * (adjusted for orientation).
-         */
-        get: function () {
-            return this._basicWidth;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "focal", {
-        /**
-         * Get focal.
-         * @returns {number} The node focal length.
-         */
-        get: function () {
-            return this._focal;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "fullPano", {
-        /**
-         * Get fullPano.
-         *
-         * @returns {boolean} Value indicating whether the node is a complete
-         * 360 panorama.
-         */
-        get: function () {
-            return this._gpano != null &&
-                this._gpano.CroppedAreaLeftPixels === 0 &&
-                this._gpano.CroppedAreaTopPixels === 0 &&
-                this._gpano.CroppedAreaImageWidthPixels === this._gpano.FullPanoWidthPixels &&
-                this._gpano.CroppedAreaImageHeightPixels === this._gpano.FullPanoHeightPixels;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "gpano", {
-        /**
-         * Get gpano.
-         * @returns {number} The node gpano information.
-         */
-        get: function () {
-            return this._gpano;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "height", {
-        /**
-         * Get height.
-         *
-         * @description Falls back to the node image height if
-         * the API data is faulty.
-         *
-         * @returns {number} The orientation adjusted image height.
-         */
-        get: function () {
-            return this._height;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "orientation", {
-        /**
-         * Get orientation.
-         * @returns {number} The image orientation.
-         */
-        get: function () {
-            return this._orientation;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "rt", {
-        /**
-         * Get rt.
-         * @returns {THREE.Matrix4} The extrinsic camera matrix.
-         */
-        get: function () {
-            return this._rt;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "srt", {
-        /**
-         * Get srt.
-         * @returns {THREE.Matrix4} The scaled extrinsic camera matrix.
-         */
-        get: function () {
-            return this._srt;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "scale", {
-        /**
-         * Get scale.
-         * @returns {number} The node atomic reconstruction scale.
-         */
-        get: function () {
-            return this._scale;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "hasValidScale", {
-        /**
-         * Get has valid scale.
-         * @returns {boolean} Value indicating if the scale of the transform is valid.
-         */
-        get: function () {
-            return this._scale > 1e-2 && this._scale < 50;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "radialPeak", {
-        /**
-         * Get radial peak.
-         * @returns {number} Value indicating the radius where the radial
-         * undistortion function peaks.
-         */
-        get: function () {
-            return this._radialPeak;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Transform.prototype, "width", {
-        /**
-         * Get width.
-         *
-         * @description Falls back to the node image width if
-         * the API data is faulty.
-         *
-         * @returns {number} The orientation adjusted image width.
-         */
-        get: function () {
-            return this._width;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Calculate the up vector for the node transform.
-     *
-     * @returns {THREE.Vector3} Normalized and orientation adjusted up vector.
-     */
-    Transform.prototype.upVector = function () {
-        var rte = this._rt.elements;
-        switch (this._orientation) {
-            case 1:
-                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);
-            case 3:
-                return new THREE.Vector3(rte[1], rte[5], rte[9]);
-            case 6:
-                return new THREE.Vector3(-rte[0], -rte[4], -rte[8]);
-            case 8:
-                return new THREE.Vector3(rte[0], rte[4], rte[8]);
-            default:
-                return new THREE.Vector3(-rte[1], -rte[5], -rte[9]);
-        }
-    };
-    /**
-     * Calculate projector matrix for projecting 3D points to texture map
-     * coordinates (u and v).
-     *
-     * @returns {THREE.Matrix4} Projection matrix for 3D point to texture
-     * map coordinate calculations.
-     */
-    Transform.prototype.projectorMatrix = function () {
-        var projector = this._normalizedToTextureMatrix();
-        var f = this._focal;
-        var projection = new THREE.Matrix4().set(f, 0, 0, 0, 0, f, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0);
-        projector.multiply(projection);
-        projector.multiply(this._rt);
-        return projector;
-    };
-    /**
-     * Project 3D world coordinates to basic coordinates.
-     *
-     * @param {Array<number>} point3d - 3D world coordinates.
-     * @return {Array<number>} 2D basic coordinates.
-     */
-    Transform.prototype.projectBasic = function (point3d) {
-        var sfm = this.projectSfM(point3d);
-        return this._sfmToBasic(sfm);
-    };
-    /**
-     * Unproject basic coordinates to 3D world coordinates.
-     *
-     * @param {Array<number>} basic - 2D basic coordinates.
-     * @param {Array<number>} distance - Distance to unproject from camera center.
-     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
-     *                            Only applicable for perspective images. Will be
-     *                            ignored for panoramas.
-     * @returns {Array<number>} Unprojected 3D world coordinates.
-     */
-    Transform.prototype.unprojectBasic = function (basic, distance, depth) {
-        var sfm = this._basicToSfm(basic);
-        return this.unprojectSfM(sfm, distance, depth);
-    };
-    /**
-     * Project 3D world coordinates to SfM coordinates.
-     *
-     * @param {Array<number>} point3d - 3D world coordinates.
-     * @return {Array<number>} 2D SfM coordinates.
-     */
-    Transform.prototype.projectSfM = function (point3d) {
-        var v = new THREE.Vector4(point3d[0], point3d[1], point3d[2], 1);
-        v.applyMatrix4(this._rt);
-        return this._bearingToSfm([v.x, v.y, v.z]);
-    };
-    /**
-     * Unproject SfM coordinates to a 3D world coordinates.
-     *
-     * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @param {Array<number>} distance - Distance to unproject from camera center.
-     * @param {boolean} [depth] - Treat the distance value as depth from camera center.
-     *                            Only applicable for perspective images. Will be
-     *                            ignored for panoramas.
-     * @returns {Array<number>} Unprojected 3D world coordinates.
-     */
-    Transform.prototype.unprojectSfM = function (sfm, distance, depth) {
-        var bearing = this._sfmToBearing(sfm);
-        var v = depth && !this.gpano ?
-            new THREE.Vector4(distance * bearing[0] / bearing[2], distance * bearing[1] / bearing[2], distance, 1) :
-            new THREE.Vector4(distance * bearing[0], distance * bearing[1], distance * bearing[2], 1);
-        v.applyMatrix4(new THREE.Matrix4().getInverse(this._rt));
-        return [v.x / v.w, v.y / v.w, v.z / v.w];
-    };
-    /**
-     * Transform SfM coordinates to bearing vector (3D cartesian
-     * coordinates on the unit sphere).
-     *
-     * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @returns {Array<number>} Bearing vector (3D cartesian coordinates
-     * on the unit sphere).
-     */
-    Transform.prototype._sfmToBearing = function (sfm) {
-        if (this._fullPano()) {
-            var lon = sfm[0] * 2 * Math.PI;
-            var lat = -sfm[1] * 2 * Math.PI;
-            var x = Math.cos(lat) * Math.sin(lon);
-            var y = -Math.sin(lat);
-            var z = Math.cos(lat) * Math.cos(lon);
-            return [x, y, z];
-        }
-        else if (this._gpano) {
-            var size = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);
-            var fullPanoPixel = [
-                sfm[0] * size + this.gpano.CroppedAreaImageWidthPixels / 2 + this.gpano.CroppedAreaLeftPixels,
-                sfm[1] * size + this.gpano.CroppedAreaImageHeightPixels / 2 + this.gpano.CroppedAreaTopPixels,
-            ];
-            var lon = 2 * Math.PI * (fullPanoPixel[0] / this.gpano.FullPanoWidthPixels - 0.5);
-            var lat = -Math.PI * (fullPanoPixel[1] / this.gpano.FullPanoHeightPixels - 0.5);
-            var x = Math.cos(lat) * Math.sin(lon);
-            var y = -Math.sin(lat);
-            var z = Math.cos(lat) * Math.cos(lon);
-            return [x, y, z];
-        }
-        else if (this._cameraProjection === "fisheye") {
-            var _a = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _a[0], dyn = _a[1];
-            var dTheta = Math.sqrt(dxn * dxn + dyn * dyn);
-            var d = this._distortionFromDistortedRadius(dTheta, this._ck1, this._ck2, this._radialPeak);
-            var theta = dTheta / d;
-            var z = Math.cos(theta);
-            var r = Math.sin(theta);
-            var x = r * dxn / dTheta;
-            var y = r * dyn / dTheta;
-            return [x, y, z];
-        }
-        else {
-            var _b = [sfm[0] / this._focal, sfm[1] / this._focal], dxn = _b[0], dyn = _b[1];
-            var dr = Math.sqrt(dxn * dxn + dyn * dyn);
-            var d = this._distortionFromDistortedRadius(dr, this._ck1, this._ck2, this._radialPeak);
-            var xn = dxn / d;
-            var yn = dyn / d;
-            var v = new THREE.Vector3(xn, yn, 1);
-            v.normalize();
-            return [v.x, v.y, v.z];
-        }
-    };
-    /** Compute distortion given the distorted radius.
-     *
-     *  Solves for d in the equation
-     *    y = d(x, k1, k2) * x
-     * given the distorted radius, y.
-     */
-    Transform.prototype._distortionFromDistortedRadius = function (distortedRadius, k1, k2, radialPeak) {
-        var d = 1.0;
-        for (var i = 0; i < 10; i++) {
-            var radius = distortedRadius / d;
-            if (radius > radialPeak) {
-                radius = radialPeak;
-            }
-            d = 1 + k1 * Math.pow(radius, 2) + k2 * Math.pow(radius, 4);
-        }
-        return d;
-    };
-    /**
-     * Transform bearing vector (3D cartesian coordiantes on the unit sphere) to
-     * SfM coordinates.
-     *
-     * @param {Array<number>} bearing - Bearing vector (3D cartesian coordinates on the
-     * unit sphere).
-     * @returns {Array<number>} 2D SfM coordinates.
-     */
-    Transform.prototype._bearingToSfm = function (bearing) {
-        if (this._fullPano()) {
-            var x = bearing[0];
-            var y = bearing[1];
-            var z = bearing[2];
-            var lon = Math.atan2(x, z);
-            var lat = Math.atan2(-y, Math.sqrt(x * x + z * z));
-            return [lon / (2 * Math.PI), -lat / (2 * Math.PI)];
-        }
-        else if (this._gpano) {
-            var x = bearing[0];
-            var y = bearing[1];
-            var z = bearing[2];
-            var lon = Math.atan2(x, z);
-            var lat = Math.atan2(-y, Math.sqrt(x * x + z * z));
-            var fullPanoPixel = [
-                (lon / (2 * Math.PI) + 0.5) * this.gpano.FullPanoWidthPixels,
-                (-lat / Math.PI + 0.5) * this.gpano.FullPanoHeightPixels,
-            ];
-            var size = Math.max(this.gpano.CroppedAreaImageWidthPixels, this.gpano.CroppedAreaImageHeightPixels);
-            return [
-                (fullPanoPixel[0] - this.gpano.CroppedAreaLeftPixels - this.gpano.CroppedAreaImageWidthPixels / 2) / size,
-                (fullPanoPixel[1] - this.gpano.CroppedAreaTopPixels - this.gpano.CroppedAreaImageHeightPixels / 2) / size,
-            ];
-        }
-        else if (this._cameraProjection === "fisheye") {
-            if (bearing[2] > 0) {
-                var x = bearing[0], y = bearing[1], z = bearing[2];
-                var r = Math.sqrt(x * x + y * y);
-                var theta = Math.atan2(r, z);
-                if (theta > this._radialPeak) {
-                    theta = this._radialPeak;
-                }
-                var distortion = 1.0 + Math.pow(theta, 2) * (this._ck1 + Math.pow(theta, 2) * this._ck2);
-                var s = this._focal * distortion * theta / r;
-                return [s * x, s * y];
-            }
-            else {
-                return [
-                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                ];
-            }
-        }
-        else {
-            if (bearing[2] > 0) {
-                var _a = [bearing[0] / bearing[2], bearing[1] / bearing[2]], xn = _a[0], yn = _a[1];
-                var r2 = xn * xn + yn * yn;
-                var rp2 = Math.pow(this._radialPeak, 2);
-                if (r2 > rp2) {
-                    r2 = rp2;
-                }
-                var d = 1 + this._ck1 * r2 + this._ck2 * Math.pow(r2, 2);
-                return [
-                    this._focal * d * xn,
-                    this._focal * d * yn,
-                ];
-            }
-            else {
-                return [
-                    bearing[0] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                    bearing[1] < 0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY,
-                ];
-            }
-        }
-    };
-    /**
-     * Convert basic coordinates to SfM coordinates.
-     *
-     * @param {Array<number>} basic - 2D basic coordinates.
-     * @returns {Array<number>} 2D SfM coordinates.
-     */
-    Transform.prototype._basicToSfm = function (basic) {
-        var rotatedX;
-        var rotatedY;
-        switch (this._orientation) {
-            case 1:
-                rotatedX = basic[0];
-                rotatedY = basic[1];
-                break;
-            case 3:
-                rotatedX = 1 - basic[0];
-                rotatedY = 1 - basic[1];
-                break;
-            case 6:
-                rotatedX = basic[1];
-                rotatedY = 1 - basic[0];
-                break;
-            case 8:
-                rotatedX = 1 - basic[1];
-                rotatedY = basic[0];
-                break;
-            default:
-                rotatedX = basic[0];
-                rotatedY = basic[1];
-                break;
-        }
-        var w = this._width;
-        var h = this._height;
-        var s = Math.max(w, h);
-        var sfmX = rotatedX * w / s - w / s / 2;
-        var sfmY = rotatedY * h / s - h / s / 2;
-        return [sfmX, sfmY];
-    };
-    /**
-     * Convert SfM coordinates to basic coordinates.
-     *
-     * @param {Array<number>} sfm - 2D SfM coordinates.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    Transform.prototype._sfmToBasic = function (sfm) {
-        var w = this._width;
-        var h = this._height;
-        var s = Math.max(w, h);
-        var rotatedX = (sfm[0] + w / s / 2) / w * s;
-        var rotatedY = (sfm[1] + h / s / 2) / h * s;
-        var basicX;
-        var basicY;
-        switch (this._orientation) {
-            case 1:
-                basicX = rotatedX;
-                basicY = rotatedY;
-                break;
-            case 3:
-                basicX = 1 - rotatedX;
-                basicY = 1 - rotatedY;
-                break;
-            case 6:
-                basicX = 1 - rotatedY;
-                basicY = rotatedX;
-                break;
-            case 8:
-                basicX = rotatedY;
-                basicY = 1 - rotatedX;
-                break;
-            default:
-                basicX = rotatedX;
-                basicY = rotatedY;
-                break;
-        }
-        return [basicX, basicY];
-    };
-    /**
-     * Determines if the gpano information indicates a full panorama.
-     *
-     * @returns {boolean} Value determining if the gpano information indicates
-     * a full panorama.
-     */
-    Transform.prototype._fullPano = function () {
-        return this.gpano != null &&
-            this.gpano.CroppedAreaLeftPixels === 0 &&
-            this.gpano.CroppedAreaTopPixels === 0 &&
-            this.gpano.CroppedAreaImageWidthPixels === this.gpano.FullPanoWidthPixels &&
-            this.gpano.CroppedAreaImageHeightPixels === this.gpano.FullPanoHeightPixels;
-    };
-    /**
-     * Checks a value and returns it if it exists and is larger than 0.
-     * Fallbacks if it is null.
-     *
-     * @param {number} value - Value to check.
-     * @param {number} fallback - Value to fall back to.
-     * @returns {number} The value or its fallback value if it is not defined or negative.
-     */
-    Transform.prototype._getValue = function (value, fallback) {
-        return value != null && value > 0 ? value : fallback;
-    };
-    /**
-     * Creates the extrinsic camera matrix [ R | t ].
-     *
-     * @param {Array<number>} rotation - Rotation vector in angle axis representation.
-     * @param {Array<number>} translation - Translation vector.
-     * @returns {THREE.Matrix4} Extrisic camera matrix.
-     */
-    Transform.prototype._getRt = function (rotation, translation) {
-        var axis = new THREE.Vector3(rotation[0], rotation[1], rotation[2]);
-        var angle = axis.length();
-        if (angle > 0) {
-            axis.normalize();
-        }
-        var rt = new THREE.Matrix4();
-        rt.makeRotationAxis(axis, angle);
-        rt.setPosition(new THREE.Vector3(translation[0], translation[1], translation[2]));
-        return rt;
-    };
-    /**
-     * Calculates the scaled extrinsic camera matrix scale * [ R | t ].
-     *
-     * @param {THREE.Matrix4} rt - Extrisic camera matrix.
-     * @param {number} scale - Scale factor.
-     * @returns {THREE.Matrix4} Scaled extrisic camera matrix.
-     */
-    Transform.prototype._getSrt = function (rt, scale) {
-        var srt = rt.clone();
-        var elements = srt.elements;
-        elements[12] = scale * elements[12];
-        elements[13] = scale * elements[13];
-        elements[14] = scale * elements[14];
-        srt.scale(new THREE.Vector3(scale, scale, scale));
-        return srt;
-    };
-    Transform.prototype._getBasicRt = function (rt, orientation) {
-        var axis = new THREE.Vector3(0, 0, 1);
-        var angle = 0;
-        switch (orientation) {
-            case 3:
-                angle = Math.PI;
-                break;
-            case 6:
-                angle = Math.PI / 2;
-                break;
-            case 8:
-                angle = 3 * Math.PI / 2;
-                break;
-            default:
-                break;
-        }
-        return new THREE.Matrix4()
-            .makeRotationAxis(axis, angle)
-            .multiply(rt);
-    };
-    Transform.prototype._getRadialPeak = function (k1, k2) {
-        var a = 5 * k2;
-        var b = 3 * k1;
-        var c = 1;
-        var d = Math.pow(b, 2) - 4 * a * c;
-        if (d < 0) {
-            return undefined;
-        }
-        var root1 = (-b - Math.sqrt(d)) / 2 / a;
-        var root2 = (-b + Math.sqrt(d)) / 2 / a;
-        var minRoot = Math.min(root1, root2);
-        var maxRoot = Math.max(root1, root2);
-        return minRoot > 0 ?
-            Math.sqrt(minRoot) :
-            maxRoot > 0 ?
-                Math.sqrt(maxRoot) :
-                undefined;
-    };
-    /**
-     * Calculate a transformation matrix from normalized coordinates for
-     * texture map coordinates.
-     *
-     * @returns {THREE.Matrix4} Normalized coordinates to texture map
-     * coordinates transformation matrix.
-     */
-    Transform.prototype._normalizedToTextureMatrix = function () {
-        var size = Math.max(this._width, this._height);
-        var scaleX = this._orientation < 5 ? this._textureScale[0] : this._textureScale[1];
-        var scaleY = this._orientation < 5 ? this._textureScale[1] : this._textureScale[0];
-        var w = size / this._width * scaleX;
-        var h = size / this._height * scaleY;
-        switch (this._orientation) {
-            case 1:
-                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 3:
-                return new THREE.Matrix4().set(-w, 0, 0, 0.5, 0, h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 6:
-                return new THREE.Matrix4().set(0, -h, 0, 0.5, -w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            case 8:
-                return new THREE.Matrix4().set(0, h, 0, 0.5, w, 0, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-            default:
-                return new THREE.Matrix4().set(w, 0, 0, 0.5, 0, -h, 0, 0.5, 0, 0, 1, 0, 0, 0, 0, 1);
-        }
-    };
-    return Transform;
-}());
-exports.Transform = Transform;
-
-},{"three":226}],389:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-/**
- * @class ViewportCoords
- *
- * @classdesc Provides methods for calculating 2D coordinate conversions
- * as well as 3D projection and unprojection.
- *
- * Basic coordinates are 2D coordinates on the [0, 1] interval and
- * have the origin point, (0, 0), at the top left corner and the
- * maximum value, (1, 1), at the bottom right corner of the original
- * image.
- *
- * Viewport coordinates are 2D coordinates on the [-1, 1] interval and
- * have the origin point in the center. The bottom left corner point is
- * (-1, -1) and the top right corner point is (1, 1).
- *
- * Canvas coordiantes are 2D pixel coordinates on the [0, canvasWidth] and
- * [0, canvasHeight] intervals. The origin point (0, 0) is in the top left
- * corner and the maximum value is (canvasWidth, canvasHeight) is in the
- * bottom right corner.
- *
- * 3D coordinates are in the topocentric world reference frame.
- */
-var ViewportCoords = /** @class */ (function () {
-    function ViewportCoords() {
-        this._unprojectDepth = 200;
-    }
-    /**
-     * Convert basic coordinates to canvas coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.basicToCanvas = function (basicX, basicY, container, transform, camera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var canvas = this.projectToCanvas(point3d, container, camera);
-        return canvas;
-    };
-    /**
-     * Convert basic coordinates to canvas coordinates safely. If 3D point is
-     * behind camera null will be returned.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates if the basic point represents a 3D point
-     * in front of the camera, otherwise null.
-     */
-    ViewportCoords.prototype.basicToCanvasSafe = function (basicX, basicY, container, transform, camera) {
-        var viewport = this.basicToViewportSafe(basicX, basicY, transform, camera);
-        if (viewport === null) {
-            return null;
-        }
-        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
-        return canvas;
-    };
-    /**
-     * Convert basic coordinates to viewport coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.basicToViewport = function (basicX, basicY, transform, camera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var viewport = this.projectToViewport(point3d, camera);
-        return viewport;
-    };
-    /**
-     * Convert basic coordinates to viewport coordinates safely. If 3D point is
-     * behind camera null will be returned.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} basicX - Basic X coordinate.
-     * @param {number} basicY - Basic Y coordinate.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.basicToViewportSafe = function (basicX, basicY, transform, camera) {
-        var point3d = transform.unprojectBasic([basicX, basicY], this._unprojectDepth);
-        var pointCamera = this.worldToCamera(point3d, camera);
-        if (pointCamera[2] > 0) {
-            return null;
-        }
-        var viewport = this.projectToViewport(point3d, camera);
-        return viewport;
-    };
-    /**
-     * Convert camera 3D coordinates to viewport coordinates.
-     *
-     * @param {number} pointCamera - 3D point in camera coordinate system.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.cameraToViewport = function (pointCamera, camera) {
-        var viewport = new THREE.Vector3().fromArray(pointCamera)
-            .applyMatrix4(camera.projectionMatrix);
-        return [viewport.x, viewport.y];
-    };
-    /**
-     * Get canvas pixel position from event.
-     *
-     * @param {Event} event - Event containing clientX and clientY properties.
-     * @param {HTMLElement} element - HTML element.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.canvasPosition = function (event, element) {
-        var clientRect = element.getBoundingClientRect();
-        var canvasX = event.clientX - clientRect.left - element.clientLeft;
-        var canvasY = event.clientY - clientRect.top - element.clientTop;
-        return [canvasX, canvasY];
-    };
-    /**
-     * Convert canvas coordinates to basic coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    ViewportCoords.prototype.canvasToBasic = function (canvasX, canvasY, container, transform, camera) {
-        var point3d = this.unprojectFromCanvas(canvasX, canvasY, container, camera)
-            .toArray();
-        var basic = transform.projectBasic(point3d);
-        return basic;
-    };
-    /**
-     * Convert canvas coordinates to viewport coordinates.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.canvasToViewport = function (canvasX, canvasY, container) {
-        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
-        var viewportX = 2 * canvasX / canvasWidth - 1;
-        var viewportY = 1 - 2 * canvasY / canvasHeight;
-        return [viewportX, viewportY];
-    };
-    /**
-     * Determines the width and height of the container in canvas coordinates.
-     *
-     * @param {HTMLElement} container - The viewer container.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.containerToCanvas = function (container) {
-        return [container.offsetWidth, container.offsetHeight];
-    };
-    /**
-     * Determine basic distances from image to canvas corners.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * Determines the smallest basic distance for every side of the canvas.
-     *
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} Array of basic distances as [top, right, bottom, left].
-     */
-    ViewportCoords.prototype.getBasicDistances = function (transform, camera) {
-        var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera);
-        var topRightBasic = this.viewportToBasic(1, 1, transform, camera);
-        var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera);
-        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera);
-        var topBasicDistance = 0;
-        var rightBasicDistance = 0;
-        var bottomBasicDistance = 0;
-        var leftBasicDistance = 0;
-        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {
-            topBasicDistance = topLeftBasic[1] > topRightBasic[1] ?
-                -topLeftBasic[1] :
-                -topRightBasic[1];
-        }
-        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {
-            rightBasicDistance = topRightBasic[0] < bottomRightBasic[0] ?
-                topRightBasic[0] - 1 :
-                bottomRightBasic[0] - 1;
-        }
-        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {
-            bottomBasicDistance = bottomRightBasic[1] < bottomLeftBasic[1] ?
-                bottomRightBasic[1] - 1 :
-                bottomLeftBasic[1] - 1;
-        }
-        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {
-            leftBasicDistance = bottomLeftBasic[0] > topLeftBasic[0] ?
-                -bottomLeftBasic[0] :
-                -topLeftBasic[0];
-        }
-        return [topBasicDistance, rightBasicDistance, bottomBasicDistance, leftBasicDistance];
-    };
-    /**
-     * Determine pixel distances from image to canvas corners.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * Determines the smallest pixel distance for every side of the canvas.
-     *
-     * @param {HTMLElement} container - The viewer container.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} Array of pixel distances as [top, right, bottom, left].
-     */
-    ViewportCoords.prototype.getPixelDistances = function (container, transform, camera) {
-        var topLeftBasic = this.viewportToBasic(-1, 1, transform, camera);
-        var topRightBasic = this.viewportToBasic(1, 1, transform, camera);
-        var bottomRightBasic = this.viewportToBasic(1, -1, transform, camera);
-        var bottomLeftBasic = this.viewportToBasic(-1, -1, transform, camera);
-        var topPixelDistance = 0;
-        var rightPixelDistance = 0;
-        var bottomPixelDistance = 0;
-        var leftPixelDistance = 0;
-        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
-        if (topLeftBasic[1] < 0 && topRightBasic[1] < 0) {
-            var basicX = topLeftBasic[1] > topRightBasic[1] ?
-                topLeftBasic[0] :
-                topRightBasic[0];
-            var canvas = this.basicToCanvas(basicX, 0, container, transform, camera);
-            topPixelDistance = canvas[1] > 0 ? canvas[1] : 0;
-        }
-        if (topRightBasic[0] > 1 && bottomRightBasic[0] > 1) {
-            var basicY = topRightBasic[0] < bottomRightBasic[0] ?
-                topRightBasic[1] :
-                bottomRightBasic[1];
-            var canvas = this.basicToCanvas(1, basicY, container, transform, camera);
-            rightPixelDistance = canvas[0] < canvasWidth ? canvasWidth - canvas[0] : 0;
-        }
-        if (bottomRightBasic[1] > 1 && bottomLeftBasic[1] > 1) {
-            var basicX = bottomRightBasic[1] < bottomLeftBasic[1] ?
-                bottomRightBasic[0] :
-                bottomLeftBasic[0];
-            var canvas = this.basicToCanvas(basicX, 1, container, transform, camera);
-            bottomPixelDistance = canvas[1] < canvasHeight ? canvasHeight - canvas[1] : 0;
-        }
-        if (bottomLeftBasic[0] < 0 && topLeftBasic[0] < 0) {
-            var basicY = bottomLeftBasic[0] > topLeftBasic[0] ?
-                bottomLeftBasic[1] :
-                topLeftBasic[1];
-            var canvas = this.basicToCanvas(0, basicY, container, transform, camera);
-            leftPixelDistance = canvas[0] > 0 ? canvas[0] : 0;
-        }
-        return [topPixelDistance, rightPixelDistance, bottomPixelDistance, leftPixelDistance];
-    };
-    /**
-     * Determine if an event occured inside an element.
-     *
-     * @param {Event} event - Event containing clientX and clientY properties.
-     * @param {HTMLElement} element - HTML element.
-     * @returns {boolean} Value indicating if the event occured inside the element or not.
-     */
-    ViewportCoords.prototype.insideElement = function (event, element) {
-        var clientRect = element.getBoundingClientRect();
-        var minX = clientRect.left + element.clientLeft;
-        var maxX = minX + element.clientWidth;
-        var minY = clientRect.top + element.clientTop;
-        var maxY = minY + element.clientHeight;
-        return event.clientX > minX &&
-            event.clientX < maxX &&
-            event.clientY > minY &&
-            event.clientY < maxY;
-    };
-    /**
-     * Project 3D world coordinates to canvas coordinates.
-     *
-     * @param {Array<number>} point3D - 3D world coordinates.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.projectToCanvas = function (point3d, container, camera) {
-        var viewport = this.projectToViewport(point3d, camera);
-        var canvas = this.viewportToCanvas(viewport[0], viewport[1], container);
-        return canvas;
-    };
-    /**
-     * Project 3D world coordinates to viewport coordinates.
-     *
-     * @param {Array<number>} point3D - 3D world coordinates.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D viewport coordinates.
-     */
-    ViewportCoords.prototype.projectToViewport = function (point3d, camera) {
-        var viewport = new THREE.Vector3(point3d[0], point3d[1], point3d[2])
-            .project(camera);
-        return [viewport.x, viewport.y];
-    };
-    /**
-     * Uproject canvas coordinates to 3D world coordinates.
-     *
-     * @param {number} canvasX - Canvas X coordinate.
-     * @param {number} canvasY - Canvas Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.unprojectFromCanvas = function (canvasX, canvasY, container, camera) {
-        var viewport = this.canvasToViewport(canvasX, canvasY, container);
-        var point3d = this.unprojectFromViewport(viewport[0], viewport[1], camera);
-        return point3d;
-    };
-    /**
-     * Unproject viewport coordinates to 3D world coordinates.
-     *
-     * @param {number} viewportX - Viewport X coordinate.
-     * @param {number} viewportY - Viewport Y coordinate.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 3D world coordinates.
-     */
-    ViewportCoords.prototype.unprojectFromViewport = function (viewportX, viewportY, camera) {
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(camera);
-        return point3d;
-    };
-    /**
-     * Convert viewport coordinates to basic coordinates.
-     *
-     * @description Transform origin and camera position needs to be the
-     * equal for reliable return value.
-     *
-     * @param {number} viewportX - Viewport X coordinate.
-     * @param {number} viewportY - Viewport Y coordinate.
-     * @param {Transform} transform - Transform of the node to unproject from.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 2D basic coordinates.
-     */
-    ViewportCoords.prototype.viewportToBasic = function (viewportX, viewportY, transform, camera) {
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(camera)
-            .toArray();
-        var basic = transform.projectBasic(point3d);
-        return basic;
-    };
-    /**
-     * Convert viewport coordinates to canvas coordinates.
-     *
-     * @param {number} viewportX - Viewport X coordinate.
-     * @param {number} viewportY - Viewport Y coordinate.
-     * @param {HTMLElement} container - The viewer container.
-     * @returns {Array<number>} 2D canvas coordinates.
-     */
-    ViewportCoords.prototype.viewportToCanvas = function (viewportX, viewportY, container) {
-        var _a = this.containerToCanvas(container), canvasWidth = _a[0], canvasHeight = _a[1];
-        var canvasX = canvasWidth * (viewportX + 1) / 2;
-        var canvasY = -canvasHeight * (viewportY - 1) / 2;
-        return [canvasX, canvasY];
-    };
-    /**
-     * Convert 3D world coordinates to 3D camera coordinates.
-     *
-     * @param {number} point3D - 3D point in world coordinate system.
-     * @param {THREE.Camera} camera - Camera used in rendering.
-     * @returns {Array<number>} 3D camera coordinates.
-     */
-    ViewportCoords.prototype.worldToCamera = function (point3d, camera) {
-        var pointCamera = new THREE.Vector3(point3d[0], point3d[1], point3d[2])
-            .applyMatrix4(camera.matrixWorldInverse);
-        return pointCamera.toArray();
-    };
-    return ViewportCoords;
-}());
-exports.ViewportCoords = ViewportCoords;
-exports.default = ViewportCoords;
-
-
-},{"three":226}],390:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * @class Filter
- *
- * @classdesc Represents a class for creating node filters. Implementation and
- * definitions based on https://github.com/mapbox/feature-filter.
- */
-var FilterCreator = /** @class */ (function () {
-    function FilterCreator() {
-    }
-    /**
-     * Create a filter from a filter expression.
-     *
-     * @description The following filters are supported:
-     *
-     * Comparison
-     * `==`
-     * `!=`
-     * `<`
-     * `<=`
-     * `>`
-     * `>=`
-     *
-     * Set membership
-     * `in`
-     * `!in`
-     *
-     * Combining
-     * `all`
-     *
-     * @param {FilterExpression} filter - Comparison, set membership or combinding filter
-     * expression.
-     * @returns {FilterFunction} Function taking a node and returning a boolean that
-     * indicates whether the node passed the test or not.
-     */
-    FilterCreator.prototype.createFilter = function (filter) {
-        return new Function("node", "return " + this._compile(filter) + ";");
-    };
-    FilterCreator.prototype._compile = function (filter) {
-        if (filter == null || filter.length <= 1) {
-            return "true";
-        }
-        var operator = filter[0];
-        var operation = operator === "==" ? this._compileComparisonOp("===", filter[1], filter[2], false) :
-            operator === "!=" ? this._compileComparisonOp("!==", filter[1], filter[2], false) :
-                operator === ">" ||
-                    operator === ">=" ||
-                    operator === "<" ||
-                    operator === "<=" ? this._compileComparisonOp(operator, filter[1], filter[2], true) :
-                    operator === "in" ?
-                        this._compileInOp(filter[1], filter.slice(2)) :
-                        operator === "!in" ?
-                            this._compileNegation(this._compileInOp(filter[1], filter.slice(2))) :
-                            operator === "all" ? this._compileLogicalOp(filter.slice(1), "&&") :
-                                "true";
-        return "(" + operation + ")";
-    };
-    FilterCreator.prototype._compare = function (a, b) {
-        return a < b ? -1 : a > b ? 1 : 0;
-    };
-    FilterCreator.prototype._compileComparisonOp = function (operator, property, value, checkType) {
-        var left = this._compilePropertyReference(property);
-        var right = JSON.stringify(value);
-        return (checkType ? "typeof " + left + "===typeof " + right + "&&" : "") + left + operator + right;
-    };
-    FilterCreator.prototype._compileInOp = function (property, values) {
-        var compare = this._compare;
-        var left = JSON.stringify(values.sort(compare));
-        var right = this._compilePropertyReference(property);
-        return left + ".indexOf(" + right + ")!==-1";
-    };
-    FilterCreator.prototype._compileLogicalOp = function (filters, operator) {
-        var compile = this._compile.bind(this);
-        return filters.map(compile).join(operator);
-    };
-    FilterCreator.prototype._compileNegation = function (expression) {
-        return "!(" + expression + ")";
-    };
-    FilterCreator.prototype._compilePropertyReference = function (property) {
-        return "node[" + JSON.stringify(property) + "]";
-    };
-    return FilterCreator;
-}());
-exports.FilterCreator = FilterCreator;
-exports.default = FilterCreator;
-
-},{}],391:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var rbush = require("rbush");
-var Edge_1 = require("../Edge");
-var Error_1 = require("../Error");
-var Graph_1 = require("../Graph");
-/**
- * @class Graph
- *
- * @classdesc Represents a graph of nodes with edges.
- */
-var Graph = /** @class */ (function () {
-    /**
-     * Create a new graph instance.
-     *
-     * @param {APIv3} [apiV3] - API instance for retrieving data.
-     * @param {rbush.RBush<NodeIndexItem>} [nodeIndex] - Node index for fast spatial retreival.
-     * @param {GraphCalculator} [graphCalculator] - Instance for graph calculations.
-     * @param {EdgeCalculator} [edgeCalculator] - Instance for edge calculations.
-     * @param {FilterCreator} [filterCreator] - Instance for  filter creation.
-     * @param {IGraphConfiguration} [configuration] - Configuration struct.
-     */
-    function Graph(apiV3, nodeIndex, graphCalculator, edgeCalculator, filterCreator, configuration) {
-        this._apiV3 = apiV3;
-        this._cachedNodes = {};
-        this._cachedNodeTiles = {};
-        this._cachedSequenceNodes = {};
-        this._cachedSpatialEdges = {};
-        this._cachedTiles = {};
-        this._cachingFill$ = {};
-        this._cachingFull$ = {};
-        this._cachingSequenceNodes$ = {};
-        this._cachingSequences$ = {};
-        this._cachingSpatialArea$ = {};
-        this._cachingTiles$ = {};
-        this._changed$ = new rxjs_1.Subject();
-        this._defaultAlt = 2;
-        this._edgeCalculator = edgeCalculator != null ? edgeCalculator : new Edge_1.EdgeCalculator();
-        this._filterCreator = filterCreator != null ? filterCreator : new Graph_1.FilterCreator();
-        this._filter = this._filterCreator.createFilter(undefined);
-        this._graphCalculator = graphCalculator != null ? graphCalculator : new Graph_1.GraphCalculator();
-        this._configuration = configuration != null ?
-            configuration :
-            {
-                maxSequences: 50,
-                maxUnusedNodes: 100,
-                maxUnusedPreStoredNodes: 30,
-                maxUnusedTiles: 20,
-            };
-        this._nodes = {};
-        this._nodeIndex = nodeIndex != null ? nodeIndex : rbush(16, [".lat", ".lon", ".lat", ".lon"]);
-        this._nodeIndexTiles = {};
-        this._nodeToTile = {};
-        this._preStored = {};
-        this._requiredNodeTiles = {};
-        this._requiredSpatialArea = {};
-        this._sequences = {};
-        this._tilePrecision = 7;
-        this._tileThreshold = 20;
-    }
-    Object.defineProperty(Graph.prototype, "changed$", {
-        /**
-         * Get changed$.
-         *
-         * @returns {Observable<Graph>} Observable emitting
-         * the graph every time it has changed.
-         */
-        get: function () {
-            return this._changed$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Caches the full node data for all images within a bounding
-     * box.
-     *
-     * @description The node assets are not cached.
-     *
-     * @param {ILatLon} sw - South west corner of bounding box.
-     * @param {ILatLon} ne - North east corner of bounding box.
-     * @returns {Observable<Graph>} Observable emitting the full
-     * nodes in the bounding box.
-     */
-    Graph.prototype.cacheBoundingBox$ = function (sw, ne) {
-        var _this = this;
-        var cacheTiles$ = this._graphCalculator.encodeHsFromBoundingBox(sw, ne)
-            .filter(function (h) {
-            return !(h in _this._cachedTiles);
-        })
-            .map(function (h) {
-            return h in _this._cachingTiles$ ?
-                _this._cachingTiles$[h] :
-                _this._cacheTile$(h);
-        });
-        if (cacheTiles$.length === 0) {
-            cacheTiles$.push(rxjs_1.of(this));
-        }
-        return rxjs_1.from(cacheTiles$).pipe(operators_1.mergeAll(), operators_1.last(), operators_1.mergeMap(function (graph) {
-            var nodes = _this._nodeIndex
-                .search({
-                maxX: ne.lat,
-                maxY: ne.lon,
-                minX: sw.lat,
-                minY: sw.lon,
-            })
-                .map(function (item) {
-                return item.node;
-            });
-            var fullNodes = [];
-            var coreNodes = [];
-            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-                var node = nodes_1[_i];
-                if (node.full) {
-                    fullNodes.push(node);
-                }
-                else {
-                    coreNodes.push(node.key);
-                }
-            }
-            var coreNodeBatches = [];
-            var batchSize = 200;
-            while (coreNodes.length > 0) {
-                coreNodeBatches.push(coreNodes.splice(0, batchSize));
-            }
-            var fullNodes$ = rxjs_1.of(fullNodes);
-            var fillNodes$ = coreNodeBatches
-                .map(function (batch) {
-                return _this._apiV3.imageByKeyFill$(batch).pipe(operators_1.map(function (imageByKeyFill) {
-                    var filledNodes = [];
-                    for (var fillKey in imageByKeyFill) {
-                        if (!imageByKeyFill.hasOwnProperty(fillKey)) {
-                            continue;
-                        }
-                        if (_this.hasNode(fillKey)) {
-                            var node = _this.getNode(fillKey);
-                            if (!node.full) {
-                                _this._makeFull(node, imageByKeyFill[fillKey]);
-                            }
-                            filledNodes.push(node);
-                        }
-                    }
-                    return filledNodes;
-                }));
-            });
-            return rxjs_1.merge(fullNodes$, rxjs_1.from(fillNodes$).pipe(operators_1.mergeAll()));
-        }), operators_1.reduce(function (acc, value) {
-            return acc.concat(value);
-        }));
-    };
-    /**
-     * Retrieve and cache node fill properties.
-     *
-     * @param {string} key - Key of node to fill.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the node has been updated.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheFill$ = function (key) {
-        var _this = this;
-        if (key in this._cachingFull$) {
-            throw new Error_1.GraphMapillaryError("Cannot fill node while caching full (" + key + ").");
-        }
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot fill node that does not exist in graph (" + key + ").");
-        }
-        if (key in this._cachingFill$) {
-            return this._cachingFill$[key];
-        }
-        var node = this.getNode(key);
-        if (node.full) {
-            throw new Error_1.GraphMapillaryError("Cannot fill node that is already full (" + key + ").");
-        }
-        this._cachingFill$[key] = this._apiV3.imageByKeyFill$([key]).pipe(operators_1.tap(function (imageByKeyFill) {
-            if (!node.full) {
-                _this._makeFull(node, imageByKeyFill[key]);
-            }
-            delete _this._cachingFill$[key];
-        }), operators_1.map(function (imageByKeyFill) {
-            return _this;
-        }), operators_1.finalize(function () {
-            if (key in _this._cachingFill$) {
-                delete _this._cachingFill$[key];
-            }
-            _this._changed$.next(_this);
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingFill$[key];
-    };
-    /**
-     * Retrieve and cache full node properties.
-     *
-     * @param {string} key - Key of node to fill.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the node has been updated.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheFull$ = function (key) {
-        var _this = this;
-        if (key in this._cachingFull$) {
-            return this._cachingFull$[key];
-        }
-        if (this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache full node that already exist in graph (" + key + ").");
-        }
-        this._cachingFull$[key] = this._apiV3.imageByKeyFull$([key]).pipe(operators_1.tap(function (imageByKeyFull) {
-            var fn = imageByKeyFull[key];
-            if (_this.hasNode(key)) {
-                var node = _this.getNode(key);
-                if (!node.full) {
-                    _this._makeFull(node, fn);
-                }
-            }
-            else {
-                if (fn.sequence_key == null) {
-                    throw new Error_1.GraphMapillaryError("Node has no sequence key (" + key + ").");
-                }
-                var node = new Graph_1.Node(fn);
-                _this._makeFull(node, fn);
-                var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision);
-                _this._preStore(h, node);
-                _this._setNode(node);
-                delete _this._cachingFull$[key];
-            }
-        }), operators_1.map(function (imageByKeyFull) {
-            return _this;
-        }), operators_1.finalize(function () {
-            if (key in _this._cachingFull$) {
-                delete _this._cachingFull$[key];
-            }
-            _this._changed$.next(_this);
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingFull$[key];
-    };
-    /**
-     * Retrieve and cache a node sequence.
-     *
-     * @param {string} key - Key of node for which to retrieve sequence.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the sequence has been retrieved.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheNodeSequence$ = function (key) {
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache sequence edges of node that does not exist in graph (" + key + ").");
-        }
-        var node = this.getNode(key);
-        if (node.sequenceKey in this._sequences) {
-            throw new Error_1.GraphMapillaryError("Sequence already cached (" + key + "), (" + node.sequenceKey + ").");
-        }
-        return this._cacheSequence$(node.sequenceKey);
-    };
-    /**
-     * Retrieve and cache a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence to cache.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the sequence has been retrieved.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSequence$ = function (sequenceKey) {
-        if (sequenceKey in this._sequences) {
-            throw new Error_1.GraphMapillaryError("Sequence already cached (" + sequenceKey + ")");
-        }
-        return this._cacheSequence$(sequenceKey);
-    };
-    /**
-     * Cache sequence edges for a node.
-     *
-     * @param {string} key - Key of node.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSequenceEdges = function (key) {
-        var node = this.getNode(key);
-        if (!(node.sequenceKey in this._sequences)) {
-            throw new Error_1.GraphMapillaryError("Sequence is not cached (" + key + "), (" + node.sequenceKey + ")");
-        }
-        var sequence = this._sequences[node.sequenceKey].sequence;
-        var edges = this._edgeCalculator.computeSequenceEdges(node, sequence);
-        node.cacheSequenceEdges(edges);
-    };
-    /**
-     * Retrieve and cache full nodes for all keys in a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @param {string} referenceNodeKey - Key of node to use as reference
-     * for optimized caching.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the nodes of the sequence has been cached.
-     */
-    Graph.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
-        var _this = this;
-        if (!this.hasSequence(sequenceKey)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache sequence nodes of sequence that does not exist in graph (" + sequenceKey + ").");
-        }
-        if (this.hasSequenceNodes(sequenceKey)) {
-            throw new Error_1.GraphMapillaryError("Sequence nodes already cached (" + sequenceKey + ").");
-        }
-        var sequence = this.getSequence(sequenceKey);
-        if (sequence.key in this._cachingSequenceNodes$) {
-            return this._cachingSequenceNodes$[sequence.key];
-        }
-        var batches = [];
-        var keys = sequence.keys.slice();
-        var referenceBatchSize = 50;
-        if (!!referenceNodeKey && keys.length > referenceBatchSize) {
-            var referenceIndex = keys.indexOf(referenceNodeKey);
-            var startIndex = Math.max(0, Math.min(referenceIndex - referenceBatchSize / 2, keys.length - referenceBatchSize));
-            batches.push(keys.splice(startIndex, referenceBatchSize));
-        }
-        var batchSize = 200;
-        while (keys.length > 0) {
-            batches.push(keys.splice(0, batchSize));
-        }
-        var batchesToCache = batches.length;
-        var sequenceNodes$ = rxjs_1.from(batches).pipe(operators_1.mergeMap(function (batch) {
-            return _this._apiV3.imageByKeyFull$(batch).pipe(operators_1.tap(function (imageByKeyFull) {
-                for (var fullKey in imageByKeyFull) {
-                    if (!imageByKeyFull.hasOwnProperty(fullKey)) {
-                        continue;
-                    }
-                    var fn = imageByKeyFull[fullKey];
-                    if (_this.hasNode(fullKey)) {
-                        var node = _this.getNode(fn.key);
-                        if (!node.full) {
-                            _this._makeFull(node, fn);
-                        }
-                    }
-                    else {
-                        if (fn.sequence_key == null) {
-                            console.warn("Sequence missing, discarding node (" + fn.key + ")");
-                        }
-                        var node = new Graph_1.Node(fn);
-                        _this._makeFull(node, fn);
-                        var h = _this._graphCalculator.encodeH(node.originalLatLon, _this._tilePrecision);
-                        _this._preStore(h, node);
-                        _this._setNode(node);
-                    }
-                }
-                batchesToCache--;
-            }), operators_1.map(function (imageByKeyFull) {
-                return _this;
-            }));
-        }, 6), operators_1.last(), operators_1.finalize(function () {
-            delete _this._cachingSequenceNodes$[sequence.key];
-            if (batchesToCache === 0) {
-                _this._cachedSequenceNodes[sequence.key] = true;
-            }
-        }), operators_1.publish(), operators_1.refCount());
-        this._cachingSequenceNodes$[sequence.key] = sequenceNodes$;
-        return sequenceNodes$;
-    };
-    /**
-     * Retrieve and cache full nodes for a node spatial area.
-     *
-     * @param {string} key - Key of node for which to retrieve sequence.
-     * @returns {Observable<Graph>} Observable emitting the graph
-     * when the nodes in the spatial area has been made full.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSpatialArea$ = function (key) {
-        var _this = this;
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache spatial area of node that does not exist in graph (" + key + ").");
-        }
-        if (key in this._cachedSpatialEdges) {
-            throw new Error_1.GraphMapillaryError("Node already spatially cached (" + key + ").");
-        }
-        if (!(key in this._requiredSpatialArea)) {
-            throw new Error_1.GraphMapillaryError("Spatial area not determined (" + key + ").");
-        }
-        var spatialArea = this._requiredSpatialArea[key];
-        if (Object.keys(spatialArea.cacheNodes).length === 0) {
-            throw new Error_1.GraphMapillaryError("Spatial nodes already cached (" + key + ").");
-        }
-        if (key in this._cachingSpatialArea$) {
-            return this._cachingSpatialArea$[key];
-        }
-        var batches = [];
-        while (spatialArea.cacheKeys.length > 0) {
-            batches.push(spatialArea.cacheKeys.splice(0, 200));
-        }
-        var batchesToCache = batches.length;
-        var spatialNodes$ = [];
-        var _loop_1 = function (batch) {
-            var spatialNodeBatch$ = this_1._apiV3.imageByKeyFill$(batch).pipe(operators_1.tap(function (imageByKeyFill) {
-                for (var fillKey in imageByKeyFill) {
-                    if (!imageByKeyFill.hasOwnProperty(fillKey)) {
-                        continue;
-                    }
-                    var spatialNode = spatialArea.cacheNodes[fillKey];
-                    if (spatialNode.full) {
-                        delete spatialArea.cacheNodes[fillKey];
-                        continue;
-                    }
-                    var fillNode = imageByKeyFill[fillKey];
-                    _this._makeFull(spatialNode, fillNode);
-                    delete spatialArea.cacheNodes[fillKey];
-                }
-                if (--batchesToCache === 0) {
-                    delete _this._cachingSpatialArea$[key];
-                }
-            }), operators_1.map(function (imageByKeyFill) {
-                return _this;
-            }), operators_1.catchError(function (error) {
-                for (var _i = 0, batch_1 = batch; _i < batch_1.length; _i++) {
-                    var batchKey = batch_1[_i];
-                    if (batchKey in spatialArea.all) {
-                        delete spatialArea.all[batchKey];
-                    }
-                    if (batchKey in spatialArea.cacheNodes) {
-                        delete spatialArea.cacheNodes[batchKey];
-                    }
-                }
-                if (--batchesToCache === 0) {
-                    delete _this._cachingSpatialArea$[key];
-                }
-                throw error;
-            }), operators_1.finalize(function () {
-                if (Object.keys(spatialArea.cacheNodes).length === 0) {
-                    _this._changed$.next(_this);
-                }
-            }), operators_1.publish(), operators_1.refCount());
-            spatialNodes$.push(spatialNodeBatch$);
-        };
-        var this_1 = this;
-        for (var _i = 0, batches_1 = batches; _i < batches_1.length; _i++) {
-            var batch = batches_1[_i];
-            _loop_1(batch);
-        }
-        this._cachingSpatialArea$[key] = spatialNodes$;
-        return spatialNodes$;
-    };
-    /**
-     * Cache spatial edges for a node.
-     *
-     * @param {string} key - Key of node.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheSpatialEdges = function (key) {
-        if (key in this._cachedSpatialEdges) {
-            throw new Error_1.GraphMapillaryError("Spatial edges already cached (" + key + ").");
-        }
-        var node = this.getNode(key);
-        var sequence = this._sequences[node.sequenceKey].sequence;
-        var fallbackKeys = [];
-        var prevKey = sequence.findPrevKey(node.key);
-        if (prevKey != null) {
-            fallbackKeys.push(prevKey);
-        }
-        var nextKey = sequence.findNextKey(node.key);
-        if (nextKey != null) {
-            fallbackKeys.push(nextKey);
-        }
-        var allSpatialNodes = this._requiredSpatialArea[key].all;
-        var potentialNodes = [];
-        var filter = this._filter;
-        for (var spatialNodeKey in allSpatialNodes) {
-            if (!allSpatialNodes.hasOwnProperty(spatialNodeKey)) {
-                continue;
-            }
-            var spatialNode = allSpatialNodes[spatialNodeKey];
-            if (filter(spatialNode)) {
-                potentialNodes.push(spatialNode);
-            }
-        }
-        var potentialEdges = this._edgeCalculator.getPotentialEdges(node, potentialNodes, fallbackKeys);
-        var edges = this._edgeCalculator.computeStepEdges(node, potentialEdges, prevKey, nextKey);
-        edges = edges.concat(this._edgeCalculator.computeTurnEdges(node, potentialEdges));
-        edges = edges.concat(this._edgeCalculator.computePanoEdges(node, potentialEdges));
-        edges = edges.concat(this._edgeCalculator.computePerspectiveToPanoEdges(node, potentialEdges));
-        edges = edges.concat(this._edgeCalculator.computeSimilarEdges(node, potentialEdges));
-        node.cacheSpatialEdges(edges);
-        this._cachedSpatialEdges[key] = node;
-        delete this._requiredSpatialArea[key];
-        delete this._cachedNodeTiles[key];
-    };
-    /**
-     * Retrieve and cache geohash tiles for a node.
-     *
-     * @param {string} key - Key of node for which to retrieve tiles.
-     * @returns {Array<Observable<Graph>>} Array of observables emitting
-     * the graph for each tile required for the node has been cached.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.cacheTiles$ = function (key) {
-        var _this = this;
-        if (key in this._cachedNodeTiles) {
-            throw new Error_1.GraphMapillaryError("Tiles already cached (" + key + ").");
-        }
-        if (key in this._cachedSpatialEdges) {
-            throw new Error_1.GraphMapillaryError("Spatial edges already cached so tiles considered cached (" + key + ").");
-        }
-        if (!(key in this._requiredNodeTiles)) {
-            throw new Error_1.GraphMapillaryError("Tiles have not been determined (" + key + ").");
-        }
-        var nodeTiles = this._requiredNodeTiles[key];
-        if (nodeTiles.cache.length === 0 &&
-            nodeTiles.caching.length === 0) {
-            throw new Error_1.GraphMapillaryError("Tiles already cached (" + key + ").");
-        }
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Cannot cache tiles of node that does not exist in graph (" + key + ").");
-        }
-        var hs = nodeTiles.cache.slice();
-        nodeTiles.caching = this._requiredNodeTiles[key].caching.concat(hs);
-        nodeTiles.cache = [];
-        var cacheTiles$ = [];
-        var _loop_2 = function (h) {
-            var cacheTile$ = h in this_2._cachingTiles$ ?
-                this_2._cachingTiles$[h] :
-                this_2._cacheTile$(h);
-            cacheTiles$.push(cacheTile$.pipe(operators_1.tap(function (graph) {
-                var index = nodeTiles.caching.indexOf(h);
-                if (index > -1) {
-                    nodeTiles.caching.splice(index, 1);
-                }
-                if (nodeTiles.caching.length === 0 &&
-                    nodeTiles.cache.length === 0) {
-                    delete _this._requiredNodeTiles[key];
-                    _this._cachedNodeTiles[key] = true;
-                }
-            }), operators_1.catchError(function (error) {
-                var index = nodeTiles.caching.indexOf(h);
-                if (index > -1) {
-                    nodeTiles.caching.splice(index, 1);
-                }
-                if (nodeTiles.caching.length === 0 &&
-                    nodeTiles.cache.length === 0) {
-                    delete _this._requiredNodeTiles[key];
-                    _this._cachedNodeTiles[key] = true;
-                }
-                throw error;
-            }), operators_1.finalize(function () {
-                _this._changed$.next(_this);
-            }), operators_1.publish(), operators_1.refCount()));
-        };
-        var this_2 = this;
-        for (var _i = 0, _a = nodeTiles.caching; _i < _a.length; _i++) {
-            var h = _a[_i];
-            _loop_2(h);
-        }
-        return cacheTiles$;
-    };
-    /**
-     * Initialize the cache for a node.
-     *
-     * @param {string} key - Key of node.
-     * @throws {GraphMapillaryError} When the operation is not valid on the
-     * current graph.
-     */
-    Graph.prototype.initializeCache = function (key) {
-        if (key in this._cachedNodes) {
-            throw new Error_1.GraphMapillaryError("Node already in cache (" + key + ").");
-        }
-        var node = this.getNode(key);
-        node.initializeCache(new Graph_1.NodeCache());
-        var accessed = new Date().getTime();
-        this._cachedNodes[key] = { accessed: accessed, node: node };
-        this._updateCachedTileAccess(key, accessed);
-    };
-    /**
-     * Get a value indicating if the graph is fill caching a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the node is being fill cached.
-     */
-    Graph.prototype.isCachingFill = function (key) {
-        return key in this._cachingFill$;
-    };
-    /**
-     * Get a value indicating if the graph is fully caching a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the node is being fully cached.
-     */
-    Graph.prototype.isCachingFull = function (key) {
-        return key in this._cachingFull$;
-    };
-    /**
-     * Get a value indicating if the graph is caching a sequence of a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the sequence of a node is
-     * being cached.
-     */
-    Graph.prototype.isCachingNodeSequence = function (key) {
-        var node = this.getNode(key);
-        return node.sequenceKey in this._cachingSequences$;
-    };
-    /**
-     * Get a value indicating if the graph is caching a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if the sequence is
-     * being cached.
-     */
-    Graph.prototype.isCachingSequence = function (sequenceKey) {
-        return sequenceKey in this._cachingSequences$;
-    };
-    /**
-     * Get a value indicating if the graph is caching sequence nodes.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if the sequence nodes are
-     * being cached.
-     */
-    Graph.prototype.isCachingSequenceNodes = function (sequenceKey) {
-        return sequenceKey in this._cachingSequenceNodes$;
-    };
-    /**
-     * Get a value indicating if the graph is caching the tiles
-     * required for calculating spatial edges of a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the tiles of
-     * a node are being cached.
-     */
-    Graph.prototype.isCachingTiles = function (key) {
-        return key in this._requiredNodeTiles &&
-            this._requiredNodeTiles[key].cache.length === 0 &&
-            this._requiredNodeTiles[key].caching.length > 0;
-    };
-    /**
-     * Get a value indicating if the cache has been initialized
-     * for a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the cache has been
-     * initialized for a node.
-     */
-    Graph.prototype.hasInitializedCache = function (key) {
-        return key in this._cachedNodes;
-    };
-    /**
-     * Get a value indicating if a node exist in the graph.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if a node exist in the graph.
-     */
-    Graph.prototype.hasNode = function (key) {
-        var accessed = new Date().getTime();
-        this._updateCachedNodeAccess(key, accessed);
-        this._updateCachedTileAccess(key, accessed);
-        return key in this._nodes;
-    };
-    /**
-     * Get a value indicating if a node sequence exist in the graph.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if a node sequence exist
-     * in the graph.
-     */
-    Graph.prototype.hasNodeSequence = function (key) {
-        var node = this.getNode(key);
-        var sequenceKey = node.sequenceKey;
-        var hasNodeSequence = sequenceKey in this._sequences;
-        if (hasNodeSequence) {
-            this._sequences[sequenceKey].accessed = new Date().getTime();
-        }
-        return hasNodeSequence;
-    };
-    /**
-     * Get a value indicating if a sequence exist in the graph.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if a sequence exist
-     * in the graph.
-     */
-    Graph.prototype.hasSequence = function (sequenceKey) {
-        var hasSequence = sequenceKey in this._sequences;
-        if (hasSequence) {
-            this._sequences[sequenceKey].accessed = new Date().getTime();
-        }
-        return hasSequence;
-    };
-    /**
-     * Get a value indicating if sequence nodes has been cached in the graph.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {boolean} Value indicating if a sequence nodes has been
-     * cached in the graph.
-     */
-    Graph.prototype.hasSequenceNodes = function (sequenceKey) {
-        return sequenceKey in this._cachedSequenceNodes;
-    };
-    /**
-     * Get a value indicating if the graph has fully cached
-     * all nodes in the spatial area of a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the spatial area
-     * of a node has been cached.
-     */
-    Graph.prototype.hasSpatialArea = function (key) {
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Spatial area nodes cannot be determined if node not in graph (" + key + ").");
-        }
-        if (key in this._cachedSpatialEdges) {
-            return true;
-        }
-        if (key in this._requiredSpatialArea) {
-            return Object.keys(this._requiredSpatialArea[key].cacheNodes).length === 0;
-        }
-        var node = this.getNode(key);
-        var bbox = this._graphCalculator.boundingBoxCorners(node.latLon, this._tileThreshold);
-        var spatialItems = this._nodeIndex.search({
-            maxX: bbox[1].lat,
-            maxY: bbox[1].lon,
-            minX: bbox[0].lat,
-            minY: bbox[0].lon,
-        });
-        var spatialNodes = {
-            all: {},
-            cacheKeys: [],
-            cacheNodes: {},
-        };
-        for (var _i = 0, spatialItems_1 = spatialItems; _i < spatialItems_1.length; _i++) {
-            var spatialItem = spatialItems_1[_i];
-            spatialNodes.all[spatialItem.node.key] = spatialItem.node;
-            if (!spatialItem.node.full) {
-                spatialNodes.cacheKeys.push(spatialItem.node.key);
-                spatialNodes.cacheNodes[spatialItem.node.key] = spatialItem.node;
-            }
-        }
-        this._requiredSpatialArea[key] = spatialNodes;
-        return spatialNodes.cacheKeys.length === 0;
-    };
-    /**
-     * Get a value indicating if the graph has a tiles required
-     * for a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {boolean} Value indicating if the the tiles required
-     * by a node has been cached.
-     */
-    Graph.prototype.hasTiles = function (key) {
-        var _this = this;
-        if (key in this._cachedNodeTiles) {
-            return true;
-        }
-        if (key in this._cachedSpatialEdges) {
-            return true;
-        }
-        if (!this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Node does not exist in graph (" + key + ").");
-        }
-        var nodeTiles = { cache: [], caching: [] };
-        if (!(key in this._requiredNodeTiles)) {
-            var node = this.getNode(key);
-            nodeTiles.cache = this._graphCalculator
-                .encodeHs(node.latLon, this._tilePrecision, this._tileThreshold)
-                .filter(function (h) {
-                return !(h in _this._cachedTiles);
-            });
-            if (nodeTiles.cache.length > 0) {
-                this._requiredNodeTiles[key] = nodeTiles;
-            }
-        }
-        else {
-            nodeTiles = this._requiredNodeTiles[key];
-        }
-        return nodeTiles.cache.length === 0 && nodeTiles.caching.length === 0;
-    };
-    /**
-     * Get a node.
-     *
-     * @param {string} key - Key of node.
-     * @returns {Node} Retrieved node.
-     */
-    Graph.prototype.getNode = function (key) {
-        var accessed = new Date().getTime();
-        this._updateCachedNodeAccess(key, accessed);
-        this._updateCachedTileAccess(key, accessed);
-        return this._nodes[key];
-    };
-    /**
-     * Get a sequence.
-     *
-     * @param {string} sequenceKey - Key of sequence.
-     * @returns {Node} Retrieved sequence.
-     */
-    Graph.prototype.getSequence = function (sequenceKey) {
-        var sequenceAccess = this._sequences[sequenceKey];
-        sequenceAccess.accessed = new Date().getTime();
-        return sequenceAccess.sequence;
-    };
-    /**
-     * Reset all spatial edges of the graph nodes.
-     */
-    Graph.prototype.resetSpatialEdges = function () {
-        var cachedKeys = Object.keys(this._cachedSpatialEdges);
-        for (var _i = 0, cachedKeys_1 = cachedKeys; _i < cachedKeys_1.length; _i++) {
-            var cachedKey = cachedKeys_1[_i];
-            var node = this._cachedSpatialEdges[cachedKey];
-            node.resetSpatialEdges();
-            delete this._cachedSpatialEdges[cachedKey];
-        }
-    };
-    /**
-     * Reset the complete graph but keep the nodes corresponding
-     * to the supplied keys. All other nodes will be disposed.
-     *
-     * @param {Array<string>} keepKeys - Keys for nodes to keep
-     * in graph after reset.
-     */
-    Graph.prototype.reset = function (keepKeys) {
-        var nodes = [];
-        for (var _i = 0, keepKeys_1 = keepKeys; _i < keepKeys_1.length; _i++) {
-            var key = keepKeys_1[_i];
-            if (!this.hasNode(key)) {
-                throw new Error("Node does not exist " + key);
-            }
-            var node = this.getNode(key);
-            node.resetSequenceEdges();
-            node.resetSpatialEdges();
-            nodes.push(node);
-        }
-        for (var _a = 0, _b = Object.keys(this._cachedNodes); _a < _b.length; _a++) {
-            var cachedKey = _b[_a];
-            if (keepKeys.indexOf(cachedKey) !== -1) {
-                continue;
-            }
-            this._cachedNodes[cachedKey].node.dispose();
-            delete this._cachedNodes[cachedKey];
-        }
-        this._cachedNodeTiles = {};
-        this._cachedSpatialEdges = {};
-        this._cachedTiles = {};
-        this._cachingFill$ = {};
-        this._cachingFull$ = {};
-        this._cachingSequences$ = {};
-        this._cachingSpatialArea$ = {};
-        this._cachingTiles$ = {};
-        this._nodes = {};
-        this._nodeToTile = {};
-        this._preStored = {};
-        for (var _c = 0, nodes_2 = nodes; _c < nodes_2.length; _c++) {
-            var node = nodes_2[_c];
-            this._nodes[node.key] = node;
-            var h = this._graphCalculator.encodeH(node.originalLatLon, this._tilePrecision);
-            this._preStore(h, node);
-        }
-        this._requiredNodeTiles = {};
-        this._requiredSpatialArea = {};
-        this._sequences = {};
-        this._nodeIndexTiles = {};
-        this._nodeIndex.clear();
-    };
-    /**
-     * Set the spatial node filter.
-     *
-     * @param {FilterExpression} filter - Filter expression to be applied
-     * when calculating spatial edges.
-     */
-    Graph.prototype.setFilter = function (filter) {
-        this._filter = this._filterCreator.createFilter(filter);
-    };
-    /**
-     * Uncache the graph according to the graph configuration.
-     *
-     * @description Uncaches unused tiles, unused nodes and
-     * sequences according to the numbers specified in the
-     * graph configuration. Sequences does not have a direct
-     * reference to either tiles or nodes and may be uncached
-     * even if they are related to the nodes that should be kept.
-     *
-     * @param {Array<string>} keepKeys - Keys of nodes to keep in
-     * graph unrelated to last access. Tiles related to those keys
-     * will also be kept in graph.
-     * @param {string} keepSequenceKey - Optional key of sequence
-     * for which the belonging nodes should not be disposed or
-     * removed from the graph. These nodes may still be uncached if
-     * not specified in keep keys param.
-     */
-    Graph.prototype.uncache = function (keepKeys, keepSequenceKey) {
-        var keysInUse = {};
-        this._addNewKeys(keysInUse, this._cachingFull$);
-        this._addNewKeys(keysInUse, this._cachingFill$);
-        this._addNewKeys(keysInUse, this._cachingSpatialArea$);
-        this._addNewKeys(keysInUse, this._requiredNodeTiles);
-        this._addNewKeys(keysInUse, this._requiredSpatialArea);
-        for (var _i = 0, keepKeys_2 = keepKeys; _i < keepKeys_2.length; _i++) {
-            var key = keepKeys_2[_i];
-            if (key in keysInUse) {
-                continue;
-            }
-            keysInUse[key] = true;
-        }
-        var keepHs = {};
-        for (var key in keysInUse) {
-            if (!keysInUse.hasOwnProperty(key)) {
-                continue;
-            }
-            var node = this._nodes[key];
-            var nodeHs = this._graphCalculator.encodeHs(node.latLon);
-            for (var _a = 0, nodeHs_1 = nodeHs; _a < nodeHs_1.length; _a++) {
-                var nodeH = nodeHs_1[_a];
-                if (!(nodeH in keepHs)) {
-                    keepHs[nodeH] = true;
-                }
-            }
-        }
-        var potentialHs = [];
-        for (var h in this._cachedTiles) {
-            if (!this._cachedTiles.hasOwnProperty(h) || h in keepHs) {
-                continue;
-            }
-            potentialHs.push([h, this._cachedTiles[h]]);
-        }
-        var uncacheHs = potentialHs
-            .sort(function (h1, h2) {
-            return h2[1].accessed - h1[1].accessed;
-        })
-            .slice(this._configuration.maxUnusedTiles)
-            .map(function (h) {
-            return h[0];
-        });
-        for (var _b = 0, uncacheHs_1 = uncacheHs; _b < uncacheHs_1.length; _b++) {
-            var uncacheH = uncacheHs_1[_b];
-            this._uncacheTile(uncacheH, keepSequenceKey);
-        }
-        var potentialPreStored = [];
-        var nonCachedPreStored = [];
-        for (var h in this._preStored) {
-            if (!this._preStored.hasOwnProperty(h) || h in this._cachingTiles$) {
-                continue;
-            }
-            var prestoredNodes = this._preStored[h];
-            for (var key in prestoredNodes) {
-                if (!prestoredNodes.hasOwnProperty(key) || key in keysInUse) {
-                    continue;
-                }
-                if (prestoredNodes[key].sequenceKey === keepSequenceKey) {
-                    continue;
-                }
-                if (key in this._cachedNodes) {
-                    potentialPreStored.push([this._cachedNodes[key], h]);
-                }
-                else {
-                    nonCachedPreStored.push([key, h]);
-                }
-            }
-        }
-        var uncachePreStored = potentialPreStored
-            .sort(function (_a, _b) {
-            var na1 = _a[0], h1 = _a[1];
-            var na2 = _b[0], h2 = _b[1];
-            return na2.accessed - na1.accessed;
-        })
-            .slice(this._configuration.maxUnusedPreStoredNodes)
-            .map(function (_a) {
-            var na = _a[0], h = _a[1];
-            return [na.node.key, h];
-        });
-        this._uncachePreStored(nonCachedPreStored);
-        this._uncachePreStored(uncachePreStored);
-        var potentialNodes = [];
-        for (var key in this._cachedNodes) {
-            if (!this._cachedNodes.hasOwnProperty(key) || key in keysInUse) {
-                continue;
-            }
-            potentialNodes.push(this._cachedNodes[key]);
-        }
-        var uncacheNodes = potentialNodes
-            .sort(function (n1, n2) {
-            return n2.accessed - n1.accessed;
-        })
-            .slice(this._configuration.maxUnusedNodes);
-        for (var _c = 0, uncacheNodes_1 = uncacheNodes; _c < uncacheNodes_1.length; _c++) {
-            var nodeAccess = uncacheNodes_1[_c];
-            nodeAccess.node.uncache();
-            var key = nodeAccess.node.key;
-            delete this._cachedNodes[key];
-            if (key in this._cachedNodeTiles) {
-                delete this._cachedNodeTiles[key];
-            }
-            if (key in this._cachedSpatialEdges) {
-                delete this._cachedSpatialEdges[key];
-            }
-        }
-        var potentialSequences = [];
-        for (var sequenceKey in this._sequences) {
-            if (!this._sequences.hasOwnProperty(sequenceKey) ||
-                sequenceKey in this._cachingSequences$ ||
-                sequenceKey === keepSequenceKey) {
-                continue;
-            }
-            potentialSequences.push(this._sequences[sequenceKey]);
-        }
-        var uncacheSequences = potentialSequences
-            .sort(function (s1, s2) {
-            return s2.accessed - s1.accessed;
-        })
-            .slice(this._configuration.maxSequences);
-        for (var _d = 0, uncacheSequences_1 = uncacheSequences; _d < uncacheSequences_1.length; _d++) {
-            var sequenceAccess = uncacheSequences_1[_d];
-            var sequenceKey = sequenceAccess.sequence.key;
-            delete this._sequences[sequenceKey];
-            if (sequenceKey in this._cachedSequenceNodes) {
-                delete this._cachedSequenceNodes[sequenceKey];
-            }
-            sequenceAccess.sequence.dispose();
-        }
-    };
-    Graph.prototype._addNewKeys = function (keys, dict) {
-        for (var key in dict) {
-            if (!dict.hasOwnProperty(key) || !this.hasNode(key)) {
-                continue;
-            }
-            if (!(key in keys)) {
-                keys[key] = true;
-            }
-        }
-    };
-    Graph.prototype._cacheSequence$ = function (sequenceKey) {
-        var _this = this;
-        if (sequenceKey in this._cachingSequences$) {
-            return this._cachingSequences$[sequenceKey];
-        }
-        this._cachingSequences$[sequenceKey] = this._apiV3.sequenceByKey$([sequenceKey]).pipe(operators_1.tap(function (sequenceByKey) {
-            if (!(sequenceKey in _this._sequences)) {
-                _this._sequences[sequenceKey] = {
-                    accessed: new Date().getTime(),
-                    sequence: new Graph_1.Sequence(sequenceByKey[sequenceKey]),
-                };
-            }
-            delete _this._cachingSequences$[sequenceKey];
-        }), operators_1.map(function (sequenceByKey) {
-            return _this;
-        }), operators_1.finalize(function () {
-            if (sequenceKey in _this._cachingSequences$) {
-                delete _this._cachingSequences$[sequenceKey];
-            }
-            _this._changed$.next(_this);
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingSequences$[sequenceKey];
-    };
-    Graph.prototype._cacheTile$ = function (h) {
-        var _this = this;
-        this._cachingTiles$[h] = this._apiV3.imagesByH$([h]).pipe(operators_1.tap(function (imagesByH) {
-            var coreNodes = imagesByH[h];
-            if (h in _this._cachedTiles) {
-                return;
-            }
-            _this._nodeIndexTiles[h] = [];
-            _this._cachedTiles[h] = { accessed: new Date().getTime(), nodes: [] };
-            var hCache = _this._cachedTiles[h].nodes;
-            var preStored = _this._removeFromPreStore(h);
-            for (var index in coreNodes) {
-                if (!coreNodes.hasOwnProperty(index)) {
-                    continue;
-                }
-                var coreNode = coreNodes[index];
-                if (coreNode == null) {
-                    break;
-                }
-                if (coreNode.sequence_key == null) {
-                    console.warn("Sequence missing, discarding node (" + coreNode.key + ")");
-                    continue;
-                }
-                if (preStored != null && coreNode.key in preStored) {
-                    var preStoredNode = preStored[coreNode.key];
-                    delete preStored[coreNode.key];
-                    hCache.push(preStoredNode);
-                    var preStoredNodeIndexItem = {
-                        lat: preStoredNode.latLon.lat,
-                        lon: preStoredNode.latLon.lon,
-                        node: preStoredNode,
-                    };
-                    _this._nodeIndex.insert(preStoredNodeIndexItem);
-                    _this._nodeIndexTiles[h].push(preStoredNodeIndexItem);
-                    _this._nodeToTile[preStoredNode.key] = h;
-                    continue;
-                }
-                var node = new Graph_1.Node(coreNode);
-                hCache.push(node);
-                var nodeIndexItem = {
-                    lat: node.latLon.lat,
-                    lon: node.latLon.lon,
-                    node: node,
-                };
-                _this._nodeIndex.insert(nodeIndexItem);
-                _this._nodeIndexTiles[h].push(nodeIndexItem);
-                _this._nodeToTile[node.key] = h;
-                _this._setNode(node);
-            }
-            delete _this._cachingTiles$[h];
-        }), operators_1.map(function (imagesByH) {
-            return _this;
-        }), operators_1.catchError(function (error) {
-            delete _this._cachingTiles$[h];
-            throw error;
-        }), operators_1.publish(), operators_1.refCount());
-        return this._cachingTiles$[h];
-    };
-    Graph.prototype._makeFull = function (node, fillNode) {
-        if (fillNode.calt == null) {
-            fillNode.calt = this._defaultAlt;
-        }
-        if (fillNode.c_rotation == null) {
-            fillNode.c_rotation = this._graphCalculator.rotationFromCompass(fillNode.ca, fillNode.orientation);
-        }
-        node.makeFull(fillNode);
-    };
-    Graph.prototype._preStore = function (h, node) {
-        if (!(h in this._preStored)) {
-            this._preStored[h] = {};
-        }
-        this._preStored[h][node.key] = node;
-    };
-    Graph.prototype._removeFromPreStore = function (h) {
-        var preStored = null;
-        if (h in this._preStored) {
-            preStored = this._preStored[h];
-            delete this._preStored[h];
-        }
-        return preStored;
-    };
-    Graph.prototype._setNode = function (node) {
-        var key = node.key;
-        if (this.hasNode(key)) {
-            throw new Error_1.GraphMapillaryError("Node already exist (" + key + ").");
-        }
-        this._nodes[key] = node;
-    };
-    Graph.prototype._uncacheTile = function (h, keepSequenceKey) {
-        for (var _i = 0, _a = this._cachedTiles[h].nodes; _i < _a.length; _i++) {
-            var node = _a[_i];
-            var key = node.key;
-            delete this._nodeToTile[key];
-            if (key in this._cachedNodes) {
-                delete this._cachedNodes[key];
-            }
-            if (key in this._cachedNodeTiles) {
-                delete this._cachedNodeTiles[key];
-            }
-            if (key in this._cachedSpatialEdges) {
-                delete this._cachedSpatialEdges[key];
-            }
-            if (node.sequenceKey === keepSequenceKey) {
-                this._preStore(h, node);
-                node.uncache();
-            }
-            else {
-                delete this._nodes[key];
-                if (node.sequenceKey in this._cachedSequenceNodes) {
-                    delete this._cachedSequenceNodes[node.sequenceKey];
-                }
-                node.dispose();
-            }
-        }
-        for (var _b = 0, _c = this._nodeIndexTiles[h]; _b < _c.length; _b++) {
-            var nodeIndexItem = _c[_b];
-            this._nodeIndex.remove(nodeIndexItem);
-        }
-        delete this._nodeIndexTiles[h];
-        delete this._cachedTiles[h];
-    };
-    Graph.prototype._uncachePreStored = function (preStored) {
-        var hs = {};
-        for (var _i = 0, preStored_1 = preStored; _i < preStored_1.length; _i++) {
-            var _a = preStored_1[_i], key = _a[0], h = _a[1];
-            if (key in this._nodes) {
-                delete this._nodes[key];
-            }
-            if (key in this._cachedNodes) {
-                delete this._cachedNodes[key];
-            }
-            var node = this._preStored[h][key];
-            if (node.sequenceKey in this._cachedSequenceNodes) {
-                delete this._cachedSequenceNodes[node.sequenceKey];
-            }
-            delete this._preStored[h][key];
-            node.dispose();
-            hs[h] = true;
-        }
-        for (var h in hs) {
-            if (!hs.hasOwnProperty(h)) {
-                continue;
-            }
-            if (Object.keys(this._preStored[h]).length === 0) {
-                delete this._preStored[h];
-            }
-        }
-    };
-    Graph.prototype._updateCachedTileAccess = function (key, accessed) {
-        if (key in this._nodeToTile) {
-            this._cachedTiles[this._nodeToTile[key]].accessed = accessed;
-        }
-    };
-    Graph.prototype._updateCachedNodeAccess = function (key, accessed) {
-        if (key in this._cachedNodes) {
-            this._cachedNodes[key].accessed = accessed;
-        }
-    };
-    return Graph;
-}());
-exports.Graph = Graph;
-exports.default = Graph;
-
-},{"../Edge":276,"../Error":277,"../Graph":279,"rbush":26,"rxjs":27,"rxjs/operators":225}],392:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var geohash = require("latlon-geohash");
-var THREE = require("three");
-var Error_1 = require("../Error");
-var Geo_1 = require("../Geo");
-/**
- * @class GraphCalculator
- *
- * @classdesc Represents a calculator for graph entities.
- */
-var GraphCalculator = /** @class */ (function () {
-    /**
-     * Create a new graph calculator instance.
-     *
-     * @param {GeoCoords} geoCoords - Geo coords instance.
-     */
-    function GraphCalculator(geoCoords) {
-        this._geoCoords = geoCoords != null ? geoCoords : new Geo_1.GeoCoords();
-    }
-    /**
-     * Encode the geohash tile for geodetic coordinates.
-     *
-     * @param {ILatLon} latlon - Latitude and longitude to encode.
-     * @param {number} precision - Precision of the encoding.
-     *
-     * @returns {string} The geohash tile for the lat, lon and precision.
-     */
-    GraphCalculator.prototype.encodeH = function (latLon, precision) {
-        if (precision === void 0) { precision = 7; }
-        return geohash.encode(latLon.lat, latLon.lon, precision);
-    };
-    /**
-     * Encode the geohash tiles within a threshold from a position
-     * using Manhattan distance.
-     *
-     * @param {ILatLon} latlon - Latitude and longitude to encode.
-     * @param {number} precision - Precision of the encoding.
-     * @param {number} threshold - Threshold of the encoding in meters.
-     *
-     * @returns {string} The geohash tiles reachable within the threshold.
-     */
-    GraphCalculator.prototype.encodeHs = function (latLon, precision, threshold) {
-        if (precision === void 0) { precision = 7; }
-        if (threshold === void 0) { threshold = 20; }
-        var h = geohash.encode(latLon.lat, latLon.lon, precision);
-        var bounds = geohash.bounds(h);
-        var ne = bounds.ne;
-        var sw = bounds.sw;
-        var neighbours = geohash.neighbours(h);
-        var bl = [0, 0, 0];
-        var tr = this._geoCoords.geodeticToEnu(ne.lat, ne.lon, 0, sw.lat, sw.lon, 0);
-        var position = this._geoCoords.geodeticToEnu(latLon.lat, latLon.lon, 0, sw.lat, sw.lon, 0);
-        var left = position[0] - bl[0];
-        var right = tr[0] - position[0];
-        var bottom = position[1] - bl[1];
-        var top = tr[1] - position[1];
-        var l = left < threshold;
-        var r = right < threshold;
-        var b = bottom < threshold;
-        var t = top < threshold;
-        var hs = [h];
-        if (t) {
-            hs.push(neighbours.n);
-        }
-        if (t && l) {
-            hs.push(neighbours.nw);
-        }
-        if (l) {
-            hs.push(neighbours.w);
-        }
-        if (l && b) {
-            hs.push(neighbours.sw);
-        }
-        if (b) {
-            hs.push(neighbours.s);
-        }
-        if (b && r) {
-            hs.push(neighbours.se);
-        }
-        if (r) {
-            hs.push(neighbours.e);
-        }
-        if (r && t) {
-            hs.push(neighbours.ne);
-        }
-        return hs;
-    };
-    /**
-     * Encode the minimum set of geohash tiles containing a bounding box.
-     *
-     * @description The current algorithm does expect the bounding box
-     * to be sufficiently small to be contained in an area with the size
-     * of maximally four tiles. Up to nine adjacent tiles may be returned.
-     * The method currently uses the largest side as the threshold leading to
-     * more tiles being returned than needed in edge cases.
-     *
-     * @param {ILatLon} sw - South west corner of bounding box.
-     * @param {ILatLon} ne - North east corner of bounding box.
-     * @param {number} precision - Precision of the encoding.
-     *
-     * @returns {string} The geohash tiles containing the bounding box.
-     */
-    GraphCalculator.prototype.encodeHsFromBoundingBox = function (sw, ne, precision) {
-        if (precision === void 0) { precision = 7; }
-        if (ne.lat <= sw.lat || ne.lon <= sw.lon) {
-            throw new Error_1.GraphMapillaryError("North east needs to be top right of south west");
-        }
-        var centerLat = (sw.lat + ne.lat) / 2;
-        var centerLon = (sw.lon + ne.lon) / 2;
-        var enu = this._geoCoords.geodeticToEnu(ne.lat, ne.lon, 0, centerLat, centerLon, 0);
-        var threshold = Math.max(enu[0], enu[1]);
-        return this.encodeHs({ lat: centerLat, lon: centerLon }, precision, threshold);
-    };
-    /**
-     * Get the bounding box corners for a circle with radius of a threshold
-     * with center in a geodetic position.
-     *
-     * @param {ILatLon} latlon - Latitude and longitude to encode.
-     * @param {number} threshold - Threshold distance from the position in meters.
-     *
-     * @returns {Array<ILatLon>} The south west and north east corners of the
-     * bounding box.
-     */
-    GraphCalculator.prototype.boundingBoxCorners = function (latLon, threshold) {
-        var bl = this._geoCoords.enuToGeodetic(-threshold, -threshold, 0, latLon.lat, latLon.lon, 0);
-        var tr = this._geoCoords.enuToGeodetic(threshold, threshold, 0, latLon.lat, latLon.lon, 0);
-        return [
-            { lat: bl[0], lon: bl[1] },
-            { lat: tr[0], lon: tr[1] },
-        ];
-    };
-    /**
-     * Convert a compass angle to an angle axis rotation vector.
-     *
-     * @param {number} compassAngle - The compass angle in degrees.
-     * @param {number} orientation - The orientation of the original image.
-     *
-     * @returns {Array<number>} Angle axis rotation vector.
-     */
-    GraphCalculator.prototype.rotationFromCompass = function (compassAngle, orientation) {
-        var x = 0;
-        var y = 0;
-        var z = 0;
-        switch (orientation) {
-            case 1:
-                x = Math.PI / 2;
-                break;
-            case 3:
-                x = -Math.PI / 2;
-                z = Math.PI;
-                break;
-            case 6:
-                y = -Math.PI / 2;
-                z = -Math.PI / 2;
-                break;
-            case 8:
-                y = Math.PI / 2;
-                z = Math.PI / 2;
-                break;
-            default:
-                break;
-        }
-        var rz = new THREE.Matrix4().makeRotationZ(z);
-        var euler = new THREE.Euler(x, y, compassAngle * Math.PI / 180, "XYZ");
-        var re = new THREE.Matrix4().makeRotationFromEuler(euler);
-        var rotation = new THREE.Vector4().setAxisAngleFromRotationMatrix(re.multiply(rz));
-        return rotation.multiplyScalar(rotation.w).toArray().slice(0, 3);
-    };
-    return GraphCalculator;
-}());
-exports.GraphCalculator = GraphCalculator;
-exports.default = GraphCalculator;
-
-},{"../Error":277,"../Geo":278,"latlon-geohash":21,"three":226}],393:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for graph modes.
- * @enum {number}
- * @readonly
- * @description Modes for the retrieval and caching performed
- * by the graph service on the graph.
- */
-var GraphMode;
-(function (GraphMode) {
-    /**
-     * Caching is performed on sequences only and sequence edges are
-     * calculated. Spatial tiles
-     * are not retrieved and spatial edges are not calculated when
-     * caching nodes. Complete sequences are being cached for requested
-     * nodes within the graph.
-     */
-    GraphMode[GraphMode["Sequence"] = 0] = "Sequence";
-    /**
-     * Caching is performed with emphasis on spatial data. Sequence edges
-     * as well as spatial edges are cached. Sequence data
-     * is still requested but complete sequences are not being cached
-     * for requested nodes.
-     *
-     * This is the initial mode of the graph service.
-     */
-    GraphMode[GraphMode["Spatial"] = 1] = "Spatial";
-})(GraphMode = exports.GraphMode || (exports.GraphMode = {}));
-exports.default = GraphMode;
-
-},{}],394:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Graph_1 = require("../Graph");
-/**
- * @class GraphService
- *
- * @classdesc Represents a service for graph operations.
- */
-var GraphService = /** @class */ (function () {
-    /**
-     * Create a new graph service instance.
-     *
-     * @param {Graph} graph - Graph instance to be operated on.
-     */
-    function GraphService(graph, imageLoadingService) {
-        this._graph$ = rxjs_1.concat(rxjs_1.of(graph), graph.changed$).pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._graph$.subscribe(function () { });
-        this._graphMode = Graph_1.GraphMode.Spatial;
-        this._graphModeSubject$ = new rxjs_1.Subject();
-        this._graphMode$ = this._graphModeSubject$.pipe(operators_1.startWith(this._graphMode), operators_1.publishReplay(1), operators_1.refCount());
-        this._graphMode$.subscribe(function () { });
-        this._imageLoadingService = imageLoadingService;
-        this._firstGraphSubjects$ = [];
-        this._initializeCacheSubscriptions = [];
-        this._sequenceSubscriptions = [];
-        this._spatialSubscriptions = [];
-    }
-    Object.defineProperty(GraphService.prototype, "graphMode$", {
-        /**
-         * Get graph mode observable.
-         *
-         * @description Emits the current graph mode.
-         *
-         * @returns {Observable<GraphMode>} Observable
-         * emitting the current graph mode when it changes.
-         */
-        get: function () {
-            return this._graphMode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Cache full nodes in a bounding box.
-     *
-     * @description When called, the full properties of
-     * the node are retrieved. The node cache is not initialized
-     * for any new nodes retrieved and the node assets are not
-     * retrieved, {@link cacheNode$} needs to be called for caching
-     * assets.
-     *
-     * @param {ILatLon} sw - South west corner of bounding box.
-     * @param {ILatLon} ne - North east corner of bounding box.
-     * @return {Observable<Array<Node>>} Observable emitting a single item,
-     * the nodes of the bounding box, when they have all been retrieved.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheBoundingBox$ = function (sw, ne) {
-        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            return graph.cacheBoundingBox$(sw, ne);
-        }));
-    };
-    /**
-     * Cache a node in the graph and retrieve it.
-     *
-     * @description When called, the full properties of
-     * the node are retrieved and the node cache is initialized.
-     * After that the node assets are cached and the node
-     * is emitted to the observable when.
-     * In parallel to caching the node assets, the sequence and
-     * spatial edges of the node are cached. For this, the sequence
-     * of the node and the required tiles and spatial nodes are
-     * retrieved. The sequence and spatial edges may be set before
-     * or after the node is returned.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @return {Observable<Node>} Observable emitting a single item,
-     * the node, when it has been retrieved and its assets are cached.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheNode$ = function (key) {
-        var _this = this;
-        var firstGraphSubject$ = new rxjs_1.Subject();
-        this._firstGraphSubjects$.push(firstGraphSubject$);
-        var firstGraph$ = firstGraphSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
-        var node$ = firstGraph$.pipe(operators_1.map(function (graph) {
-            return graph.getNode(key);
-        }), operators_1.mergeMap(function (node) {
-            return node.assetsCached ?
-                rxjs_1.of(node) :
-                node.cacheAssets$();
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        node$.subscribe(function (node) {
-            _this._imageLoadingService.loadnode$.next(node);
-        }, function (error) {
-            console.error("Failed to cache node (" + key + ")", error);
-        });
-        var initializeCacheSubscription = this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingFull(key) || !graph.hasNode(key)) {
-                return graph.cacheFull$(key);
-            }
-            if (graph.isCachingFill(key) || !graph.getNode(key).full) {
-                return graph.cacheFill$(key);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.tap(function (graph) {
-            if (!graph.hasInitializedCache(key)) {
-                graph.initializeCache(key);
-            }
-        }), operators_1.finalize(function () {
-            if (initializeCacheSubscription == null) {
-                return;
-            }
-            _this._removeFromArray(initializeCacheSubscription, _this._initializeCacheSubscriptions);
-            _this._removeFromArray(firstGraphSubject$, _this._firstGraphSubjects$);
-        }))
-            .subscribe(function (graph) {
-            firstGraphSubject$.next(graph);
-            firstGraphSubject$.complete();
-        }, function (error) {
-            firstGraphSubject$.error(error);
-        });
-        if (!initializeCacheSubscription.closed) {
-            this._initializeCacheSubscriptions.push(initializeCacheSubscription);
-        }
-        var graphSequence$ = firstGraph$.pipe(operators_1.mergeMap(function (graph) {
-            if (graph.isCachingNodeSequence(key) || !graph.hasNodeSequence(key)) {
-                return graph.cacheNodeSequence$(key);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var sequenceSubscription = graphSequence$.pipe(operators_1.tap(function (graph) {
-            if (!graph.getNode(key).sequenceEdges.cached) {
-                graph.cacheSequenceEdges(key);
-            }
-        }), operators_1.finalize(function () {
-            if (sequenceSubscription == null) {
-                return;
-            }
-            _this._removeFromArray(sequenceSubscription, _this._sequenceSubscriptions);
-        }))
-            .subscribe(function (graph) { return; }, function (error) {
-            console.error("Failed to cache sequence edges (" + key + ").", error);
-        });
-        if (!sequenceSubscription.closed) {
-            this._sequenceSubscriptions.push(sequenceSubscription);
-        }
-        if (this._graphMode === Graph_1.GraphMode.Spatial) {
-            var spatialSubscription_1 = firstGraph$.pipe(operators_1.expand(function (graph) {
-                if (graph.hasTiles(key)) {
-                    return rxjs_1.empty();
-                }
-                return rxjs_1.from(graph.cacheTiles$(key)).pipe(operators_1.mergeMap(function (graph$) {
-                    return graph$.pipe(operators_1.mergeMap(function (g) {
-                        if (g.isCachingTiles(key)) {
-                            return rxjs_1.empty();
-                        }
-                        return rxjs_1.of(g);
-                    }), operators_1.catchError(function (error, caught$) {
-                        console.error("Failed to cache tile data (" + key + ").", error);
-                        return rxjs_1.empty();
-                    }));
-                }));
-            }), operators_1.last(), operators_1.mergeMap(function (graph) {
-                if (graph.hasSpatialArea(key)) {
-                    return rxjs_1.of(graph);
-                }
-                return rxjs_1.from(graph.cacheSpatialArea$(key)).pipe(operators_1.mergeMap(function (graph$) {
-                    return graph$.pipe(operators_1.catchError(function (error, caught$) {
-                        console.error("Failed to cache spatial nodes (" + key + ").", error);
-                        return rxjs_1.empty();
-                    }));
-                }));
-            }), operators_1.last(), operators_1.mergeMap(function (graph) {
-                return graph.hasNodeSequence(key) ?
-                    rxjs_1.of(graph) :
-                    graph.cacheNodeSequence$(key);
-            }), operators_1.tap(function (graph) {
-                if (!graph.getNode(key).spatialEdges.cached) {
-                    graph.cacheSpatialEdges(key);
-                }
-            }), operators_1.finalize(function () {
-                if (spatialSubscription_1 == null) {
-                    return;
-                }
-                _this._removeFromArray(spatialSubscription_1, _this._spatialSubscriptions);
-            }))
-                .subscribe(function (graph) { return; }, function (error) {
-                console.error("Failed to cache spatial edges (" + key + ").", error);
-            });
-            if (!spatialSubscription_1.closed) {
-                this._spatialSubscriptions.push(spatialSubscription_1);
-            }
-        }
-        return node$.pipe(operators_1.first(function (node) {
-            return node.assetsCached;
-        }));
-    };
-    /**
-     * Cache a sequence in the graph and retrieve it.
-     *
-     * @param {string} sequenceKey - Sequence key.
-     * @returns {Observable<Sequence>} Observable emitting a single item,
-     * the sequence, when it has been retrieved and its assets are cached.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheSequence$ = function (sequenceKey) {
-        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
-                return graph.cacheSequence$(sequenceKey);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.map(function (graph) {
-            return graph.getSequence(sequenceKey);
-        }));
-    };
-    /**
-     * Cache a sequence and its nodes in the graph and retrieve the sequence.
-     *
-     * @description Caches a sequence and its assets are cached and
-     * retrieves all nodes belonging to the sequence. The node assets
-     * or edges will not be cached.
-     *
-     * @param {string} sequenceKey - Sequence key.
-     * @param {string} referenceNodeKey - Key of node to use as reference
-     * for optimized caching.
-     * @returns {Observable<Sequence>} Observable emitting a single item,
-     * the sequence, when it has been retrieved, its assets are cached and
-     * all nodes belonging to the sequence has been retrieved.
-     * @throws {Error} Propagates any IO node caching errors to the caller.
-     */
-    GraphService.prototype.cacheSequenceNodes$ = function (sequenceKey, referenceNodeKey) {
-        return this._graph$.pipe(operators_1.first(), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingSequence(sequenceKey) || !graph.hasSequence(sequenceKey)) {
-                return graph.cacheSequence$(sequenceKey);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.mergeMap(function (graph) {
-            if (graph.isCachingSequenceNodes(sequenceKey) || !graph.hasSequenceNodes(sequenceKey)) {
-                return graph.cacheSequenceNodes$(sequenceKey, referenceNodeKey);
-            }
-            return rxjs_1.of(graph);
-        }), operators_1.map(function (graph) {
-            return graph.getSequence(sequenceKey);
-        }));
-    };
-    /**
-     * Set a spatial edge filter on the graph.
-     *
-     * @description Resets the spatial edges of all cached nodes.
-     *
-     * @param {FilterExpression} filter - Filter expression to be applied.
-     * @return {Observable<Graph>} Observable emitting a single item,
-     * the graph, when the spatial edges have been reset.
-     */
-    GraphService.prototype.setFilter$ = function (filter) {
-        this._resetSubscriptions(this._spatialSubscriptions);
-        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
-            graph.resetSpatialEdges();
-            graph.setFilter(filter);
-        }), operators_1.map(function (graph) {
-            return undefined;
-        }));
-    };
-    /**
-     * Set the graph mode.
-     *
-     * @description If graph mode is set to spatial, caching
-     * is performed with emphasis on spatial edges. If graph
-     * mode is set to sequence no tile data is requested and
-     * no spatial edges are computed.
-     *
-     * When setting graph mode to sequence all spatial
-     * subscriptions are aborted.
-     *
-     * @param {GraphMode} mode - Graph mode to set.
-     */
-    GraphService.prototype.setGraphMode = function (mode) {
-        if (this._graphMode === mode) {
-            return;
-        }
-        if (mode === Graph_1.GraphMode.Sequence) {
-            this._resetSubscriptions(this._spatialSubscriptions);
-        }
-        this._graphMode = mode;
-        this._graphModeSubject$.next(this._graphMode);
-    };
-    /**
-     * Reset the graph.
-     *
-     * @description Resets the graph but keeps the nodes of the
-     * supplied keys.
-     *
-     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
-     * @return {Observable<Node>} Observable emitting a single item,
-     * the graph, when it has been reset.
-     */
-    GraphService.prototype.reset$ = function (keepKeys) {
-        this._abortSubjects(this._firstGraphSubjects$);
-        this._resetSubscriptions(this._initializeCacheSubscriptions);
-        this._resetSubscriptions(this._sequenceSubscriptions);
-        this._resetSubscriptions(this._spatialSubscriptions);
-        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
-            graph.reset(keepKeys);
-        }), operators_1.map(function (graph) {
-            return undefined;
-        }));
-    };
-    /**
-     * Uncache the graph.
-     *
-     * @description Uncaches the graph by removing tiles, nodes and
-     * sequences. Keeps the nodes of the supplied keys and the tiles
-     * related to those nodes.
-     *
-     * @param {Array<string>} keepKeys - Keys of nodes to keep in graph.
-     * @param {string} keepSequenceKey - Optional key of sequence
-     * for which the belonging nodes should not be disposed or
-     * removed from the graph. These nodes may still be uncached if
-     * not specified in keep keys param.
-     * @return {Observable<Graph>} Observable emitting a single item,
-     * the graph, when the graph has been uncached.
-     */
-    GraphService.prototype.uncache$ = function (keepKeys, keepSequenceKey) {
-        return this._graph$.pipe(operators_1.first(), operators_1.tap(function (graph) {
-            graph.uncache(keepKeys, keepSequenceKey);
-        }), operators_1.map(function (graph) {
-            return undefined;
-        }));
-    };
-    GraphService.prototype._abortSubjects = function (subjects) {
-        for (var _i = 0, _a = subjects.slice(); _i < _a.length; _i++) {
-            var subject = _a[_i];
-            this._removeFromArray(subject, subjects);
-            subject.error(new Error("Cache node request was aborted."));
-        }
-    };
-    GraphService.prototype._removeFromArray = function (object, objects) {
-        var index = objects.indexOf(object);
-        if (index !== -1) {
-            objects.splice(index, 1);
-        }
-    };
-    GraphService.prototype._resetSubscriptions = function (subscriptions) {
-        for (var _i = 0, _a = subscriptions.slice(); _i < _a.length; _i++) {
-            var subscription = _a[_i];
-            this._removeFromArray(subscription, subscriptions);
-            if (!subscription.closed) {
-                subscription.unsubscribe();
-            }
-        }
-    };
-    return GraphService;
-}());
-exports.GraphService = GraphService;
-exports.default = GraphService;
-
-},{"../Graph":279,"rxjs":27,"rxjs/operators":225}],395:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var ImageLoadingService = /** @class */ (function () {
-    function ImageLoadingService() {
-        this._loadnode$ = new rxjs_1.Subject();
-        this._loadstatus$ = this._loadnode$.pipe(operators_1.scan(function (_a, node) {
-            var nodes = _a[0];
-            var changed = false;
-            if (node.loadStatus.total === 0 || node.loadStatus.loaded === node.loadStatus.total) {
-                if (node.key in nodes) {
-                    delete nodes[node.key];
-                    changed = true;
-                }
-            }
-            else {
-                nodes[node.key] = node.loadStatus;
-                changed = true;
-            }
-            return [nodes, changed];
-        }, [{}, false]), operators_1.filter(function (_a) {
-            var nodes = _a[0], changed = _a[1];
-            return changed;
-        }), operators_1.map(function (_a) {
-            var nodes = _a[0];
-            return nodes;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._loadstatus$.subscribe(function () { });
-    }
-    Object.defineProperty(ImageLoadingService.prototype, "loadnode$", {
-        get: function () {
-            return this._loadnode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ImageLoadingService.prototype, "loadstatus$", {
-        get: function () {
-            return this._loadstatus$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return ImageLoadingService;
-}());
-exports.ImageLoadingService = ImageLoadingService;
-
-},{"rxjs":27,"rxjs/operators":225}],396:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Pbf = require("pbf");
-var MeshReader = /** @class */ (function () {
-    function MeshReader() {
-    }
-    MeshReader.read = function (buffer) {
-        var pbf = new Pbf(buffer);
-        return pbf.readFields(MeshReader._readMeshField, { faces: [], vertices: [] });
-    };
-    MeshReader._readMeshField = function (tag, mesh, pbf) {
-        if (tag === 1) {
-            mesh.vertices.push(pbf.readFloat());
-        }
-        else if (tag === 2) {
-            mesh.faces.push(pbf.readVarint());
-        }
-    };
-    return MeshReader;
-}());
-exports.MeshReader = MeshReader;
-
-},{"pbf":24}],397:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-/**
- * @class Node
- *
- * @classdesc Represents a node in the navigation graph.
- *
- * Explanation of position and bearing properties:
- *
- * When images are uploaded they will have GPS information in the EXIF, this is what
- * is called `originalLatLon` {@link Node.originalLatLon}.
- *
- * When Structure from Motions has been run for a node a `computedLatLon` that
- * differs from the `originalLatLon` will be created. It is different because
- * GPS positions are not very exact and SfM aligns the camera positions according
- * to the 3D reconstruction {@link Node.computedLatLon}.
- *
- * At last there exist a `latLon` property which evaluates to
- * the `computedLatLon` from SfM if it exists but falls back
- * to the `originalLatLon` from the EXIF GPS otherwise {@link Node.latLon}.
- *
- * Everything that is done in in the Viewer is based on the SfM positions,
- * i.e. `computedLatLon`. That is why the smooth transitions go in the right
- * direction (nd not in strange directions because of bad GPS).
- *
- * E.g. when placing a marker in the Viewer it is relative to the SfM
- * position i.e. the `computedLatLon`.
- *
- * The same concept as above also applies to the compass angle (or bearing) properties
- * `originalCa`, `computedCa` and `ca`.
- */
-var Node = /** @class */ (function () {
-    /**
-     * Create a new node instance.
-     *
-     * @description Nodes are always created internally by the library.
-     * Nodes can not be added to the library through any API method.
-     *
-     * @param {ICoreNode} coreNode - Raw core node data.
-     * @ignore
-     */
-    function Node(core) {
-        this._cache = null;
-        this._core = core;
-        this._fill = null;
-    }
-    Object.defineProperty(Node.prototype, "assetsCached", {
-        /**
-         * Get assets cached.
-         *
-         * @description The assets that need to be cached for this property
-         * to report true are the following: fill properties, image and mesh.
-         * The library ensures that the current node will always have the
-         * assets cached.
-         *
-         * @returns {boolean} Value indicating whether all assets have been
-         * cached.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._core != null &&
-                this._fill != null &&
-                this._cache != null &&
-                this._cache.image != null &&
-                this._cache.mesh != null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "alt", {
-        /**
-         * Get alt.
-         *
-         * @description If SfM has not been run the computed altitude is
-         * set to a default value of two meters.
-         *
-         * @returns {number} Altitude, in meters.
-         */
-        get: function () {
-            return this._fill.calt;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "ca", {
-        /**
-         * Get ca.
-         *
-         * @description If the SfM computed compass angle exists it will
-         * be returned, otherwise the original EXIF compass angle.
-         *
-         * @returns {number} Compass angle, measured in degrees
-         * clockwise with respect to north.
-         */
-        get: function () {
-            return this._fill.cca != null ? this._fill.cca : this._fill.ca;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "cameraProjection", {
-        /**
-         * Get cameraProjection.
-         *
-         * @description Will be undefined if SfM has not been run.
-         *
-         * @returns {number} The camera projection of the image.
-         */
-        get: function () {
-            return this._fill.camera_projection_type;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "capturedAt", {
-        /**
-         * Get capturedAt.
-         *
-         * @returns {number} Timestamp when the image was captured.
-         */
-        get: function () {
-            return this._fill.captured_at;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "cameraUuid", {
-        /**
-         * Get camera uuid.
-         *
-         * @description Will be undefined if the camera uuid was not
-         * recorded in the image exif information.
-         *
-         * @returns {string} Universally unique id for camera used
-         * when capturing image.
-         */
-        get: function () {
-            return this._fill.captured_with_camera_uuid;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "ck1", {
-        /**
-         * Get ck1.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed radial distortion parameter
-         * k1.
-         */
-        get: function () {
-            return this._fill.ck1;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "ck2", {
-        /**
-         * Get ck2.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed radial distortion parameter
-         * k2.
-         */
-        get: function () {
-            return this._fill.ck2;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "computedCA", {
-        /**
-         * Get computedCA.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed compass angle, measured
-         * in degrees clockwise with respect to north.
-         */
-        get: function () {
-            return this._fill.cca;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "computedLatLon", {
-        /**
-         * Get computedLatLon.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {ILatLon} SfM computed latitude longitude in WGS84 datum,
-         * measured in degrees.
-         */
-        get: function () {
-            return this._core.cl;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "focal", {
-        /**
-         * Get focal.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} SfM computed focal length.
-         */
-        get: function () {
-            return this._fill.cfocal;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "full", {
-        /**
-         * Get full.
-         *
-         * @description The library ensures that the current node will
-         * always be full.
-         *
-         * @returns {boolean} Value indicating whether the node has all
-         * properties filled.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._fill != null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "fullPano", {
-        /**
-         * Get fullPano.
-         *
-         * @returns {boolean} Value indicating whether the node is a complete
-         * 360 panorama.
-         */
-        get: function () {
-            return this._fill.gpano != null &&
-                this._fill.gpano.CroppedAreaLeftPixels === 0 &&
-                this._fill.gpano.CroppedAreaTopPixels === 0 &&
-                this._fill.gpano.CroppedAreaImageWidthPixels === this._fill.gpano.FullPanoWidthPixels &&
-                this._fill.gpano.CroppedAreaImageHeightPixels === this._fill.gpano.FullPanoHeightPixels;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "gpano", {
-        /**
-         * Get gpano.
-         *
-         * @description Will not be set for non panoramic images.
-         *
-         * @returns {IGPano} Panorama information for panorama images.
-         */
-        get: function () {
-            return this._fill.gpano;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "height", {
-        /**
-         * Get height.
-         *
-         * @returns {number} Height of original image, not adjusted
-         * for orientation.
-         */
-        get: function () {
-            return this._fill.height;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "image", {
-        /**
-         * Get image.
-         *
-         * @description The image will always be set on the current node.
-         *
-         * @returns {HTMLImageElement} Cached image element of the node.
-         */
-        get: function () {
-            return this._cache.image;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "image$", {
-        /**
-         * Get image$.
-         *
-         * @returns {Observable<HTMLImageElement>} Observable emitting
-         * the cached image when it is updated.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.image$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "key", {
-        /**
-         * Get key.
-         *
-         * @returns {string} Unique key of the node.
-         */
-        get: function () {
-            return this._core.key;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "latLon", {
-        /**
-         * Get latLon.
-         *
-         * @description If the SfM computed latitude longitude exist
-         * it will be returned, otherwise the original EXIF latitude
-         * longitude.
-         *
-         * @returns {ILatLon} Latitude longitude in WGS84 datum,
-         * measured in degrees.
-         */
-        get: function () {
-            return this._core.cl != null ? this._core.cl : this._core.l;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "loadStatus", {
-        /**
-         * Get loadStatus.
-         *
-         * @returns {ILoadStatus} Value indicating the load status
-         * of the mesh and image.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.loadStatus;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "merged", {
-        /**
-         * Get merged.
-         *
-         * @returns {boolean} Value indicating whether SfM has been
-         * run on the node and the node has been merged into a
-         * connected component.
-         */
-        get: function () {
-            return this._fill != null &&
-                this._fill.merge_version != null &&
-                this._fill.merge_version > 0;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "mergeCC", {
-        /**
-         * Get mergeCC.
-         *
-         * @description Will not be set if SfM has not yet been run on
-         * node.
-         *
-         * @returns {number} SfM connected component key to which
-         * image belongs.
-         */
-        get: function () {
-            return this._fill.merge_cc;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "mergeVersion", {
-        /**
-         * Get mergeVersion.
-         *
-         * @returns {number} Version for which SfM was run and image was merged.
-         */
-        get: function () {
-            return this._fill.merge_version;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "mesh", {
-        /**
-         * Get mesh.
-         *
-         * @description The mesh will always be set on the current node.
-         *
-         * @returns {IMesh} SfM triangulated mesh of reconstructed
-         * atomic 3D points.
-         */
-        get: function () {
-            return this._cache.mesh;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "organizationKey", {
-        /**
-         * Get organizationKey.
-         *
-         * @returns {string} Unique key of the organization to which
-         * the node belongs. If the node does not belong to an
-         * organization the organization key will be undefined.
-         */
-        get: function () {
-            return this._fill.organization_key;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "orientation", {
-        /**
-         * Get orientation.
-         *
-         * @returns {number} EXIF orientation of original image.
-         */
-        get: function () {
-            return this._fill.orientation;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "originalCA", {
-        /**
-         * Get originalCA.
-         *
-         * @returns {number} Original EXIF compass angle, measured in
-         * degrees.
-         */
-        get: function () {
-            return this._fill.ca;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "originalLatLon", {
-        /**
-         * Get originalLatLon.
-         *
-         * @returns {ILatLon} Original EXIF latitude longitude in
-         * WGS84 datum, measured in degrees.
-         */
-        get: function () {
-            return this._core.l;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "pano", {
-        /**
-         * Get pano.
-         *
-         * @returns {boolean} Value indicating whether the node is a panorama.
-         * It could be a cropped or full panorama.
-         */
-        get: function () {
-            return this._fill.gpano != null &&
-                this._fill.gpano.FullPanoWidthPixels != null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "private", {
-        /**
-         * Get private.
-         *
-         * @returns {boolean} Value specifying if image is accessible to
-         * organization members only or to everyone.
-         */
-        get: function () {
-            return this._fill.private;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "projectKey", {
-        /**
-         * Get projectKey.
-         *
-         * @returns {string} Unique key of the project to which
-         * the node belongs. If the node does not belong to a
-         * project the project key will be undefined.
-         *
-         * @deprecated This property will be deprecated in favor
-         * of the organization key and private properties.
-         */
-        get: function () {
-            return this._fill.project != null ?
-                this._fill.project.key :
-                null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "rotation", {
-        /**
-         * Get rotation.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {Array<number>} Rotation vector in angle axis representation.
-         */
-        get: function () {
-            return this._fill.c_rotation;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "scale", {
-        /**
-         * Get scale.
-         *
-         * @description Will not be set if SfM has not been run.
-         *
-         * @returns {number} Scale of atomic reconstruction.
-         */
-        get: function () {
-            return this._fill.atomic_scale;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceKey", {
-        /**
-         * Get sequenceKey.
-         *
-         * @returns {string} Unique key of the sequence to which
-         * the node belongs.
-         */
-        get: function () {
-            return this._core.sequence_key;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceEdges", {
-        /**
-         * Get sequenceEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * sequence edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.sequenceEdges;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "sequenceEdges$", {
-        /**
-         * Get sequenceEdges$.
-         *
-         * @description Internal observable, should not be used as an API.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the sequence edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.sequenceEdges$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "spatialEdges", {
-        /**
-         * Get spatialEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * spatial edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.spatialEdges;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "spatialEdges$", {
-        /**
-         * Get spatialEdges$.
-         *
-         * @description Internal observable, should not be used as an API.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the spatial edges.
-         *
-         * @ignore
-         */
-        get: function () {
-            return this._cache.spatialEdges$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "userKey", {
-        /**
-         * Get userKey.
-         *
-         * @returns {string} Unique key of the user who uploaded
-         * the image.
-         */
-        get: function () {
-            return this._fill.user.key;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "username", {
-        /**
-         * Get username.
-         *
-         * @returns {string} Username of the user who uploaded
-         * the image.
-         */
-        get: function () {
-            return this._fill.user.username;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Node.prototype, "width", {
-        /**
-         * Get width.
-         *
-         * @returns {number} Width of original image, not
-         * adjusted for orientation.
-         */
-        get: function () {
-            return this._fill.width;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Cache the image and mesh assets.
-     *
-     * @description The assets are always cached internally by the
-     * library prior to setting a node as the current node.
-     *
-     * @returns {Observable<Node>} Observable emitting this node whenever the
-     * load status has changed and when the mesh or image has been fully loaded.
-     *
-     * @ignore
-     */
-    Node.prototype.cacheAssets$ = function () {
-        var _this = this;
-        return this._cache.cacheAssets$(this.key, this.pano, this.merged).pipe(operators_1.map(function () {
-            return _this;
-        }));
-    };
-    /**
-     * Cache the image asset.
-     *
-     * @description Use for caching a differently sized image than
-     * the one currently held by the node.
-     *
-     * @returns {Observable<Node>} Observable emitting this node whenever the
-     * load status has changed and when the mesh or image has been fully loaded.
-     *
-     * @ignore
-     */
-    Node.prototype.cacheImage$ = function (imageSize) {
-        var _this = this;
-        return this._cache.cacheImage$(this.key, imageSize).pipe(operators_1.map(function () {
-            return _this;
-        }));
-    };
-    /**
-     * Cache the sequence edges.
-     *
-     * @description The sequence edges are cached asynchronously
-     * internally by the library.
-     *
-     * @param {Array<IEdge>} edges - Sequence edges to cache.
-     * @ignore
-     */
-    Node.prototype.cacheSequenceEdges = function (edges) {
-        this._cache.cacheSequenceEdges(edges);
-    };
-    /**
-     * Cache the spatial edges.
-     *
-     * @description The spatial edges are cached asynchronously
-     * internally by the library.
-     *
-     * @param {Array<IEdge>} edges - Spatial edges to cache.
-     * @ignore
-     */
-    Node.prototype.cacheSpatialEdges = function (edges) {
-        this._cache.cacheSpatialEdges(edges);
-    };
-    /**
-     * Dispose the node.
-     *
-     * @description Disposes all cached assets.
-     * @ignore
-     */
-    Node.prototype.dispose = function () {
-        if (this._cache != null) {
-            this._cache.dispose();
-            this._cache = null;
-        }
-        this._core = null;
-        this._fill = null;
-    };
-    /**
-     * Initialize the node cache.
-     *
-     * @description The node cache is initialized internally by
-     * the library.
-     *
-     * @param {NodeCache} cache - The node cache to set as cache.
-     * @ignore
-     */
-    Node.prototype.initializeCache = function (cache) {
-        if (this._cache != null) {
-            throw new Error("Node cache already initialized (" + this.key + ").");
-        }
-        this._cache = cache;
-    };
-    /**
-     * Fill the node with all properties.
-     *
-     * @description The node is filled internally by
-     * the library.
-     *
-     * @param {IFillNode} fill - The fill node struct.
-     * @ignore
-     */
-    Node.prototype.makeFull = function (fill) {
-        if (fill == null) {
-            throw new Error("Fill can not be null.");
-        }
-        this._fill = fill;
-    };
-    /**
-     * Reset the sequence edges.
-     *
-     * @ignore
-     */
-    Node.prototype.resetSequenceEdges = function () {
-        this._cache.resetSequenceEdges();
-    };
-    /**
-     * Reset the spatial edges.
-     *
-     * @ignore
-     */
-    Node.prototype.resetSpatialEdges = function () {
-        this._cache.resetSpatialEdges();
-    };
-    /**
-     * Clears the image and mesh assets, aborts
-     * any outstanding requests and resets edges.
-     *
-     * @ignore
-     */
-    Node.prototype.uncache = function () {
-        if (this._cache == null) {
-            return;
-        }
-        this._cache.dispose();
-        this._cache = null;
-    };
-    return Node;
-}());
-exports.Node = Node;
-exports.default = Node;
-
-},{"rxjs/operators":225}],398:[function(require,module,exports){
-(function (Buffer){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Graph_1 = require("../Graph");
-var Utils_1 = require("../Utils");
-/**
- * @class NodeCache
- *
- * @classdesc Represents the cached properties of a node.
- */
-var NodeCache = /** @class */ (function () {
-    /**
-     * Create a new node cache instance.
-     */
-    function NodeCache() {
-        this._disposed = false;
-        this._image = null;
-        this._loadStatus = { loaded: 0, total: 0 };
-        this._mesh = null;
-        this._sequenceEdges = { cached: false, edges: [] };
-        this._spatialEdges = { cached: false, edges: [] };
-        this._imageChanged$ = new rxjs_1.Subject();
-        this._image$ = this._imageChanged$.pipe(operators_1.startWith(null), operators_1.publishReplay(1), operators_1.refCount());
-        this._iamgeSubscription = this._image$.subscribe();
-        this._sequenceEdgesChanged$ = new rxjs_1.Subject();
-        this._sequenceEdges$ = this._sequenceEdgesChanged$.pipe(operators_1.startWith(this._sequenceEdges), operators_1.publishReplay(1), operators_1.refCount());
-        this._sequenceEdgesSubscription = this._sequenceEdges$.subscribe(function () { });
-        this._spatialEdgesChanged$ = new rxjs_1.Subject();
-        this._spatialEdges$ = this._spatialEdgesChanged$.pipe(operators_1.startWith(this._spatialEdges), operators_1.publishReplay(1), operators_1.refCount());
-        this._spatialEdgesSubscription = this._spatialEdges$.subscribe(function () { });
-        this._cachingAssets$ = null;
-    }
-    Object.defineProperty(NodeCache.prototype, "image", {
-        /**
-         * Get image.
-         *
-         * @description Will not be set when assets have not been cached
-         * or when the object has been disposed.
-         *
-         * @returns {HTMLImageElement} Cached image element of the node.
-         */
-        get: function () {
-            return this._image;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "image$", {
-        /**
-         * Get image$.
-         *
-         * @returns {Observable<HTMLImageElement>} Observable emitting
-         * the cached image when it is updated.
-         */
-        get: function () {
-            return this._image$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "loadStatus", {
-        /**
-         * Get loadStatus.
-         *
-         * @returns {ILoadStatus} Value indicating the load status
-         * of the mesh and image.
-         */
-        get: function () {
-            return this._loadStatus;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "mesh", {
-        /**
-         * Get mesh.
-         *
-         * @description Will not be set when assets have not been cached
-         * or when the object has been disposed.
-         *
-         * @returns {IMesh} SfM triangulated mesh of reconstructed
-         * atomic 3D points.
-         */
-        get: function () {
-            return this._mesh;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "sequenceEdges", {
-        /**
-         * Get sequenceEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * sequence edges.
-         */
-        get: function () {
-            return this._sequenceEdges;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "sequenceEdges$", {
-        /**
-         * Get sequenceEdges$.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the sequence edges.
-         */
-        get: function () {
-            return this._sequenceEdges$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "spatialEdges", {
-        /**
-         * Get spatialEdges.
-         *
-         * @returns {IEdgeStatus} Value describing the status of the
-         * spatial edges.
-         */
-        get: function () {
-            return this._spatialEdges;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(NodeCache.prototype, "spatialEdges$", {
-        /**
-         * Get spatialEdges$.
-         *
-         * @returns {Observable<IEdgeStatus>} Observable emitting
-         * values describing the status of the spatial edges.
-         */
-        get: function () {
-            return this._spatialEdges$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Cache the image and mesh assets.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {boolean} pano - Value indicating whether node is a panorama.
-     * @param {boolean} merged - Value indicating whether node is merged.
-     * @returns {Observable<NodeCache>} Observable emitting this node
-     * cache whenever the load status has changed and when the mesh or image
-     * has been fully loaded.
-     */
-    NodeCache.prototype.cacheAssets$ = function (key, pano, merged) {
-        var _this = this;
-        if (this._cachingAssets$ != null) {
-            return this._cachingAssets$;
-        }
-        var imageSize = pano ?
-            Utils_1.Settings.basePanoramaSize :
-            Utils_1.Settings.baseImageSize;
-        this._cachingAssets$ = rxjs_1.combineLatest(this._cacheImage$(key, imageSize), this._cacheMesh$(key, merged)).pipe(operators_1.map(function (_a) {
-            var imageStatus = _a[0], meshStatus = _a[1];
-            _this._loadStatus.loaded = 0;
-            _this._loadStatus.total = 0;
-            if (meshStatus) {
-                _this._mesh = meshStatus.object;
-                _this._loadStatus.loaded += meshStatus.loaded.loaded;
-                _this._loadStatus.total += meshStatus.loaded.total;
-            }
-            if (imageStatus) {
-                _this._image = imageStatus.object;
-                _this._loadStatus.loaded += imageStatus.loaded.loaded;
-                _this._loadStatus.total += imageStatus.loaded.total;
-            }
-            return _this;
-        }), operators_1.finalize(function () {
-            _this._cachingAssets$ = null;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._cachingAssets$.pipe(operators_1.first(function (nodeCache) {
-            return !!nodeCache._image;
-        }))
-            .subscribe(function (nodeCache) {
-            _this._imageChanged$.next(_this._image);
-        }, function (error) { });
-        return this._cachingAssets$;
-    };
-    /**
-     * Cache an image with a higher resolution than the current one.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {ImageSize} imageSize - The size to cache.
-     * @returns {Observable<NodeCache>} Observable emitting a single item,
-     * the node cache, when the image has been cached. If supplied image
-     * size is not larger than the current image size the node cache is
-     * returned immediately.
-     */
-    NodeCache.prototype.cacheImage$ = function (key, imageSize) {
-        var _this = this;
-        if (this._image != null && imageSize <= Math.max(this._image.width, this._image.height)) {
-            return rxjs_1.of(this);
-        }
-        var cacheImage$ = this._cacheImage$(key, imageSize).pipe(operators_1.first(function (status) {
-            return status.object != null;
-        }), operators_1.tap(function (status) {
-            _this._disposeImage();
-            _this._image = status.object;
-        }), operators_1.map(function (imageStatus) {
-            return _this;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        cacheImage$
-            .subscribe(function (nodeCache) {
-            _this._imageChanged$.next(_this._image);
-        }, function (error) { });
-        return cacheImage$;
-    };
-    /**
-     * Cache the sequence edges.
-     *
-     * @param {Array<IEdge>} edges - Sequence edges to cache.
-     */
-    NodeCache.prototype.cacheSequenceEdges = function (edges) {
-        this._sequenceEdges = { cached: true, edges: edges };
-        this._sequenceEdgesChanged$.next(this._sequenceEdges);
-    };
-    /**
-     * Cache the spatial edges.
-     *
-     * @param {Array<IEdge>} edges - Spatial edges to cache.
-     */
-    NodeCache.prototype.cacheSpatialEdges = function (edges) {
-        this._spatialEdges = { cached: true, edges: edges };
-        this._spatialEdgesChanged$.next(this._spatialEdges);
-    };
-    /**
-     * Dispose the node cache.
-     *
-     * @description Disposes all cached assets and unsubscribes to
-     * all streams.
-     */
-    NodeCache.prototype.dispose = function () {
-        this._iamgeSubscription.unsubscribe();
-        this._sequenceEdgesSubscription.unsubscribe();
-        this._spatialEdgesSubscription.unsubscribe();
-        this._disposeImage();
-        this._mesh = null;
-        this._loadStatus.loaded = 0;
-        this._loadStatus.total = 0;
-        this._sequenceEdges = { cached: false, edges: [] };
-        this._spatialEdges = { cached: false, edges: [] };
-        this._imageChanged$.next(null);
-        this._sequenceEdgesChanged$.next(this._sequenceEdges);
-        this._spatialEdgesChanged$.next(this._spatialEdges);
-        this._disposed = true;
-        if (this._imageRequest != null) {
-            this._imageRequest.abort();
-        }
-        if (this._meshRequest != null) {
-            this._meshRequest.abort();
-        }
-    };
-    /**
-     * Reset the sequence edges.
-     */
-    NodeCache.prototype.resetSequenceEdges = function () {
-        this._sequenceEdges = { cached: false, edges: [] };
-        this._sequenceEdgesChanged$.next(this._sequenceEdges);
-    };
-    /**
-     * Reset the spatial edges.
-     */
-    NodeCache.prototype.resetSpatialEdges = function () {
-        this._spatialEdges = { cached: false, edges: [] };
-        this._spatialEdgesChanged$.next(this._spatialEdges);
-    };
-    /**
-     * Cache the image.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {boolean} pano - Value indicating whether node is a panorama.
-     * @returns {Observable<ILoadStatusObject<HTMLImageElement>>} Observable
-     * emitting a load status object every time the load status changes
-     * and completes when the image is fully loaded.
-     */
-    NodeCache.prototype._cacheImage$ = function (key, imageSize) {
-        var _this = this;
-        return rxjs_1.Observable.create(function (subscriber) {
-            var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", Utils_1.Urls.thumbnail(key, imageSize, Utils_1.Urls.origin), true);
-            xmlHTTP.responseType = "arraybuffer";
-            xmlHTTP.timeout = 15000;
-            xmlHTTP.onload = function (pe) {
-                if (xmlHTTP.status !== 200) {
-                    _this._imageRequest = null;
-                    subscriber.error(new Error("Failed to fetch image (" + key + "). Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText));
-                    return;
-                }
-                var image = new Image();
-                image.crossOrigin = "Anonymous";
-                image.onload = function (e) {
-                    _this._imageRequest = null;
-                    if (_this._disposed) {
-                        window.URL.revokeObjectURL(image.src);
-                        subscriber.error(new Error("Image load was aborted (" + key + ")"));
-                        return;
-                    }
-                    subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: image });
-                    subscriber.complete();
-                };
-                image.onerror = function (error) {
-                    _this._imageRequest = null;
-                    subscriber.error(new Error("Failed to load image (" + key + ")"));
-                };
-                var blob = new Blob([xmlHTTP.response]);
-                image.src = window.URL.createObjectURL(blob);
-            };
-            xmlHTTP.onprogress = function (pe) {
-                if (_this._disposed) {
-                    return;
-                }
-                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });
-            };
-            xmlHTTP.onerror = function (error) {
-                _this._imageRequest = null;
-                subscriber.error(new Error("Failed to fetch image (" + key + ")"));
-            };
-            xmlHTTP.ontimeout = function (e) {
-                _this._imageRequest = null;
-                subscriber.error(new Error("Image request timed out (" + key + ")"));
-            };
-            xmlHTTP.onabort = function (event) {
-                _this._imageRequest = null;
-                subscriber.error(new Error("Image request was aborted (" + key + ")"));
-            };
-            _this._imageRequest = xmlHTTP;
-            xmlHTTP.send(null);
-        });
-    };
-    /**
-     * Cache the mesh.
-     *
-     * @param {string} key - Key of the node to cache.
-     * @param {boolean} merged - Value indicating whether node is merged.
-     * @returns {Observable<ILoadStatusObject<IMesh>>} Observable emitting
-     * a load status object every time the load status changes and completes
-     * when the mesh is fully loaded.
-     */
-    NodeCache.prototype._cacheMesh$ = function (key, merged) {
-        var _this = this;
-        return rxjs_1.Observable.create(function (subscriber) {
-            if (!merged) {
-                subscriber.next(_this._createEmptyMeshLoadStatus());
-                subscriber.complete();
-                return;
-            }
-            var xmlHTTP = new XMLHttpRequest();
-            xmlHTTP.open("GET", Utils_1.Urls.protoMesh(key), true);
-            xmlHTTP.responseType = "arraybuffer";
-            xmlHTTP.timeout = 15000;
-            xmlHTTP.onload = function (pe) {
-                _this._meshRequest = null;
-                if (_this._disposed) {
-                    return;
-                }
-                var mesh = xmlHTTP.status === 200 ?
-                    Graph_1.MeshReader.read(new Buffer(xmlHTTP.response)) :
-                    { faces: [], vertices: [] };
-                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: mesh });
-                subscriber.complete();
-            };
-            xmlHTTP.onprogress = function (pe) {
-                if (_this._disposed) {
-                    return;
-                }
-                subscriber.next({ loaded: { loaded: pe.loaded, total: pe.total }, object: null });
-            };
-            xmlHTTP.onerror = function (e) {
-                _this._meshRequest = null;
-                console.error("Failed to cache mesh (" + key + ")");
-                subscriber.next(_this._createEmptyMeshLoadStatus());
-                subscriber.complete();
-            };
-            xmlHTTP.ontimeout = function (e) {
-                _this._meshRequest = null;
-                console.error("Mesh request timed out (" + key + ")");
-                subscriber.next(_this._createEmptyMeshLoadStatus());
-                subscriber.complete();
-            };
-            xmlHTTP.onabort = function (e) {
-                _this._meshRequest = null;
-                subscriber.error(new Error("Mesh request was aborted (" + key + ")"));
-            };
-            _this._meshRequest = xmlHTTP;
-            xmlHTTP.send(null);
-        });
-    };
-    /**
-     * Create a load status object with an empty mesh.
-     *
-     * @returns {ILoadStatusObject<IMesh>} Load status object
-     * with empty mesh.
-     */
-    NodeCache.prototype._createEmptyMeshLoadStatus = function () {
-        return {
-            loaded: { loaded: 0, total: 0 },
-            object: { faces: [], vertices: [] },
-        };
-    };
-    NodeCache.prototype._disposeImage = function () {
-        if (this._image != null) {
-            window.URL.revokeObjectURL(this._image.src);
-        }
-        this._image = null;
-    };
-    return NodeCache;
-}());
-exports.NodeCache = NodeCache;
-exports.default = NodeCache;
-
-}).call(this,require("buffer").Buffer)
-
-},{"../Graph":279,"../Utils":285,"buffer":7,"rxjs":27,"rxjs/operators":225}],399:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * @class Sequence
- *
- * @classdesc Represents a sequence of ordered nodes.
- */
-var Sequence = /** @class */ (function () {
-    /**
-     * Create a new sequene instance.
-     *
-     * @param {ISequence} sequence - Raw sequence data.
-     */
-    function Sequence(sequence) {
-        this._key = sequence.key;
-        this._keys = sequence.keys;
-    }
-    Object.defineProperty(Sequence.prototype, "key", {
-        /**
-         * Get key.
-         *
-         * @returns {string} Unique sequence key.
-         */
-        get: function () {
-            return this._key;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Sequence.prototype, "keys", {
-        /**
-         * Get keys.
-         *
-         * @returns {Array<string>} Array of ordered node keys in the sequence.
-         */
-        get: function () {
-            return this._keys;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Dispose the sequence.
-     *
-     * @description Disposes all cached assets.
-     */
-    Sequence.prototype.dispose = function () {
-        this._key = null;
-        this._keys = null;
-    };
-    /**
-     * Find the next node key in the sequence with respect to
-     * the provided node key.
-     *
-     * @param {string} key - Reference node key.
-     * @returns {string} Next key in sequence if it exists, null otherwise.
-     */
-    Sequence.prototype.findNextKey = function (key) {
-        var i = this._keys.indexOf(key);
-        if ((i + 1) >= this._keys.length || i === -1) {
-            return null;
-        }
-        else {
-            return this._keys[i + 1];
-        }
-    };
-    /**
-     * Find the previous node key in the sequence with respect to
-     * the provided node key.
-     *
-     * @param {string} key - Reference node key.
-     * @returns {string} Previous key in sequence if it exists, null otherwise.
-     */
-    Sequence.prototype.findPrevKey = function (key) {
-        var i = this._keys.indexOf(key);
-        if (i === 0 || i === -1) {
-            return null;
-        }
-        else {
-            return this._keys[i - 1];
-        }
-    };
-    return Sequence;
-}());
-exports.Sequence = Sequence;
-exports.default = Sequence;
-
-},{}],400:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Edge_1 = require("../../Edge");
-var Error_1 = require("../../Error");
-var Geo_1 = require("../../Geo");
-/**
- * @class EdgeCalculator
- *
- * @classdesc Represents a class for calculating node edges.
- */
-var EdgeCalculator = /** @class */ (function () {
-    /**
-     * Create a new edge calculator instance.
-     *
-     * @param {EdgeCalculatorSettings} settings - Settings struct.
-     * @param {EdgeCalculatorDirections} directions - Directions struct.
-     * @param {EdgeCalculatorCoefficients} coefficients - Coefficients struct.
-     */
-    function EdgeCalculator(settings, directions, coefficients) {
-        this._spatial = new Geo_1.Spatial();
-        this._geoCoords = new Geo_1.GeoCoords();
-        this._settings = settings != null ? settings : new Edge_1.EdgeCalculatorSettings();
-        this._directions = directions != null ? directions : new Edge_1.EdgeCalculatorDirections();
-        this._coefficients = coefficients != null ? coefficients : new Edge_1.EdgeCalculatorCoefficients();
-    }
-    /**
-     * Returns the potential edges to destination nodes for a set
-     * of nodes with respect to a source node.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<Node>} nodes - Potential destination nodes.
-     * @param {Array<string>} fallbackKeys - Keys for destination nodes that should
-     * be returned even if they do not meet the criteria for a potential edge.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.getPotentialEdges = function (node, potentialNodes, fallbackKeys) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (!node.merged) {
-            return [];
-        }
-        var currentDirection = this._spatial.viewingDirection(node.rotation);
-        var currentVerticalDirection = this._spatial.angleToPlane(currentDirection.toArray(), [0, 0, 1]);
-        var potentialEdges = [];
-        for (var _i = 0, potentialNodes_1 = potentialNodes; _i < potentialNodes_1.length; _i++) {
-            var potential = potentialNodes_1[_i];
-            if (!potential.merged ||
-                potential.key === node.key) {
-                continue;
-            }
-            var enu = this._geoCoords.geodeticToEnu(potential.latLon.lat, potential.latLon.lon, potential.alt, node.latLon.lat, node.latLon.lon, node.alt);
-            var motion = new THREE.Vector3(enu[0], enu[1], enu[2]);
-            var distance = motion.length();
-            if (distance > this._settings.maxDistance &&
-                fallbackKeys.indexOf(potential.key) < 0) {
-                continue;
-            }
-            var motionChange = this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, motion.x, motion.y);
-            var verticalMotion = this._spatial.angleToPlane(motion.toArray(), [0, 0, 1]);
-            var direction = this._spatial.viewingDirection(potential.rotation);
-            var directionChange = this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, direction.x, direction.y);
-            var verticalDirection = this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-            var verticalDirectionChange = verticalDirection - currentVerticalDirection;
-            var rotation = this._spatial.relativeRotationAngle(node.rotation, potential.rotation);
-            var worldMotionAzimuth = this._spatial.angleBetweenVector2(1, 0, motion.x, motion.y);
-            var sameSequence = potential.sequenceKey != null &&
-                node.sequenceKey != null &&
-                potential.sequenceKey === node.sequenceKey;
-            var sameMergeCC = (potential.mergeCC == null && node.mergeCC == null) ||
-                potential.mergeCC === node.mergeCC;
-            var sameUser = potential.userKey === node.userKey;
-            var potentialEdge = {
-                capturedAt: potential.capturedAt,
-                croppedPano: potential.pano && !potential.fullPano,
-                directionChange: directionChange,
-                distance: distance,
-                fullPano: potential.fullPano,
-                key: potential.key,
-                motionChange: motionChange,
-                rotation: rotation,
-                sameMergeCC: sameMergeCC,
-                sameSequence: sameSequence,
-                sameUser: sameUser,
-                sequenceKey: potential.sequenceKey,
-                verticalDirectionChange: verticalDirectionChange,
-                verticalMotion: verticalMotion,
-                worldMotionAzimuth: worldMotionAzimuth,
-            };
-            potentialEdges.push(potentialEdge);
-        }
-        return potentialEdges;
-    };
-    /**
-     * Computes the sequence edges for a node.
-     *
-     * @param {Node} node - Source node.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeSequenceEdges = function (node, sequence) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (node.sequenceKey !== sequence.key) {
-            throw new Error_1.ArgumentMapillaryError("Node and sequence does not correspond.");
-        }
-        var edges = [];
-        var nextKey = sequence.findNextKey(node.key);
-        if (nextKey != null) {
-            edges.push({
-                data: {
-                    direction: Edge_1.EdgeDirection.Next,
-                    worldMotionAzimuth: Number.NaN,
-                },
-                from: node.key,
-                to: nextKey,
-            });
-        }
-        var prevKey = sequence.findPrevKey(node.key);
-        if (prevKey != null) {
-            edges.push({
-                data: {
-                    direction: Edge_1.EdgeDirection.Prev,
-                    worldMotionAzimuth: Number.NaN,
-                },
-                from: node.key,
-                to: prevKey,
-            });
-        }
-        return edges;
-    };
-    /**
-     * Computes the similar edges for a node.
-     *
-     * @description Similar edges for perspective images and cropped panoramas
-     * look roughly in the same direction and are positioned closed to the node.
-     * Similar edges for full panoramas only target other full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeSimilarEdges = function (node, potentialEdges) {
-        var _this = this;
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        var nodeFullPano = node.fullPano;
-        var sequenceGroups = {};
-        for (var _i = 0, potentialEdges_1 = potentialEdges; _i < potentialEdges_1.length; _i++) {
-            var potentialEdge = potentialEdges_1[_i];
-            if (potentialEdge.sequenceKey == null) {
-                continue;
-            }
-            if (potentialEdge.sameSequence) {
-                continue;
-            }
-            if (nodeFullPano) {
-                if (!potentialEdge.fullPano) {
-                    continue;
-                }
-            }
-            else {
-                if (!potentialEdge.fullPano &&
-                    Math.abs(potentialEdge.directionChange) > this._settings.similarMaxDirectionChange) {
-                    continue;
-                }
-            }
-            if (potentialEdge.distance > this._settings.similarMaxDistance) {
-                continue;
-            }
-            if (potentialEdge.sameUser &&
-                Math.abs(potentialEdge.capturedAt - node.capturedAt) <
-                    this._settings.similarMinTimeDifference) {
-                continue;
-            }
-            if (sequenceGroups[potentialEdge.sequenceKey] == null) {
-                sequenceGroups[potentialEdge.sequenceKey] = [];
-            }
-            sequenceGroups[potentialEdge.sequenceKey].push(potentialEdge);
-        }
-        var similarEdges = [];
-        var calculateScore = node.fullPano ?
-            function (potentialEdge) {
-                return potentialEdge.distance;
-            } :
-            function (potentialEdge) {
-                return _this._coefficients.similarDistance * potentialEdge.distance +
-                    _this._coefficients.similarRotation * potentialEdge.rotation;
-            };
-        for (var sequenceKey in sequenceGroups) {
-            if (!sequenceGroups.hasOwnProperty(sequenceKey)) {
-                continue;
-            }
-            var lowestScore = Number.MAX_VALUE;
-            var similarEdge = null;
-            for (var _a = 0, _b = sequenceGroups[sequenceKey]; _a < _b.length; _a++) {
-                var potentialEdge = _b[_a];
-                var score = calculateScore(potentialEdge);
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    similarEdge = potentialEdge;
-                }
-            }
-            if (similarEdge == null) {
-                continue;
-            }
-            similarEdges.push(similarEdge);
-        }
-        return similarEdges
-            .map(function (potentialEdge) {
-            return {
-                data: {
-                    direction: Edge_1.EdgeDirection.Similar,
-                    worldMotionAzimuth: potentialEdge.worldMotionAzimuth,
-                },
-                from: node.key,
-                to: potentialEdge.key,
-            };
-        });
-    };
-    /**
-     * Computes the step edges for a perspective node.
-     *
-     * @description Step edge targets can only be other perspective nodes.
-     * Returns an empty array for cropped and full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @param {string} prevKey - Key of previous node in sequence.
-     * @param {string} prevKey - Key of next node in sequence.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeStepEdges = function (node, potentialEdges, prevKey, nextKey) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        var edges = [];
-        if (node.pano) {
-            return edges;
-        }
-        for (var k in this._directions.steps) {
-            if (!this._directions.steps.hasOwnProperty(k)) {
-                continue;
-            }
-            var step = this._directions.steps[k];
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            var fallback = null;
-            for (var _i = 0, potentialEdges_2 = potentialEdges; _i < potentialEdges_2.length; _i++) {
-                var potential = potentialEdges_2[_i];
-                if (potential.croppedPano || potential.fullPano) {
-                    continue;
-                }
-                if (Math.abs(potential.directionChange) > this._settings.stepMaxDirectionChange) {
-                    continue;
-                }
-                var motionDifference = this._spatial.angleDifference(step.motionChange, potential.motionChange);
-                var directionMotionDifference = this._spatial.angleDifference(potential.directionChange, motionDifference);
-                var drift = Math.max(Math.abs(motionDifference), Math.abs(directionMotionDifference));
-                if (Math.abs(drift) > this._settings.stepMaxDrift) {
-                    continue;
-                }
-                var potentialKey = potential.key;
-                if (step.useFallback && (potentialKey === prevKey || potentialKey === nextKey)) {
-                    fallback = potential;
-                }
-                if (potential.distance > this._settings.stepMaxDistance) {
-                    continue;
-                }
-                motionDifference = Math.sqrt(motionDifference * motionDifference +
-                    potential.verticalMotion * potential.verticalMotion);
-                var score = this._coefficients.stepPreferredDistance *
-                    Math.abs(potential.distance - this._settings.stepPreferredDistance) /
-                    this._settings.stepMaxDistance +
-                    this._coefficients.stepMotion * motionDifference / this._settings.stepMaxDrift +
-                    this._coefficients.stepRotation * potential.rotation / this._settings.stepMaxDirectionChange +
-                    this._coefficients.stepSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                    this._coefficients.stepMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
-                }
-            }
-            edge = edge == null ? fallback : edge;
-            if (edge != null) {
-                edges.push({
-                    data: {
-                        direction: step.direction,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
-            }
-        }
-        return edges;
-    };
-    /**
-     * Computes the turn edges for a perspective node.
-     *
-     * @description Turn edge targets can only be other perspective images.
-     * Returns an empty array for cropped and full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computeTurnEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        var edges = [];
-        if (node.pano) {
-            return edges;
-        }
-        for (var k in this._directions.turns) {
-            if (!this._directions.turns.hasOwnProperty(k)) {
-                continue;
-            }
-            var turn = this._directions.turns[k];
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            for (var _i = 0, potentialEdges_3 = potentialEdges; _i < potentialEdges_3.length; _i++) {
-                var potential = potentialEdges_3[_i];
-                if (potential.croppedPano || potential.fullPano) {
-                    continue;
-                }
-                if (potential.distance > this._settings.turnMaxDistance) {
-                    continue;
-                }
-                var rig = turn.direction !== Edge_1.EdgeDirection.TurnU &&
-                    potential.distance < this._settings.turnMaxRigDistance &&
-                    Math.abs(potential.directionChange) > this._settings.turnMinRigDirectionChange;
-                var directionDifference = this._spatial.angleDifference(turn.directionChange, potential.directionChange);
-                var score = void 0;
-                if (rig &&
-                    potential.directionChange * turn.directionChange > 0 &&
-                    Math.abs(potential.directionChange) < Math.abs(turn.directionChange)) {
-                    score = -Math.PI / 2 + Math.abs(potential.directionChange);
-                }
-                else {
-                    if (Math.abs(directionDifference) > this._settings.turnMaxDirectionChange) {
-                        continue;
-                    }
-                    var motionDifference = turn.motionChange ?
-                        this._spatial.angleDifference(turn.motionChange, potential.motionChange) : 0;
-                    motionDifference = Math.sqrt(motionDifference * motionDifference +
-                        potential.verticalMotion * potential.verticalMotion);
-                    score =
-                        this._coefficients.turnDistance * potential.distance /
-                            this._settings.turnMaxDistance +
-                            this._coefficients.turnMotion * motionDifference / Math.PI +
-                            this._coefficients.turnSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                            this._coefficients.turnMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                }
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
-                }
-            }
-            if (edge != null) {
-                edges.push({
-                    data: {
-                        direction: turn.direction,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
-            }
-        }
-        return edges;
-    };
-    /**
-     * Computes the pano edges for a perspective node.
-     *
-     * @description Perspective to pano edge targets can only be
-     * full pano nodes. Returns an empty array for cropped and full panoramas.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computePerspectiveToPanoEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (node.pano) {
-            return [];
-        }
-        var lowestScore = Number.MAX_VALUE;
-        var edge = null;
-        for (var _i = 0, potentialEdges_4 = potentialEdges; _i < potentialEdges_4.length; _i++) {
-            var potential = potentialEdges_4[_i];
-            if (!potential.fullPano) {
-                continue;
-            }
-            var score = this._coefficients.panoPreferredDistance *
-                Math.abs(potential.distance - this._settings.panoPreferredDistance) /
-                this._settings.panoMaxDistance +
-                this._coefficients.panoMotion * Math.abs(potential.motionChange) / Math.PI +
-                this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-            if (score < lowestScore) {
-                lowestScore = score;
-                edge = potential;
-            }
-        }
-        if (edge == null) {
-            return [];
-        }
-        return [
-            {
-                data: {
-                    direction: Edge_1.EdgeDirection.Pano,
-                    worldMotionAzimuth: edge.worldMotionAzimuth,
-                },
-                from: node.key,
-                to: edge.key,
-            },
-        ];
-    };
-    /**
-     * Computes the full pano and step edges for a full pano node.
-     *
-     * @description Pano to pano edge targets can only be
-     * full pano nodes. Pano to step edge targets can only be perspective
-     * nodes.
-     * Returns an empty array for cropped panoramas and perspective nodes.
-     *
-     * @param {Node} node - Source node.
-     * @param {Array<IPotentialEdge>} potentialEdges - Potential edges.
-     * @throws {ArgumentMapillaryError} If node is not full.
-     */
-    EdgeCalculator.prototype.computePanoEdges = function (node, potentialEdges) {
-        if (!node.full) {
-            throw new Error_1.ArgumentMapillaryError("Node has to be full.");
-        }
-        if (!node.fullPano) {
-            return [];
-        }
-        var panoEdges = [];
-        var potentialPanos = [];
-        var potentialSteps = [];
-        for (var _i = 0, potentialEdges_5 = potentialEdges; _i < potentialEdges_5.length; _i++) {
-            var potential = potentialEdges_5[_i];
-            if (potential.distance > this._settings.panoMaxDistance) {
-                continue;
-            }
-            if (potential.fullPano) {
-                if (potential.distance < this._settings.panoMinDistance) {
-                    continue;
-                }
-                potentialPanos.push(potential);
-            }
-            else {
-                if (potential.croppedPano) {
-                    continue;
-                }
-                for (var k in this._directions.panos) {
-                    if (!this._directions.panos.hasOwnProperty(k)) {
-                        continue;
-                    }
-                    var pano = this._directions.panos[k];
-                    var turn = this._spatial.angleDifference(potential.directionChange, potential.motionChange);
-                    var turnChange = this._spatial.angleDifference(pano.directionChange, turn);
-                    if (Math.abs(turnChange) > this._settings.panoMaxStepTurnChange) {
-                        continue;
-                    }
-                    potentialSteps.push([pano.direction, potential]);
-                    // break if step direction found
-                    break;
-                }
-            }
-        }
-        var maxRotationDifference = Math.PI / this._settings.panoMaxItems;
-        var occupiedAngles = [];
-        var stepAngles = [];
-        for (var index = 0; index < this._settings.panoMaxItems; index++) {
-            var rotation = index / this._settings.panoMaxItems * 2 * Math.PI;
-            var lowestScore = Number.MAX_VALUE;
-            var edge = null;
-            for (var _a = 0, potentialPanos_1 = potentialPanos; _a < potentialPanos_1.length; _a++) {
-                var potential = potentialPanos_1[_a];
-                var motionDifference = this._spatial.angleDifference(rotation, potential.motionChange);
-                if (Math.abs(motionDifference) > maxRotationDifference) {
-                    continue;
-                }
-                var occupiedDifference = Number.MAX_VALUE;
-                for (var _b = 0, occupiedAngles_1 = occupiedAngles; _b < occupiedAngles_1.length; _b++) {
-                    var occupiedAngle = occupiedAngles_1[_b];
-                    var difference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential.motionChange));
-                    if (difference < occupiedDifference) {
-                        occupiedDifference = difference;
-                    }
-                }
-                if (occupiedDifference <= maxRotationDifference) {
-                    continue;
-                }
-                var score = this._coefficients.panoPreferredDistance *
-                    Math.abs(potential.distance - this._settings.panoPreferredDistance) /
-                    this._settings.panoMaxDistance +
-                    this._coefficients.panoMotion * Math.abs(motionDifference) / maxRotationDifference +
-                    this._coefficients.panoSequencePenalty * (potential.sameSequence ? 0 : 1) +
-                    this._coefficients.panoMergeCCPenalty * (potential.sameMergeCC ? 0 : 1);
-                if (score < lowestScore) {
-                    lowestScore = score;
-                    edge = potential;
-                }
-            }
-            if (edge != null) {
-                occupiedAngles.push(edge.motionChange);
-                panoEdges.push({
-                    data: {
-                        direction: Edge_1.EdgeDirection.Pano,
-                        worldMotionAzimuth: edge.worldMotionAzimuth,
-                    },
-                    from: node.key,
-                    to: edge.key,
-                });
-            }
-            else {
-                stepAngles.push(rotation);
-            }
-        }
-        var occupiedStepAngles = {};
-        occupiedStepAngles[Edge_1.EdgeDirection.Pano] = occupiedAngles;
-        occupiedStepAngles[Edge_1.EdgeDirection.StepForward] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepLeft] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepBackward] = [];
-        occupiedStepAngles[Edge_1.EdgeDirection.StepRight] = [];
-        for (var _c = 0, stepAngles_1 = stepAngles; _c < stepAngles_1.length; _c++) {
-            var stepAngle = stepAngles_1[_c];
-            var occupations = [];
-            for (var k in this._directions.panos) {
-                if (!this._directions.panos.hasOwnProperty(k)) {
-                    continue;
-                }
-                var pano = this._directions.panos[k];
-                var allOccupiedAngles = occupiedStepAngles[Edge_1.EdgeDirection.Pano]
-                    .concat(occupiedStepAngles[pano.direction])
-                    .concat(occupiedStepAngles[pano.prev])
-                    .concat(occupiedStepAngles[pano.next]);
-                var lowestScore = Number.MAX_VALUE;
-                var edge = null;
-                for (var _d = 0, potentialSteps_1 = potentialSteps; _d < potentialSteps_1.length; _d++) {
-                    var potential = potentialSteps_1[_d];
-                    if (potential[0] !== pano.direction) {
-                        continue;
-                    }
-                    var motionChange = this._spatial.angleDifference(stepAngle, potential[1].motionChange);
-                    if (Math.abs(motionChange) > maxRotationDifference) {
-                        continue;
-                    }
-                    var minOccupiedDifference = Number.MAX_VALUE;
-                    for (var _e = 0, allOccupiedAngles_1 = allOccupiedAngles; _e < allOccupiedAngles_1.length; _e++) {
-                        var occupiedAngle = allOccupiedAngles_1[_e];
-                        var occupiedDifference = Math.abs(this._spatial.angleDifference(occupiedAngle, potential[1].motionChange));
-                        if (occupiedDifference < minOccupiedDifference) {
-                            minOccupiedDifference = occupiedDifference;
-                        }
-                    }
-                    if (minOccupiedDifference <= maxRotationDifference) {
-                        continue;
-                    }
-                    var score = this._coefficients.panoPreferredDistance *
-                        Math.abs(potential[1].distance - this._settings.panoPreferredDistance) /
-                        this._settings.panoMaxDistance +
-                        this._coefficients.panoMotion * Math.abs(motionChange) / maxRotationDifference +
-                        this._coefficients.panoMergeCCPenalty * (potential[1].sameMergeCC ? 0 : 1);
-                    if (score < lowestScore) {
-                        lowestScore = score;
-                        edge = potential;
-                    }
-                }
-                if (edge != null) {
-                    occupations.push(edge);
-                    panoEdges.push({
-                        data: {
-                            direction: edge[0],
-                            worldMotionAzimuth: edge[1].worldMotionAzimuth,
-                        },
-                        from: node.key,
-                        to: edge[1].key,
-                    });
-                }
-            }
-            for (var _f = 0, occupations_1 = occupations; _f < occupations_1.length; _f++) {
-                var occupation = occupations_1[_f];
-                occupiedStepAngles[occupation[0]].push(occupation[1].motionChange);
-            }
-        }
-        return panoEdges;
-    };
-    return EdgeCalculator;
-}());
-exports.EdgeCalculator = EdgeCalculator;
-exports.default = EdgeCalculator;
-
-},{"../../Edge":276,"../../Error":277,"../../Geo":278,"three":226}],401:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeCalculatorCoefficients = /** @class */ (function () {
-    function EdgeCalculatorCoefficients() {
-        this.panoPreferredDistance = 2;
-        this.panoMotion = 2;
-        this.panoSequencePenalty = 1;
-        this.panoMergeCCPenalty = 4;
-        this.stepPreferredDistance = 4;
-        this.stepMotion = 3;
-        this.stepRotation = 4;
-        this.stepSequencePenalty = 2;
-        this.stepMergeCCPenalty = 6;
-        this.similarDistance = 2;
-        this.similarRotation = 3;
-        this.turnDistance = 4;
-        this.turnMotion = 2;
-        this.turnSequencePenalty = 1;
-        this.turnMergeCCPenalty = 4;
-    }
-    return EdgeCalculatorCoefficients;
-}());
-exports.EdgeCalculatorCoefficients = EdgeCalculatorCoefficients;
-exports.default = EdgeCalculatorCoefficients;
-
-},{}],402:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Edge_1 = require("../../Edge");
-var EdgeCalculatorDirections = /** @class */ (function () {
-    function EdgeCalculatorDirections() {
-        this.steps = {};
-        this.turns = {};
-        this.panos = {};
-        this.steps[Edge_1.EdgeDirection.StepForward] = {
-            direction: Edge_1.EdgeDirection.StepForward,
-            motionChange: 0,
-            useFallback: true,
-        };
-        this.steps[Edge_1.EdgeDirection.StepBackward] = {
-            direction: Edge_1.EdgeDirection.StepBackward,
-            motionChange: Math.PI,
-            useFallback: true,
-        };
-        this.steps[Edge_1.EdgeDirection.StepLeft] = {
-            direction: Edge_1.EdgeDirection.StepLeft,
-            motionChange: Math.PI / 2,
-            useFallback: false,
-        };
-        this.steps[Edge_1.EdgeDirection.StepRight] = {
-            direction: Edge_1.EdgeDirection.StepRight,
-            motionChange: -Math.PI / 2,
-            useFallback: false,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnLeft] = {
-            direction: Edge_1.EdgeDirection.TurnLeft,
-            directionChange: Math.PI / 2,
-            motionChange: Math.PI / 4,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnRight] = {
-            direction: Edge_1.EdgeDirection.TurnRight,
-            directionChange: -Math.PI / 2,
-            motionChange: -Math.PI / 4,
-        };
-        this.turns[Edge_1.EdgeDirection.TurnU] = {
-            direction: Edge_1.EdgeDirection.TurnU,
-            directionChange: Math.PI,
-            motionChange: null,
-        };
-        this.panos[Edge_1.EdgeDirection.StepForward] = {
-            direction: Edge_1.EdgeDirection.StepForward,
-            directionChange: 0,
-            next: Edge_1.EdgeDirection.StepLeft,
-            prev: Edge_1.EdgeDirection.StepRight,
-        };
-        this.panos[Edge_1.EdgeDirection.StepBackward] = {
-            direction: Edge_1.EdgeDirection.StepBackward,
-            directionChange: Math.PI,
-            next: Edge_1.EdgeDirection.StepRight,
-            prev: Edge_1.EdgeDirection.StepLeft,
-        };
-        this.panos[Edge_1.EdgeDirection.StepLeft] = {
-            direction: Edge_1.EdgeDirection.StepLeft,
-            directionChange: Math.PI / 2,
-            next: Edge_1.EdgeDirection.StepBackward,
-            prev: Edge_1.EdgeDirection.StepForward,
-        };
-        this.panos[Edge_1.EdgeDirection.StepRight] = {
-            direction: Edge_1.EdgeDirection.StepRight,
-            directionChange: -Math.PI / 2,
-            next: Edge_1.EdgeDirection.StepForward,
-            prev: Edge_1.EdgeDirection.StepBackward,
-        };
-    }
-    return EdgeCalculatorDirections;
-}());
-exports.EdgeCalculatorDirections = EdgeCalculatorDirections;
-
-},{"../../Edge":276}],403:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EdgeCalculatorSettings = /** @class */ (function () {
-    function EdgeCalculatorSettings() {
-        this.panoMinDistance = 0.1;
-        this.panoMaxDistance = 20;
-        this.panoPreferredDistance = 5;
-        this.panoMaxItems = 4;
-        this.panoMaxStepTurnChange = Math.PI / 8;
-        this.rotationMaxDistance = this.turnMaxRigDistance;
-        this.rotationMaxDirectionChange = Math.PI / 6;
-        this.rotationMaxVerticalDirectionChange = Math.PI / 8;
-        this.similarMaxDirectionChange = Math.PI / 8;
-        this.similarMaxDistance = 12;
-        this.similarMinTimeDifference = 12 * 3600 * 1000;
-        this.stepMaxDistance = 20;
-        this.stepMaxDirectionChange = Math.PI / 6;
-        this.stepMaxDrift = Math.PI / 6;
-        this.stepPreferredDistance = 4;
-        this.turnMaxDistance = 15;
-        this.turnMaxDirectionChange = 2 * Math.PI / 9;
-        this.turnMaxRigDistance = 0.65;
-        this.turnMinRigDirectionChange = Math.PI / 6;
-    }
-    Object.defineProperty(EdgeCalculatorSettings.prototype, "maxDistance", {
-        get: function () {
-            return Math.max(this.panoMaxDistance, this.similarMaxDistance, this.stepMaxDistance, this.turnMaxDistance);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return EdgeCalculatorSettings;
-}());
-exports.EdgeCalculatorSettings = EdgeCalculatorSettings;
-exports.default = EdgeCalculatorSettings;
-
-},{}],404:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for edge directions
- * @enum {number}
- * @readonly
- * @description Directions for edges in node graph describing
- * sequence, spatial and node type relations between nodes.
- */
-var EdgeDirection;
-(function (EdgeDirection) {
-    /**
-     * Next node in the sequence.
-     */
-    EdgeDirection[EdgeDirection["Next"] = 0] = "Next";
-    /**
-     * Previous node in the sequence.
-     */
-    EdgeDirection[EdgeDirection["Prev"] = 1] = "Prev";
-    /**
-     * Step to the left keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepLeft"] = 2] = "StepLeft";
-    /**
-     * Step to the right keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepRight"] = 3] = "StepRight";
-    /**
-     * Step forward keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepForward"] = 4] = "StepForward";
-    /**
-     * Step backward keeping viewing direction.
-     */
-    EdgeDirection[EdgeDirection["StepBackward"] = 5] = "StepBackward";
-    /**
-     * Turn 90 degrees counter clockwise.
-     */
-    EdgeDirection[EdgeDirection["TurnLeft"] = 6] = "TurnLeft";
-    /**
-     * Turn 90 degrees clockwise.
-     */
-    EdgeDirection[EdgeDirection["TurnRight"] = 7] = "TurnRight";
-    /**
-     * Turn 180 degrees.
-     */
-    EdgeDirection[EdgeDirection["TurnU"] = 8] = "TurnU";
-    /**
-     * Panorama in general direction.
-     */
-    EdgeDirection[EdgeDirection["Pano"] = 9] = "Pano";
-    /**
-     * Looking in roughly the same direction at rougly the same position.
-     */
-    EdgeDirection[EdgeDirection["Similar"] = 10] = "Similar";
-})(EdgeDirection = exports.EdgeDirection || (exports.EdgeDirection = {}));
-
-},{}],405:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var vd = require("virtual-dom");
-var rxjs_2 = require("rxjs");
-var Render_1 = require("../Render");
-var DOMRenderer = /** @class */ (function () {
-    function DOMRenderer(element, renderService, currentFrame$) {
-        this._adaptiveOperation$ = new rxjs_2.Subject();
-        this._render$ = new rxjs_2.Subject();
-        this._renderAdaptive$ = new rxjs_2.Subject();
-        this._renderService = renderService;
-        this._currentFrame$ = currentFrame$;
-        var rootNode = vd.create(vd.h("div.domRenderer", []));
-        element.appendChild(rootNode);
-        this._offset$ = this._adaptiveOperation$.pipe(operators_1.scan(function (adaptive, operation) {
-            return operation(adaptive);
-        }, {
-            elementHeight: element.offsetHeight,
-            elementWidth: element.offsetWidth,
-            imageAspect: 0,
-            renderMode: Render_1.RenderMode.Fill,
-        }), operators_1.filter(function (adaptive) {
-            return adaptive.imageAspect > 0 && adaptive.elementWidth > 0 && adaptive.elementHeight > 0;
-        }), operators_1.map(function (adaptive) {
-            var elementAspect = adaptive.elementWidth / adaptive.elementHeight;
-            var ratio = adaptive.imageAspect / elementAspect;
-            var verticalOffset = 0;
-            var horizontalOffset = 0;
-            if (adaptive.renderMode === Render_1.RenderMode.Letterbox) {
-                if (adaptive.imageAspect > elementAspect) {
-                    verticalOffset = adaptive.elementHeight * (1 - 1 / ratio) / 2;
-                }
-                else {
-                    horizontalOffset = adaptive.elementWidth * (1 - ratio) / 2;
-                }
-            }
-            else {
-                if (adaptive.imageAspect > elementAspect) {
-                    horizontalOffset = -adaptive.elementWidth * (ratio - 1) / 2;
-                }
-                else {
-                    verticalOffset = -adaptive.elementHeight * (1 / ratio - 1) / 2;
-                }
-            }
-            return {
-                bottom: verticalOffset,
-                left: horizontalOffset,
-                right: horizontalOffset,
-                top: verticalOffset,
-            };
-        }));
-        this._currentFrame$.pipe(operators_1.filter(function (frame) {
-            return frame.state.currentNode != null;
-        }), operators_1.distinctUntilChanged(function (k1, k2) {
-            return k1 === k2;
-        }, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.map(function (frame) {
-            return frame.state.currentTransform.basicAspect;
-        }), operators_1.map(function (aspect) {
-            return function (adaptive) {
-                adaptive.imageAspect = aspect;
-                return adaptive;
-            };
-        }))
-            .subscribe(this._adaptiveOperation$);
-        rxjs_1.combineLatest(this._renderAdaptive$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
-            }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
-            }
-            return vNodeHashes;
-        }, {})), this._offset$).pipe(operators_1.map(function (vo) {
-            var vNodes = [];
-            var hashes = vo[0];
-            for (var name_1 in hashes) {
-                if (!hashes.hasOwnProperty(name_1)) {
-                    continue;
-                }
-                vNodes.push(hashes[name_1]);
-            }
-            var offset = vo[1];
-            var properties = {
-                style: {
-                    bottom: offset.bottom + "px",
-                    left: offset.left + "px",
-                    "pointer-events": "none",
-                    position: "absolute",
-                    right: offset.right + "px",
-                    top: offset.top + "px",
-                },
-            };
-            return {
-                name: "adaptiveDomRenderer",
-                vnode: vd.h("div.adaptiveDomRenderer", properties, vNodes),
-            };
-        }))
-            .subscribe(this._render$);
-        this._vNode$ = this._render$.pipe(operators_1.scan(function (vNodeHashes, vNodeHash) {
-            if (vNodeHash.vnode == null) {
-                delete vNodeHashes[vNodeHash.name];
-            }
-            else {
-                vNodeHashes[vNodeHash.name] = vNodeHash.vnode;
-            }
-            return vNodeHashes;
-        }, {}), operators_1.map(function (hashes) {
-            var vNodes = [];
-            for (var name_2 in hashes) {
-                if (!hashes.hasOwnProperty(name_2)) {
-                    continue;
-                }
-                vNodes.push(hashes[name_2]);
-            }
-            return vd.h("div.domRenderer", vNodes);
-        }));
-        this._vPatch$ = this._vNode$.pipe(operators_1.scan(function (nodePatch, vNode) {
-            nodePatch.vpatch = vd.diff(nodePatch.vnode, vNode);
-            nodePatch.vnode = vNode;
-            return nodePatch;
-        }, { vnode: vd.h("div.domRenderer", []), vpatch: null }), operators_1.pluck("vpatch"));
-        this._element$ = this._vPatch$.pipe(operators_1.scan(function (oldElement, vPatch) {
-            return vd.patch(oldElement, vPatch);
-        }, rootNode), operators_1.publishReplay(1), operators_1.refCount());
-        this._element$.subscribe(function () { });
-        this._renderService.size$.pipe(operators_1.map(function (size) {
-            return function (adaptive) {
-                adaptive.elementWidth = size.width;
-                adaptive.elementHeight = size.height;
-                return adaptive;
-            };
-        }))
-            .subscribe(this._adaptiveOperation$);
-        this._renderService.renderMode$.pipe(operators_1.map(function (renderMode) {
-            return function (adaptive) {
-                adaptive.renderMode = renderMode;
-                return adaptive;
-            };
-        }))
-            .subscribe(this._adaptiveOperation$);
-    }
-    Object.defineProperty(DOMRenderer.prototype, "element$", {
-        get: function () {
-            return this._element$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DOMRenderer.prototype, "render$", {
-        get: function () {
-            return this._render$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(DOMRenderer.prototype, "renderAdaptive$", {
-        get: function () {
-            return this._renderAdaptive$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    DOMRenderer.prototype.clear = function (name) {
-        this._renderAdaptive$.next({ name: name, vnode: null });
-        this._render$.next({ name: name, vnode: null });
-    };
-    return DOMRenderer;
-}());
-exports.DOMRenderer = DOMRenderer;
-exports.default = DOMRenderer;
-
-
-},{"../Render":281,"rxjs":27,"rxjs/operators":225,"virtual-dom":231}],406:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var GLRenderStage;
-(function (GLRenderStage) {
-    GLRenderStage[GLRenderStage["Background"] = 0] = "Background";
-    GLRenderStage[GLRenderStage["Foreground"] = 1] = "Foreground";
-})(GLRenderStage = exports.GLRenderStage || (exports.GLRenderStage = {}));
-exports.default = GLRenderStage;
-
-},{}],407:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var Render_1 = require("../Render");
-var Utils_1 = require("../Utils");
-var GLRenderer = /** @class */ (function () {
-    function GLRenderer(canvasContainer, renderService, dom) {
-        var _this = this;
-        this._renderFrame$ = new rxjs_1.Subject();
-        this._renderCameraOperation$ = new rxjs_1.Subject();
-        this._render$ = new rxjs_1.Subject();
-        this._clear$ = new rxjs_1.Subject();
-        this._renderOperation$ = new rxjs_1.Subject();
-        this._rendererOperation$ = new rxjs_1.Subject();
-        this._eraserOperation$ = new rxjs_1.Subject();
-        this._renderService = renderService;
-        this._dom = !!dom ? dom : new Utils_1.DOM();
-        this._renderer$ = this._rendererOperation$.pipe(operators_1.scan(function (renderer, operation) {
-            return operation(renderer);
-        }, { needsRender: false, renderer: null }), operators_1.filter(function (renderer) {
-            return !!renderer.renderer;
-        }));
-        this._renderCollection$ = this._renderOperation$.pipe(operators_1.scan(function (hashes, operation) {
-            return operation(hashes);
-        }, {}), operators_1.share());
-        this._renderCamera$ = this._renderCameraOperation$.pipe(operators_1.scan(function (rc, operation) {
-            return operation(rc);
-        }, { frameId: -1, needsRender: false, perspective: null }));
-        this._eraser$ = this._eraserOperation$.pipe(operators_1.startWith(function (eraser) {
-            return eraser;
-        }), operators_1.scan(function (eraser, operation) {
-            return operation(eraser);
-        }, { needsRender: false }));
-        rxjs_1.combineLatest(this._renderer$, this._renderCollection$, this._renderCamera$, this._eraser$).pipe(operators_1.map(function (_a) {
-            var renderer = _a[0], hashes = _a[1], rc = _a[2], eraser = _a[3];
-            var renders = Object.keys(hashes)
-                .map(function (key) {
-                return hashes[key];
-            });
-            return { camera: rc, eraser: eraser, renderer: renderer, renders: renders };
-        }), operators_1.filter(function (co) {
-            var needsRender = co.renderer.needsRender ||
-                co.camera.needsRender ||
-                co.eraser.needsRender;
-            var frameId = co.camera.frameId;
-            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
-                var render = _a[_i];
-                if (render.frameId !== frameId) {
-                    return false;
-                }
-                needsRender = needsRender || render.needsRender;
-            }
-            return needsRender;
-        }), operators_1.distinctUntilChanged(function (n1, n2) {
-            return n1 === n2;
-        }, function (co) {
-            return co.eraser.needsRender ? -1 : co.camera.frameId;
-        }))
-            .subscribe(function (co) {
-            co.renderer.needsRender = false;
-            co.camera.needsRender = false;
-            co.eraser.needsRender = false;
-            var perspectiveCamera = co.camera.perspective;
-            var backgroundRenders = [];
-            var foregroundRenders = [];
-            for (var _i = 0, _a = co.renders; _i < _a.length; _i++) {
-                var render = _a[_i];
-                if (render.stage === Render_1.GLRenderStage.Background) {
-                    backgroundRenders.push(render.render);
-                }
-                else if (render.stage === Render_1.GLRenderStage.Foreground) {
-                    foregroundRenders.push(render.render);
-                }
-            }
-            var renderer = co.renderer.renderer;
-            renderer.clear();
-            for (var _b = 0, backgroundRenders_1 = backgroundRenders; _b < backgroundRenders_1.length; _b++) {
-                var render = backgroundRenders_1[_b];
-                render(perspectiveCamera, renderer);
-            }
-            renderer.clearDepth();
-            for (var _c = 0, foregroundRenders_1 = foregroundRenders; _c < foregroundRenders_1.length; _c++) {
-                var render = foregroundRenders_1[_c];
-                render(perspectiveCamera, renderer);
-            }
-        });
-        this._renderFrame$.pipe(operators_1.map(function (rc) {
-            return function (irc) {
-                irc.frameId = rc.frameId;
-                irc.perspective = rc.perspective;
-                if (rc.changed === true) {
-                    irc.needsRender = true;
-                }
-                return irc;
-            };
-        }))
-            .subscribe(this._renderCameraOperation$);
-        this._renderFrameSubscribe();
-        var renderHash$ = this._render$.pipe(operators_1.map(function (hash) {
-            return function (hashes) {
-                hashes[hash.name] = hash.render;
-                return hashes;
-            };
-        }));
-        var clearHash$ = this._clear$.pipe(operators_1.map(function (name) {
-            return function (hashes) {
-                delete hashes[name];
-                return hashes;
-            };
-        }));
-        rxjs_1.merge(renderHash$, clearHash$)
-            .subscribe(this._renderOperation$);
-        this._webGLRenderer$ = this._render$.pipe(operators_1.first(), operators_1.map(function (hash) {
-            var canvas = _this._dom.createElement("canvas", "mapillary-js-canvas");
-            canvas.style.position = "absolute";
-            canvas.setAttribute("tabindex", "0");
-            canvasContainer.appendChild(canvas);
-            var element = renderService.element;
-            var webGLRenderer = new THREE.WebGLRenderer({ canvas: canvas });
-            webGLRenderer.setPixelRatio(window.devicePixelRatio);
-            webGLRenderer.setSize(element.offsetWidth, element.offsetHeight);
-            webGLRenderer.setClearColor(new THREE.Color(0x202020), 1.0);
-            webGLRenderer.autoClear = false;
-            return webGLRenderer;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._webGLRenderer$.subscribe(function () { });
-        var createRenderer$ = this._webGLRenderer$.pipe(operators_1.first(), operators_1.map(function (webGLRenderer) {
-            return function (renderer) {
-                renderer.needsRender = true;
-                renderer.renderer = webGLRenderer;
-                return renderer;
-            };
-        }));
-        var resizeRenderer$ = this._renderService.size$.pipe(operators_1.map(function (size) {
-            return function (renderer) {
-                if (renderer.renderer == null) {
-                    return renderer;
-                }
-                renderer.renderer.setSize(size.width, size.height);
-                renderer.needsRender = true;
-                return renderer;
-            };
-        }));
-        var clearRenderer$ = this._clear$.pipe(operators_1.map(function (name) {
-            return function (renderer) {
-                if (renderer.renderer == null) {
-                    return renderer;
-                }
-                renderer.needsRender = true;
-                return renderer;
-            };
-        }));
-        rxjs_1.merge(createRenderer$, resizeRenderer$, clearRenderer$)
-            .subscribe(this._rendererOperation$);
-        var renderCollectionEmpty$ = this._renderCollection$.pipe(operators_1.filter(function (hashes) {
-            return Object.keys(hashes).length === 0;
-        }), operators_1.share());
-        renderCollectionEmpty$
-            .subscribe(function (hashes) {
-            if (_this._renderFrameSubscription == null) {
-                return;
-            }
-            _this._renderFrameSubscription.unsubscribe();
-            _this._renderFrameSubscription = null;
-            _this._renderFrameSubscribe();
-        });
-        renderCollectionEmpty$.pipe(operators_1.map(function (hashes) {
-            return function (eraser) {
-                eraser.needsRender = true;
-                return eraser;
-            };
-        }))
-            .subscribe(this._eraserOperation$);
-    }
-    Object.defineProperty(GLRenderer.prototype, "render$", {
-        get: function () {
-            return this._render$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(GLRenderer.prototype, "webGLRenderer$", {
-        get: function () {
-            return this._webGLRenderer$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    GLRenderer.prototype.clear = function (name) {
-        this._clear$.next(name);
-    };
-    GLRenderer.prototype._renderFrameSubscribe = function () {
-        var _this = this;
-        this._render$.pipe(operators_1.first(), operators_1.map(function (renderHash) {
-            return function (irc) {
-                irc.needsRender = true;
-                return irc;
-            };
-        }))
-            .subscribe(function (operation) {
-            _this._renderCameraOperation$.next(operation);
-        });
-        this._renderFrameSubscription = this._render$.pipe(operators_1.first(), operators_1.mergeMap(function (hash) {
-            return _this._renderService.renderCameraFrame$;
-        }))
-            .subscribe(this._renderFrame$);
-    };
-    return GLRenderer;
-}());
-exports.GLRenderer = GLRenderer;
-exports.default = GLRenderer;
-
-
-},{"../Render":281,"../Utils":285,"rxjs":27,"rxjs/operators":225,"three":226}],408:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var Render_1 = require("../Render");
-var State_1 = require("../State");
-var RenderCamera = /** @class */ (function () {
-    function RenderCamera(elementWidth, elementHeight, renderMode) {
-        this._spatial = new Geo_1.Spatial();
-        this._viewportCoords = new Geo_1.ViewportCoords();
-        this._initialFov = 50;
-        this._alpha = -1;
-        this._renderMode = renderMode;
-        this._zoom = 0;
-        this._frameId = -1;
-        this._changed = false;
-        this._changedForFrame = -1;
-        this._currentNodeId = null;
-        this._previousNodeId = null;
-        this._currentPano = false;
-        this._previousPano = false;
-        this._state = null;
-        this._currentProjectedPoints = [];
-        this._previousProjectedPoints = [];
-        this._currentFov = this._initialFov;
-        this._previousFov = this._initialFov;
-        this._camera = new Geo_1.Camera();
-        this._perspective = new THREE.PerspectiveCamera(this._initialFov, this._computeAspect(elementWidth, elementHeight), 0.16, 10000);
-        this._perspective.matrixAutoUpdate = false;
-        this._rotation = { phi: 0, theta: 0 };
-    }
-    Object.defineProperty(RenderCamera.prototype, "alpha", {
-        get: function () {
-            return this._alpha;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "camera", {
-        get: function () {
-            return this._camera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "changed", {
-        get: function () {
-            return this._frameId === this._changedForFrame;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "frameId", {
-        get: function () {
-            return this._frameId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "perspective", {
-        get: function () {
-            return this._perspective;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "renderMode", {
-        get: function () {
-            return this._renderMode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "rotation", {
-        get: function () {
-            return this._rotation;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderCamera.prototype, "zoom", {
-        get: function () {
-            return this._zoom;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    RenderCamera.prototype.setFrame = function (frame) {
-        var state = frame.state;
-        if (state.state !== this._state) {
-            this._state = state.state;
-            this._changed = true;
-        }
-        var currentNodeId = state.currentNode.key;
-        var previousNodeId = !!state.previousNode ? state.previousNode.key : null;
-        if (currentNodeId !== this._currentNodeId) {
-            this._currentNodeId = currentNodeId;
-            this._currentPano = !!state.currentTransform.gpano;
-            this._currentProjectedPoints = this._computeProjectedPoints(state.currentTransform);
-            this._changed = true;
-        }
-        if (previousNodeId !== this._previousNodeId) {
-            this._previousNodeId = previousNodeId;
-            this._previousPano = !!state.previousTransform.gpano;
-            this._previousProjectedPoints = this._computeProjectedPoints(state.previousTransform);
-            this._changed = true;
-        }
-        var zoom = state.zoom;
-        if (zoom !== this._zoom) {
-            this._zoom = zoom;
-            this._changed = true;
-        }
-        if (this._changed) {
-            this._currentFov = this._computeCurrentFov();
-            this._previousFov = this._computePreviousFov();
-        }
-        var alpha = state.alpha;
-        if (this._changed || alpha !== this._alpha) {
-            this._alpha = alpha;
-            this._perspective.fov = this._state === State_1.State.Earth ?
-                60 :
-                this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
-            this._changed = true;
-        }
-        var camera = state.camera;
-        if (this._camera.diff(camera) > 1e-9) {
-            this._camera.copy(camera);
-            this._rotation = this._computeRotation(camera);
-            this._perspective.up.copy(camera.up);
-            this._perspective.position.copy(camera.position);
-            this._perspective.lookAt(camera.lookat);
-            this._perspective.updateMatrix();
-            this._perspective.updateMatrixWorld(false);
-            this._changed = true;
-        }
-        if (this._changed) {
-            this._perspective.updateProjectionMatrix();
-        }
-        this._setFrameId(frame.id);
-    };
-    RenderCamera.prototype.setRenderMode = function (renderMode) {
-        this._renderMode = renderMode;
-        this._perspective.fov = this._computeFov();
-        this._perspective.updateProjectionMatrix();
-        this._changed = true;
-    };
-    RenderCamera.prototype.setSize = function (size) {
-        this._perspective.aspect = this._computeAspect(size.width, size.height);
-        this._perspective.fov = this._computeFov();
-        this._perspective.updateProjectionMatrix();
-        this._changed = true;
-    };
-    RenderCamera.prototype._computeAspect = function (elementWidth, elementHeight) {
-        return elementWidth === 0 ? 0 : elementWidth / elementHeight;
-    };
-    RenderCamera.prototype._computeCurrentFov = function () {
-        if (this._perspective.aspect === 0) {
-            return 0;
-        }
-        if (!this._currentNodeId) {
-            return this._initialFov;
-        }
-        return this._currentPano ?
-            this._yToFov(1, this._zoom) :
-            this._computeVerticalFov(this._currentProjectedPoints, this._renderMode, this._zoom, this.perspective.aspect);
-    };
-    RenderCamera.prototype._computeFov = function () {
-        this._currentFov = this._computeCurrentFov();
-        this._previousFov = this._computePreviousFov();
-        return this._interpolateFov(this._currentFov, this._previousFov, this._alpha);
-    };
-    RenderCamera.prototype._computePreviousFov = function () {
-        if (this._perspective.aspect === 0) {
-            return 0;
-        }
-        if (!this._currentNodeId) {
-            return this._initialFov;
-        }
-        return !this._previousNodeId ?
-            this._currentFov :
-            this._previousPano ?
-                this._yToFov(1, this._zoom) :
-                this._computeVerticalFov(this._previousProjectedPoints, this._renderMode, this._zoom, this.perspective.aspect);
-    };
-    RenderCamera.prototype._computeProjectedPoints = function (transform) {
-        var vertices = [[0.5, 0], [1, 0]];
-        var directions = [[0.5, 0], [0, 0.5]];
-        var pointsPerLine = 100;
-        return Geo_1.Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
-    };
-    RenderCamera.prototype._computeRequiredVerticalFov = function (projectedPoint, zoom, aspect) {
-        var maxY = Math.max(projectedPoint[0] / aspect, projectedPoint[1]);
-        return this._yToFov(maxY, zoom);
-    };
-    RenderCamera.prototype._computeRotation = function (camera) {
-        var direction = camera.lookat.clone().sub(camera.position);
-        var up = camera.up.clone();
-        var phi = this._spatial.azimuthal(direction.toArray(), up.toArray());
-        var theta = Math.PI / 2 - this._spatial.angleToPlane(direction.toArray(), [0, 0, 1]);
-        return { phi: phi, theta: theta };
-    };
-    RenderCamera.prototype._computeVerticalFov = function (projectedPoints, renderMode, zoom, aspect) {
-        var _this = this;
-        var fovs = projectedPoints
-            .map(function (projectedPoint) {
-            return _this._computeRequiredVerticalFov(projectedPoint, zoom, aspect);
-        });
-        var fov = renderMode === Render_1.RenderMode.Fill ?
-            Math.min.apply(Math, fovs) * 0.995 : Math.max.apply(Math, fovs);
-        return fov;
-    };
-    RenderCamera.prototype._yToFov = function (y, zoom) {
-        return 2 * Math.atan(y / Math.pow(2, zoom)) * 180 / Math.PI;
-    };
-    RenderCamera.prototype._interpolateFov = function (v1, v2, alpha) {
-        return alpha * v1 + (1 - alpha) * v2;
-    };
-    RenderCamera.prototype._setFrameId = function (frameId) {
-        this._frameId = frameId;
-        if (this._changed) {
-            this._changed = false;
-            this._changedForFrame = frameId;
-        }
-    };
-    return RenderCamera;
-}());
-exports.RenderCamera = RenderCamera;
-exports.default = RenderCamera;
-
-},{"../Geo":278,"../Render":281,"../State":282,"three":226}],409:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for render mode
- * @enum {number}
- * @readonly
- * @description Modes for specifying how rendering is done
- * in the viewer. All modes preserves the original aspect
- * ratio of the images.
- */
-var RenderMode;
-(function (RenderMode) {
-    /**
-     * Displays all content within the viewer.
-     *
-     * @description Black bars shown on both
-     * sides of the content. Bars are shown
-     * either below and above or to the left
-     * and right of the content depending on
-     * the aspect ratio relation between the
-     * image and the viewer.
-     */
-    RenderMode[RenderMode["Letterbox"] = 0] = "Letterbox";
-    /**
-     * Fills the viewer by cropping content.
-     *
-     * @description Cropping is done either
-     * in horizontal or vertical direction
-     * depending on the aspect ratio relation
-     * between the image and the viewer.
-     */
-    RenderMode[RenderMode["Fill"] = 1] = "Fill";
-})(RenderMode = exports.RenderMode || (exports.RenderMode = {}));
-exports.default = RenderMode;
-
-},{}],410:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var Geo_1 = require("../Geo");
-var Render_1 = require("../Render");
-var RenderService = /** @class */ (function () {
-    function RenderService(element, currentFrame$, renderMode, renderCamera) {
-        var _this = this;
-        this._element = element;
-        this._currentFrame$ = currentFrame$;
-        this._spatial = new Geo_1.Spatial();
-        renderMode = renderMode != null ? renderMode : Render_1.RenderMode.Fill;
-        this._resize$ = new rxjs_1.Subject();
-        this._renderCameraOperation$ = new rxjs_1.Subject();
-        this._size$ =
-            new rxjs_1.BehaviorSubject({
-                height: this._element.offsetHeight,
-                width: this._element.offsetWidth,
-            });
-        this._resize$.pipe(operators_1.map(function () {
-            return { height: _this._element.offsetHeight, width: _this._element.offsetWidth };
-        }))
-            .subscribe(this._size$);
-        this._renderMode$ = new rxjs_1.BehaviorSubject(renderMode);
-        this._renderCameraHolder$ = this._renderCameraOperation$.pipe(operators_1.startWith(function (rc) {
-            return rc;
-        }), operators_1.scan(function (rc, operation) {
-            return operation(rc);
-        }, !!renderCamera ? renderCamera : new Render_1.RenderCamera(this._element.offsetWidth, this._element.offsetHeight, renderMode)), operators_1.publishReplay(1), operators_1.refCount());
-        this._renderCameraFrame$ = this._currentFrame$.pipe(operators_1.withLatestFrom(this._renderCameraHolder$), operators_1.tap(function (_a) {
-            var frame = _a[0], rc = _a[1];
-            rc.setFrame(frame);
-        }), operators_1.map(function (args) {
-            return args[1];
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._renderCamera$ = this._renderCameraFrame$.pipe(operators_1.filter(function (rc) {
-            return rc.changed;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._bearing$ = this._renderCamera$.pipe(operators_1.map(function (rc) {
-            var bearing = _this._spatial.radToDeg(_this._spatial.azimuthalToBearing(rc.rotation.phi));
-            return _this._spatial.wrap(bearing, 0, 360);
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._size$.pipe(operators_1.skip(1), operators_1.map(function (size) {
-            return function (rc) {
-                rc.setSize(size);
-                return rc;
-            };
-        }))
-            .subscribe(this._renderCameraOperation$);
-        this._renderMode$.pipe(operators_1.skip(1), operators_1.map(function (rm) {
-            return function (rc) {
-                rc.setRenderMode(rm);
-                return rc;
-            };
-        }))
-            .subscribe(this._renderCameraOperation$);
-        this._bearing$.subscribe(function () { });
-        this._renderCameraHolder$.subscribe(function () { });
-        this._size$.subscribe(function () { });
-        this._renderMode$.subscribe(function () { });
-        this._renderCamera$.subscribe(function () { });
-        this._renderCameraFrame$.subscribe(function () { });
-    }
-    Object.defineProperty(RenderService.prototype, "bearing$", {
-        get: function () {
-            return this._bearing$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "element", {
-        get: function () {
-            return this._element;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "resize$", {
-        get: function () {
-            return this._resize$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "size$", {
-        get: function () {
-            return this._size$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderMode$", {
-        get: function () {
-            return this._renderMode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCameraFrame$", {
-        get: function () {
-            return this._renderCameraFrame$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RenderService.prototype, "renderCamera$", {
-        get: function () {
-            return this._renderCamera$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return RenderService;
-}());
-exports.RenderService = RenderService;
-exports.default = RenderService;
-
-
-},{"../Geo":278,"../Render":281,"rxjs":27,"rxjs/operators":225}],411:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var FrameGenerator = /** @class */ (function () {
-    function FrameGenerator(root) {
-        if (root.requestAnimationFrame) {
-            this._cancelAnimationFrame = root.cancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.requestAnimationFrame.bind(root);
-        }
-        else if (root.mozRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.mozCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.mozRequestAnimationFrame.bind(root);
-        }
-        else if (root.webkitRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.webkitCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.webkitRequestAnimationFrame.bind(root);
-        }
-        else if (root.msRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.msCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.msRequestAnimationFrame.bind(root);
-        }
-        else if (root.oRequestAnimationFrame) {
-            this._cancelAnimationFrame = root.oCancelAnimationFrame.bind(root);
-            this._requestAnimationFrame = root.oRequestAnimationFrame.bind(root);
-        }
-        else {
-            this._cancelAnimationFrame = root.clearTimeout.bind(root);
-            this._requestAnimationFrame = function (cb) { return root.setTimeout(cb, 1000 / 60); };
-        }
-    }
-    Object.defineProperty(FrameGenerator.prototype, "cancelAnimationFrame", {
-        get: function () {
-            return this._cancelAnimationFrame;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(FrameGenerator.prototype, "requestAnimationFrame", {
-        get: function () {
-            return this._requestAnimationFrame;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return FrameGenerator;
-}());
-exports.FrameGenerator = FrameGenerator;
-exports.default = FrameGenerator;
-
-},{}],412:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var RotationDelta = /** @class */ (function () {
-    function RotationDelta(phi, theta) {
-        this._phi = phi;
-        this._theta = theta;
-    }
-    Object.defineProperty(RotationDelta.prototype, "phi", {
-        get: function () {
-            return this._phi;
-        },
-        set: function (value) {
-            this._phi = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "theta", {
-        get: function () {
-            return this._theta;
-        },
-        set: function (value) {
-            this._theta = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(RotationDelta.prototype, "isZero", {
-        get: function () {
-            return this._phi === 0 && this._theta === 0;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    RotationDelta.prototype.copy = function (delta) {
-        this._phi = delta.phi;
-        this._theta = delta.theta;
-    };
-    RotationDelta.prototype.lerp = function (other, alpha) {
-        this._phi = (1 - alpha) * this._phi + alpha * other.phi;
-        this._theta = (1 - alpha) * this._theta + alpha * other.theta;
-    };
-    RotationDelta.prototype.multiply = function (value) {
-        this._phi *= value;
-        this._theta *= value;
-    };
-    RotationDelta.prototype.threshold = function (value) {
-        this._phi = Math.abs(this._phi) > value ? this._phi : 0;
-        this._theta = Math.abs(this._theta) > value ? this._theta : 0;
-    };
-    RotationDelta.prototype.lengthSquared = function () {
-        return this._phi * this._phi + this._theta * this._theta;
-    };
-    RotationDelta.prototype.reset = function () {
-        this._phi = 0;
-        this._theta = 0;
-    };
-    return RotationDelta;
-}());
-exports.RotationDelta = RotationDelta;
-exports.default = RotationDelta;
-
-},{}],413:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var State;
-(function (State) {
-    State[State["Earth"] = 0] = "Earth";
-    State[State["Traversing"] = 1] = "Traversing";
-    State[State["Waiting"] = 2] = "Waiting";
-    State[State["WaitingInteractively"] = 3] = "WaitingInteractively";
-})(State = exports.State || (exports.State = {}));
-exports.default = State;
-
-},{}],414:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var State_1 = require("../State");
-var Geo_1 = require("../Geo");
-var StateContext = /** @class */ (function () {
-    function StateContext(transitionMode) {
-        this._state = new State_1.TraversingState({
-            alpha: 1,
-            camera: new Geo_1.Camera(),
-            currentIndex: -1,
-            reference: { alt: 0, lat: 0, lon: 0 },
-            trajectory: [],
-            transitionMode: transitionMode == null ? State_1.TransitionMode.Default : transitionMode,
-            zoom: 0,
-        });
-    }
-    StateContext.prototype.earth = function () {
-        this._state = this._state.earth();
-    };
-    StateContext.prototype.traverse = function () {
-        this._state = this._state.traverse();
-    };
-    StateContext.prototype.wait = function () {
-        this._state = this._state.wait();
-    };
-    StateContext.prototype.waitInteractively = function () {
-        this._state = this._state.waitInteractively();
-    };
-    Object.defineProperty(StateContext.prototype, "state", {
-        get: function () {
-            if (this._state instanceof State_1.EarthState) {
-                return State_1.State.Earth;
-            }
-            else if (this._state instanceof State_1.TraversingState) {
-                return State_1.State.Traversing;
-            }
-            else if (this._state instanceof State_1.WaitingState) {
-                return State_1.State.Waiting;
-            }
-            else if (this._state instanceof State_1.InteractiveWaitingState) {
-                return State_1.State.WaitingInteractively;
-            }
-            throw new Error("Invalid state");
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "reference", {
-        get: function () {
-            return this._state.reference;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "alpha", {
-        get: function () {
-            return this._state.alpha;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "camera", {
-        get: function () {
-            return this._state.camera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "zoom", {
-        get: function () {
-            return this._state.zoom;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentNode", {
-        get: function () {
-            return this._state.currentNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousNode", {
-        get: function () {
-            return this._state.previousNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentCamera", {
-        get: function () {
-            return this._state.currentCamera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentTransform", {
-        get: function () {
-            return this._state.currentTransform;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "previousTransform", {
-        get: function () {
-            return this._state.previousTransform;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "trajectory", {
-        get: function () {
-            return this._state.trajectory;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "currentIndex", {
-        get: function () {
-            return this._state.currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "lastNode", {
-        get: function () {
-            return this._state.trajectory[this._state.trajectory.length - 1];
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "nodesAhead", {
-        get: function () {
-            return this._state.trajectory.length - 1 - this._state.currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateContext.prototype, "motionless", {
-        get: function () {
-            return this._state.motionless;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StateContext.prototype.getCenter = function () {
-        return this._state.getCenter();
-    };
-    StateContext.prototype.setCenter = function (center) {
-        this._state.setCenter(center);
-    };
-    StateContext.prototype.setZoom = function (zoom) {
-        this._state.setZoom(zoom);
-    };
-    StateContext.prototype.update = function (fps) {
-        this._state.update(fps);
-    };
-    StateContext.prototype.append = function (nodes) {
-        this._state.append(nodes);
-    };
-    StateContext.prototype.prepend = function (nodes) {
-        this._state.prepend(nodes);
-    };
-    StateContext.prototype.remove = function (n) {
-        this._state.remove(n);
-    };
-    StateContext.prototype.clear = function () {
-        this._state.clear();
-    };
-    StateContext.prototype.clearPrior = function () {
-        this._state.clearPrior();
-    };
-    StateContext.prototype.cut = function () {
-        this._state.cut();
-    };
-    StateContext.prototype.set = function (nodes) {
-        this._state.set(nodes);
-    };
-    StateContext.prototype.rotate = function (delta) {
-        this._state.rotate(delta);
-    };
-    StateContext.prototype.rotateUnbounded = function (delta) {
-        this._state.rotateUnbounded(delta);
-    };
-    StateContext.prototype.rotateWithoutInertia = function (delta) {
-        this._state.rotateWithoutInertia(delta);
-    };
-    StateContext.prototype.rotateBasic = function (basicRotation) {
-        this._state.rotateBasic(basicRotation);
-    };
-    StateContext.prototype.rotateBasicUnbounded = function (basicRotation) {
-        this._state.rotateBasicUnbounded(basicRotation);
-    };
-    StateContext.prototype.rotateBasicWithoutInertia = function (basicRotation) {
-        this._state.rotateBasicWithoutInertia(basicRotation);
-    };
-    StateContext.prototype.rotateToBasic = function (basic) {
-        this._state.rotateToBasic(basic);
-    };
-    StateContext.prototype.move = function (delta) {
-        this._state.move(delta);
-    };
-    StateContext.prototype.moveTo = function (delta) {
-        this._state.moveTo(delta);
-    };
-    StateContext.prototype.zoomIn = function (delta, reference) {
-        this._state.zoomIn(delta, reference);
-    };
-    StateContext.prototype.setSpeed = function (speed) {
-        this._state.setSpeed(speed);
-    };
-    StateContext.prototype.setTransitionMode = function (mode) {
-        this._state.setTransitionMode(mode);
-    };
-    StateContext.prototype.dolly = function (delta) {
-        this._state.dolly(delta);
-    };
-    StateContext.prototype.orbit = function (rotation) {
-        this._state.orbit(rotation);
-    };
-    StateContext.prototype.truck = function (direction) {
-        this._state.truck(direction);
-    };
-    return StateContext;
-}());
-exports.StateContext = StateContext;
-
-},{"../Geo":278,"../State":282}],415:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var State_1 = require("../State");
-var StateService = /** @class */ (function () {
-    function StateService(transitionMode) {
-        var _this = this;
-        this._appendNode$ = new rxjs_1.Subject();
-        this._start$ = new rxjs_1.Subject();
-        this._frame$ = new rxjs_1.Subject();
-        this._fpsSampleRate = 30;
-        this._contextOperation$ = new rxjs_1.BehaviorSubject(function (context) {
-            return context;
-        });
-        this._context$ = this._contextOperation$.pipe(operators_1.scan(function (context, operation) {
-            return operation(context);
-        }, new State_1.StateContext(transitionMode)), operators_1.publishReplay(1), operators_1.refCount());
-        this._state$ = this._context$.pipe(operators_1.map(function (context) {
-            return context.state;
-        }), operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._fps$ = this._start$.pipe(operators_1.switchMap(function () {
-            return _this._frame$.pipe(operators_1.bufferCount(1, _this._fpsSampleRate), operators_1.map(function (frameIds) {
-                return new Date().getTime();
-            }), operators_1.pairwise(), operators_1.map(function (times) {
-                return Math.max(20, 1000 * _this._fpsSampleRate / (times[1] - times[0]));
-            }), operators_1.startWith(60));
-        }), operators_1.share());
-        this._currentState$ = this._frame$.pipe(operators_1.withLatestFrom(this._fps$, this._context$, function (frameId, fps, context) {
-            return [frameId, fps, context];
-        }), operators_1.filter(function (fc) {
-            return fc[2].currentNode != null;
-        }), operators_1.tap(function (fc) {
-            fc[2].update(fc[1]);
-        }), operators_1.map(function (fc) {
-            return { fps: fc[1], id: fc[0], state: fc[2] };
-        }), operators_1.share());
-        this._lastState$ = this._currentState$.pipe(operators_1.publishReplay(1), operators_1.refCount());
-        var nodeChanged$ = this._currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (f) {
-            return f.state.currentNode.key;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        var nodeChangedSubject$ = new rxjs_1.Subject();
-        nodeChanged$
-            .subscribe(nodeChangedSubject$);
-        this._currentKey$ = new rxjs_1.BehaviorSubject(null);
-        nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentNode.key;
-        }))
-            .subscribe(this._currentKey$);
-        this._currentNode$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentNode;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._currentCamera$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentCamera;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._currentTransform$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.currentTransform;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._reference$ = nodeChangedSubject$.pipe(operators_1.map(function (f) {
-            return f.state.reference;
-        }), operators_1.distinctUntilChanged(function (r1, r2) {
-            return r1.lat === r2.lat && r1.lon === r2.lon;
-        }, function (reference) {
-            return { lat: reference.lat, lon: reference.lon };
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._currentNodeExternal$ = nodeChanged$.pipe(operators_1.map(function (f) {
-            return f.state.currentNode;
-        }), operators_1.publishReplay(1), operators_1.refCount());
-        this._appendNode$.pipe(operators_1.map(function (node) {
-            return function (context) {
-                context.append([node]);
-                return context;
-            };
-        }))
-            .subscribe(this._contextOperation$);
-        this._inMotionOperation$ = new rxjs_1.Subject();
-        nodeChanged$.pipe(operators_1.map(function (frame) {
-            return true;
-        }))
-            .subscribe(this._inMotionOperation$);
-        this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (moving) {
-            return moving;
-        }), operators_1.switchMap(function (moving) {
-            return _this._currentState$.pipe(operators_1.filter(function (frame) {
-                return frame.state.nodesAhead === 0;
-            }), operators_1.map(function (frame) {
-                return [frame.state.camera.clone(), frame.state.zoom];
-            }), operators_1.pairwise(), operators_1.map(function (pair) {
-                var c1 = pair[0][0];
-                var c2 = pair[1][0];
-                var z1 = pair[0][1];
-                var z2 = pair[1][1];
-                return c1.diff(c2) > 1e-5 || Math.abs(z1 - z2) > 1e-5;
-            }), operators_1.first(function (changed) {
-                return !changed;
-            }));
-        }))
-            .subscribe(this._inMotionOperation$);
-        this._inMotion$ = this._inMotionOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._inTranslationOperation$ = new rxjs_1.Subject();
-        nodeChanged$.pipe(operators_1.map(function (frame) {
-            return true;
-        }))
-            .subscribe(this._inTranslationOperation$);
-        this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.filter(function (inTranslation) {
-            return inTranslation;
-        }), operators_1.switchMap(function (inTranslation) {
-            return _this._currentState$.pipe(operators_1.filter(function (frame) {
-                return frame.state.nodesAhead === 0;
-            }), operators_1.map(function (frame) {
-                return frame.state.camera.position.clone();
-            }), operators_1.pairwise(), operators_1.map(function (pair) {
-                return pair[0].distanceToSquared(pair[1]) !== 0;
-            }), operators_1.first(function (changed) {
-                return !changed;
-            }));
-        }))
-            .subscribe(this._inTranslationOperation$);
-        this._inTranslation$ = this._inTranslationOperation$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._state$.subscribe(function () { });
-        this._currentNode$.subscribe(function () { });
-        this._currentCamera$.subscribe(function () { });
-        this._currentTransform$.subscribe(function () { });
-        this._reference$.subscribe(function () { });
-        this._currentNodeExternal$.subscribe(function () { });
-        this._lastState$.subscribe(function () { });
-        this._inMotion$.subscribe(function () { });
-        this._inTranslation$.subscribe(function () { });
-        this._frameId = null;
-        this._frameGenerator = new State_1.FrameGenerator(window);
-    }
-    Object.defineProperty(StateService.prototype, "currentState$", {
-        get: function () {
-            return this._currentState$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNode$", {
-        get: function () {
-            return this._currentNode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentKey$", {
-        get: function () {
-            return this._currentKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentNodeExternal$", {
-        get: function () {
-            return this._currentNodeExternal$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentCamera$", {
-        get: function () {
-            return this._currentCamera$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "currentTransform$", {
-        get: function () {
-            return this._currentTransform$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "state$", {
-        get: function () {
-            return this._state$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "reference$", {
-        get: function () {
-            return this._reference$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "inMotion$", {
-        get: function () {
-            return this._inMotion$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "inTranslation$", {
-        get: function () {
-            return this._inTranslation$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateService.prototype, "appendNode$", {
-        get: function () {
-            return this._appendNode$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StateService.prototype.earth = function () {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.earth(); });
-    };
-    StateService.prototype.traverse = function () {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.traverse(); });
-    };
-    StateService.prototype.wait = function () {
-        this._invokeContextOperation(function (context) { context.wait(); });
-    };
-    StateService.prototype.waitInteractively = function () {
-        this._invokeContextOperation(function (context) { context.waitInteractively(); });
-    };
-    StateService.prototype.appendNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.append(nodes); });
-    };
-    StateService.prototype.prependNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.prepend(nodes); });
-    };
-    StateService.prototype.removeNodes = function (n) {
-        this._invokeContextOperation(function (context) { context.remove(n); });
-    };
-    StateService.prototype.clearNodes = function () {
-        this._invokeContextOperation(function (context) { context.clear(); });
-    };
-    StateService.prototype.clearPriorNodes = function () {
-        this._invokeContextOperation(function (context) { context.clearPrior(); });
-    };
-    StateService.prototype.cutNodes = function () {
-        this._invokeContextOperation(function (context) { context.cut(); });
-    };
-    StateService.prototype.setNodes = function (nodes) {
-        this._invokeContextOperation(function (context) { context.set(nodes); });
-    };
-    StateService.prototype.rotate = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotate(delta); });
-    };
-    StateService.prototype.rotateUnbounded = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateUnbounded(delta); });
-    };
-    StateService.prototype.rotateWithoutInertia = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateWithoutInertia(delta); });
-    };
-    StateService.prototype.rotateBasic = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasic(basicRotation); });
-    };
-    StateService.prototype.rotateBasicUnbounded = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasicUnbounded(basicRotation); });
-    };
-    StateService.prototype.rotateBasicWithoutInertia = function (basicRotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateBasicWithoutInertia(basicRotation); });
-    };
-    StateService.prototype.rotateToBasic = function (basic) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.rotateToBasic(basic); });
-    };
-    StateService.prototype.move = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.move(delta); });
-    };
-    StateService.prototype.moveTo = function (position) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.moveTo(position); });
-    };
-    StateService.prototype.dolly = function (delta) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.dolly(delta); });
-    };
-    StateService.prototype.orbit = function (rotation) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.orbit(rotation); });
-    };
-    StateService.prototype.truck = function (direction) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.truck(direction); });
-    };
-    /**
-     * Change zoom level while keeping the reference point position approximately static.
-     *
-     * @parameter {number} delta - Change in zoom level.
-     * @parameter {Array<number>} reference - Reference point in basic coordinates.
-     */
-    StateService.prototype.zoomIn = function (delta, reference) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.zoomIn(delta, reference); });
-    };
-    StateService.prototype.getCenter = function () {
-        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
-            return frame.state.getCenter();
-        }));
-    };
-    StateService.prototype.getZoom = function () {
-        return this._lastState$.pipe(operators_1.first(), operators_1.map(function (frame) {
-            return frame.state.zoom;
-        }));
-    };
-    StateService.prototype.setCenter = function (center) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setCenter(center); });
-    };
-    StateService.prototype.setSpeed = function (speed) {
-        this._invokeContextOperation(function (context) { context.setSpeed(speed); });
-    };
-    StateService.prototype.setTransitionMode = function (mode) {
-        this._invokeContextOperation(function (context) { context.setTransitionMode(mode); });
-    };
-    StateService.prototype.setZoom = function (zoom) {
-        this._inMotionOperation$.next(true);
-        this._invokeContextOperation(function (context) { context.setZoom(zoom); });
-    };
-    StateService.prototype.start = function () {
-        if (this._frameId == null) {
-            this._start$.next(null);
-            this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-            this._frame$.next(this._frameId);
-        }
-    };
-    StateService.prototype.stop = function () {
-        if (this._frameId != null) {
-            this._frameGenerator.cancelAnimationFrame(this._frameId);
-            this._frameId = null;
-        }
-    };
-    StateService.prototype._invokeContextOperation = function (action) {
-        this._contextOperation$
-            .next(function (context) {
-            action(context);
-            return context;
-        });
-    };
-    StateService.prototype._frame = function (time) {
-        this._frameId = this._frameGenerator.requestAnimationFrame(this._frame.bind(this));
-        this._frame$.next(this._frameId);
-    };
-    return StateService;
-}());
-exports.StateService = StateService;
-
-},{"../State":282,"rxjs":27,"rxjs/operators":225}],416:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for transition mode
- * @enum {number}
- * @readonly
- * @description Modes for specifying how transitions
- * between nodes are performed.
- */
-var TransitionMode;
-(function (TransitionMode) {
-    /**
-     * Default transitions.
-     *
-     * @description The viewer dynamically determines
-     * whether transitions should be performed with or
-     * without motion and blending for each transition
-     * based on the underlying data.
-     */
-    TransitionMode[TransitionMode["Default"] = 0] = "Default";
-    /**
-     * Instantaneous transitions.
-     *
-     * @description All transitions are performed
-     * without motion or blending.
-     */
-    TransitionMode[TransitionMode["Instantaneous"] = 1] = "Instantaneous";
-})(TransitionMode = exports.TransitionMode || (exports.TransitionMode = {}));
-exports.default = TransitionMode;
-
-},{}],417:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var State_1 = require("../../State");
-var EarthState = /** @class */ (function (_super) {
-    __extends(EarthState, _super);
-    function EarthState(state) {
-        var _this = _super.call(this, state) || this;
-        var viewingDirection = _this._camera.lookat
-            .clone()
-            .sub(_this._camera.position)
-            .normalize();
-        _this._camera.lookat.copy(_this._camera.position);
-        _this._camera.position.z = state.camera.position.z + 20;
-        _this._camera.position.x = state.camera.position.x - 16 * viewingDirection.x;
-        _this._camera.position.y = state.camera.position.y - 16 * viewingDirection.y;
-        _this._camera.up.set(0, 0, 1);
-        return _this;
-    }
-    EarthState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    EarthState.prototype.wait = function () {
-        return new State_1.WaitingState(this);
-    };
-    EarthState.prototype.waitInteractively = function () {
-        return new State_1.InteractiveWaitingState(this);
-    };
-    EarthState.prototype.dolly = function (delta) {
-        var camera = this._camera;
-        var offset = new THREE.Vector3()
-            .copy(camera.position)
-            .sub(camera.lookat);
-        var length = offset.length();
-        var scaled = length * Math.pow(2, -delta);
-        var clipped = Math.max(1, Math.min(scaled, 1000));
-        offset.normalize();
-        offset.multiplyScalar(clipped);
-        camera.position.copy(camera.lookat).add(offset);
-    };
-    EarthState.prototype.orbit = function (rotation) {
-        var camera = this._camera;
-        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3();
-        offset.copy(camera.position).sub(camera.lookat);
-        offset.applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += rotation.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += rotation.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        camera.position.copy(camera.lookat).add(offset.multiplyScalar(length));
-    };
-    EarthState.prototype.truck = function (direction) {
-        this._camera.position.add(new THREE.Vector3().fromArray(direction));
-        this._camera.lookat.add(new THREE.Vector3().fromArray(direction));
-    };
-    EarthState.prototype.update = function () { };
-    return EarthState;
-}(State_1.StateBase));
-exports.EarthState = EarthState;
-exports.default = EarthState;
-
-
-},{"../../State":282,"three":226}],418:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var State_1 = require("../../State");
-var InteractiveStateBase = /** @class */ (function (_super) {
-    __extends(InteractiveStateBase, _super);
-    function InteractiveStateBase(state) {
-        var _this = _super.call(this, state) || this;
-        _this._animationSpeed = 1 / 40;
-        _this._rotationDelta = new State_1.RotationDelta(0, 0);
-        _this._requestedRotationDelta = null;
-        _this._basicRotation = [0, 0];
-        _this._requestedBasicRotation = null;
-        _this._requestedBasicRotationUnbounded = null;
-        _this._rotationAcceleration = 0.86;
-        _this._rotationIncreaseAlpha = 0.97;
-        _this._rotationDecreaseAlpha = 0.9;
-        _this._rotationThreshold = 1e-3;
-        _this._unboundedRotationAlpha = 0.8;
-        _this._desiredZoom = state.zoom;
-        _this._minZoom = 0;
-        _this._maxZoom = 3;
-        _this._lookatDepth = 10;
-        _this._desiredLookat = null;
-        _this._desiredCenter = null;
-        return _this;
-    }
-    InteractiveStateBase.prototype.rotate = function (rotationDelta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        if (rotationDelta.phi === 0 && rotationDelta.theta === 0) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedBasicRotation = null;
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta.phi = this._requestedRotationDelta.phi + rotationDelta.phi;
-            this._requestedRotationDelta.theta = this._requestedRotationDelta.theta + rotationDelta.theta;
-        }
-        else {
-            this._requestedRotationDelta = new State_1.RotationDelta(rotationDelta.phi, rotationDelta.theta);
-        }
-    };
-    InteractiveStateBase.prototype.rotateUnbounded = function (delta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._requestedBasicRotation = null;
-        this._requestedRotationDelta = null;
-        this._applyRotation(delta, this._currentCamera);
-        this._applyRotation(delta, this._previousCamera);
-        if (!this._desiredLookat) {
-            return;
-        }
-        var q = new THREE.Quaternion().setFromUnitVectors(this._currentCamera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3()
-            .copy(this._desiredLookat)
-            .sub(this._camera.position)
-            .applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += delta.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += delta.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        this._desiredLookat
-            .copy(this._camera.position)
-            .add(offset.multiplyScalar(length));
-    };
-    InteractiveStateBase.prototype.rotateWithoutInertia = function (rotationDelta) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedBasicRotation = null;
-        this._requestedRotationDelta = null;
-        var threshold = Math.PI / (10 * Math.pow(2, this._zoom));
-        var delta = {
-            phi: this._spatial.clamp(rotationDelta.phi, -threshold, threshold),
-            theta: this._spatial.clamp(rotationDelta.theta, -threshold, threshold),
-        };
-        this._applyRotation(delta, this._currentCamera);
-        this._applyRotation(delta, this._previousCamera);
-    };
-    InteractiveStateBase.prototype.rotateBasic = function (basicRotation) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation[0] += basicRotation[0];
-            this._requestedBasicRotation[1] += basicRotation[1];
-            var threshold = 0.05 / Math.pow(2, this._zoom);
-            this._requestedBasicRotation[0] =
-                this._spatial.clamp(this._requestedBasicRotation[0], -threshold, threshold);
-            this._requestedBasicRotation[1] =
-                this._spatial.clamp(this._requestedBasicRotation[1], -threshold, threshold);
-        }
-        else {
-            this._requestedBasicRotation = basicRotation.slice();
-        }
-    };
-    InteractiveStateBase.prototype.rotateBasicUnbounded = function (basicRotation) {
-        if (this._currentNode == null) {
-            return;
-        }
-        if (this._requestedBasicRotationUnbounded != null) {
-            this._requestedBasicRotationUnbounded[0] += basicRotation[0];
-            this._requestedBasicRotationUnbounded[1] += basicRotation[1];
-        }
-        else {
-            this._requestedBasicRotationUnbounded = basicRotation.slice();
-        }
-    };
-    InteractiveStateBase.prototype.rotateBasicWithoutInertia = function (basic) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        var threshold = 0.05 / Math.pow(2, this._zoom);
-        var basicRotation = basic.slice();
-        basicRotation[0] = this._spatial.clamp(basicRotation[0], -threshold, threshold);
-        basicRotation[1] = this._spatial.clamp(basicRotation[1], -threshold, threshold);
-        this._applyRotationBasic(basicRotation);
-    };
-    InteractiveStateBase.prototype.rotateToBasic = function (basic) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = this._zoom;
-        this._desiredLookat = null;
-        basic[0] = this._spatial.clamp(basic[0], 0, 1);
-        basic[1] = this._spatial.clamp(basic[1], 0, 1);
-        var lookat = this.currentTransform.unprojectBasic(basic, this._lookatDepth);
-        this._currentCamera.lookat.fromArray(lookat);
-    };
-    InteractiveStateBase.prototype.zoomIn = function (delta, reference) {
-        if (this._currentNode == null) {
-            return;
-        }
-        this._desiredZoom = Math.max(this._minZoom, Math.min(this._maxZoom, this._desiredZoom + delta));
-        var currentCenter = this.currentTransform.projectBasic(this._currentCamera.lookat.toArray());
-        var currentCenterX = currentCenter[0];
-        var currentCenterY = currentCenter[1];
-        var zoom0 = Math.pow(2, this._zoom);
-        var zoom1 = Math.pow(2, this._desiredZoom);
-        var refX = reference[0];
-        var refY = reference[1];
-        if (this.currentTransform.gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            if (refX - currentCenterX > 0.5) {
-                refX = refX - 1;
-            }
-            else if (currentCenterX - refX > 0.5) {
-                refX = 1 + refX;
-            }
-        }
-        var newCenterX = refX - zoom0 / zoom1 * (refX - currentCenterX);
-        var newCenterY = refY - zoom0 / zoom1 * (refY - currentCenterY);
-        var gpano = this.currentTransform.gpano;
-        if (this._currentNode.fullPano) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0.05, 0.95);
-        }
-        else if (gpano != null &&
-            this.currentTransform.gpano.CroppedAreaImageWidthPixels === this.currentTransform.gpano.FullPanoWidthPixels) {
-            newCenterX = this._spatial.wrap(newCenterX + this._basicRotation[0], 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY + this._basicRotation[1], 0, 1);
-        }
-        else {
-            newCenterX = this._spatial.clamp(newCenterX, 0, 1);
-            newCenterY = this._spatial.clamp(newCenterY, 0, 1);
-        }
-        this._desiredLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic([newCenterX, newCenterY], this._lookatDepth));
-    };
-    InteractiveStateBase.prototype.setCenter = function (center) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._desiredZoom = this._zoom;
-        var clamped = [
-            this._spatial.clamp(center[0], 0, 1),
-            this._spatial.clamp(center[1], 0, 1),
-        ];
-        if (this._currentNode == null) {
-            this._desiredCenter = clamped;
-            return;
-        }
-        this._desiredCenter = null;
-        var currentLookat = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(clamped, this._lookatDepth));
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var previousLookat = new THREE.Vector3()
-            .fromArray(previousTransform.unprojectBasic(clamped, this._lookatDepth));
-        this._currentCamera.lookat.copy(currentLookat);
-        this._previousCamera.lookat.copy(previousLookat);
-    };
-    InteractiveStateBase.prototype.setZoom = function (zoom) {
-        this._desiredLookat = null;
-        this._requestedRotationDelta = null;
-        this._requestedBasicRotation = null;
-        this._zoom = this._spatial.clamp(zoom, this._minZoom, this._maxZoom);
-        this._desiredZoom = this._zoom;
-    };
-    InteractiveStateBase.prototype._applyRotation = function (delta, camera) {
-        if (camera == null) {
-            return;
-        }
-        var q = new THREE.Quaternion().setFromUnitVectors(camera.up, new THREE.Vector3(0, 0, 1));
-        var qInverse = q.clone().inverse();
-        var offset = new THREE.Vector3();
-        offset.copy(camera.lookat).sub(camera.position);
-        offset.applyQuaternion(q);
-        var length = offset.length();
-        var phi = Math.atan2(offset.y, offset.x);
-        phi += delta.phi;
-        var theta = Math.atan2(Math.sqrt(offset.x * offset.x + offset.y * offset.y), offset.z);
-        theta += delta.theta;
-        theta = Math.max(0.1, Math.min(Math.PI - 0.1, theta));
-        offset.x = Math.sin(theta) * Math.cos(phi);
-        offset.y = Math.sin(theta) * Math.sin(phi);
-        offset.z = Math.cos(theta);
-        offset.applyQuaternion(qInverse);
-        camera.lookat.copy(camera.position).add(offset.multiplyScalar(length));
-    };
-    InteractiveStateBase.prototype._applyRotationBasic = function (basicRotation) {
-        var currentNode = this._currentNode;
-        var previousNode = this._previousNode != null ?
-            this.previousNode :
-            this.currentNode;
-        var currentCamera = this._currentCamera;
-        var previousCamera = this._previousCamera;
-        var currentTransform = this.currentTransform;
-        var previousTransform = this.previousTransform != null ?
-            this.previousTransform :
-            this.currentTransform;
-        var currentBasic = currentTransform.projectBasic(currentCamera.lookat.toArray());
-        var previousBasic = previousTransform.projectBasic(previousCamera.lookat.toArray());
-        var currentGPano = currentTransform.gpano;
-        var previousGPano = previousTransform.gpano;
-        if (currentNode.fullPano) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0.05, 0.95);
-        }
-        else if (currentGPano != null &&
-            currentTransform.gpano.CroppedAreaImageWidthPixels === currentTransform.gpano.FullPanoWidthPixels) {
-            currentBasic[0] = this._spatial.wrap(currentBasic[0] + basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
-        }
-        else {
-            currentBasic[0] = this._spatial.clamp(currentBasic[0] + basicRotation[0], 0, 1);
-            currentBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
-        }
-        if (previousNode.fullPano) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0.05, 0.95);
-        }
-        else if (previousGPano != null &&
-            previousTransform.gpano.CroppedAreaImageWidthPixels === previousTransform.gpano.FullPanoWidthPixels) {
-            previousBasic[0] = this._spatial.wrap(previousBasic[0] + basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(previousBasic[1] + basicRotation[1], 0, 1);
-        }
-        else {
-            previousBasic[0] = this._spatial.clamp(previousBasic[0] + basicRotation[0], 0, 1);
-            previousBasic[1] = this._spatial.clamp(currentBasic[1] + basicRotation[1], 0, 1);
-        }
-        var currentLookat = currentTransform.unprojectBasic(currentBasic, this._lookatDepth);
-        currentCamera.lookat.fromArray(currentLookat);
-        var previousLookat = previousTransform.unprojectBasic(previousBasic, this._lookatDepth);
-        previousCamera.lookat.fromArray(previousLookat);
-    };
-    InteractiveStateBase.prototype._updateZoom = function (animationSpeed) {
-        var diff = this._desiredZoom - this._zoom;
-        var sign = diff > 0 ? 1 : diff < 0 ? -1 : 0;
-        if (diff === 0) {
-            return;
-        }
-        else if (Math.abs(diff) < 2e-3) {
-            this._zoom = this._desiredZoom;
-            if (this._desiredLookat != null) {
-                this._desiredLookat = null;
-            }
-        }
-        else {
-            this._zoom += sign * Math.max(Math.abs(5 * animationSpeed * diff), 2e-3);
-        }
-    };
-    InteractiveStateBase.prototype._updateLookat = function (animationSpeed) {
-        if (this._desiredLookat === null) {
-            return;
-        }
-        var diff = this._desiredLookat.distanceToSquared(this._currentCamera.lookat);
-        if (Math.abs(diff) < 1e-6) {
-            this._currentCamera.lookat.copy(this._desiredLookat);
-            this._desiredLookat = null;
-        }
-        else {
-            this._currentCamera.lookat.lerp(this._desiredLookat, 5 * animationSpeed);
-        }
-    };
-    InteractiveStateBase.prototype._updateRotation = function () {
-        if (this._requestedRotationDelta != null) {
-            var length_1 = this._rotationDelta.lengthSquared();
-            var requestedLength = this._requestedRotationDelta.lengthSquared();
-            if (requestedLength > length_1) {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationIncreaseAlpha);
-            }
-            else {
-                this._rotationDelta.lerp(this._requestedRotationDelta, this._rotationDecreaseAlpha);
-            }
-            this._requestedRotationDelta = null;
-            return;
-        }
-        if (this._rotationDelta.isZero) {
-            return;
-        }
-        var alpha = this.currentNode.fullPano ? 1 : this._alpha;
-        this._rotationDelta.multiply(this._rotationAcceleration * alpha);
-        this._rotationDelta.threshold(this._rotationThreshold);
-    };
-    InteractiveStateBase.prototype._updateRotationBasic = function () {
-        if (this._requestedBasicRotation != null) {
-            var x = this._basicRotation[0];
-            var y = this._basicRotation[1];
-            var reqX = this._requestedBasicRotation[0];
-            var reqY = this._requestedBasicRotation[1];
-            if (Math.abs(reqX) > Math.abs(x)) {
-                this._basicRotation[0] = (1 - this._rotationIncreaseAlpha) * x + this._rotationIncreaseAlpha * reqX;
-            }
-            else {
-                this._basicRotation[0] = (1 - this._rotationDecreaseAlpha) * x + this._rotationDecreaseAlpha * reqX;
-            }
-            if (Math.abs(reqY) > Math.abs(y)) {
-                this._basicRotation[1] = (1 - this._rotationIncreaseAlpha) * y + this._rotationIncreaseAlpha * reqY;
-            }
-            else {
-                this._basicRotation[1] = (1 - this._rotationDecreaseAlpha) * y + this._rotationDecreaseAlpha * reqY;
-            }
-            this._requestedBasicRotation = null;
-            return;
-        }
-        if (this._requestedBasicRotationUnbounded != null) {
-            var reqX = this._requestedBasicRotationUnbounded[0];
-            var reqY = this._requestedBasicRotationUnbounded[1];
-            if (Math.abs(reqX) > 0) {
-                this._basicRotation[0] = (1 - this._unboundedRotationAlpha) * this._basicRotation[0] + this._unboundedRotationAlpha * reqX;
-            }
-            if (Math.abs(reqY) > 0) {
-                this._basicRotation[1] = (1 - this._unboundedRotationAlpha) * this._basicRotation[1] + this._unboundedRotationAlpha * reqY;
-            }
-            if (this._desiredLookat != null) {
-                var desiredBasicLookat = this.currentTransform.projectBasic(this._desiredLookat.toArray());
-                desiredBasicLookat[0] += reqX;
-                desiredBasicLookat[1] += reqY;
-                this._desiredLookat = new THREE.Vector3()
-                    .fromArray(this.currentTransform.unprojectBasic(desiredBasicLookat, this._lookatDepth));
-            }
-            this._requestedBasicRotationUnbounded = null;
-        }
-        if (this._basicRotation[0] === 0 && this._basicRotation[1] === 0) {
-            return;
-        }
-        this._basicRotation[0] = this._rotationAcceleration * this._basicRotation[0];
-        this._basicRotation[1] = this._rotationAcceleration * this._basicRotation[1];
-        if (Math.abs(this._basicRotation[0]) < this._rotationThreshold / Math.pow(2, this._zoom) &&
-            Math.abs(this._basicRotation[1]) < this._rotationThreshold / Math.pow(2, this._zoom)) {
-            this._basicRotation = [0, 0];
-        }
-    };
-    InteractiveStateBase.prototype._clearRotation = function () {
-        if (this._currentNode.fullPano) {
-            return;
-        }
-        if (this._requestedRotationDelta != null) {
-            this._requestedRotationDelta = null;
-        }
-        if (!this._rotationDelta.isZero) {
-            this._rotationDelta.reset();
-        }
-        if (this._requestedBasicRotation != null) {
-            this._requestedBasicRotation = null;
-        }
-        if (this._basicRotation[0] > 0 || this._basicRotation[1] > 0) {
-            this._basicRotation = [0, 0];
-        }
-    };
-    InteractiveStateBase.prototype._setDesiredCenter = function () {
-        if (this._desiredCenter == null) {
-            return;
-        }
-        var lookatDirection = new THREE.Vector3()
-            .fromArray(this.currentTransform.unprojectBasic(this._desiredCenter, this._lookatDepth))
-            .sub(this._currentCamera.position);
-        this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(lookatDirection));
-        this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(lookatDirection));
-        this._desiredCenter = null;
-    };
-    InteractiveStateBase.prototype._setDesiredZoom = function () {
-        this._desiredZoom =
-            this._currentNode.fullPano || this._previousNode == null ?
-                this._zoom : 0;
-    };
-    return InteractiveStateBase;
-}(State_1.StateBase));
-exports.InteractiveStateBase = InteractiveStateBase;
-exports.default = InteractiveStateBase;
-
-
-},{"../../State":282,"three":226}],419:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var State_1 = require("../../State");
-var InteractiveWaitingState = /** @class */ (function (_super) {
-    __extends(InteractiveWaitingState, _super);
-    function InteractiveWaitingState(state) {
-        var _this = _super.call(this, state) || this;
-        _this._adjustCameras();
-        _this._motionless = _this._motionlessTransition();
-        return _this;
-    }
-    InteractiveWaitingState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    InteractiveWaitingState.prototype.wait = function () {
-        return new State_1.WaitingState(this);
-    };
-    InteractiveWaitingState.prototype.prepend = function (nodes) {
-        _super.prototype.prepend.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    InteractiveWaitingState.prototype.set = function (nodes) {
-        _super.prototype.set.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    InteractiveWaitingState.prototype.move = function (delta) {
-        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
-    };
-    InteractiveWaitingState.prototype.moveTo = function (position) {
-        this._alpha = Math.max(0, Math.min(1, position));
-    };
-    InteractiveWaitingState.prototype.update = function (fps) {
-        this._updateRotation();
-        if (!this._rotationDelta.isZero) {
-            this._applyRotation(this._rotationDelta, this._previousCamera);
-            this._applyRotation(this._rotationDelta, this._currentCamera);
-        }
-        this._updateRotationBasic();
-        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
-            this._applyRotationBasic(this._basicRotation);
-        }
-        var animationSpeed = this._animationSpeed * (60 / fps);
-        this._updateZoom(animationSpeed);
-        this._updateLookat(animationSpeed);
-        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
-    };
-    InteractiveWaitingState.prototype._getAlpha = function () {
-        return this._motionless ? Math.round(this._alpha) : this._alpha;
-    };
-    InteractiveWaitingState.prototype._setCurrentCamera = function () {
-        _super.prototype._setCurrentCamera.call(this);
-        this._adjustCameras();
-    };
-    InteractiveWaitingState.prototype._adjustCameras = function () {
-        if (this._previousNode == null) {
-            return;
-        }
-        if (this._currentNode.fullPano) {
-            var lookat = this._camera.lookat.clone().sub(this._camera.position);
-            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
-        }
-        if (this._previousNode.fullPano) {
-            var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position);
-            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
-        }
-    };
-    return InteractiveWaitingState;
-}(State_1.InteractiveStateBase));
-exports.InteractiveWaitingState = InteractiveWaitingState;
-exports.default = InteractiveWaitingState;
-
-},{"../../State":282}],420:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Error_1 = require("../../Error");
-var Geo_1 = require("../../Geo");
-var State_1 = require("../../State");
-var StateBase = /** @class */ (function () {
-    function StateBase(state) {
-        this._spatial = new Geo_1.Spatial();
-        this._geoCoords = new Geo_1.GeoCoords();
-        this._referenceThreshold = 0.01;
-        this._transitionMode = state.transitionMode;
-        this._reference = state.reference;
-        this._alpha = state.alpha;
-        this._camera = state.camera.clone();
-        this._zoom = state.zoom;
-        this._currentIndex = state.currentIndex;
-        this._trajectory = state.trajectory.slice();
-        this._trajectoryTransforms = [];
-        this._trajectoryCameras = [];
-        for (var _i = 0, _a = this._trajectory; _i < _a.length; _i++) {
-            var node = _a[_i];
-            var translation = this._nodeToTranslation(node, this._reference);
-            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
-            this._trajectoryTransforms.push(transform);
-            this._trajectoryCameras.push(new Geo_1.Camera(transform));
-        }
-        this._currentNode = this._trajectory.length > 0 ?
-            this._trajectory[this._currentIndex] :
-            null;
-        this._previousNode = this._trajectory.length > 1 && this.currentIndex > 0 ?
-            this._trajectory[this._currentIndex - 1] :
-            null;
-        this._currentCamera = this._trajectoryCameras.length > 0 ?
-            this._trajectoryCameras[this._currentIndex].clone() :
-            new Geo_1.Camera();
-        this._previousCamera = this._trajectoryCameras.length > 1 && this.currentIndex > 0 ?
-            this._trajectoryCameras[this._currentIndex - 1].clone() :
-            this._currentCamera.clone();
-    }
-    Object.defineProperty(StateBase.prototype, "reference", {
-        get: function () {
-            return this._reference;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "alpha", {
-        get: function () {
-            return this._getAlpha();
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "camera", {
-        get: function () {
-            return this._camera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "zoom", {
-        get: function () {
-            return this._zoom;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "trajectory", {
-        get: function () {
-            return this._trajectory;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentIndex", {
-        get: function () {
-            return this._currentIndex;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentNode", {
-        get: function () {
-            return this._currentNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "previousNode", {
-        get: function () {
-            return this._previousNode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentCamera", {
-        get: function () {
-            return this._currentCamera;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "currentTransform", {
-        get: function () {
-            return this._trajectoryTransforms.length > 0 ?
-                this._trajectoryTransforms[this.currentIndex] : null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "previousTransform", {
-        get: function () {
-            return this._trajectoryTransforms.length > 1 && this.currentIndex > 0 ?
-                this._trajectoryTransforms[this.currentIndex - 1] : null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "motionless", {
-        get: function () {
-            return this._motionless;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(StateBase.prototype, "transitionMode", {
-        get: function () {
-            return this._transitionMode;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    StateBase.prototype.earth = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.traverse = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.wait = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.waitInteractively = function () { throw new Error("Not implemented"); };
-    StateBase.prototype.move = function (delta) { };
-    StateBase.prototype.moveTo = function (position) { };
-    StateBase.prototype.rotate = function (delta) { };
-    StateBase.prototype.rotateUnbounded = function (delta) { };
-    StateBase.prototype.rotateWithoutInertia = function (delta) { };
-    StateBase.prototype.rotateBasic = function (basicRotation) { };
-    StateBase.prototype.rotateBasicUnbounded = function (basicRotation) { };
-    StateBase.prototype.rotateBasicWithoutInertia = function (basicRotation) { };
-    StateBase.prototype.rotateToBasic = function (basic) { };
-    StateBase.prototype.setSpeed = function (speed) { };
-    StateBase.prototype.zoomIn = function (delta, reference) { };
-    StateBase.prototype.update = function (fps) { };
-    StateBase.prototype.setCenter = function (center) { };
-    StateBase.prototype.setZoom = function (zoom) { };
-    StateBase.prototype.dolly = function (delta) { };
-    StateBase.prototype.orbit = function (rotation) { };
-    StateBase.prototype.truck = function (direction) { };
-    StateBase.prototype.append = function (nodes) {
-        if (nodes.length < 1) {
-            throw Error("Trajectory can not be empty");
-        }
-        if (this._currentIndex < 0) {
-            this.set(nodes);
-        }
-        else {
-            this._trajectory = this._trajectory.concat(nodes);
-            this._appendToTrajectories(nodes);
-        }
-    };
-    StateBase.prototype.prepend = function (nodes) {
-        if (nodes.length < 1) {
-            throw Error("Trajectory can not be empty");
-        }
-        this._trajectory = nodes.slice().concat(this._trajectory);
-        this._currentIndex += nodes.length;
-        this._setCurrentNode();
-        var referenceReset = this._setReference(this._currentNode);
-        if (referenceReset) {
-            this._setTrajectories();
-        }
-        else {
-            this._prependToTrajectories(nodes);
-        }
-        this._setCurrentCamera();
-    };
-    StateBase.prototype.remove = function (n) {
-        if (n < 0) {
-            throw Error("n must be a positive integer");
-        }
-        if (this._currentIndex - 1 < n) {
-            throw Error("Current and previous nodes can not be removed");
-        }
-        for (var i = 0; i < n; i++) {
-            this._trajectory.shift();
-            this._trajectoryTransforms.shift();
-            this._trajectoryCameras.shift();
-            this._currentIndex--;
-        }
-        this._setCurrentNode();
-    };
-    StateBase.prototype.clearPrior = function () {
-        if (this._currentIndex > 0) {
-            this.remove(this._currentIndex - 1);
-        }
-    };
-    StateBase.prototype.clear = function () {
-        this.cut();
-        if (this._currentIndex > 0) {
-            this.remove(this._currentIndex - 1);
-        }
-    };
-    StateBase.prototype.cut = function () {
-        while (this._trajectory.length - 1 > this._currentIndex) {
-            this._trajectory.pop();
-            this._trajectoryTransforms.pop();
-            this._trajectoryCameras.pop();
-        }
-    };
-    StateBase.prototype.set = function (nodes) {
-        this._setTrajectory(nodes);
-        this._setCurrentNode();
-        this._setReference(this._currentNode);
-        this._setTrajectories();
-        this._setCurrentCamera();
-    };
-    StateBase.prototype.getCenter = function () {
-        return this._currentNode != null ?
-            this.currentTransform.projectBasic(this._camera.lookat.toArray()) :
-            [0.5, 0.5];
-    };
-    StateBase.prototype.setTransitionMode = function (mode) {
-        this._transitionMode = mode;
-    };
-    StateBase.prototype._getAlpha = function () { return 1; };
-    StateBase.prototype._setCurrent = function () {
-        this._setCurrentNode();
-        var referenceReset = this._setReference(this._currentNode);
-        if (referenceReset) {
-            this._setTrajectories();
-        }
-        this._setCurrentCamera();
-    };
-    StateBase.prototype._setCurrentCamera = function () {
-        this._currentCamera = this._trajectoryCameras[this._currentIndex].clone();
-        this._previousCamera = this._currentIndex > 0 ?
-            this._trajectoryCameras[this._currentIndex - 1].clone() :
-            this._currentCamera.clone();
-    };
-    StateBase.prototype._motionlessTransition = function () {
-        var nodesSet = this._currentNode != null && this._previousNode != null;
-        return nodesSet && (this._transitionMode === State_1.TransitionMode.Instantaneous || !(this._currentNode.merged &&
-            this._previousNode.merged &&
-            this._withinOriginalDistance() &&
-            this._sameConnectedComponent()));
-    };
-    StateBase.prototype._setReference = function (node) {
-        // do not reset reference if node is within threshold distance
-        if (Math.abs(node.latLon.lat - this.reference.lat) < this._referenceThreshold &&
-            Math.abs(node.latLon.lon - this.reference.lon) < this._referenceThreshold) {
-            return false;
-        }
-        // do not reset reference if previous node exist and transition is with motion
-        if (this._previousNode != null && !this._motionlessTransition()) {
-            return false;
-        }
-        this._reference.lat = node.latLon.lat;
-        this._reference.lon = node.latLon.lon;
-        this._reference.alt = node.alt;
-        return true;
-    };
-    StateBase.prototype._setCurrentNode = function () {
-        this._currentNode = this._trajectory.length > 0 ?
-            this._trajectory[this._currentIndex] :
-            null;
-        this._previousNode = this._currentIndex > 0 ?
-            this._trajectory[this._currentIndex - 1] :
-            null;
-    };
-    StateBase.prototype._setTrajectory = function (nodes) {
-        if (nodes.length < 1) {
-            throw new Error_1.ArgumentMapillaryError("Trajectory can not be empty");
-        }
-        if (this._currentNode != null) {
-            this._trajectory = [this._currentNode].concat(nodes);
-            this._currentIndex = 1;
-        }
-        else {
-            this._trajectory = nodes.slice();
-            this._currentIndex = 0;
-        }
-    };
-    StateBase.prototype._setTrajectories = function () {
-        this._trajectoryTransforms.length = 0;
-        this._trajectoryCameras.length = 0;
-        this._appendToTrajectories(this._trajectory);
-    };
-    StateBase.prototype._appendToTrajectories = function (nodes) {
-        for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-            var node = nodes_1[_i];
-            if (!node.assetsCached) {
-                throw new Error_1.ArgumentMapillaryError("Assets must be cached when node is added to trajectory");
-            }
-            var translation = this._nodeToTranslation(node, this.reference);
-            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
-            this._trajectoryTransforms.push(transform);
-            this._trajectoryCameras.push(new Geo_1.Camera(transform));
-        }
-    };
-    StateBase.prototype._prependToTrajectories = function (nodes) {
-        for (var _i = 0, _a = nodes.reverse(); _i < _a.length; _i++) {
-            var node = _a[_i];
-            if (!node.assetsCached) {
-                throw new Error_1.ArgumentMapillaryError("Assets must be cached when added to trajectory");
-            }
-            var translation = this._nodeToTranslation(node, this.reference);
-            var transform = new Geo_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.image, undefined, node.ck1, node.ck2, node.cameraProjection);
-            this._trajectoryTransforms.unshift(transform);
-            this._trajectoryCameras.unshift(new Geo_1.Camera(transform));
-        }
-    };
-    StateBase.prototype._nodeToTranslation = function (node, reference) {
-        return Geo_1.Geo.computeTranslation({ alt: node.alt, lat: node.latLon.lat, lon: node.latLon.lon }, node.rotation, reference);
-    };
-    StateBase.prototype._sameConnectedComponent = function () {
-        var current = this._currentNode;
-        var previous = this._previousNode;
-        return !!current && !!previous &&
-            current.mergeCC === previous.mergeCC;
-    };
-    StateBase.prototype._withinOriginalDistance = function () {
-        var current = this._currentNode;
-        var previous = this._previousNode;
-        if (!current || !previous) {
-            return true;
-        }
-        // 50 km/h moves 28m in 2s
-        var distance = this._spatial.distanceFromLatLon(current.originalLatLon.lat, current.originalLatLon.lon, previous.originalLatLon.lat, previous.originalLatLon.lon);
-        return distance < 25;
-    };
-    return StateBase;
-}());
-exports.StateBase = StateBase;
-
-},{"../../Error":277,"../../Geo":278,"../../State":282}],421:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var UnitBezier = require("@mapbox/unitbezier");
-var State_1 = require("../../State");
-var TraversingState = /** @class */ (function (_super) {
-    __extends(TraversingState, _super);
-    function TraversingState(state) {
-        var _this = _super.call(this, state) || this;
-        _this._adjustCameras();
-        _this._motionless = _this._motionlessTransition();
-        _this._baseAlpha = _this._alpha;
-        _this._speedCoefficient = 1;
-        _this._unitBezier = new UnitBezier(0.74, 0.67, 0.38, 0.96);
-        _this._useBezier = false;
-        return _this;
-    }
-    TraversingState.prototype.earth = function () {
-        return new State_1.EarthState(this);
-    };
-    TraversingState.prototype.wait = function () {
-        return new State_1.WaitingState(this);
-    };
-    TraversingState.prototype.waitInteractively = function () {
-        return new State_1.InteractiveWaitingState(this);
-    };
-    TraversingState.prototype.append = function (nodes) {
-        var emptyTrajectory = this._trajectory.length === 0;
-        if (emptyTrajectory) {
-            this._resetTransition();
-        }
-        _super.prototype.append.call(this, nodes);
-        if (emptyTrajectory) {
-            this._setDesiredCenter();
-            this._setDesiredZoom();
-        }
-    };
-    TraversingState.prototype.prepend = function (nodes) {
-        var emptyTrajectory = this._trajectory.length === 0;
-        if (emptyTrajectory) {
-            this._resetTransition();
-        }
-        _super.prototype.prepend.call(this, nodes);
-        if (emptyTrajectory) {
-            this._setDesiredCenter();
-            this._setDesiredZoom();
-        }
-    };
-    TraversingState.prototype.set = function (nodes) {
-        _super.prototype.set.call(this, nodes);
-        this._desiredLookat = null;
-        this._resetTransition();
-        this._clearRotation();
-        this._setDesiredCenter();
-        this._setDesiredZoom();
-        if (this._trajectory.length < 3) {
-            this._useBezier = true;
-        }
-    };
-    TraversingState.prototype.setSpeed = function (speed) {
-        this._speedCoefficient = this._spatial.clamp(speed, 0, 10);
-    };
-    TraversingState.prototype.update = function (fps) {
-        if (this._alpha === 1 && this._currentIndex + this._alpha < this._trajectory.length) {
-            this._currentIndex += 1;
-            this._useBezier = this._trajectory.length < 3 &&
-                this._currentIndex + 1 === this._trajectory.length;
-            this._setCurrent();
-            this._resetTransition();
-            this._clearRotation();
-            this._desiredZoom = this._currentNode.fullPano ? this._zoom : 0;
-            this._desiredLookat = null;
-        }
-        var animationSpeed = this._animationSpeed * (60 / fps);
-        this._baseAlpha = Math.min(1, this._baseAlpha + this._speedCoefficient * animationSpeed);
-        if (this._useBezier) {
-            this._alpha = this._unitBezier.solve(this._baseAlpha);
-        }
-        else {
-            this._alpha = this._baseAlpha;
-        }
-        this._updateRotation();
-        if (!this._rotationDelta.isZero) {
-            this._applyRotation(this._rotationDelta, this._previousCamera);
-            this._applyRotation(this._rotationDelta, this._currentCamera);
-        }
-        this._updateRotationBasic();
-        if (this._basicRotation[0] !== 0 || this._basicRotation[1] !== 0) {
-            this._applyRotationBasic(this._basicRotation);
-        }
-        this._updateZoom(animationSpeed);
-        this._updateLookat(animationSpeed);
-        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
-    };
-    TraversingState.prototype._getAlpha = function () {
-        return this._motionless ? Math.ceil(this._alpha) : this._alpha;
-    };
-    TraversingState.prototype._setCurrentCamera = function () {
-        _super.prototype._setCurrentCamera.call(this);
-        this._adjustCameras();
-    };
-    TraversingState.prototype._adjustCameras = function () {
-        if (this._previousNode == null) {
-            return;
-        }
-        var lookat = this._camera.lookat.clone().sub(this._camera.position);
-        this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
-        if (this._currentNode.fullPano) {
-            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
-        }
-    };
-    TraversingState.prototype._resetTransition = function () {
-        this._alpha = 0;
-        this._baseAlpha = 0;
-        this._motionless = this._motionlessTransition();
-    };
-    return TraversingState;
-}(State_1.InteractiveStateBase));
-exports.TraversingState = TraversingState;
-exports.default = TraversingState;
-
-},{"../../State":282,"@mapbox/unitbezier":2}],422:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var State_1 = require("../../State");
-var WaitingState = /** @class */ (function (_super) {
-    __extends(WaitingState, _super);
-    function WaitingState(state) {
-        var _this = _super.call(this, state) || this;
-        _this._zoom = 0;
-        _this._adjustCameras();
-        _this._motionless = _this._motionlessTransition();
-        return _this;
-    }
-    WaitingState.prototype.traverse = function () {
-        return new State_1.TraversingState(this);
-    };
-    WaitingState.prototype.waitInteractively = function () {
-        return new State_1.InteractiveWaitingState(this);
-    };
-    WaitingState.prototype.prepend = function (nodes) {
-        _super.prototype.prepend.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    WaitingState.prototype.set = function (nodes) {
-        _super.prototype.set.call(this, nodes);
-        this._motionless = this._motionlessTransition();
-    };
-    WaitingState.prototype.move = function (delta) {
-        this._alpha = Math.max(0, Math.min(1, this._alpha + delta));
-    };
-    WaitingState.prototype.moveTo = function (position) {
-        this._alpha = Math.max(0, Math.min(1, position));
-    };
-    WaitingState.prototype.update = function (fps) {
-        this._camera.lerpCameras(this._previousCamera, this._currentCamera, this.alpha);
-    };
-    WaitingState.prototype._getAlpha = function () {
-        return this._motionless ? Math.round(this._alpha) : this._alpha;
-    };
-    WaitingState.prototype._setCurrentCamera = function () {
-        _super.prototype._setCurrentCamera.call(this);
-        this._adjustCameras();
-    };
-    WaitingState.prototype._adjustCameras = function () {
-        if (this._previousNode == null) {
-            return;
-        }
-        if (this._currentNode.fullPano) {
-            var lookat = this._camera.lookat.clone().sub(this._camera.position);
-            this._currentCamera.lookat.copy(lookat.clone().add(this._currentCamera.position));
-        }
-        if (this._previousNode.fullPano) {
-            var lookat = this._currentCamera.lookat.clone().sub(this._currentCamera.position);
-            this._previousCamera.lookat.copy(lookat.clone().add(this._previousCamera.position));
-        }
-    };
-    return WaitingState;
-}(State_1.StateBase));
-exports.WaitingState = WaitingState;
-exports.default = WaitingState;
-
-},{"../../State":282}],423:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-/**
- * @class ImageTileLoader
- *
- * @classdesc Represents a loader of image tiles.
- */
-var ImageTileLoader = /** @class */ (function () {
-    /**
-     * Create a new node image tile loader instance.
-     *
-     * @param {string} scheme - The URI scheme.
-     * @param {string} host - The URI host.
-     * @param {string} [origin] - The origin query param.
-     */
-    function ImageTileLoader(scheme, host, origin) {
-        this._scheme = scheme;
-        this._host = host;
-        this._origin = origin != null ? "?origin=" + origin : "";
-    }
-    /**
-     * Retrieve an image tile.
-     *
-     * @description Retrieve an image tile by specifying the area
-     * as well as the scaled size.
-     *
-     * @param {string} identifier - The identifier of the image.
-     * @param {number} x - The top left x pixel coordinate for the tile
-     * in the original image.
-     * @param {number} y - The top left y pixel coordinate for the tile
-     * in the original image.
-     * @param {number} w - The pixel width of the tile in the original image.
-     * @param {number} h - The pixel height of the tile in the original image.
-     * @param {number} scaledW - The scaled width of the returned tile.
-     * @param {number} scaledH - The scaled height of the returned tile.
-     */
-    ImageTileLoader.prototype.getTile = function (identifier, x, y, w, h, scaledW, scaledH) {
-        var characteristics = "/" + identifier + "/" + x + "," + y + "," + w + "," + h + "/" + scaledW + "," + scaledH + "/0/default.jpg";
-        var url = this._scheme +
-            "://" +
-            this._host +
-            characteristics +
-            this._origin;
-        var xmlHTTP = null;
-        return [rxjs_1.Observable.create(function (subscriber) {
-                xmlHTTP = new XMLHttpRequest();
-                xmlHTTP.open("GET", url, true);
-                xmlHTTP.responseType = "arraybuffer";
-                xmlHTTP.timeout = 15000;
-                xmlHTTP.onload = function (event) {
-                    if (xmlHTTP.status !== 200) {
-                        subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + "). " +
-                            ("Status: " + xmlHTTP.status + ", " + xmlHTTP.statusText)));
-                        return;
-                    }
-                    var image = new Image();
-                    image.crossOrigin = "Anonymous";
-                    image.onload = function (e) {
-                        subscriber.next(image);
-                        subscriber.complete();
-                    };
-                    image.onerror = function (error) {
-                        subscriber.error(new Error("Failed to load tile image (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                    };
-                    var blob = new Blob([xmlHTTP.response]);
-                    image.src = window.URL.createObjectURL(blob);
-                };
-                xmlHTTP.onerror = function (error) {
-                    subscriber.error(new Error("Failed to fetch tile (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                };
-                xmlHTTP.ontimeout = function (error) {
-                    subscriber.error(new Error("Tile request timed out (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                };
-                xmlHTTP.onabort = function (event) {
-                    subscriber.error(new Error("Tile request was aborted (" + identifier + ": " + x + "," + y + "," + w + "," + h + ")"));
-                };
-                xmlHTTP.send(null);
-            }),
-            function () {
-                if (xmlHTTP != null) {
-                    xmlHTTP.abort();
-                }
-            },
-        ];
-    };
-    return ImageTileLoader;
-}());
-exports.ImageTileLoader = ImageTileLoader;
-exports.default = ImageTileLoader;
-
-},{"rxjs":27}],424:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * @class ImageTileStore
- *
- * @classdesc Represents a store for image tiles.
- */
-var ImageTileStore = /** @class */ (function () {
-    /**
-     * Create a new node image tile store instance.
-     */
-    function ImageTileStore() {
-        this._images = {};
-    }
-    /**
-     * Add an image tile to the store.
-     *
-     * @param {HTMLImageElement} image - The image tile.
-     * @param {string} key - The identifier for the tile.
-     * @param {number} level - The level of the tile.
-     */
-    ImageTileStore.prototype.addImage = function (image, key, level) {
-        if (!(level in this._images)) {
-            this._images[level] = {};
-        }
-        this._images[level][key] = image;
-    };
-    /**
-     * Dispose the store.
-     *
-     * @description Disposes all cached assets.
-     */
-    ImageTileStore.prototype.dispose = function () {
-        for (var _i = 0, _a = Object.keys(this._images); _i < _a.length; _i++) {
-            var level = _a[_i];
-            var levelImages = this._images[level];
-            for (var _b = 0, _c = Object.keys(levelImages); _b < _c.length; _b++) {
-                var key = _c[_b];
-                window.URL.revokeObjectURL(levelImages[key].src);
-                delete levelImages[key];
-            }
-            delete this._images[level];
-        }
-    };
-    /**
-     * Get an image tile from the store.
-     *
-     * @param {string} key - The identifier for the tile.
-     * @param {number} level - The level of the tile.
-     */
-    ImageTileStore.prototype.getImage = function (key, level) {
-        return this._images[level][key];
-    };
-    /**
-     * Check if an image tile exist in the store.
-     *
-     * @param {string} key - The identifier for the tile.
-     * @param {number} level - The level of the tile.
-     */
-    ImageTileStore.prototype.hasImage = function (key, level) {
-        return level in this._images && key in this._images[level];
-    };
-    return ImageTileStore;
-}());
-exports.ImageTileStore = ImageTileStore;
-exports.default = ImageTileStore;
-
-},{}],425:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Geo_1 = require("../Geo");
-/**
- * @class RegionOfInterestCalculator
- *
- * @classdesc Represents a calculator for regions of interest.
- */
-var RegionOfInterestCalculator = /** @class */ (function () {
-    function RegionOfInterestCalculator() {
-        this._viewportCoords = new Geo_1.ViewportCoords();
-    }
-    /**
-     * Compute a region of interest based on the current render camera
-     * and the viewport size.
-     *
-     * @param {RenderCamera} renderCamera - Render camera used for unprojections.
-     * @param {ISize} size - Viewport size in pixels.
-     * @param {Transform} transform - Transform used for projections.
-     *
-     * @returns {IRegionOfInterest} A region of interest.
-     */
-    RegionOfInterestCalculator.prototype.computeRegionOfInterest = function (renderCamera, size, transform) {
-        var viewportBoundaryPoints = this._viewportBoundaryPoints(4);
-        var bbox = this._viewportPointsBoundingBox(viewportBoundaryPoints, renderCamera, transform);
-        this._clipBoundingBox(bbox);
-        var viewportPixelWidth = 2 / size.width;
-        var viewportPixelHeight = 2 / size.height;
-        var centralViewportPixel = [
-            [-0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight],
-            [0.5 * viewportPixelWidth, 0.5 * viewportPixelHeight],
-            [0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],
-            [-0.5 * viewportPixelWidth, -0.5 * viewportPixelHeight],
-        ];
-        var cpbox = this._viewportPointsBoundingBox(centralViewportPixel, renderCamera, transform);
-        return {
-            bbox: bbox,
-            pixelHeight: cpbox.maxY - cpbox.minY,
-            pixelWidth: cpbox.maxX - cpbox.minX + (cpbox.minX < cpbox.maxX ? 0 : 1),
-        };
-    };
-    RegionOfInterestCalculator.prototype._viewportBoundaryPoints = function (pointsPerSide) {
-        var points = [];
-        var os = [[-1, 1], [1, 1], [1, -1], [-1, -1]];
-        var ds = [[2, 0], [0, -2], [-2, 0], [0, 2]];
-        for (var side = 0; side < 4; ++side) {
-            var o = os[side];
-            var d = ds[side];
-            for (var i = 0; i < pointsPerSide; ++i) {
-                points.push([o[0] + d[0] * i / pointsPerSide,
-                    o[1] + d[1] * i / pointsPerSide]);
-            }
-        }
-        return points;
-    };
-    RegionOfInterestCalculator.prototype._viewportPointsBoundingBox = function (viewportPoints, renderCamera, transform) {
-        var _this = this;
-        var basicPoints = viewportPoints
-            .map(function (point) {
-            return _this._viewportCoords
-                .viewportToBasic(point[0], point[1], transform, renderCamera.perspective);
-        });
-        if (transform.gpano != null) {
-            return this._boundingBoxPano(basicPoints);
-        }
-        else {
-            return this._boundingBox(basicPoints);
-        }
-    };
-    RegionOfInterestCalculator.prototype._boundingBox = function (points) {
-        var bbox = {
-            maxX: Number.NEGATIVE_INFINITY,
-            maxY: Number.NEGATIVE_INFINITY,
-            minX: Number.POSITIVE_INFINITY,
-            minY: Number.POSITIVE_INFINITY,
-        };
-        for (var i = 0; i < points.length; ++i) {
-            bbox.minX = Math.min(bbox.minX, points[i][0]);
-            bbox.maxX = Math.max(bbox.maxX, points[i][0]);
-            bbox.minY = Math.min(bbox.minY, points[i][1]);
-            bbox.maxY = Math.max(bbox.maxY, points[i][1]);
-        }
-        return bbox;
-    };
-    RegionOfInterestCalculator.prototype._boundingBoxPano = function (points) {
-        var _this = this;
-        var xs = [];
-        var ys = [];
-        for (var i = 0; i < points.length; ++i) {
-            xs.push(points[i][0]);
-            ys.push(points[i][1]);
-        }
-        xs.sort(function (a, b) { return _this._sign(a - b); });
-        ys.sort(function (a, b) { return _this._sign(a - b); });
-        var intervalX = this._intervalPano(xs);
-        return {
-            maxX: intervalX[1],
-            maxY: ys[ys.length - 1],
-            minX: intervalX[0],
-            minY: ys[0],
-        };
-    };
-    /**
-     * Find the max interval between consecutive numbers.
-     * Assumes numbers are between 0 and 1, sorted and that
-     * x is equivalent to x + 1.
-     */
-    RegionOfInterestCalculator.prototype._intervalPano = function (xs) {
-        var maxdx = 0;
-        var maxi = -1;
-        for (var i = 0; i < xs.length - 1; ++i) {
-            var dx = xs[i + 1] - xs[i];
-            if (dx > maxdx) {
-                maxdx = dx;
-                maxi = i;
-            }
-        }
-        var loopdx = xs[0] + 1 - xs[xs.length - 1];
-        if (loopdx > maxdx) {
-            return [xs[0], xs[xs.length - 1]];
-        }
-        else {
-            return [xs[maxi + 1], xs[maxi]];
-        }
-    };
-    RegionOfInterestCalculator.prototype._clipBoundingBox = function (bbox) {
-        bbox.minX = Math.max(0, Math.min(1, bbox.minX));
-        bbox.maxX = Math.max(0, Math.min(1, bbox.maxX));
-        bbox.minY = Math.max(0, Math.min(1, bbox.minY));
-        bbox.maxY = Math.max(0, Math.min(1, bbox.maxY));
-    };
-    RegionOfInterestCalculator.prototype._sign = function (n) {
-        return n > 0 ? 1 : n < 0 ? -1 : 0;
-    };
-    return RegionOfInterestCalculator;
-}());
-exports.RegionOfInterestCalculator = RegionOfInterestCalculator;
-exports.default = RegionOfInterestCalculator;
-
-},{"../Geo":278}],426:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var rxjs_1 = require("rxjs");
-/**
- * @class TextureProvider
- *
- * @classdesc Represents a provider of textures.
- */
-var TextureProvider = /** @class */ (function () {
-    /**
-     * Create a new node texture provider instance.
-     *
-     * @param {string} key - The identifier of the image for which to request tiles.
-     * @param {number} width - The full width of the original image.
-     * @param {number} height - The full height of the original image.
-     * @param {number} tileSize - The size used when requesting tiles.
-     * @param {HTMLImageElement} background - Image to use as background.
-     * @param {ImageTileLoader} imageTileLoader - Loader for retrieving tiles.
-     * @param {ImageTileStore} imageTileStore - Store for saving tiles.
-     * @param {THREE.WebGLRenderer} renderer - Renderer used for rendering tiles to texture.
-     */
-    function TextureProvider(key, width, height, tileSize, background, imageTileLoader, imageTileStore, renderer) {
-        this._disposed = false;
-        this._key = key;
-        if (width <= 0 || height <= 0) {
-            console.warn("Original image size (" + width + ", " + height + ") is invalid (" + key + "). Tiles will not be loaded.");
-        }
-        this._width = width;
-        this._height = height;
-        this._maxLevel = Math.ceil(Math.log(Math.max(height, width)) / Math.log(2));
-        this._currentLevel = -1;
-        this._tileSize = tileSize;
-        this._updated$ = new rxjs_1.Subject();
-        this._createdSubject$ = new rxjs_1.Subject();
-        this._created$ = this._createdSubject$.pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._createdSubscription = this._created$.subscribe(function () { });
-        this._hasSubject$ = new rxjs_1.Subject();
-        this._has$ = this._hasSubject$.pipe(operators_1.startWith(false), operators_1.publishReplay(1), operators_1.refCount());
-        this._hasSubscription = this._has$.subscribe(function () { });
-        this._abortFunctions = [];
-        this._tileSubscriptions = {};
-        this._renderedCurrentLevelTiles = {};
-        this._renderedTiles = {};
-        this._background = background;
-        this._camera = null;
-        this._imageTileLoader = imageTileLoader;
-        this._imageTileStore = imageTileStore;
-        this._renderer = renderer;
-        this._renderTarget = null;
-        this._roi = null;
-    }
-    Object.defineProperty(TextureProvider.prototype, "disposed", {
-        /**
-         * Get disposed.
-         *
-         * @returns {boolean} Value indicating whether provider has
-         * been disposed.
-         */
-        get: function () {
-            return this._disposed;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "hasTexture$", {
-        /**
-         * Get hasTexture$.
-         *
-         * @returns {Observable<boolean>} Observable emitting
-         * values indicating when the existance of a texture
-         * changes.
-         */
-        get: function () {
-            return this._has$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "key", {
-        /**
-         * Get key.
-         *
-         * @returns {boolean} The identifier of the image for
-         * which to render textures.
-         */
-        get: function () {
-            return this._key;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "textureUpdated$", {
-        /**
-         * Get textureUpdated$.
-         *
-         * @returns {Observable<boolean>} Observable emitting
-         * values when an existing texture has been updated.
-         */
-        get: function () {
-            return this._updated$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TextureProvider.prototype, "textureCreated$", {
-        /**
-         * Get textureCreated$.
-         *
-         * @returns {Observable<boolean>} Observable emitting
-         * values when a new texture has been created.
-         */
-        get: function () {
-            return this._created$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Abort all outstanding image tile requests.
-     */
-    TextureProvider.prototype.abort = function () {
-        for (var key in this._tileSubscriptions) {
-            if (!this._tileSubscriptions.hasOwnProperty(key)) {
-                continue;
-            }
-            this._tileSubscriptions[key].unsubscribe();
-        }
-        this._tileSubscriptions = {};
-        for (var _i = 0, _a = this._abortFunctions; _i < _a.length; _i++) {
-            var abort = _a[_i];
-            abort();
-        }
-        this._abortFunctions = [];
-    };
-    /**
-     * Dispose the provider.
-     *
-     * @description Disposes all cached assets and
-     * aborts all outstanding image tile requests.
-     */
-    TextureProvider.prototype.dispose = function () {
-        if (this._disposed) {
-            console.warn("Texture already disposed (" + this._key + ")");
-            return;
-        }
-        this.abort();
-        if (this._renderTarget != null) {
-            this._renderTarget.dispose();
-            this._renderTarget = null;
-        }
-        this._imageTileStore.dispose();
-        this._imageTileStore = null;
-        this._background = null;
-        this._camera = null;
-        this._imageTileLoader = null;
-        this._renderer = null;
-        this._roi = null;
-        this._createdSubscription.unsubscribe();
-        this._hasSubscription.unsubscribe();
-        this._disposed = true;
-    };
-    /**
-     * Set the region of interest.
-     *
-     * @description When the region of interest is set the
-     * the tile level is determined and tiles for the region
-     * are fetched from the store or the loader and renderedLevel
-     * to the texture.
-     *
-     * @param {IRegionOfInterest} roi - Spatial edges to cache.
-     */
-    TextureProvider.prototype.setRegionOfInterest = function (roi) {
-        if (this._width <= 0 || this._height <= 0) {
-            return;
-        }
-        this._roi = roi;
-        var width = 1 / this._roi.pixelWidth;
-        var height = 1 / this._roi.pixelHeight;
-        var size = Math.max(height, width);
-        var currentLevel = Math.max(0, Math.min(this._maxLevel, Math.ceil(Math.log(size) / Math.log(2))));
-        if (currentLevel !== this._currentLevel) {
-            this.abort();
-            this._currentLevel = currentLevel;
-            if (!(this._currentLevel in this._renderedTiles)) {
-                this._renderedTiles[this._currentLevel] = [];
-            }
-            this._renderedCurrentLevelTiles = {};
-            for (var _i = 0, _a = this._renderedTiles[this._currentLevel]; _i < _a.length; _i++) {
-                var tile = _a[_i];
-                this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
-            }
-        }
-        var topLeft = this._getTileCoords([this._roi.bbox.minX, this._roi.bbox.minY]);
-        var bottomRight = this._getTileCoords([this._roi.bbox.maxX, this._roi.bbox.maxY]);
-        var tiles = this._getTiles(topLeft, bottomRight);
-        if (this._camera == null) {
-            this._camera = new THREE.OrthographicCamera(-this._width / 2, this._width / 2, this._height / 2, -this._height / 2, -1, 1);
-            this._camera.position.z = 1;
-            var gl = this._renderer.getContext();
-            var maxTextureSize = gl.getParameter(gl.MAX_TEXTURE_SIZE);
-            var backgroundSize = Math.max(this._width, this._height);
-            var scale = maxTextureSize > backgroundSize ? 1 : maxTextureSize / backgroundSize;
-            var targetWidth = Math.floor(scale * this._width);
-            var targetHeight = Math.floor(scale * this._height);
-            this._renderTarget = new THREE.WebGLRenderTarget(targetWidth, targetHeight, {
-                depthBuffer: false,
-                format: THREE.RGBFormat,
-                magFilter: THREE.LinearFilter,
-                minFilter: THREE.LinearFilter,
-                stencilBuffer: false,
-            });
-            this._renderToTarget(0, 0, this._width, this._height, this._background);
-            this._createdSubject$.next(this._renderTarget.texture);
-            this._hasSubject$.next(true);
-        }
-        this._fetchTiles(tiles);
-    };
-    TextureProvider.prototype.setTileSize = function (tileSize) {
-        this._tileSize = tileSize;
-    };
-    /**
-     * Update the image used as background for the texture.
-     *
-     * @param {HTMLImageElement} background - The background image.
-     */
-    TextureProvider.prototype.updateBackground = function (background) {
-        this._background = background;
-    };
-    /**
-     * Retrieve an image tile.
-     *
-     * @description Retrieve an image tile and render it to the
-     * texture. Add the tile to the store and emit to the updated
-     * observable.
-     *
-     * @param {Array<number>} tile - The tile coordinates.
-     * @param {number} level - The tile level.
-     * @param {number} x - The top left x pixel coordinate of the tile.
-     * @param {number} y - The top left y pixel coordinate of the tile.
-     * @param {number} w - The pixel width of the tile.
-     * @param {number} h - The pixel height of the tile.
-     * @param {number} scaledW - The scaled width of the returned tile.
-     * @param {number} scaledH - The scaled height of the returned tile.
-     */
-    TextureProvider.prototype._fetchTile = function (tile, level, x, y, w, h, scaledX, scaledY) {
-        var _this = this;
-        var getTile = this._imageTileLoader.getTile(this._key, x, y, w, h, scaledX, scaledY);
-        var tile$ = getTile[0];
-        var abort = getTile[1];
-        this._abortFunctions.push(abort);
-        var tileKey = this._tileKey(this._tileSize, tile);
-        var subscription = tile$
-            .subscribe(function (image) {
-            _this._renderToTarget(x, y, w, h, image);
-            _this._removeFromDictionary(tileKey, _this._tileSubscriptions);
-            _this._removeFromArray(abort, _this._abortFunctions);
-            _this._setTileRendered(tile, _this._currentLevel);
-            _this._imageTileStore.addImage(image, tileKey, level);
-            _this._updated$.next(true);
-        }, function (error) {
-            _this._removeFromDictionary(tileKey, _this._tileSubscriptions);
-            _this._removeFromArray(abort, _this._abortFunctions);
-            console.error(error);
-        });
-        if (!subscription.closed) {
-            this._tileSubscriptions[tileKey] = subscription;
-        }
-    };
-    /**
-     * Retrieve image tiles.
-     *
-     * @description Retrieve a image tiles and render them to the
-     * texture. Retrieve from store if it exists, otherwise Retrieve
-     * from loader.
-     *
-     * @param {Array<Array<number>>} tiles - Array of tile coordinates to
-     * retrieve.
-     */
-    TextureProvider.prototype._fetchTiles = function (tiles) {
-        var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
-        for (var _i = 0, tiles_1 = tiles; _i < tiles_1.length; _i++) {
-            var tile = tiles_1[_i];
-            var tileKey = this._tileKey(this._tileSize, tile);
-            if (tileKey in this._renderedCurrentLevelTiles ||
-                tileKey in this._tileSubscriptions) {
-                continue;
-            }
-            var tileX = tileSize * tile[0];
-            var tileY = tileSize * tile[1];
-            var tileWidth = tileX + tileSize > this._width ? this._width - tileX : tileSize;
-            var tileHeight = tileY + tileSize > this._height ? this._height - tileY : tileSize;
-            if (this._imageTileStore.hasImage(tileKey, this._currentLevel)) {
-                this._renderToTarget(tileX, tileY, tileWidth, tileHeight, this._imageTileStore.getImage(tileKey, this._currentLevel));
-                this._setTileRendered(tile, this._currentLevel);
-                this._updated$.next(true);
-                continue;
-            }
-            var scaledX = Math.floor(tileWidth / tileSize * this._tileSize);
-            var scaledY = Math.floor(tileHeight / tileSize * this._tileSize);
-            this._fetchTile(tile, this._currentLevel, tileX, tileY, tileWidth, tileHeight, scaledX, scaledY);
-        }
-    };
-    /**
-     * Get tile coordinates for a point using the current level.
-     *
-     * @param {Array<number>} point - Point in basic coordinates.
-     *
-     * @returns {Array<number>} x and y tile coodinates.
-     */
-    TextureProvider.prototype._getTileCoords = function (point) {
-        var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
-        var maxX = Math.ceil(this._width / tileSize) - 1;
-        var maxY = Math.ceil(this._height / tileSize) - 1;
-        return [
-            Math.min(Math.floor(this._width * point[0] / tileSize), maxX),
-            Math.min(Math.floor(this._height * point[1] / tileSize), maxY),
-        ];
-    };
-    /**
-     * Get tile coordinates for all tiles contained in a bounding
-     * box.
-     *
-     * @param {Array<number>} topLeft - Top left tile coordinate of bounding box.
-     * @param {Array<number>} bottomRight - Bottom right tile coordinate of bounding box.
-     *
-     * @returns {Array<Array<number>>} Array of x, y tile coodinates.
-     */
-    TextureProvider.prototype._getTiles = function (topLeft, bottomRight) {
-        var xs = [];
-        if (topLeft[0] > bottomRight[0]) {
-            var tileSize = this._tileSize * Math.pow(2, this._maxLevel - this._currentLevel);
-            var maxX = Math.ceil(this._width / tileSize) - 1;
-            for (var x = topLeft[0]; x <= maxX; x++) {
-                xs.push(x);
-            }
-            for (var x = 0; x <= bottomRight[0]; x++) {
-                xs.push(x);
-            }
-        }
-        else {
-            for (var x = topLeft[0]; x <= bottomRight[0]; x++) {
-                xs.push(x);
-            }
-        }
-        var tiles = [];
-        for (var _i = 0, xs_1 = xs; _i < xs_1.length; _i++) {
-            var x = xs_1[_i];
-            for (var y = topLeft[1]; y <= bottomRight[1]; y++) {
-                tiles.push([x, y]);
-            }
-        }
-        return tiles;
-    };
-    /**
-     * Remove an item from an array if it exists in array.
-     *
-     * @param {T} item - Item to remove.
-     * @param {Array<T>} array - Array from which item should be removed.
-     */
-    TextureProvider.prototype._removeFromArray = function (item, array) {
-        var index = array.indexOf(item);
-        if (index !== -1) {
-            array.splice(index, 1);
-        }
-    };
-    /**
-     * Remove an item from a dictionary.
-     *
-     * @param {string} key - Key of the item to remove.
-     * @param {Object} dict - Dictionary from which item should be removed.
-     */
-    TextureProvider.prototype._removeFromDictionary = function (key, dict) {
-        if (key in dict) {
-            delete dict[key];
-        }
-    };
-    /**
-     * Render an image tile to the target texture.
-     *
-     * @param {number} x - The top left x pixel coordinate of the tile.
-     * @param {number} y - The top left y pixel coordinate of the tile.
-     * @param {number} w - The pixel width of the tile.
-     * @param {number} h - The pixel height of the tile.
-     * @param {HTMLImageElement} background - The image tile to render.
-     */
-    TextureProvider.prototype._renderToTarget = function (x, y, w, h, image) {
-        var texture = new THREE.Texture(image);
-        texture.minFilter = THREE.LinearFilter;
-        texture.needsUpdate = true;
-        var geometry = new THREE.PlaneGeometry(w, h);
-        var material = new THREE.MeshBasicMaterial({ map: texture, side: THREE.FrontSide });
-        var mesh = new THREE.Mesh(geometry, material);
-        mesh.position.x = -this._width / 2 + x + w / 2;
-        mesh.position.y = this._height / 2 - y - h / 2;
-        var scene = new THREE.Scene();
-        scene.add(mesh);
-        this._renderer.render(scene, this._camera, this._renderTarget);
-        this._renderer.setRenderTarget(undefined);
-        scene.remove(mesh);
-        geometry.dispose();
-        material.dispose();
-        texture.dispose();
-    };
-    /**
-     * Mark a tile as rendered.
-     *
-     * @description Clears tiles marked as rendered in other
-     * levels of the tile pyramid  if they were rendered on
-     * top of or below the tile.
-     *
-     * @param {Arrary<number>} tile - The tile coordinates.
-     * @param {number} level - Tile level of the tile coordinates.
-     */
-    TextureProvider.prototype._setTileRendered = function (tile, level) {
-        var otherLevels = Object.keys(this._renderedTiles)
-            .map(function (key) {
-            return parseInt(key, 10);
-        })
-            .filter(function (renderedLevel) {
-            return renderedLevel !== level;
-        });
-        for (var _i = 0, otherLevels_1 = otherLevels; _i < otherLevels_1.length; _i++) {
-            var otherLevel = otherLevels_1[_i];
-            var scale = Math.pow(2, otherLevel - level);
-            if (otherLevel < level) {
-                var x = Math.floor(scale * tile[0]);
-                var y = Math.floor(scale * tile[1]);
-                for (var _a = 0, _b = this._renderedTiles[otherLevel].slice(); _a < _b.length; _a++) {
-                    var otherTile = _b[_a];
-                    if (otherTile[0] === x && otherTile[1] === y) {
-                        var index = this._renderedTiles[otherLevel].indexOf(otherTile);
-                        this._renderedTiles[otherLevel].splice(index, 1);
-                    }
-                }
-            }
-            else {
-                var startX = scale * tile[0];
-                var endX = startX + scale - 1;
-                var startY = scale * tile[1];
-                var endY = startY + scale - 1;
-                for (var _c = 0, _d = this._renderedTiles[otherLevel].slice(); _c < _d.length; _c++) {
-                    var otherTile = _d[_c];
-                    if (otherTile[0] >= startX && otherTile[0] <= endX &&
-                        otherTile[1] >= startY && otherTile[1] <= endY) {
-                        var index = this._renderedTiles[otherLevel].indexOf(otherTile);
-                        this._renderedTiles[otherLevel].splice(index, 1);
-                    }
-                }
-            }
-            if (this._renderedTiles[otherLevel].length === 0) {
-                delete this._renderedTiles[otherLevel];
-            }
-        }
-        this._renderedTiles[level].push(tile);
-        this._renderedCurrentLevelTiles[this._tileKey(this._tileSize, tile)] = true;
-    };
-    /**
-     * Create a tile key from a tile coordinates.
-     *
-     * @description Tile keys are used as a hash for
-     * storing the tile in a dictionary.
-     *
-     * @param {number} tileSize - The tile size.
-     * @param {Arrary<number>} tile - The tile coordinates.
-     */
-    TextureProvider.prototype._tileKey = function (tileSize, tile) {
-        return tileSize + "-" + tile[0] + "-" + tile[1];
-    };
-    return TextureProvider;
-}());
-exports.TextureProvider = TextureProvider;
-exports.default = TextureProvider;
-
-},{"rxjs":27,"rxjs/operators":225,"three":226}],427:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var DOM = /** @class */ (function () {
-    function DOM(doc) {
-        this._document = !!doc ? doc : document;
-    }
-    Object.defineProperty(DOM.prototype, "document", {
-        get: function () {
-            return this._document;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    DOM.prototype.createElement = function (tagName, className, container) {
-        var element = this._document.createElement(tagName);
-        if (!!className) {
-            element.className = className;
-        }
-        if (!!container) {
-            container.appendChild(element);
-        }
-        return element;
-    };
-    return DOM;
-}());
-exports.DOM = DOM;
-exports.default = DOM;
-
-},{}],428:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var EventEmitter = /** @class */ (function () {
-    function EventEmitter() {
-        this._events = {};
-    }
-    /**
-     * Subscribe to an event by its name.
-     * @param {string }eventType - The name of the event to subscribe to.
-     * @param {any} fn - The handler called when the event occurs.
-     */
-    EventEmitter.prototype.on = function (eventType, fn) {
-        this._events[eventType] = this._events[eventType] || [];
-        this._events[eventType].push(fn);
-        return;
-    };
-    /**
-     * Unsubscribe from an event by its name.
-     * @param {string} eventType - The name of the event to subscribe to.
-     * @param {any} fn - The handler to remove.
-     */
-    EventEmitter.prototype.off = function (eventType, fn) {
-        if (!eventType) {
-            this._events = {};
-            return;
-        }
-        if (!this._listens(eventType)) {
-            var idx = this._events[eventType].indexOf(fn);
-            if (idx >= 0) {
-                this._events[eventType].splice(idx, 1);
-            }
-            if (this._events[eventType].length) {
-                delete this._events[eventType];
-            }
-        }
-        else {
-            delete this._events[eventType];
-        }
-        return;
-    };
-    EventEmitter.prototype.fire = function (eventType, data) {
-        if (!this._listens(eventType)) {
-            return;
-        }
-        for (var _i = 0, _a = this._events[eventType]; _i < _a.length; _i++) {
-            var fn = _a[_i];
-            fn.call(this, data);
-        }
-        return;
-    };
-    EventEmitter.prototype._listens = function (eventType) {
-        return !!(this._events && this._events[eventType]);
-    };
-    return EventEmitter;
-}());
-exports.EventEmitter = EventEmitter;
-exports.default = EventEmitter;
-
-},{}],429:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Viewer_1 = require("../Viewer");
-var Settings = /** @class */ (function () {
-    function Settings() {
-    }
-    Settings.setOptions = function (options) {
-        Settings._baseImageSize = options.baseImageSize != null ?
-            options.baseImageSize :
-            Viewer_1.ImageSize.Size640;
-        Settings._basePanoramaSize = options.basePanoramaSize != null ?
-            options.basePanoramaSize :
-            Viewer_1.ImageSize.Size2048;
-        Settings._maxImageSize = options.maxImageSize != null ?
-            options.maxImageSize :
-            Viewer_1.ImageSize.Size2048;
-    };
-    Object.defineProperty(Settings, "baseImageSize", {
-        get: function () {
-            return Settings._baseImageSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Settings, "basePanoramaSize", {
-        get: function () {
-            return Settings._basePanoramaSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Settings, "maxImageSize", {
-        get: function () {
-            return Settings._maxImageSize;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Settings;
-}());
-exports.Settings = Settings;
-exports.default = Settings;
-
-},{"../Viewer":286}],430:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-function isBrowser() {
-    return typeof window !== "undefined" && typeof document !== "undefined";
-}
-exports.isBrowser = isBrowser;
-function isArraySupported() {
-    return !!(Array.prototype &&
-        Array.prototype.filter &&
-        Array.prototype.indexOf &&
-        Array.prototype.map &&
-        Array.prototype.reverse);
-}
-exports.isArraySupported = isArraySupported;
-function isFunctionSupported() {
-    return !!(Function.prototype && Function.prototype.bind);
-}
-exports.isFunctionSupported = isFunctionSupported;
-function isJSONSupported() {
-    return "JSON" in window && "parse" in JSON && "stringify" in JSON;
-}
-exports.isJSONSupported = isJSONSupported;
-function isObjectSupported() {
-    return !!(Object.keys &&
-        Object.assign);
-}
-exports.isObjectSupported = isObjectSupported;
-function isBlobSupported() {
-    return "Blob" in window && "URL" in window;
-}
-exports.isBlobSupported = isBlobSupported;
-var isWebGLSupportedCache = undefined;
-function isWebGLSupportedCached() {
-    if (isWebGLSupportedCache === undefined) {
-        isWebGLSupportedCache = isWebGLSupported();
-    }
-    return isWebGLSupportedCache;
-}
-exports.isWebGLSupportedCached = isWebGLSupportedCached;
-function isWebGLSupported() {
-    var webGLContextAttributes = {
-        alpha: false,
-        antialias: false,
-        depth: true,
-        failIfMajorPerformanceCaveat: false,
-        premultipliedAlpha: true,
-        preserveDrawingBuffer: false,
-        stencil: true,
-    };
-    var canvas = document.createElement("canvas");
-    var context = canvas.getContext("webgl", webGLContextAttributes) ||
-        canvas.getContext("experimental-webgl", webGLContextAttributes);
-    if (!context) {
-        return false;
-    }
-    var requiredExtensions = [
-        "OES_standard_derivatives",
-    ];
-    var supportedExtensions = context.getSupportedExtensions();
-    for (var _i = 0, requiredExtensions_1 = requiredExtensions; _i < requiredExtensions_1.length; _i++) {
-        var requiredExtension = requiredExtensions_1[_i];
-        if (supportedExtensions.indexOf(requiredExtension) === -1) {
-            return false;
-        }
-    }
-    return true;
-}
-exports.isWebGLSupported = isWebGLSupported;
-
-},{}],431:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Urls = /** @class */ (function () {
-    function Urls() {
-    }
-    Object.defineProperty(Urls, "explore", {
-        get: function () {
-            return Urls._scheme + "://" + Urls._exploreHost;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "origin", {
-        get: function () {
-            return Urls._origin;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "tileScheme", {
-        get: function () {
-            return Urls._scheme;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Urls, "tileDomain", {
-        get: function () {
-            return Urls._imageTileHost;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Urls.atomicReconstruction = function (key) {
-        return Urls._scheme + "://" + Urls._atomicReconstructionHost + "/" + key + "/sfm/v1.0/atomic_reconstruction.json";
-    };
-    Urls.exporeImage = function (key) {
-        return Urls._scheme + "://" + Urls._exploreHost + "/app/?pKey=" + key + "&focus=photo";
-    };
-    Urls.exporeUser = function (username) {
-        return Urls._scheme + "://" + Urls._exploreHost + "/app/user/" + username;
-    };
-    Urls.falcorModel = function (clientId) {
-        return Urls._scheme + "://" + Urls._apiHost + "/v3/model.json?client_id=" + clientId;
-    };
-    Urls.protoMesh = function (key) {
-        return Urls._scheme + "://" + Urls._meshHost + "/v2/mesh/" + key;
-    };
-    Urls.thumbnail = function (key, size, origin) {
-        var query = !!origin ? "?origin=" + origin : "";
-        return Urls._scheme + "://" + Urls._imageHost + "/" + key + "/thumb-" + size + ".jpg" + query;
-    };
-    Urls.setOptions = function (options) {
-        if (!options) {
-            return;
-        }
-        if (!!options.apiHost) {
-            Urls._apiHost = options.apiHost;
-        }
-        if (!!options.atomicReconstructionHost) {
-            Urls._atomicReconstructionHost = options.atomicReconstructionHost;
-        }
-        if (!!options.exploreHost) {
-            Urls._exploreHost = options.exploreHost;
-        }
-        if (!!options.imageHost) {
-            Urls._imageHost = options.imageHost;
-        }
-        if (!!options.imageTileHost) {
-            Urls._imageTileHost = options.imageTileHost;
-        }
-        if (!!options.meshHost) {
-            Urls._meshHost = options.meshHost;
-        }
-        if (!!options.scheme) {
-            Urls._scheme = options.scheme;
-        }
-    };
-    Urls._apiHost = "a.mapillary.com";
-    Urls._atomicReconstructionHost = "atomic-reconstructions.mapillary.com";
-    Urls._exploreHost = "www.mapillary.com";
-    Urls._imageHost = "images.mapillary.com";
-    Urls._imageTileHost = "loris.mapillary.com";
-    Urls._meshHost = "meshes.mapillary.com";
-    Urls._origin = "mapillary.webgl";
-    Urls._scheme = "https";
-    return Urls;
-}());
-exports.Urls = Urls;
-exports.default = Urls;
-
-},{}],432:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for alignments
- * @enum {number}
- * @readonly
- */
-var Alignment;
-(function (Alignment) {
-    /**
-     * Align to bottom
-     */
-    Alignment[Alignment["Bottom"] = 0] = "Bottom";
-    /**
-     * Align to bottom left
-     */
-    Alignment[Alignment["BottomLeft"] = 1] = "BottomLeft";
-    /**
-     * Align to bottom right
-     */
-    Alignment[Alignment["BottomRight"] = 2] = "BottomRight";
-    /**
-     * Align to center
-     */
-    Alignment[Alignment["Center"] = 3] = "Center";
-    /**
-     * Align to left
-     */
-    Alignment[Alignment["Left"] = 4] = "Left";
-    /**
-     * Align to right
-     */
-    Alignment[Alignment["Right"] = 5] = "Right";
-    /**
-     * Align to top
-     */
-    Alignment[Alignment["Top"] = 6] = "Top";
-    /**
-     * Align to top left
-     */
-    Alignment[Alignment["TopLeft"] = 7] = "TopLeft";
-    /**
-     * Align to top right
-     */
-    Alignment[Alignment["TopRight"] = 8] = "TopRight";
-})(Alignment = exports.Alignment || (exports.Alignment = {}));
-exports.default = Alignment;
-
-},{}],433:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Graph_1 = require("../Graph");
-var CacheService = /** @class */ (function () {
-    function CacheService(graphService, stateService) {
-        this._graphService = graphService;
-        this._stateService = stateService;
-        this._started = false;
-    }
-    Object.defineProperty(CacheService.prototype, "started", {
-        get: function () {
-            return this._started;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    CacheService.prototype.start = function () {
-        var _this = this;
-        if (this._started) {
-            return;
-        }
-        this._uncacheSubscription = this._stateService.currentState$.pipe(operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.currentNode.key;
-        }), operators_1.map(function (frame) {
-            var trajectory = frame.state.trajectory;
-            var trajectoryKeys = trajectory
-                .map(function (n) {
-                return n.key;
-            });
-            var sequenceKey = trajectory[trajectory.length - 1].sequenceKey;
-            return [trajectoryKeys, sequenceKey];
-        }), operators_1.bufferCount(1, 5), operators_1.withLatestFrom(this._graphService.graphMode$), operators_1.switchMap(function (_a) {
-            var keepBuffer = _a[0], graphMode = _a[1];
-            var keepKeys = keepBuffer[0][0];
-            var keepSequenceKey = graphMode === Graph_1.GraphMode.Sequence ?
-                keepBuffer[0][1] : undefined;
-            return _this._graphService.uncache$(keepKeys, keepSequenceKey);
-        }))
-            .subscribe(function () { });
-        this._cacheNodeSubscription = this._graphService.graphMode$.pipe(operators_1.skip(1), operators_1.withLatestFrom(this._stateService.currentState$), operators_1.switchMap(function (_a) {
-            var mode = _a[0], frame = _a[1];
-            return mode === Graph_1.GraphMode.Sequence ?
-                _this._keyToEdges(frame.state.currentNode.key, function (node) {
-                    return node.sequenceEdges$;
-                }) :
-                rxjs_1.from(frame.state.trajectory
-                    .map(function (node) {
-                    return node.key;
-                })
-                    .slice(frame.state.currentIndex)).pipe(operators_1.mergeMap(function (key) {
-                    return _this._keyToEdges(key, function (node) {
-                        return node.spatialEdges$;
-                    });
-                }, 6));
-        }))
-            .subscribe(function () { });
-        this._started = true;
-    };
-    CacheService.prototype.stop = function () {
-        if (!this._started) {
-            return;
-        }
-        this._uncacheSubscription.unsubscribe();
-        this._uncacheSubscription = null;
-        this._cacheNodeSubscription.unsubscribe();
-        this._cacheNodeSubscription = null;
-        this._started = false;
-    };
-    CacheService.prototype._keyToEdges = function (key, nodeToEdgeMap) {
-        return this._graphService.cacheNode$(key).pipe(operators_1.switchMap(nodeToEdgeMap), operators_1.first(function (status) {
-            return status.cached;
-        }), operators_1.timeout(15000), operators_1.catchError(function (error) {
-            console.error("Failed to cache edges (" + key + ").", error);
-            return rxjs_1.empty();
-        }));
-    };
-    return CacheService;
-}());
-exports.CacheService = CacheService;
-exports.default = CacheService;
-
-},{"../Graph":279,"rxjs":27,"rxjs/operators":225}],434:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var Component_1 = require("../Component");
-var ComponentController = /** @class */ (function () {
-    function ComponentController(container, navigator, observer, key, options, componentService) {
-        var _this = this;
-        this._container = container;
-        this._observer = observer;
-        this._navigator = navigator;
-        this._options = options != null ? options : {};
-        this._key = key;
-        this._navigable = key == null;
-        this._componentService = !!componentService ?
-            componentService :
-            new Component_1.ComponentService(this._container, this._navigator);
-        this._coverComponent = this._componentService.getCover();
-        this._initializeComponents();
-        if (key) {
-            this._initilizeCoverComponent();
-            this._subscribeCoverComponent();
-        }
-        else {
-            this._navigator.movedToKey$.pipe(operators_1.first(function (k) {
-                return k != null;
-            }))
-                .subscribe(function (k) {
-                _this._key = k;
-                _this._componentService.deactivateCover();
-                _this._coverComponent.configure({ key: _this._key, state: Component_1.CoverState.Hidden });
-                _this._subscribeCoverComponent();
-                _this._navigator.stateService.start();
-                _this._navigator.cacheService.start();
-                _this._navigator.panService.start();
-                _this._observer.startEmit();
-            });
-        }
-    }
-    Object.defineProperty(ComponentController.prototype, "navigable", {
-        get: function () {
-            return this._navigable;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    ComponentController.prototype.get = function (name) {
-        return this._componentService.get(name);
-    };
-    ComponentController.prototype.activate = function (name) {
-        this._componentService.activate(name);
-    };
-    ComponentController.prototype.activateCover = function () {
-        this._coverComponent.configure({ state: Component_1.CoverState.Visible });
-    };
-    ComponentController.prototype.deactivate = function (name) {
-        this._componentService.deactivate(name);
-    };
-    ComponentController.prototype.deactivateCover = function () {
-        this._coverComponent.configure({ state: Component_1.CoverState.Loading });
-    };
-    ComponentController.prototype._initializeComponents = function () {
-        var options = this._options;
-        this._uFalse(options.background, "background");
-        this._uFalse(options.debug, "debug");
-        this._uFalse(options.image, "image");
-        this._uFalse(options.marker, "marker");
-        this._uFalse(options.navigation, "navigation");
-        this._uFalse(options.popup, "popup");
-        this._uFalse(options.route, "route");
-        this._uFalse(options.slider, "slider");
-        this._uFalse(options.spatialData, "spatialData");
-        this._uFalse(options.tag, "tag");
-        this._uTrue(options.attribution, "attribution");
-        this._uTrue(options.bearing, "bearing");
-        this._uTrue(options.cache, "cache");
-        this._uTrue(options.direction, "direction");
-        this._uTrue(options.imagePlane, "imagePlane");
-        this._uTrue(options.keyboard, "keyboard");
-        this._uTrue(options.loading, "loading");
-        this._uTrue(options.mouse, "mouse");
-        this._uTrue(options.sequence, "sequence");
-        this._uTrue(options.stats, "stats");
-        this._uTrue(options.zoom, "zoom");
-    };
-    ComponentController.prototype._initilizeCoverComponent = function () {
-        var options = this._options;
-        this._coverComponent.configure({ key: this._key });
-        if (options.cover === undefined || options.cover) {
-            this.activateCover();
-        }
-        else {
-            this.deactivateCover();
-        }
-    };
-    ComponentController.prototype._setNavigable = function (navigable) {
-        if (this._navigable === navigable) {
-            return;
-        }
-        this._navigable = navigable;
-        this._observer.navigable$.next(navigable);
-    };
-    ComponentController.prototype._subscribeCoverComponent = function () {
-        var _this = this;
-        this._coverComponent.configuration$.pipe(operators_1.distinctUntilChanged(undefined, function (c) {
-            return c.state;
-        }))
-            .subscribe(function (conf) {
-            if (conf.state === Component_1.CoverState.Loading) {
-                _this._navigator.stateService.currentKey$.pipe(operators_1.first(), operators_1.switchMap(function (key) {
-                    var keyChanged = key == null || key !== conf.key;
-                    if (keyChanged) {
-                        _this._setNavigable(false);
-                    }
-                    return keyChanged ?
-                        _this._navigator.moveToKey$(conf.key) :
-                        _this._navigator.stateService.currentNode$.pipe(operators_1.first());
-                }))
-                    .subscribe(function () {
-                    _this._navigator.stateService.start();
-                    _this._navigator.cacheService.start();
-                    _this._navigator.panService.start();
-                    _this._observer.startEmit();
-                    _this._coverComponent.configure({ state: Component_1.CoverState.Hidden });
-                    _this._componentService.deactivateCover();
-                    _this._setNavigable(true);
-                }, function (error) {
-                    console.error("Failed to deactivate cover.", error);
-                    _this._coverComponent.configure({ state: Component_1.CoverState.Visible });
-                });
-            }
-            else if (conf.state === Component_1.CoverState.Visible) {
-                _this._observer.stopEmit();
-                _this._navigator.stateService.stop();
-                _this._navigator.cacheService.stop();
-                _this._navigator.playService.stop();
-                _this._navigator.panService.stop();
-                _this._componentService.activateCover();
-                _this._setNavigable(conf.key == null);
-            }
-        });
-    };
-    ComponentController.prototype._uFalse = function (option, name) {
-        if (option === undefined) {
-            this._componentService.deactivate(name);
-            return;
-        }
-        if (typeof option === "boolean") {
-            if (option) {
-                this._componentService.activate(name);
-            }
-            else {
-                this._componentService.deactivate(name);
-            }
-            return;
-        }
-        this._componentService.configure(name, option);
-        this._componentService.activate(name);
-    };
-    ComponentController.prototype._uTrue = function (option, name) {
-        if (option === undefined) {
-            this._componentService.activate(name);
-            return;
-        }
-        if (typeof option === "boolean") {
-            if (option) {
-                this._componentService.activate(name);
-            }
-            else {
-                this._componentService.deactivate(name);
-            }
-            return;
-        }
-        this._componentService.configure(name, option);
-        this._componentService.activate(name);
-    };
-    return ComponentController;
-}());
-exports.ComponentController = ComponentController;
-
-},{"../Component":275,"rxjs/operators":225}],435:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var Render_1 = require("../Render");
-var Utils_1 = require("../Utils");
-var Viewer_1 = require("../Viewer");
-var Container = /** @class */ (function () {
-    function Container(id, stateService, options, dom) {
-        this.id = id;
-        this._dom = !!dom ? dom : new Utils_1.DOM();
-        this._container = this._dom.document.getElementById(id);
-        if (!this._container) {
-            throw new Error("Container '" + id + "' not found.");
-        }
-        this._container.classList.add("mapillary-js");
-        this._canvasContainer = this._dom.createElement("div", "mapillary-js-interactive", this._container);
-        this._domContainer = this._dom.createElement("div", "mapillary-js-dom", this._container);
-        this.renderService = new Render_1.RenderService(this._container, stateService.currentState$, options.renderMode);
-        this.glRenderer = new Render_1.GLRenderer(this._canvasContainer, this.renderService, this._dom);
-        this.domRenderer = new Render_1.DOMRenderer(this._domContainer, this.renderService, stateService.currentState$);
-        this.keyboardService = new Viewer_1.KeyboardService(this._canvasContainer);
-        this.mouseService = new Viewer_1.MouseService(this._container, this._canvasContainer, this._domContainer, document);
-        this.touchService = new Viewer_1.TouchService(this._canvasContainer, this._domContainer);
-        this.spriteService = new Viewer_1.SpriteService(options.sprite);
-    }
-    Object.defineProperty(Container.prototype, "element", {
-        get: function () {
-            return this._container;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Container.prototype, "canvasContainer", {
-        get: function () {
-            return this._canvasContainer;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Container.prototype, "domContainer", {
-        get: function () {
-            return this._domContainer;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return Container;
-}());
-exports.Container = Container;
-exports.default = Container;
-
-},{"../Render":281,"../Utils":285,"../Viewer":286}],436:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-/**
- * Enumeration for image sizes
- * @enum {number}
- * @readonly
- * @description Image sizes in pixels for the long side of the image.
- */
-var ImageSize;
-(function (ImageSize) {
-    /**
-     * 320 pixels image size
-     */
-    ImageSize[ImageSize["Size320"] = 320] = "Size320";
-    /**
-     * 640 pixels image size
-     */
-    ImageSize[ImageSize["Size640"] = 640] = "Size640";
-    /**
-     * 1024 pixels image size
-     */
-    ImageSize[ImageSize["Size1024"] = 1024] = "Size1024";
-    /**
-     * 2048 pixels image size
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).mapillary={})}(this,(function(e){"use strict";
+/*! *****************************************************************************
+    Copyright (c) Microsoft Corporation.
+
+    Permission to use, copy, modify, and/or distribute this software for any
+    purpose with or without fee is hereby granted.
+
+    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+    PERFORMANCE OF THIS SOFTWARE.
+    ***************************************************************************** */var t=function(e,i){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])})(e,i)};function i(e,i){if("function"!=typeof i&&null!==i)throw new TypeError("Class extends value "+String(i)+" is not a constructor or null");function n(){this.constructor=e}t(e,i),e.prototype=null===i?Object.create(i):(n.prototype=i.prototype,new n)}function n(e,t,i,n){return new(i||(i=Promise))((function(r,s){function a(e){try{h(n.next(e))}catch(e){s(e)}}function o(e){try{h(n.throw(e))}catch(e){s(e)}}function h(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(a,o)}h((n=n.apply(e,t||[])).next())}))}function r(e,t){var i,n,r,s,a={label:0,sent:function(){if(1&r[0])throw r[1];return r[1]},trys:[],ops:[]};return s={next:o(0),throw:o(1),return:o(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function o(s){return function(o){return function(s){if(i)throw new TypeError("Generator is already executing.");for(;a;)try{if(i=1,n&&(r=2&s[0]?n.return:s[0]?n.throw||((r=n.return)&&r.call(n),0):n.next)&&!(r=r.call(n,s[1])).done)return r;switch(n=0,r&&(s=[2&s[0],r.value]),s[0]){case 0:case 1:r=s;break;case 4:return a.label++,{value:s[1],done:!1};case 5:a.label++,n=s[1],s=[0];continue;case 7:s=a.ops.pop(),a.trys.pop();continue;default:if(!(r=a.trys,(r=r.length>0&&r[r.length-1])||6!==s[0]&&2!==s[0])){a=0;continue}if(3===s[0]&&(!r||s[1]>r[0]&&s[1]<r[3])){a.label=s[1];break}if(6===s[0]&&a.label<r[1]){a.label=r[1],r=s;break}if(r&&a.label<r[2]){a.label=r[2],a.ops.push(s);break}r[2]&&a.ops.pop(),a.trys.pop();continue}s=t.call(e,a)}catch(e){s=[6,e],n=0}finally{i=r=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,o])}}}function s(e){var t="function"==typeof Symbol&&Symbol.iterator,i=t&&e[t],n=0;if(i)return i.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&n>=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function a(e,t){var i="function"==typeof Symbol&&e[Symbol.iterator];if(!i)return e;var n,r,s=i.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=s.next()).done;)a.push(n.value)}catch(e){r={error:e}}finally{try{n&&!n.done&&(i=s.return)&&i.call(s)}finally{if(r)throw r.error}}return a}function o(e,t){for(var i=0,n=t.length,r=e.length;i<n;i++,r++)e[r]=t[i];return e}function h(e){return this instanceof h?(this.v=e,this):new h(e)}function c(e,t,i){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var n,r=i.apply(e,t||[]),s=[];return n={},a("next"),a("throw"),a("return"),n[Symbol.asyncIterator]=function(){return this},n;function a(e){r[e]&&(n[e]=function(t){return new Promise((function(i,n){s.push([e,t,i,n])>1||o(e,t)}))})}function o(e,t){try{(i=r[e](t)).value instanceof h?Promise.resolve(i.value.v).then(c,l):u(s[0][2],i)}catch(e){u(s[0][3],e)}var i}function c(e){o("next",e)}function l(e){o("throw",e)}function u(e,t){e(t),s.shift(),s.length&&o(s[0][0],s[0][1])}}function l(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,i=e[Symbol.asyncIterator];return i?i.call(e):(e=s(e),t={},n("next"),n("throw"),n("return"),t[Symbol.asyncIterator]=function(){return this},t);function n(i){t[i]=e[i]&&function(t){return new Promise((function(n,r){(function(e,t,i,n){Promise.resolve(n).then((function(t){e({value:t,done:i})}),t)})(n,r,(t=e[i](t)).done,t.value)}))}}}function u(e){return"function"==typeof e}function d(e){var t=e((function(e){Error.call(e),e.stack=(new Error).stack}));return t.prototype=Object.create(Error.prototype),t.prototype.constructor=t,t}var p=d((function(e){return function(t){e(this),this.message=t?t.length+" errors occurred during unsubscription:\n"+t.map((function(e,t){return t+1+") "+e.toString()})).join("\n  "):"",this.name="UnsubscriptionError",this.errors=t}}));function m(e,t){if(e){var i=e.indexOf(t);0<=i&&e.splice(i,1)}}var f=function(){function e(e){this.initialTeardown=e,this.closed=!1,this._parentage=null,this._teardowns=null}return e.prototype.unsubscribe=function(){var e,t,i,n,r;if(!this.closed){this.closed=!0;var h=this._parentage;if(h)if(this._parentage=null,Array.isArray(h))try{for(var c=s(h),l=c.next();!l.done;l=c.next()){l.value.remove(this)}}catch(t){e={error:t}}finally{try{l&&!l.done&&(t=c.return)&&t.call(c)}finally{if(e)throw e.error}}else h.remove(this);var d=this.initialTeardown;if(u(d))try{d()}catch(e){r=e instanceof p?e.errors:[e]}var m=this._teardowns;if(m){this._teardowns=null;try{for(var f=s(m),g=f.next();!g.done;g=f.next()){var _=g.value;try{v(_)}catch(e){r=null!=r?r:[],e instanceof p?r=o(o([],a(r)),a(e.errors)):r.push(e)}}}catch(e){i={error:e}}finally{try{g&&!g.done&&(n=f.return)&&n.call(f)}finally{if(i)throw i.error}}}if(r)throw new p(r)}},e.prototype.add=function(t){var i;if(t&&t!==this)if(this.closed)v(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._teardowns=null!==(i=this._teardowns)&&void 0!==i?i:[]).push(t)}},e.prototype._hasParent=function(e){var t=this._parentage;return t===e||Array.isArray(t)&&t.includes(e)},e.prototype._addParent=function(e){var t=this._parentage;this._parentage=Array.isArray(t)?(t.push(e),t):t?[t,e]:e},e.prototype._removeParent=function(e){var t=this._parentage;t===e?this._parentage=null:Array.isArray(t)&&m(t,e)},e.prototype.remove=function(t){var i=this._teardowns;i&&m(i,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}(),g=f.EMPTY;function _(e){return e instanceof f||e&&"closed"in e&&u(e.remove)&&u(e.add)&&u(e.unsubscribe)}function v(e){u(e)?e():e.unsubscribe()}var y={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1},b={setTimeout:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=b.delegate;return((null==i?void 0:i.setTimeout)||setTimeout).apply(void 0,o([],a(e)))},clearTimeout:function(e){var t=b.delegate;return((null==t?void 0:t.clearTimeout)||clearTimeout)(e)},delegate:void 0};function x(e){b.setTimeout((function(){throw e}))}function w(){}var M=S("C",void 0,void 0);function S(e,t,i){return{kind:e,value:t,error:i}}var T=null;function C(e){if(y.useDeprecatedSynchronousErrorHandling){var t=!T;if(t&&(T={errorThrown:!1,error:null}),e(),t){var i=T,n=i.errorThrown,r=i.error;if(T=null,n)throw r}}else e()}var E=function(e){function t(t){var i=e.call(this)||this;return i.isStopped=!1,t?(i.destination=t,_(t)&&t.add(i)):i.destination=L,i}return i(t,e),t.create=function(e,t,i){return new A(e,t,i)},t.prototype.next=function(e){this.isStopped?P(function(e){return S("N",e,void 0)}(e),this):this._next(e)},t.prototype.error=function(e){this.isStopped?P(S("E",void 0,e),this):(this.isStopped=!0,this._error(e))},t.prototype.complete=function(){this.isStopped?P(M,this):(this.isStopped=!0,this._complete())},t.prototype.unsubscribe=function(){this.closed||(this.isStopped=!0,e.prototype.unsubscribe.call(this),this.destination=null)},t.prototype._next=function(e){this.destination.next(e)},t.prototype._error=function(e){try{this.destination.error(e)}finally{this.unsubscribe()}},t.prototype._complete=function(){try{this.destination.complete()}finally{this.unsubscribe()}},t}(f),A=function(e){function t(t,i,n){var r,s=e.call(this)||this;if(u(t))r=t;else if(t){var a;r=t.next,i=t.error,n=t.complete,s&&y.useDeprecatedNextContext?(a=Object.create(t)).unsubscribe=function(){return s.unsubscribe()}:a=t,r=null==r?void 0:r.bind(a),i=null==i?void 0:i.bind(a),n=null==n?void 0:n.bind(a)}return s.destination={next:r?I(r):w,error:I(null!=i?i:R),complete:n?I(n):w},s}return i(t,e),t}(E);function I(e,t){return function(){for(var t=[],i=0;i<arguments.length;i++)t[i]=arguments[i];try{e.apply(void 0,o([],a(t)))}catch(e){x(e)}}}function R(e){throw e}function P(e,t){var i=y.onStoppedNotification;i&&b.setTimeout((function(){return i(e,t)}))}var L={closed:!0,next:w,error:R,complete:w},D="function"==typeof Symbol&&Symbol.observable||"@@observable";function N(e){return e}function $(e){return 0===e.length?N:1===e.length?e[0]:function(t){return e.reduce((function(e,t){return t(e)}),t)}}var k=function(){function e(e){e&&(this._subscribe=e)}return e.prototype.lift=function(t){var i=new e;return i.source=this,i.operator=t,i},e.prototype.subscribe=function(e,t,i){var n,r=this,s=(n=e)&&n instanceof E||function(e){return e&&u(e.next)&&u(e.error)&&u(e.complete)}(n)&&_(n)?e:new A(e,t,i);return C((function(){var e=r,t=e.operator,i=e.source;s.add(t?t.call(s,i):i?r._subscribe(s):r._trySubscribe(s))})),s},e.prototype._trySubscribe=function(e){try{return this._subscribe(e)}catch(t){e.error(t)}},e.prototype.forEach=function(e,t){var i=this;return new(t=O(t))((function(t,n){var r;r=i.subscribe((function(t){try{e(t)}catch(e){n(e),null==r||r.unsubscribe()}}),n,t)}))},e.prototype._subscribe=function(e){var t;return null===(t=this.source)||void 0===t?void 0:t.subscribe(e)},e.prototype[D]=function(){return this},e.prototype.pipe=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return $(e)(this)},e.prototype.toPromise=function(e){var t=this;return new(e=O(e))((function(e,i){var n;t.subscribe((function(e){return n=e}),(function(e){return i(e)}),(function(){return e(n)}))}))},e.create=function(t){return new e(t)},e}();function O(e){var t;return null!==(t=null!=e?e:y.Promise)&&void 0!==t?t:Promise}function z(e){return u(null==e?void 0:e.lift)}function F(e){return function(t){if(z(t))return t.lift((function(t){try{return e(t,this)}catch(e){this.error(e)}}));throw new TypeError("Unable to lift unknown Observable type")}}var B=function(e){function t(t,i,n,r,s){var a=e.call(this,t)||this;return a.onFinalize=s,a._next=i?function(e){try{i(e)}catch(e){t.error(e)}}:e.prototype._next,a._error=r?function(e){try{r(e)}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._error,a._complete=n?function(){try{n()}catch(e){t.error(e)}finally{this.unsubscribe()}}:e.prototype._complete,a}return i(t,e),t.prototype.unsubscribe=function(){var t,i=this.closed;e.prototype.unsubscribe.call(this),!i&&(null===(t=this.onFinalize)||void 0===t||t.call(this))},t}(E);function U(){return F((function(e,t){var i=null;e._refCount++;var n=new B(t,void 0,void 0,void 0,(function(){if(!e||e._refCount<=0||0<--e._refCount)i=null;else{var n=e._connection,r=i;i=null,!n||r&&n!==r||n.unsubscribe(),t.unsubscribe()}}));e.subscribe(n),n.closed||(i=e.connect())}))}var V=function(e){function t(t,i){var n=e.call(this)||this;return n.source=t,n.subjectFactory=i,n._subject=null,n._refCount=0,n._connection=null,z(t)&&(n.lift=t.lift),n}return i(t,e),t.prototype._subscribe=function(e){return this.getSubject().subscribe(e)},t.prototype.getSubject=function(){var e=this._subject;return e&&!e.isStopped||(this._subject=this.subjectFactory()),this._subject},t.prototype._teardown=function(){this._refCount=0;var e=this._connection;this._subject=this._connection=null,null==e||e.unsubscribe()},t.prototype.connect=function(){var e=this,t=this._connection;if(!t){t=this._connection=new f;var i=this.getSubject();t.add(this.source.subscribe(new B(i,void 0,(function(){e._teardown(),i.complete()}),(function(t){e._teardown(),i.error(t)}),(function(){return e._teardown()})))),t.closed&&(this._connection=null,t=f.EMPTY)}return t},t.prototype.refCount=function(){return U()(this)},t}(k),H=d((function(e){return function(){e(this),this.name="ObjectUnsubscribedError",this.message="object unsubscribed"}})),j=function(e){function t(){var t=e.call(this)||this;return t.closed=!1,t.observers=[],t.isStopped=!1,t.hasError=!1,t.thrownError=null,t}return i(t,e),t.prototype.lift=function(e){var t=new G(this,this);return t.operator=e,t},t.prototype._throwIfClosed=function(){if(this.closed)throw new H},t.prototype.next=function(e){var t=this;C((function(){var i,n;if(t._throwIfClosed(),!t.isStopped){var r=t.observers.slice();try{for(var a=s(r),o=a.next();!o.done;o=a.next()){o.value.next(e)}}catch(e){i={error:e}}finally{try{o&&!o.done&&(n=a.return)&&n.call(a)}finally{if(i)throw i.error}}}}))},t.prototype.error=function(e){var t=this;C((function(){if(t._throwIfClosed(),!t.isStopped){t.hasError=t.isStopped=!0,t.thrownError=e;for(var i=t.observers;i.length;)i.shift().error(e)}}))},t.prototype.complete=function(){var e=this;C((function(){if(e._throwIfClosed(),!e.isStopped){e.isStopped=!0;for(var t=e.observers;t.length;)t.shift().complete()}}))},t.prototype.unsubscribe=function(){this.isStopped=this.closed=!0,this.observers=null},Object.defineProperty(t.prototype,"observed",{get:function(){var e;return(null===(e=this.observers)||void 0===e?void 0:e.length)>0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(t){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,t)},t.prototype._subscribe=function(e){return this._throwIfClosed(),this._checkFinalizedStatuses(e),this._innerSubscribe(e)},t.prototype._innerSubscribe=function(e){var t=this,i=t.hasError,n=t.isStopped,r=t.observers;return i||n?g:(r.push(e),new f((function(){return m(r,e)})))},t.prototype._checkFinalizedStatuses=function(e){var t=this,i=t.hasError,n=t.thrownError,r=t.isStopped;i?e.error(n):r&&e.complete()},t.prototype.asObservable=function(){var e=new k;return e.source=this,e},t.create=function(e,t){return new G(e,t)},t}(k),G=function(e){function t(t,i){var n=e.call(this)||this;return n.destination=t,n.source=i,n}return i(t,e),t.prototype.next=function(e){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.next)||void 0===i||i.call(t,e)},t.prototype.error=function(e){var t,i;null===(i=null===(t=this.destination)||void 0===t?void 0:t.error)||void 0===i||i.call(t,e)},t.prototype.complete=function(){var e,t;null===(t=null===(e=this.destination)||void 0===e?void 0:e.complete)||void 0===t||t.call(e)},t.prototype._subscribe=function(e){var t,i;return null!==(i=null===(t=this.source)||void 0===t?void 0:t.subscribe(e))&&void 0!==i?i:g},t}(j),W=function(e){function t(t){var i=e.call(this)||this;return i._value=t,i}return i(t,e),Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(t){var i=e.prototype._subscribe.call(this,t);return!i.closed&&t.next(this._value),i},t.prototype.getValue=function(){var e=this,t=e.hasError,i=e.thrownError,n=e._value;if(t)throw i;return this._throwIfClosed(),n},t.prototype.next=function(t){e.prototype.next.call(this,this._value=t)},t}(j),q={now:function(){return(q.delegate||Date).now()},delegate:void 0},X=function(e){function t(t,i,n){void 0===t&&(t=1/0),void 0===i&&(i=1/0),void 0===n&&(n=q);var r=e.call(this)||this;return r._bufferSize=t,r._windowTime=i,r._timestampProvider=n,r._buffer=[],r._infiniteTimeWindow=!0,r._infiniteTimeWindow=i===1/0,r._bufferSize=Math.max(1,t),r._windowTime=Math.max(1,i),r}return i(t,e),t.prototype.next=function(t){var i=this,n=i.isStopped,r=i._buffer,s=i._infiniteTimeWindow,a=i._timestampProvider,o=i._windowTime;n||(r.push(t),!s&&r.push(a.now()+o)),this._trimBuffer(),e.prototype.next.call(this,t)},t.prototype._subscribe=function(e){this._throwIfClosed(),this._trimBuffer();for(var t=this._innerSubscribe(e),i=this._infiniteTimeWindow,n=this._buffer.slice(),r=0;r<n.length&&!e.closed;r+=i?1:2)e.next(n[r]);return this._checkFinalizedStatuses(e),t},t.prototype._trimBuffer=function(){var e=this,t=e._bufferSize,i=e._timestampProvider,n=e._buffer,r=e._infiniteTimeWindow,s=(r?1:2)*t;if(t<1/0&&s<n.length&&n.splice(0,n.length-s),!r){for(var a=i.now(),o=0,h=1;h<n.length&&n[h]<=a;h+=2)o=h;o&&n.splice(0,o+1)}},t}(j),Z=function(e){function t(t,i){return e.call(this)||this}return i(t,e),t.prototype.schedule=function(e,t){return this},t}(f),Y={setInterval:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Y.delegate;return((null==i?void 0:i.setInterval)||setInterval).apply(void 0,o([],a(e)))},clearInterval:function(e){var t=Y.delegate;return((null==t?void 0:t.clearInterval)||clearInterval)(e)},delegate:void 0},J=function(e){function t(t,i){var n=e.call(this,t,i)||this;return n.scheduler=t,n.work=i,n.pending=!1,n}return i(t,e),t.prototype.schedule=function(e,t){if(void 0===t&&(t=0),this.closed)return this;this.state=e;var i=this.id,n=this.scheduler;return null!=i&&(this.id=this.recycleAsyncId(n,i,t)),this.pending=!0,this.delay=t,this.id=this.id||this.requestAsyncId(n,this.id,t),this},t.prototype.requestAsyncId=function(e,t,i){return void 0===i&&(i=0),Y.setInterval(e.flush.bind(e,this),i)},t.prototype.recycleAsyncId=function(e,t,i){if(void 0===i&&(i=0),null!=i&&this.delay===i&&!1===this.pending)return t;Y.clearInterval(t)},t.prototype.execute=function(e,t){if(this.closed)return new Error("executing a cancelled action");this.pending=!1;var i=this._execute(e,t);if(i)return i;!1===this.pending&&null!=this.id&&(this.id=this.recycleAsyncId(this.scheduler,this.id,null))},t.prototype._execute=function(e,t){var i,n=!1;try{this.work(e)}catch(e){n=!0,i=!!e&&e||new Error(e)}if(n)return this.unsubscribe(),i},t.prototype.unsubscribe=function(){if(!this.closed){var t=this.id,i=this.scheduler,n=i.actions;this.work=this.state=this.scheduler=null,this.pending=!1,m(n,this),null!=t&&(this.id=this.recycleAsyncId(i,t,null)),this.delay=null,e.prototype.unsubscribe.call(this)}},t}(Z),K=function(){function e(t,i){void 0===i&&(i=e.now),this.schedulerActionCtor=t,this.now=i}return e.prototype.schedule=function(e,t,i){return void 0===t&&(t=0),new this.schedulerActionCtor(this,e).schedule(i,t)},e.now=q.now,e}(),Q=new(function(e){function t(t,i){void 0===i&&(i=K.now);var n=e.call(this,t,i)||this;return n.actions=[],n._active=!1,n._scheduled=void 0,n}return i(t,e),t.prototype.flush=function(e){var t=this.actions;if(this._active)t.push(e);else{var i;this._active=!0;do{if(i=e.execute(e.state,e.delay))break}while(e=t.shift());if(this._active=!1,i){for(;e=t.shift();)e.unsubscribe();throw i}}},t}(K))(J),ee=Q,te=new k((function(e){return e.complete()}));function ie(e){return e?function(e){return new k((function(t){return e.schedule((function(){return t.complete()}))}))}(e):te}function ne(e,t){return new k((function(i){var n=0;return t.schedule((function(){n===e.length?i.complete():(i.next(e[n++]),i.closed||this.schedule())}))}))}var re=function(e){return e&&"number"==typeof e.length&&"function"!=typeof e};function se(e){return u(null==e?void 0:e.then)}var ae="function"==typeof Symbol&&Symbol.iterator?Symbol.iterator:"@@iterator";function oe(e,t,i,n){void 0===n&&(n=0);var r=t.schedule((function(){try{i.call(this)}catch(t){e.error(t)}}),n);return e.add(r),r}function he(e,t){if(!e)throw new Error("Iterable cannot be null");return new k((function(i){var n=new f;return n.add(t.schedule((function(){var r=e[Symbol.asyncIterator]();n.add(t.schedule((function(){var e=this;r.next().then((function(t){t.done?i.complete():(i.next(t.value),e.schedule())}))})))}))),n}))}function ce(e){return u(e[D])}function le(e){return u(null==e?void 0:e[ae])}function ue(e){return Symbol.asyncIterator&&u(null==e?void 0:e[Symbol.asyncIterator])}function de(e){return new TypeError("You provided "+(null!==e&&"object"==typeof e?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function pe(e){return c(this,arguments,(function(){var t,i,n;return r(this,(function(r){switch(r.label){case 0:t=e.getReader(),r.label=1;case 1:r.trys.push([1,,9,10]),r.label=2;case 2:return[4,h(t.read())];case 3:return i=r.sent(),n=i.value,i.done?[4,h(void 0)]:[3,5];case 4:return[2,r.sent()];case 5:return[4,h(n)];case 6:return[4,r.sent()];case 7:return r.sent(),[3,2];case 8:return[3,10];case 9:return t.releaseLock(),[7];case 10:return[2]}}))}))}function me(e){return u(null==e?void 0:e.getReader)}function fe(e,t){if(null!=e){if(ce(e))return function(e,t){return new k((function(i){var n=new f;return n.add(t.schedule((function(){var r=e[D]();n.add(r.subscribe({next:function(e){n.add(t.schedule((function(){return i.next(e)})))},error:function(e){n.add(t.schedule((function(){return i.error(e)})))},complete:function(){n.add(t.schedule((function(){return i.complete()})))}}))}))),n}))}(e,t);if(re(e))return ne(e,t);if(se(e))return function(e,t){return new k((function(i){return t.schedule((function(){return e.then((function(e){i.add(t.schedule((function(){i.next(e),i.add(t.schedule((function(){return i.complete()})))})))}),(function(e){i.add(t.schedule((function(){return i.error(e)})))}))}))}))}(e,t);if(ue(e))return he(e,t);if(le(e))return function(e,t){return new k((function(i){var n;return i.add(t.schedule((function(){n=e[ae](),oe(i,t,(function(){var e=n.next(),t=e.value;e.done?i.complete():(i.next(t),this.schedule())}))}))),function(){return u(null==n?void 0:n.return)&&n.return()}}))}(e,t);if(me(e))return function(e,t){return he(pe(e),t)}(e,t)}throw de(e)}function ge(e,t){return t?fe(e,t):_e(e)}function _e(e){if(e instanceof k)return e;if(null!=e){if(ce(e))return n=e,new k((function(e){var t=n[D]();if(u(t.subscribe))return t.subscribe(e);throw new TypeError("Provided object does not correctly implement Symbol.observable")}));if(re(e))return ve(e);if(se(e))return i=e,new k((function(e){i.then((function(t){e.closed||(e.next(t),e.complete())}),(function(t){return e.error(t)})).then(null,x)}));if(ue(e))return ye(e);if(le(e))return t=e,new k((function(e){var i,n;try{for(var r=s(t),a=r.next();!a.done;a=r.next()){var o=a.value;if(e.next(o),e.closed)return}}catch(e){i={error:e}}finally{try{a&&!a.done&&(n=r.return)&&n.call(r)}finally{if(i)throw i.error}}e.complete()}));if(me(e))return ye(pe(e))}var t,i,n;throw de(e)}function ve(e){return new k((function(t){for(var i=0;i<e.length&&!t.closed;i++)t.next(e[i]);t.complete()}))}function ye(e){return new k((function(t){(function(e,t){var i,s,a,o;return n(this,void 0,void 0,(function(){var n,h;return r(this,(function(r){switch(r.label){case 0:r.trys.push([0,5,6,11]),i=l(e),r.label=1;case 1:return[4,i.next()];case 2:if((s=r.sent()).done)return[3,4];if(n=s.value,t.next(n),t.closed)return[2];r.label=3;case 3:return[3,1];case 4:return[3,11];case 5:return h=r.sent(),a={error:h},[3,11];case 6:return r.trys.push([6,,9,10]),s&&!s.done&&(o=i.return)?[4,o.call(i)]:[3,8];case 7:r.sent(),r.label=8;case 8:return[3,10];case 9:if(a)throw a.error;return[7];case 10:return[7];case 11:return t.complete(),[2]}}))}))})(e,t).catch((function(e){return t.error(e)}))}))}function be(e,t){return t?ne(e,t):ve(e)}function xe(e){return e&&u(e.schedule)}function we(e){return e[e.length-1]}function Me(e){return u(we(e))?e.pop():void 0}function Se(e){return xe(we(e))?e.pop():void 0}function Te(e,t){return"number"==typeof we(e)?e.pop():t}function Ce(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e);return i?ne(e,i):be(e)}function Ee(e,t){var i=u(e)?e:function(){return e},n=function(e){return e.error(i())};return new k(t?function(e){return t.schedule(n,0,e)}:n)}var Ae=d((function(e){return function(){e(this),this.name="EmptyError",this.message="no elements in sequence"}}));function Ie(e){return e instanceof Date&&!isNaN(e)}var Re=d((function(e){return function(t){void 0===t&&(t=null),e(this),this.message="Timeout has occurred",this.name="TimeoutError",this.info=t}}));function Pe(e,t){var i=Ie(e)?{first:e}:"number"==typeof e?{each:e}:e,n=i.first,r=i.each,s=i.with,a=void 0===s?Le:s,o=i.scheduler,h=void 0===o?null!=t?t:Q:o,c=i.meta,l=void 0===c?null:c;if(null==n&&null==r)throw new TypeError("No timeout provided.");return F((function(e,t){var i,s,o=null,c=0,u=function(e){s=oe(t,h,(function(){i.unsubscribe(),_e(a({meta:l,lastValue:o,seen:c})).subscribe(t)}),e)};i=e.subscribe(new B(t,(function(e){null==s||s.unsubscribe(),c++,t.next(o=e),r>0&&u(r)}),void 0,void 0,(function(){(null==s?void 0:s.closed)||null==s||s.unsubscribe(),o=null}))),u(null!=n?"number"==typeof n?n:+n-h.now():r)}))}function Le(e){throw new Re(e)}function De(e,t){return F((function(i,n){var r=0;i.subscribe(new B(n,(function(i){n.next(e.call(t,i,r++))})))}))}var Ne=Array.isArray;function $e(e){return De((function(t){return function(e,t){return Ne(t)?e.apply(void 0,o([],a(t))):e(t)}(e,t)}))}var ke=Array.isArray,Oe=Object.getPrototypeOf,ze=Object.prototype,Fe=Object.keys;function Be(e){if(1===e.length){var t=e[0];if(ke(t))return{args:t,keys:null};if((n=t)&&"object"==typeof n&&Oe(n)===ze){var i=Fe(t);return{args:i.map((function(e){return t[e]})),keys:i}}}var n;return{args:e,keys:null}}function Ue(e,t){return e.reduce((function(e,i,n){return e[i]=t[n],e}),{})}function Ve(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e),n=Me(e),r=Be(e),s=r.args,a=r.keys;if(0===s.length)return ge([],i);var o=new k(He(s,i,a?function(e){return Ue(a,e)}:N));return n?o.pipe($e(n)):o}function He(e,t,i){return void 0===i&&(i=N),function(n){je(t,(function(){for(var r=e.length,s=new Array(r),a=r,o=r,h=function(r){je(t,(function(){var h=ge(e[r],t),c=!1;h.subscribe(new B(n,(function(e){s[r]=e,c||(c=!0,o--),o||n.next(i(s.slice()))}),(function(){--a||n.complete()})))}),n)},c=0;c<r;c++)h(c)}),n)}}function je(e,t,i){e?i.add(e.schedule(t)):t()}function Ge(e,t,i,n,r,s,a,o){var h=[],c=0,l=0,u=!1,d=function(){!u||h.length||c||t.complete()},p=function(e){return c<n?m(e):h.push(e)},m=function(e){s&&t.next(e),c++;var o=!1;_e(i(e,l++)).subscribe(new B(t,(function(e){null==r||r(e),s?p(e):t.next(e)}),(function(){o=!0}),void 0,(function(){if(o)try{c--;for(var e=function(){var e=h.shift();a?t.add(a.schedule((function(){return m(e)}))):m(e)};h.length&&c<n;)e();d()}catch(e){t.error(e)}})))};return e.subscribe(new B(t,p,(function(){u=!0,d()}))),function(){null==o||o()}}function We(e,t,i){return void 0===i&&(i=1/0),u(t)?We((function(i,n){return De((function(e,r){return t(i,e,n,r)}))(_e(e(i,n)))}),i):("number"==typeof t&&(i=t),F((function(t,n){return Ge(t,n,e,i)})))}function qe(e){return void 0===e&&(e=1/0),We(N,e)}function Xe(){return qe(1)}function Ze(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return Xe()(be(e,Se(e)))}var Ye=["addListener","removeListener"],Je=["addEventListener","removeEventListener"],Ke=["on","off"];function Qe(e,t,i,n){if(u(i)&&(n=i,i=void 0),n)return Qe(e,t,i).pipe($e(n));var r=a(function(e){return u(e.addEventListener)&&u(e.removeEventListener)}(e)?Je.map((function(n){return function(r){return e[n](t,r,i)}})):function(e){return u(e.addListener)&&u(e.removeListener)}(e)?Ye.map(et(e,t)):function(e){return u(e.on)&&u(e.off)}(e)?Ke.map(et(e,t)):[],2),s=r[0],o=r[1];if(!s&&re(e))return We((function(e){return Qe(e,t,i)}))(be(e));if(!s)throw new TypeError("Invalid event target");return new k((function(e){var t=function(){for(var t=[],i=0;i<arguments.length;i++)t[i]=arguments[i];return e.next(1<t.length?t:t[0])};return s(t),function(){return o(t)}}))}function et(e,t){return function(i){return function(n){return e[i](t,n)}}}function tt(e,t,i){void 0===e&&(e=0),void 0===i&&(i=ee);var n=-1;return null!=t&&(xe(t)?i=t:n=t),new k((function(t){var r=Ie(e)?+e-i.now():e;r<0&&(r=0);var s=0;return i.schedule((function(){t.closed||(t.next(s++),0<=n?this.schedule(void 0,n):t.complete())}),r)}))}function it(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e),n=Te(e,1/0),r=e;return r.length?1===r.length?_e(r[0]):qe(n)(be(r,i)):te}var nt=Array.isArray;function rt(e){return 1===e.length&&nt(e[0])?e[0]:e}function st(e,t){return F((function(i,n){var r=0;i.subscribe(new B(n,(function(i){return e.call(t,i,r++)&&n.next(i)})))}))}function at(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Me(e),n=rt(e);return n.length?new k((function(e){var t=n.map((function(){return[]})),r=n.map((function(){return!1}));e.add((function(){t=r=null}));for(var s=function(s){_e(n[s]).subscribe(new B(e,(function(n){if(t[s].push(n),t.every((function(e){return e.length}))){var h=t.map((function(e){return e.shift()}));e.next(i?i.apply(void 0,o([],a(h))):h),t.some((function(e,t){return!e.length&&r[t]}))&&e.complete()}}),(function(){r[s]=!0,!t[s].length&&e.complete()})))},h=0;!e.closed&&h<n.length;h++)s(h);return function(){t=r=null}})):te}function ot(e,t){return void 0===t&&(t=ee),i=function(){return tt(e,t)},F((function(e,t){var n=!1,r=null,s=null,a=!1,o=function(){if(null==s||s.unsubscribe(),s=null,n){n=!1;var e=r;r=null,t.next(e)}a&&t.complete()},h=function(){s=null,a&&t.complete()};e.subscribe(new B(t,(function(e){n=!0,r=e,s||_e(i(e)).subscribe(s=new B(t,o,h))}),(function(){a=!0,(!n||!s||s.closed)&&t.complete()})))}));var i}function ht(e,t){return void 0===t&&(t=null),t=null!=t?t:e,F((function(i,n){var r=[],a=0;i.subscribe(new B(n,(function(i){var o,h,c,l,u=null;a++%t==0&&r.push([]);try{for(var d=s(r),p=d.next();!p.done;p=d.next()){(_=p.value).push(i),e<=_.length&&(u=null!=u?u:[]).push(_)}}catch(e){o={error:e}}finally{try{p&&!p.done&&(h=d.return)&&h.call(d)}finally{if(o)throw o.error}}if(u)try{for(var f=s(u),g=f.next();!g.done;g=f.next()){var _=g.value;m(r,_),n.next(_)}}catch(e){c={error:e}}finally{try{g&&!g.done&&(l=f.return)&&l.call(f)}finally{if(c)throw c.error}}}),(function(){var e,t;try{for(var i=s(r),a=i.next();!a.done;a=i.next()){var o=a.value;n.next(o)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}n.complete()}),void 0,(function(){r=null})))}))}function ct(e){return F((function(t,i){var n,r=null,s=!1;r=t.subscribe(new B(i,void 0,void 0,(function(a){n=_e(e(a,ct(e)(t))),r?(r.unsubscribe(),r=null,n.subscribe(i)):s=!0}))),s&&(r.unsubscribe(),r=null,n.subscribe(i))}))}function lt(e,t,i,n,r){return function(s,a){var o=i,h=t,c=0;s.subscribe(new B(a,(function(t){var i=c++;h=o?e(h,t,i):(o=!0,t),n&&a.next(h)}),r&&function(){o&&a.next(h),a.complete()}))}}function ut(e,t){return F(lt(e,t,arguments.length>=2,!1,!0))}function dt(e,t){return u(t)?We(e,t,1):We(e,1)}var pt={connector:function(){return new j}};function mt(e,t){void 0===t&&(t=pt);var i=t.connector;return F((function(t,n){var r,s=i();ge(e((r=s,new k((function(e){return r.subscribe(e)}))))).subscribe(n),n.add(t.subscribe(s))}))}function ft(e,t){return void 0===t&&(t=Q),F((function(i,n){var r=null,s=null,a=null,o=function(){if(r){r.unsubscribe(),r=null;var e=s;s=null,n.next(e)}};function h(){var i=a+e,s=t.now();if(s<i)return r=this.schedule(void 0,i-s),void n.add(r);o()}i.subscribe(new B(n,(function(i){s=i,a=t.now(),r||(r=t.schedule(h,e),n.add(r))}),(function(){o(),n.complete()}),void 0,(function(){s=r=null})))}))}function gt(e){return F((function(t,i){var n=!1;t.subscribe(new B(i,(function(e){n=!0,i.next(e)}),(function(){n||i.next(e),i.complete()})))}))}function _t(e){return e<=0?function(){return te}:F((function(t,i){var n=0;t.subscribe(new B(i,(function(t){++n<=e&&(i.next(t),e<=n&&i.complete())})))}))}function vt(e,t){return void 0===t&&(t=N),e=null!=e?e:yt,F((function(i,n){var r,s=!0;i.subscribe(new B(n,(function(i){var a=t(i);!s&&e(r,a)||(s=!1,r=a,n.next(i))})))}))}function yt(e,t){return e===t}function bt(e){return void 0===e&&(e=xt),F((function(t,i){var n=!1;t.subscribe(new B(i,(function(e){n=!0,i.next(e)}),(function(){return n?i.complete():i.error(e())})))}))}function xt(){return new Ae}function wt(e,t,i){return void 0===t&&(t=1/0),t=(t||0)<1?1/0:t,F((function(n,r){return Ge(n,r,e,t,void 0,!0,i)}))}function Mt(e){return F((function(t,i){try{t.subscribe(i)}finally{i.add(e)}}))}function St(e,t){var i=arguments.length>=2;return function(n){return n.pipe(e?st((function(t,i){return e(t,i,n)})):N,_t(1),i?gt(t):bt((function(){return new Ae})))}}function Tt(e){return e<=0?function(){return te}:F((function(t,i){var n=[];t.subscribe(new B(i,(function(t){n.push(t),e<n.length&&n.shift()}),(function(){var e,t;try{for(var r=s(n),a=r.next();!a.done;a=r.next()){var o=a.value;i.next(o)}}catch(t){e={error:t}}finally{try{a&&!a.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}i.complete()}),void 0,(function(){n=null})))}))}function Ct(e,t){var i=arguments.length>=2;return function(n){return n.pipe(e?st((function(t,i){return e(t,i,n)})):N,Tt(1),i?gt(t):bt((function(){return new Ae})))}}function Et(e,t){var i=u(e)?e:function(){return e};return u(t)?mt(t,{connector:i}):function(e){return new V(e,i)}}function At(){return F((function(e,t){var i,n=!1;e.subscribe(new B(t,(function(e){var r=i;i=e,n&&t.next([r,e]),n=!0})))}))}function It(e){return e?function(t){return mt(e)(t)}:function(e){return Et(new j)(e)}}function Rt(e,t,i,n){i&&!u(i)&&(n=i);var r=u(i)?i:void 0;return function(i){return Et(new X(e,t,n),r)(i)}}function Pt(e){var t;void 0===e&&(e=1/0);var i=(t=e&&"object"==typeof e?e:{count:e}).count,n=void 0===i?1/0:i,r=t.delay,s=t.resetOnSuccess,a=void 0!==s&&s;return n<=0?N:F((function(e,t){var i,s=0,o=function(){var h=!1;i=e.subscribe(new B(t,(function(e){a&&(s=0),t.next(e)}),void 0,(function(e){if(s++<n){var a=function(){i?(i.unsubscribe(),i=null,o()):h=!0};if(null!=r){var c="number"==typeof r?tt(r):_e(r(e,s)),l=new B(t,(function(){l.unsubscribe(),a()}),(function(){t.complete()}));c.subscribe(l)}else a()}else t.error(e)}))),h&&(i.unsubscribe(),i=null,o())};o()}))}function Lt(e,t){return F(lt(e,t,arguments.length>=2,!0))}function Dt(e){void 0===e&&(e={});var t=e.connector,i=void 0===t?function(){return new j}:t,n=e.resetOnError,r=void 0===n||n,s=e.resetOnComplete,a=void 0===s||s,o=e.resetOnRefCountZero,h=void 0===o||o;return function(e){var t=null,n=null,s=null,o=0,c=!1,l=!1,u=function(){null==n||n.unsubscribe(),n=null},d=function(){u(),t=s=null,c=l=!1},p=function(){var e=t;d(),null==e||e.unsubscribe()};return F((function(e,m){o++,l||c||u();var f=s=null!=s?s:i();m.add((function(){0!==--o||l||c||(n=Nt(p,h))})),f.subscribe(m),t||(t=new A({next:function(e){return f.next(e)},error:function(e){l=!0,u(),n=Nt(d,r,e),f.error(e)},complete:function(){c=!0,u(),n=Nt(d,a),f.complete()}}),ge(e).subscribe(t))}))(e)}}function Nt(e,t){for(var i=[],n=2;n<arguments.length;n++)i[n-2]=arguments[n];return!0===t?(e(),null):!1===t?null:t.apply(void 0,o([],a(i))).pipe(_t(1)).subscribe((function(){return e()}))}function $t(e){return st((function(t,i){return e<=i}))}function kt(e){return F((function(t,i){var n=!1,r=0;t.subscribe(new B(i,(function(t){return(n||(n=!e(t,r++)))&&i.next(t)})))}))}function Ot(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Se(e);return F((function(t,n){(i?Ze(e,t,i):Ze(e,t)).subscribe(n)}))}function zt(e,t){return F((function(i,n){var r=null,s=0,a=!1,o=function(){return a&&!r&&n.complete()};i.subscribe(new B(n,(function(i){null==r||r.unsubscribe();var a=0,h=s++;_e(e(i,h)).subscribe(r=new B(n,(function(e){return n.next(t?t(i,e,h,a++):e)}),(function(){r=null,o()})))}),(function(){a=!0,o()})))}))}function Ft(e){return F((function(t,i){_e(e).subscribe(new B(i,(function(){return i.complete()}),w)),!i.closed&&t.subscribe(i)}))}function Bt(e,t){return void 0===t&&(t=!1),F((function(i,n){var r=0;i.subscribe(new B(n,(function(i){var s=e(i,r++);(s||t)&&n.next(i),!s&&n.complete()})))}))}function Ut(e,t,i){var n=u(e)||t||i?{next:e,error:t,complete:i}:e;return n?F((function(e,t){var i;null===(i=n.subscribe)||void 0===i||i.call(n);var r=!0;e.subscribe(new B(t,(function(e){var i;null===(i=n.next)||void 0===i||i.call(n,e),t.next(e)}),(function(){var e;r=!1,null===(e=n.complete)||void 0===e||e.call(n),t.complete()}),(function(e){var i;r=!1,null===(i=n.error)||void 0===i||i.call(n,e),t.error(e)}),(function(){var e,t;r&&(null===(e=n.unsubscribe)||void 0===e||e.call(n)),null===(t=n.finalize)||void 0===t||t.call(n)})))})):N}function Vt(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=Me(e);return F((function(t,n){for(var r=e.length,s=new Array(r),h=e.map((function(){return!1})),c=!1,l=function(t){_e(e[t]).subscribe(new B(n,(function(e){s[t]=e,c||h[t]||(h[t]=!0,(c=h.every(N))&&(h=null))}),w))},u=0;u<r;u++)l(u);t.subscribe(new B(n,(function(e){if(c){var t=o([e],a(s));n.next(i?i.apply(void 0,o([],a(t))):t)}})))}))}class Ht{createFilter(e){return new Function("node","return "+this._compile(e)+";")}_compile(e){if(null==e||e.length<=1)return"true";const t=e[0];return"("+("=="===t?this._compileComparisonOp("===",e[1],e[2],!1):"!="===t?this._compileComparisonOp("!==",e[1],e[2],!1):">"===t||">="===t||"<"===t||"<="===t?this._compileComparisonOp(t,e[1],e[2],!0):"in"===t?this._compileInOp(e[1],e.slice(2)):"!in"===t?this._compileNegation(this._compileInOp(e[1],e.slice(2))):"all"===t?this._compileLogicalOp(e.slice(1),"&&"):"true")+")"}_compare(e,t){return e<t?-1:e>t?1:0}_compileComparisonOp(e,t,i,n){const r=this._compilePropertyReference(t),s=JSON.stringify(i);return(n?"typeof "+r+"===typeof "+s+"&&":"")+r+e+s}_compileInOp(e,t){const i=this._compare;return JSON.stringify(t.sort(i))+".indexOf("+this._compilePropertyReference(e)+")!==-1"}_compileLogicalOp(e,t){const i=this._compile.bind(this);return e.map(i).join(t)}_compileNegation(e){return"!("+e+")"}_compilePropertyReference(e){return"node["+JSON.stringify(e)+"]"}}
+/**
+     * @license
+     * Copyright 2010-2021 Three.js Authors
+     * SPDX-License-Identifier: MIT
+     */const jt=100,Gt=301,Wt=302,qt=306,Xt=1e3,Zt=1001,Yt=1002,Jt=1003,Kt=1006,Qt=1008,ei=1009,ti=1012,ii=1014,ni=1015,ri=1016,si=1020,ai=1022,oi=1023,hi=1026,ci=1027,li=2300,ui=2301,di=2302,pi=2400,mi=2401,fi=2402,gi=2500,_i=3e3,vi=3001,yi=3007,bi=3002,xi=7680,wi=35044,Mi=35048,Si="300 es";class Ti{addEventListener(e,t){void 0===this._listeners&&(this._listeners={});const i=this._listeners;void 0===i[e]&&(i[e]=[]),-1===i[e].indexOf(t)&&i[e].push(t)}hasEventListener(e,t){if(void 0===this._listeners)return!1;const i=this._listeners;return void 0!==i[e]&&-1!==i[e].indexOf(t)}removeEventListener(e,t){if(void 0===this._listeners)return;const i=this._listeners[e];if(void 0!==i){const e=i.indexOf(t);-1!==e&&i.splice(e,1)}}dispatchEvent(e){if(void 0===this._listeners)return;const t=this._listeners[e.type];if(void 0!==t){e.target=this;const i=t.slice(0);for(let t=0,n=i.length;t<n;t++)i[t].call(this,e);e.target=null}}}let Ci=1234567;const Ei=Math.PI/180,Ai=180/Math.PI,Ii=[];for(let e=0;e<256;e++)Ii[e]=(e<16?"0":"")+e.toString(16);const Ri="undefined"!=typeof crypto&&"randomUUID"in crypto;function Pi(){if(Ri)return crypto.randomUUID().toUpperCase();const e=4294967295*Math.random()|0,t=4294967295*Math.random()|0,i=4294967295*Math.random()|0,n=4294967295*Math.random()|0;return(Ii[255&e]+Ii[e>>8&255]+Ii[e>>16&255]+Ii[e>>24&255]+"-"+Ii[255&t]+Ii[t>>8&255]+"-"+Ii[t>>16&15|64]+Ii[t>>24&255]+"-"+Ii[63&i|128]+Ii[i>>8&255]+"-"+Ii[i>>16&255]+Ii[i>>24&255]+Ii[255&n]+Ii[n>>8&255]+Ii[n>>16&255]+Ii[n>>24&255]).toUpperCase()}function Li(e,t,i){return Math.max(t,Math.min(i,e))}function Di(e,t){return(e%t+t)%t}function Ni(e,t,i){return(1-i)*e+i*t}function $i(e){return 0==(e&e-1)&&0!==e}function ki(e){return Math.pow(2,Math.floor(Math.log(e)/Math.LN2))}var Oi=Object.freeze({__proto__:null,DEG2RAD:Ei,RAD2DEG:Ai,generateUUID:Pi,clamp:Li,euclideanModulo:Di,mapLinear:function(e,t,i,n,r){return n+(e-t)*(r-n)/(i-t)},inverseLerp:function(e,t,i){return e!==t?(i-e)/(t-e):0},lerp:Ni,damp:function(e,t,i,n){return Ni(e,t,1-Math.exp(-i*n))},pingpong:function(e,t=1){return t-Math.abs(Di(e,2*t)-t)},smoothstep:function(e,t,i){return e<=t?0:e>=i?1:(e=(e-t)/(i-t))*e*(3-2*e)},smootherstep:function(e,t,i){return e<=t?0:e>=i?1:(e=(e-t)/(i-t))*e*e*(e*(6*e-15)+10)},randInt:function(e,t){return e+Math.floor(Math.random()*(t-e+1))},randFloat:function(e,t){return e+Math.random()*(t-e)},randFloatSpread:function(e){return e*(.5-Math.random())},seededRandom:function(e){return void 0!==e&&(Ci=e%2147483647),Ci=16807*Ci%2147483647,(Ci-1)/2147483646},degToRad:function(e){return e*Ei},radToDeg:function(e){return e*Ai},isPowerOfTwo:$i,ceilPowerOfTwo:function(e){return Math.pow(2,Math.ceil(Math.log(e)/Math.LN2))},floorPowerOfTwo:ki,setQuaternionFromProperEuler:function(e,t,i,n,r){const s=Math.cos,a=Math.sin,o=s(i/2),h=a(i/2),c=s((t+n)/2),l=a((t+n)/2),u=s((t-n)/2),d=a((t-n)/2),p=s((n-t)/2),m=a((n-t)/2);switch(r){case"XYX":e.set(o*l,h*u,h*d,o*c);break;case"YZY":e.set(h*d,o*l,h*u,o*c);break;case"ZXZ":e.set(h*u,h*d,o*l,o*c);break;case"XZX":e.set(o*l,h*m,h*p,o*c);break;case"YXY":e.set(h*p,o*l,h*m,o*c);break;case"ZYZ":e.set(h*m,h*p,o*l,o*c);break;default:console.warn("THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: "+r)}}});class zi{constructor(e=0,t=0){this.x=e,this.y=t}get width(){return this.x}set width(e){this.x=e}get height(){return this.y}set height(e){this.y=e}set(e,t){return this.x=e,this.y=t,this}setScalar(e){return this.x=e,this.y=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y)}copy(e){return this.x=e.x,this.y=e.y,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector2: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this)}addScalar(e){return this.x+=e,this.y+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector2: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this)}subScalar(e){return this.x-=e,this.y-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this}multiply(e){return this.x*=e.x,this.y*=e.y,this}multiplyScalar(e){return this.x*=e,this.y*=e,this}divide(e){return this.x/=e.x,this.y/=e.y,this}divideScalar(e){return this.multiplyScalar(1/e)}applyMatrix3(e){const t=this.x,i=this.y,n=e.elements;return this.x=n[0]*t+n[3]*i+n[6],this.y=n[1]*t+n[4]*i+n[7],this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this}negate(){return this.x=-this.x,this.y=-this.y,this}dot(e){return this.x*e.x+this.y*e.y}cross(e){return this.x*e.y-this.y*e.x}lengthSq(){return this.x*this.x+this.y*this.y}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)}normalize(){return this.divideScalar(this.length()||1)}angle(){return Math.atan2(-this.y,-this.x)+Math.PI}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y;return t*t+i*i}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this}equals(e){return e.x===this.x&&e.y===this.y}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e}fromBufferAttribute(e,t,i){return void 0!==i&&console.warn("THREE.Vector2: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this}rotateAround(e,t){const i=Math.cos(t),n=Math.sin(t),r=this.x-e.x,s=this.y-e.y;return this.x=r*i-s*n+e.x,this.y=r*n+s*i+e.y,this}random(){return this.x=Math.random(),this.y=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y}}zi.prototype.isVector2=!0;class Fi{constructor(){this.elements=[1,0,0,0,1,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix3: the constructor no longer reads arguments. use .set() instead.")}set(e,t,i,n,r,s,a,o,h){const c=this.elements;return c[0]=e,c[1]=n,c[2]=a,c[3]=t,c[4]=r,c[5]=o,c[6]=i,c[7]=s,c[8]=h,this}identity(){return this.set(1,0,0,0,1,0,0,0,1),this}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],this}extractBasis(e,t,i){return e.setFromMatrix3Column(this,0),t.setFromMatrix3Column(this,1),i.setFromMatrix3Column(this,2),this}setFromMatrix4(e){const t=e.elements;return this.set(t[0],t[4],t[8],t[1],t[5],t[9],t[2],t[6],t[10]),this}multiply(e){return this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,n=t.elements,r=this.elements,s=i[0],a=i[3],o=i[6],h=i[1],c=i[4],l=i[7],u=i[2],d=i[5],p=i[8],m=n[0],f=n[3],g=n[6],_=n[1],v=n[4],y=n[7],b=n[2],x=n[5],w=n[8];return r[0]=s*m+a*_+o*b,r[3]=s*f+a*v+o*x,r[6]=s*g+a*y+o*w,r[1]=h*m+c*_+l*b,r[4]=h*f+c*v+l*x,r[7]=h*g+c*y+l*w,r[2]=u*m+d*_+p*b,r[5]=u*f+d*v+p*x,r[8]=u*g+d*y+p*w,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[3]*=e,t[6]*=e,t[1]*=e,t[4]*=e,t[7]*=e,t[2]*=e,t[5]*=e,t[8]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],h=e[7],c=e[8];return t*s*c-t*a*h-i*r*c+i*a*o+n*r*h-n*s*o}invert(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],h=e[7],c=e[8],l=c*s-a*h,u=a*o-c*r,d=h*r-s*o,p=t*l+i*u+n*d;if(0===p)return this.set(0,0,0,0,0,0,0,0,0);const m=1/p;return e[0]=l*m,e[1]=(n*h-c*i)*m,e[2]=(a*i-n*s)*m,e[3]=u*m,e[4]=(c*t-n*o)*m,e[5]=(n*r-a*t)*m,e[6]=d*m,e[7]=(i*o-h*t)*m,e[8]=(s*t-i*r)*m,this}transpose(){let e;const t=this.elements;return e=t[1],t[1]=t[3],t[3]=e,e=t[2],t[2]=t[6],t[6]=e,e=t[5],t[5]=t[7],t[7]=e,this}getNormalMatrix(e){return this.setFromMatrix4(e).invert().transpose()}transposeIntoArray(e){const t=this.elements;return e[0]=t[0],e[1]=t[3],e[2]=t[6],e[3]=t[1],e[4]=t[4],e[5]=t[7],e[6]=t[2],e[7]=t[5],e[8]=t[8],this}setUvTransform(e,t,i,n,r,s,a){const o=Math.cos(r),h=Math.sin(r);return this.set(i*o,i*h,-i*(o*s+h*a)+s+e,-n*h,n*o,-n*(-h*s+o*a)+a+t,0,0,1),this}scale(e,t){const i=this.elements;return i[0]*=e,i[3]*=e,i[6]*=e,i[1]*=t,i[4]*=t,i[7]*=t,this}rotate(e){const t=Math.cos(e),i=Math.sin(e),n=this.elements,r=n[0],s=n[3],a=n[6],o=n[1],h=n[4],c=n[7];return n[0]=t*r+i*o,n[3]=t*s+i*h,n[6]=t*a+i*c,n[1]=-i*r+t*o,n[4]=-i*s+t*h,n[7]=-i*a+t*c,this}translate(e,t){const i=this.elements;return i[0]+=e*i[2],i[3]+=e*i[5],i[6]+=e*i[8],i[1]+=t*i[2],i[4]+=t*i[5],i[7]+=t*i[8],this}equals(e){const t=this.elements,i=e.elements;for(let e=0;e<9;e++)if(t[e]!==i[e])return!1;return!0}fromArray(e,t=0){for(let i=0;i<9;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e}clone(){return(new this.constructor).fromArray(this.elements)}}function Bi(e){if(0===e.length)return-1/0;let t=e[0];for(let i=1,n=e.length;i<n;++i)e[i]>t&&(t=e[i]);return t}function Ui(e){return document.createElementNS("http://www.w3.org/1999/xhtml",e)}function Vi(e,t=0){let i=3735928559^t,n=1103547991^t;for(let t,r=0;r<e.length;r++)t=e.charCodeAt(r),i=Math.imul(i^t,2654435761),n=Math.imul(n^t,1597334677);return i=Math.imul(i^i>>>16,2246822507)^Math.imul(n^n>>>13,3266489909),n=Math.imul(n^n>>>16,2246822507)^Math.imul(i^i>>>13,3266489909),4294967296*(2097151&n)+(i>>>0)}let Hi;Fi.prototype.isMatrix3=!0;class ji{static getDataURL(e){if(/^data:/i.test(e.src))return e.src;if("undefined"==typeof HTMLCanvasElement)return e.src;let t;if(e instanceof HTMLCanvasElement)t=e;else{void 0===Hi&&(Hi=Ui("canvas")),Hi.width=e.width,Hi.height=e.height;const i=Hi.getContext("2d");e instanceof ImageData?i.putImageData(e,0,0):i.drawImage(e,0,0,e.width,e.height),t=Hi}return t.width>2048||t.height>2048?(console.warn("THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons",e),t.toDataURL("image/jpeg",.6)):t.toDataURL("image/png")}}let Gi=0;class Wi extends Ti{constructor(e=Wi.DEFAULT_IMAGE,t=Wi.DEFAULT_MAPPING,i=1001,n=1001,r=1006,s=1008,a=1023,o=1009,h=1,c=3e3){super(),Object.defineProperty(this,"id",{value:Gi++}),this.uuid=Pi(),this.name="",this.image=e,this.mipmaps=[],this.mapping=t,this.wrapS=i,this.wrapT=n,this.magFilter=r,this.minFilter=s,this.anisotropy=h,this.format=a,this.internalFormat=null,this.type=o,this.offset=new zi(0,0),this.repeat=new zi(1,1),this.center=new zi(0,0),this.rotation=0,this.matrixAutoUpdate=!0,this.matrix=new Fi,this.generateMipmaps=!0,this.premultiplyAlpha=!1,this.flipY=!0,this.unpackAlignment=4,this.encoding=c,this.userData={},this.version=0,this.onUpdate=null,this.isRenderTargetTexture=!1}updateMatrix(){this.matrix.setUvTransform(this.offset.x,this.offset.y,this.repeat.x,this.repeat.y,this.rotation,this.center.x,this.center.y)}clone(){return(new this.constructor).copy(this)}copy(e){return this.name=e.name,this.image=e.image,this.mipmaps=e.mipmaps.slice(0),this.mapping=e.mapping,this.wrapS=e.wrapS,this.wrapT=e.wrapT,this.magFilter=e.magFilter,this.minFilter=e.minFilter,this.anisotropy=e.anisotropy,this.format=e.format,this.internalFormat=e.internalFormat,this.type=e.type,this.offset.copy(e.offset),this.repeat.copy(e.repeat),this.center.copy(e.center),this.rotation=e.rotation,this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrix.copy(e.matrix),this.generateMipmaps=e.generateMipmaps,this.premultiplyAlpha=e.premultiplyAlpha,this.flipY=e.flipY,this.unpackAlignment=e.unpackAlignment,this.encoding=e.encoding,this.userData=JSON.parse(JSON.stringify(e.userData)),this}toJSON(e){const t=void 0===e||"string"==typeof e;if(!t&&void 0!==e.textures[this.uuid])return e.textures[this.uuid];const i={metadata:{version:4.5,type:"Texture",generator:"Texture.toJSON"},uuid:this.uuid,name:this.name,mapping:this.mapping,repeat:[this.repeat.x,this.repeat.y],offset:[this.offset.x,this.offset.y],center:[this.center.x,this.center.y],rotation:this.rotation,wrap:[this.wrapS,this.wrapT],format:this.format,type:this.type,encoding:this.encoding,minFilter:this.minFilter,magFilter:this.magFilter,anisotropy:this.anisotropy,flipY:this.flipY,premultiplyAlpha:this.premultiplyAlpha,unpackAlignment:this.unpackAlignment};if(void 0!==this.image){const n=this.image;if(void 0===n.uuid&&(n.uuid=Pi()),!t&&void 0===e.images[n.uuid]){let t;if(Array.isArray(n)){t=[];for(let e=0,i=n.length;e<i;e++)n[e].isDataTexture?t.push(qi(n[e].image)):t.push(qi(n[e]))}else t=qi(n);e.images[n.uuid]={uuid:n.uuid,url:t}}i.image=n.uuid}return"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),t||(e.textures[this.uuid]=i),i}dispose(){this.dispatchEvent({type:"dispose"})}transformUv(e){if(300!==this.mapping)return e;if(e.applyMatrix3(this.matrix),e.x<0||e.x>1)switch(this.wrapS){case Xt:e.x=e.x-Math.floor(e.x);break;case Zt:e.x=e.x<0?0:1;break;case Yt:1===Math.abs(Math.floor(e.x)%2)?e.x=Math.ceil(e.x)-e.x:e.x=e.x-Math.floor(e.x)}if(e.y<0||e.y>1)switch(this.wrapT){case Xt:e.y=e.y-Math.floor(e.y);break;case Zt:e.y=e.y<0?0:1;break;case Yt:1===Math.abs(Math.floor(e.y)%2)?e.y=Math.ceil(e.y)-e.y:e.y=e.y-Math.floor(e.y)}return this.flipY&&(e.y=1-e.y),e}set needsUpdate(e){!0===e&&this.version++}}function qi(e){return"undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap?ji.getDataURL(e):e.data?{data:Array.prototype.slice.call(e.data),width:e.width,height:e.height,type:e.data.constructor.name}:(console.warn("THREE.Texture: Unable to serialize Texture."),{})}Wi.DEFAULT_IMAGE=void 0,Wi.DEFAULT_MAPPING=300,Wi.prototype.isTexture=!0;class Xi{constructor(e=0,t=0,i=0,n=1){this.x=e,this.y=t,this.z=i,this.w=n}get width(){return this.z}set width(e){this.z=e}get height(){return this.w}set height(e){this.w=e}set(e,t,i,n){return this.x=e,this.y=t,this.z=i,this.w=n,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this.w=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setW(e){return this.w=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;case 3:this.w=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;case 3:return this.w;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z,this.w)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this.w=void 0!==e.w?e.w:1,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector4: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this.w+=e.w,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this.w+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this.w=e.w+t.w,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this.w+=e.w*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector4: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this.w-=e.w,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this.w-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this.w=e.w-t.w,this}multiply(e){return this.x*=e.x,this.y*=e.y,this.z*=e.z,this.w*=e.w,this}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this.w*=e,this}applyMatrix4(e){const t=this.x,i=this.y,n=this.z,r=this.w,s=e.elements;return this.x=s[0]*t+s[4]*i+s[8]*n+s[12]*r,this.y=s[1]*t+s[5]*i+s[9]*n+s[13]*r,this.z=s[2]*t+s[6]*i+s[10]*n+s[14]*r,this.w=s[3]*t+s[7]*i+s[11]*n+s[15]*r,this}divideScalar(e){return this.multiplyScalar(1/e)}setAxisAngleFromQuaternion(e){this.w=2*Math.acos(e.w);const t=Math.sqrt(1-e.w*e.w);return t<1e-4?(this.x=1,this.y=0,this.z=0):(this.x=e.x/t,this.y=e.y/t,this.z=e.z/t),this}setAxisAngleFromRotationMatrix(e){let t,i,n,r;const s=.01,a=.1,o=e.elements,h=o[0],c=o[4],l=o[8],u=o[1],d=o[5],p=o[9],m=o[2],f=o[6],g=o[10];if(Math.abs(c-u)<s&&Math.abs(l-m)<s&&Math.abs(p-f)<s){if(Math.abs(c+u)<a&&Math.abs(l+m)<a&&Math.abs(p+f)<a&&Math.abs(h+d+g-3)<a)return this.set(1,0,0,0),this;t=Math.PI;const e=(h+1)/2,o=(d+1)/2,_=(g+1)/2,v=(c+u)/4,y=(l+m)/4,b=(p+f)/4;return e>o&&e>_?e<s?(i=0,n=.707106781,r=.707106781):(i=Math.sqrt(e),n=v/i,r=y/i):o>_?o<s?(i=.707106781,n=0,r=.707106781):(n=Math.sqrt(o),i=v/n,r=b/n):_<s?(i=.707106781,n=.707106781,r=0):(r=Math.sqrt(_),i=y/r,n=b/r),this.set(i,n,r,t),this}let _=Math.sqrt((f-p)*(f-p)+(l-m)*(l-m)+(u-c)*(u-c));return Math.abs(_)<.001&&(_=1),this.x=(f-p)/_,this.y=(l-m)/_,this.z=(u-c)/_,this.w=Math.acos((h+d+g-1)/2),this}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this.w=Math.min(this.w,e.w),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this.w=Math.max(this.w,e.w),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this.w=Math.max(e.w,Math.min(t.w,this.w)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this.w=Math.max(e,Math.min(t,this.w)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this.w=Math.floor(this.w),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this.w=Math.ceil(this.w),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this.w=Math.round(this.w),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this.w=this.w<0?Math.ceil(this.w):Math.floor(this.w),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this.w=-this.w,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z+this.w*e.w}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z+this.w*this.w)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)+Math.abs(this.w)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this.w+=(e.w-this.w)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this.w=e.w+(t.w-e.w)*i,this}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z&&e.w===this.w}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this.w=e[t+3],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e[t+3]=this.w,e}fromBufferAttribute(e,t,i){return void 0!==i&&console.warn("THREE.Vector4: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this.w=e.getW(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this.w=Math.random(),this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z,yield this.w}}Xi.prototype.isVector4=!0;class Zi extends Ti{constructor(e,t,i={}){super(),this.width=e,this.height=t,this.depth=1,this.scissor=new Xi(0,0,e,t),this.scissorTest=!1,this.viewport=new Xi(0,0,e,t),this.texture=new Wi(void 0,i.mapping,i.wrapS,i.wrapT,i.magFilter,i.minFilter,i.format,i.type,i.anisotropy,i.encoding),this.texture.isRenderTargetTexture=!0,this.texture.image={width:e,height:t,depth:1},this.texture.generateMipmaps=void 0!==i.generateMipmaps&&i.generateMipmaps,this.texture.internalFormat=void 0!==i.internalFormat?i.internalFormat:null,this.texture.minFilter=void 0!==i.minFilter?i.minFilter:Kt,this.depthBuffer=void 0===i.depthBuffer||i.depthBuffer,this.stencilBuffer=void 0!==i.stencilBuffer&&i.stencilBuffer,this.depthTexture=void 0!==i.depthTexture?i.depthTexture:null}setTexture(e){e.image={width:this.width,height:this.height,depth:this.depth},this.texture=e}setSize(e,t,i=1){this.width===e&&this.height===t&&this.depth===i||(this.width=e,this.height=t,this.depth=i,this.texture.image.width=e,this.texture.image.height=t,this.texture.image.depth=i,this.dispose()),this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t)}clone(){return(new this.constructor).copy(this)}copy(e){return this.width=e.width,this.height=e.height,this.depth=e.depth,this.viewport.copy(e.viewport),this.texture=e.texture.clone(),this.texture.image={...this.texture.image},this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this}dispose(){this.dispatchEvent({type:"dispose"})}}Zi.prototype.isWebGLRenderTarget=!0;(class extends Zi{constructor(e,t,i){super(e,t);const n=this.texture;this.texture=[];for(let e=0;e<i;e++)this.texture[e]=n.clone()}setSize(e,t,i=1){if(this.width!==e||this.height!==t||this.depth!==i){this.width=e,this.height=t,this.depth=i;for(let n=0,r=this.texture.length;n<r;n++)this.texture[n].image.width=e,this.texture[n].image.height=t,this.texture[n].image.depth=i;this.dispose()}return this.viewport.set(0,0,e,t),this.scissor.set(0,0,e,t),this}copy(e){this.dispose(),this.width=e.width,this.height=e.height,this.depth=e.depth,this.viewport.set(0,0,this.width,this.height),this.scissor.set(0,0,this.width,this.height),this.depthBuffer=e.depthBuffer,this.stencilBuffer=e.stencilBuffer,this.depthTexture=e.depthTexture,this.texture.length=0;for(let t=0,i=e.texture.length;t<i;t++)this.texture[t]=e.texture[t].clone();return this}}).prototype.isWebGLMultipleRenderTargets=!0;class Yi extends Zi{constructor(e,t,i){super(e,t,i),this.samples=4}copy(e){return super.copy.call(this,e),this.samples=e.samples,this}}Yi.prototype.isWebGLMultisampleRenderTarget=!0;class Ji{constructor(e=0,t=0,i=0,n=1){this._x=e,this._y=t,this._z=i,this._w=n}static slerp(e,t,i,n){return console.warn("THREE.Quaternion: Static .slerp() has been deprecated. Use qm.slerpQuaternions( qa, qb, t ) instead."),i.slerpQuaternions(e,t,n)}static slerpFlat(e,t,i,n,r,s,a){let o=i[n+0],h=i[n+1],c=i[n+2],l=i[n+3];const u=r[s+0],d=r[s+1],p=r[s+2],m=r[s+3];if(0===a)return e[t+0]=o,e[t+1]=h,e[t+2]=c,void(e[t+3]=l);if(1===a)return e[t+0]=u,e[t+1]=d,e[t+2]=p,void(e[t+3]=m);if(l!==m||o!==u||h!==d||c!==p){let e=1-a;const t=o*u+h*d+c*p+l*m,i=t>=0?1:-1,n=1-t*t;if(n>Number.EPSILON){const r=Math.sqrt(n),s=Math.atan2(r,t*i);e=Math.sin(e*s)/r,a=Math.sin(a*s)/r}const r=a*i;if(o=o*e+u*r,h=h*e+d*r,c=c*e+p*r,l=l*e+m*r,e===1-a){const e=1/Math.sqrt(o*o+h*h+c*c+l*l);o*=e,h*=e,c*=e,l*=e}}e[t]=o,e[t+1]=h,e[t+2]=c,e[t+3]=l}static multiplyQuaternionsFlat(e,t,i,n,r,s){const a=i[n],o=i[n+1],h=i[n+2],c=i[n+3],l=r[s],u=r[s+1],d=r[s+2],p=r[s+3];return e[t]=a*p+c*l+o*d-h*u,e[t+1]=o*p+c*u+h*l-a*d,e[t+2]=h*p+c*d+a*u-o*l,e[t+3]=c*p-a*l-o*u-h*d,e}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get w(){return this._w}set w(e){this._w=e,this._onChangeCallback()}set(e,t,i,n){return this._x=e,this._y=t,this._z=i,this._w=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._w)}copy(e){return this._x=e.x,this._y=e.y,this._z=e.z,this._w=e.w,this._onChangeCallback(),this}setFromEuler(e,t){if(!e||!e.isEuler)throw new Error("THREE.Quaternion: .setFromEuler() now expects an Euler rotation rather than a Vector3 and order.");const i=e._x,n=e._y,r=e._z,s=e._order,a=Math.cos,o=Math.sin,h=a(i/2),c=a(n/2),l=a(r/2),u=o(i/2),d=o(n/2),p=o(r/2);switch(s){case"XYZ":this._x=u*c*l+h*d*p,this._y=h*d*l-u*c*p,this._z=h*c*p+u*d*l,this._w=h*c*l-u*d*p;break;case"YXZ":this._x=u*c*l+h*d*p,this._y=h*d*l-u*c*p,this._z=h*c*p-u*d*l,this._w=h*c*l+u*d*p;break;case"ZXY":this._x=u*c*l-h*d*p,this._y=h*d*l+u*c*p,this._z=h*c*p+u*d*l,this._w=h*c*l-u*d*p;break;case"ZYX":this._x=u*c*l-h*d*p,this._y=h*d*l+u*c*p,this._z=h*c*p-u*d*l,this._w=h*c*l+u*d*p;break;case"YZX":this._x=u*c*l+h*d*p,this._y=h*d*l+u*c*p,this._z=h*c*p-u*d*l,this._w=h*c*l-u*d*p;break;case"XZY":this._x=u*c*l-h*d*p,this._y=h*d*l-u*c*p,this._z=h*c*p+u*d*l,this._w=h*c*l+u*d*p;break;default:console.warn("THREE.Quaternion: .setFromEuler() encountered an unknown order: "+s)}return!1!==t&&this._onChangeCallback(),this}setFromAxisAngle(e,t){const i=t/2,n=Math.sin(i);return this._x=e.x*n,this._y=e.y*n,this._z=e.z*n,this._w=Math.cos(i),this._onChangeCallback(),this}setFromRotationMatrix(e){const t=e.elements,i=t[0],n=t[4],r=t[8],s=t[1],a=t[5],o=t[9],h=t[2],c=t[6],l=t[10],u=i+a+l;if(u>0){const e=.5/Math.sqrt(u+1);this._w=.25/e,this._x=(c-o)*e,this._y=(r-h)*e,this._z=(s-n)*e}else if(i>a&&i>l){const e=2*Math.sqrt(1+i-a-l);this._w=(c-o)/e,this._x=.25*e,this._y=(n+s)/e,this._z=(r+h)/e}else if(a>l){const e=2*Math.sqrt(1+a-i-l);this._w=(r-h)/e,this._x=(n+s)/e,this._y=.25*e,this._z=(o+c)/e}else{const e=2*Math.sqrt(1+l-i-a);this._w=(s-n)/e,this._x=(r+h)/e,this._y=(o+c)/e,this._z=.25*e}return this._onChangeCallback(),this}setFromUnitVectors(e,t){let i=e.dot(t)+1;return i<Number.EPSILON?(i=0,Math.abs(e.x)>Math.abs(e.z)?(this._x=-e.y,this._y=e.x,this._z=0,this._w=i):(this._x=0,this._y=-e.z,this._z=e.y,this._w=i)):(this._x=e.y*t.z-e.z*t.y,this._y=e.z*t.x-e.x*t.z,this._z=e.x*t.y-e.y*t.x,this._w=i),this.normalize()}angleTo(e){return 2*Math.acos(Math.abs(Li(this.dot(e),-1,1)))}rotateTowards(e,t){const i=this.angleTo(e);if(0===i)return this;const n=Math.min(1,t/i);return this.slerp(e,n),this}identity(){return this.set(0,0,0,1)}invert(){return this.conjugate()}conjugate(){return this._x*=-1,this._y*=-1,this._z*=-1,this._onChangeCallback(),this}dot(e){return this._x*e._x+this._y*e._y+this._z*e._z+this._w*e._w}lengthSq(){return this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w}length(){return Math.sqrt(this._x*this._x+this._y*this._y+this._z*this._z+this._w*this._w)}normalize(){let e=this.length();return 0===e?(this._x=0,this._y=0,this._z=0,this._w=1):(e=1/e,this._x=this._x*e,this._y=this._y*e,this._z=this._z*e,this._w=this._w*e),this._onChangeCallback(),this}multiply(e,t){return void 0!==t?(console.warn("THREE.Quaternion: .multiply() now only accepts one argument. Use .multiplyQuaternions( a, b ) instead."),this.multiplyQuaternions(e,t)):this.multiplyQuaternions(this,e)}premultiply(e){return this.multiplyQuaternions(e,this)}multiplyQuaternions(e,t){const i=e._x,n=e._y,r=e._z,s=e._w,a=t._x,o=t._y,h=t._z,c=t._w;return this._x=i*c+s*a+n*h-r*o,this._y=n*c+s*o+r*a-i*h,this._z=r*c+s*h+i*o-n*a,this._w=s*c-i*a-n*o-r*h,this._onChangeCallback(),this}slerp(e,t){if(0===t)return this;if(1===t)return this.copy(e);const i=this._x,n=this._y,r=this._z,s=this._w;let a=s*e._w+i*e._x+n*e._y+r*e._z;if(a<0?(this._w=-e._w,this._x=-e._x,this._y=-e._y,this._z=-e._z,a=-a):this.copy(e),a>=1)return this._w=s,this._x=i,this._y=n,this._z=r,this;const o=1-a*a;if(o<=Number.EPSILON){const e=1-t;return this._w=e*s+t*this._w,this._x=e*i+t*this._x,this._y=e*n+t*this._y,this._z=e*r+t*this._z,this.normalize(),this._onChangeCallback(),this}const h=Math.sqrt(o),c=Math.atan2(h,a),l=Math.sin((1-t)*c)/h,u=Math.sin(t*c)/h;return this._w=s*l+this._w*u,this._x=i*l+this._x*u,this._y=n*l+this._y*u,this._z=r*l+this._z*u,this._onChangeCallback(),this}slerpQuaternions(e,t,i){this.copy(e).slerp(t,i)}random(){const e=Math.random(),t=Math.sqrt(1-e),i=Math.sqrt(e),n=2*Math.PI*Math.random(),r=2*Math.PI*Math.random();return this.set(t*Math.cos(n),i*Math.sin(r),i*Math.cos(r),t*Math.sin(n))}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._w===this._w}fromArray(e,t=0){return this._x=e[t],this._y=e[t+1],this._z=e[t+2],this._w=e[t+3],this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._w,e}fromBufferAttribute(e,t){return this._x=e.getX(t),this._y=e.getY(t),this._z=e.getZ(t),this._w=e.getW(t),this}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}}Ji.prototype.isQuaternion=!0;class Ki{constructor(e=0,t=0,i=0){this.x=e,this.y=t,this.z=i}set(e,t,i){return void 0===i&&(i=this.z),this.x=e,this.y=t,this.z=i,this}setScalar(e){return this.x=e,this.y=e,this.z=e,this}setX(e){return this.x=e,this}setY(e){return this.y=e,this}setZ(e){return this.z=e,this}setComponent(e,t){switch(e){case 0:this.x=t;break;case 1:this.y=t;break;case 2:this.z=t;break;default:throw new Error("index is out of range: "+e)}return this}getComponent(e){switch(e){case 0:return this.x;case 1:return this.y;case 2:return this.z;default:throw new Error("index is out of range: "+e)}}clone(){return new this.constructor(this.x,this.y,this.z)}copy(e){return this.x=e.x,this.y=e.y,this.z=e.z,this}add(e,t){return void 0!==t?(console.warn("THREE.Vector3: .add() now only accepts one argument. Use .addVectors( a, b ) instead."),this.addVectors(e,t)):(this.x+=e.x,this.y+=e.y,this.z+=e.z,this)}addScalar(e){return this.x+=e,this.y+=e,this.z+=e,this}addVectors(e,t){return this.x=e.x+t.x,this.y=e.y+t.y,this.z=e.z+t.z,this}addScaledVector(e,t){return this.x+=e.x*t,this.y+=e.y*t,this.z+=e.z*t,this}sub(e,t){return void 0!==t?(console.warn("THREE.Vector3: .sub() now only accepts one argument. Use .subVectors( a, b ) instead."),this.subVectors(e,t)):(this.x-=e.x,this.y-=e.y,this.z-=e.z,this)}subScalar(e){return this.x-=e,this.y-=e,this.z-=e,this}subVectors(e,t){return this.x=e.x-t.x,this.y=e.y-t.y,this.z=e.z-t.z,this}multiply(e,t){return void 0!==t?(console.warn("THREE.Vector3: .multiply() now only accepts one argument. Use .multiplyVectors( a, b ) instead."),this.multiplyVectors(e,t)):(this.x*=e.x,this.y*=e.y,this.z*=e.z,this)}multiplyScalar(e){return this.x*=e,this.y*=e,this.z*=e,this}multiplyVectors(e,t){return this.x=e.x*t.x,this.y=e.y*t.y,this.z=e.z*t.z,this}applyEuler(e){return e&&e.isEuler||console.error("THREE.Vector3: .applyEuler() now expects an Euler rotation rather than a Vector3 and order."),this.applyQuaternion(en.setFromEuler(e))}applyAxisAngle(e,t){return this.applyQuaternion(en.setFromAxisAngle(e,t))}applyMatrix3(e){const t=this.x,i=this.y,n=this.z,r=e.elements;return this.x=r[0]*t+r[3]*i+r[6]*n,this.y=r[1]*t+r[4]*i+r[7]*n,this.z=r[2]*t+r[5]*i+r[8]*n,this}applyNormalMatrix(e){return this.applyMatrix3(e).normalize()}applyMatrix4(e){const t=this.x,i=this.y,n=this.z,r=e.elements,s=1/(r[3]*t+r[7]*i+r[11]*n+r[15]);return this.x=(r[0]*t+r[4]*i+r[8]*n+r[12])*s,this.y=(r[1]*t+r[5]*i+r[9]*n+r[13])*s,this.z=(r[2]*t+r[6]*i+r[10]*n+r[14])*s,this}applyQuaternion(e){const t=this.x,i=this.y,n=this.z,r=e.x,s=e.y,a=e.z,o=e.w,h=o*t+s*n-a*i,c=o*i+a*t-r*n,l=o*n+r*i-s*t,u=-r*t-s*i-a*n;return this.x=h*o+u*-r+c*-a-l*-s,this.y=c*o+u*-s+l*-r-h*-a,this.z=l*o+u*-a+h*-s-c*-r,this}project(e){return this.applyMatrix4(e.matrixWorldInverse).applyMatrix4(e.projectionMatrix)}unproject(e){return this.applyMatrix4(e.projectionMatrixInverse).applyMatrix4(e.matrixWorld)}transformDirection(e){const t=this.x,i=this.y,n=this.z,r=e.elements;return this.x=r[0]*t+r[4]*i+r[8]*n,this.y=r[1]*t+r[5]*i+r[9]*n,this.z=r[2]*t+r[6]*i+r[10]*n,this.normalize()}divide(e){return this.x/=e.x,this.y/=e.y,this.z/=e.z,this}divideScalar(e){return this.multiplyScalar(1/e)}min(e){return this.x=Math.min(this.x,e.x),this.y=Math.min(this.y,e.y),this.z=Math.min(this.z,e.z),this}max(e){return this.x=Math.max(this.x,e.x),this.y=Math.max(this.y,e.y),this.z=Math.max(this.z,e.z),this}clamp(e,t){return this.x=Math.max(e.x,Math.min(t.x,this.x)),this.y=Math.max(e.y,Math.min(t.y,this.y)),this.z=Math.max(e.z,Math.min(t.z,this.z)),this}clampScalar(e,t){return this.x=Math.max(e,Math.min(t,this.x)),this.y=Math.max(e,Math.min(t,this.y)),this.z=Math.max(e,Math.min(t,this.z)),this}clampLength(e,t){const i=this.length();return this.divideScalar(i||1).multiplyScalar(Math.max(e,Math.min(t,i)))}floor(){return this.x=Math.floor(this.x),this.y=Math.floor(this.y),this.z=Math.floor(this.z),this}ceil(){return this.x=Math.ceil(this.x),this.y=Math.ceil(this.y),this.z=Math.ceil(this.z),this}round(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this.z=Math.round(this.z),this}roundToZero(){return this.x=this.x<0?Math.ceil(this.x):Math.floor(this.x),this.y=this.y<0?Math.ceil(this.y):Math.floor(this.y),this.z=this.z<0?Math.ceil(this.z):Math.floor(this.z),this}negate(){return this.x=-this.x,this.y=-this.y,this.z=-this.z,this}dot(e){return this.x*e.x+this.y*e.y+this.z*e.z}lengthSq(){return this.x*this.x+this.y*this.y+this.z*this.z}length(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)}manhattanLength(){return Math.abs(this.x)+Math.abs(this.y)+Math.abs(this.z)}normalize(){return this.divideScalar(this.length()||1)}setLength(e){return this.normalize().multiplyScalar(e)}lerp(e,t){return this.x+=(e.x-this.x)*t,this.y+=(e.y-this.y)*t,this.z+=(e.z-this.z)*t,this}lerpVectors(e,t,i){return this.x=e.x+(t.x-e.x)*i,this.y=e.y+(t.y-e.y)*i,this.z=e.z+(t.z-e.z)*i,this}cross(e,t){return void 0!==t?(console.warn("THREE.Vector3: .cross() now only accepts one argument. Use .crossVectors( a, b ) instead."),this.crossVectors(e,t)):this.crossVectors(this,e)}crossVectors(e,t){const i=e.x,n=e.y,r=e.z,s=t.x,a=t.y,o=t.z;return this.x=n*o-r*a,this.y=r*s-i*o,this.z=i*a-n*s,this}projectOnVector(e){const t=e.lengthSq();if(0===t)return this.set(0,0,0);const i=e.dot(this)/t;return this.copy(e).multiplyScalar(i)}projectOnPlane(e){return Qi.copy(this).projectOnVector(e),this.sub(Qi)}reflect(e){return this.sub(Qi.copy(e).multiplyScalar(2*this.dot(e)))}angleTo(e){const t=Math.sqrt(this.lengthSq()*e.lengthSq());if(0===t)return Math.PI/2;const i=this.dot(e)/t;return Math.acos(Li(i,-1,1))}distanceTo(e){return Math.sqrt(this.distanceToSquared(e))}distanceToSquared(e){const t=this.x-e.x,i=this.y-e.y,n=this.z-e.z;return t*t+i*i+n*n}manhattanDistanceTo(e){return Math.abs(this.x-e.x)+Math.abs(this.y-e.y)+Math.abs(this.z-e.z)}setFromSpherical(e){return this.setFromSphericalCoords(e.radius,e.phi,e.theta)}setFromSphericalCoords(e,t,i){const n=Math.sin(t)*e;return this.x=n*Math.sin(i),this.y=Math.cos(t)*e,this.z=n*Math.cos(i),this}setFromCylindrical(e){return this.setFromCylindricalCoords(e.radius,e.theta,e.y)}setFromCylindricalCoords(e,t,i){return this.x=e*Math.sin(t),this.y=i,this.z=e*Math.cos(t),this}setFromMatrixPosition(e){const t=e.elements;return this.x=t[12],this.y=t[13],this.z=t[14],this}setFromMatrixScale(e){const t=this.setFromMatrixColumn(e,0).length(),i=this.setFromMatrixColumn(e,1).length(),n=this.setFromMatrixColumn(e,2).length();return this.x=t,this.y=i,this.z=n,this}setFromMatrixColumn(e,t){return this.fromArray(e.elements,4*t)}setFromMatrix3Column(e,t){return this.fromArray(e.elements,3*t)}equals(e){return e.x===this.x&&e.y===this.y&&e.z===this.z}fromArray(e,t=0){return this.x=e[t],this.y=e[t+1],this.z=e[t+2],this}toArray(e=[],t=0){return e[t]=this.x,e[t+1]=this.y,e[t+2]=this.z,e}fromBufferAttribute(e,t,i){return void 0!==i&&console.warn("THREE.Vector3: offset has been removed from .fromBufferAttribute()."),this.x=e.getX(t),this.y=e.getY(t),this.z=e.getZ(t),this}random(){return this.x=Math.random(),this.y=Math.random(),this.z=Math.random(),this}randomDirection(){const e=2*(Math.random()-.5),t=Math.random()*Math.PI*2,i=Math.sqrt(1-e**2);return this.x=i*Math.cos(t),this.y=i*Math.sin(t),this.z=e,this}*[Symbol.iterator](){yield this.x,yield this.y,yield this.z}}Ki.prototype.isVector3=!0;const Qi=new Ki,en=new Ji;class tn{constructor(e=new Ki(1/0,1/0,1/0),t=new Ki(-1/0,-1/0,-1/0)){this.min=e,this.max=t}set(e,t){return this.min.copy(e),this.max.copy(t),this}setFromArray(e){let t=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,h=e.length;o<h;o+=3){const h=e[o],c=e[o+1],l=e[o+2];h<t&&(t=h),c<i&&(i=c),l<n&&(n=l),h>r&&(r=h),c>s&&(s=c),l>a&&(a=l)}return this.min.set(t,i,n),this.max.set(r,s,a),this}setFromBufferAttribute(e){let t=1/0,i=1/0,n=1/0,r=-1/0,s=-1/0,a=-1/0;for(let o=0,h=e.count;o<h;o++){const h=e.getX(o),c=e.getY(o),l=e.getZ(o);h<t&&(t=h),c<i&&(i=c),l<n&&(n=l),h>r&&(r=h),c>s&&(s=c),l>a&&(a=l)}return this.min.set(t,i,n),this.max.set(r,s,a),this}setFromPoints(e){this.makeEmpty();for(let t=0,i=e.length;t<i;t++)this.expandByPoint(e[t]);return this}setFromCenterAndSize(e,t){const i=rn.copy(t).multiplyScalar(.5);return this.min.copy(e).sub(i),this.max.copy(e).add(i),this}setFromObject(e){return this.makeEmpty(),this.expandByObject(e)}clone(){return(new this.constructor).copy(this)}copy(e){return this.min.copy(e.min),this.max.copy(e.max),this}makeEmpty(){return this.min.x=this.min.y=this.min.z=1/0,this.max.x=this.max.y=this.max.z=-1/0,this}isEmpty(){return this.max.x<this.min.x||this.max.y<this.min.y||this.max.z<this.min.z}getCenter(e){return this.isEmpty()?e.set(0,0,0):e.addVectors(this.min,this.max).multiplyScalar(.5)}getSize(e){return this.isEmpty()?e.set(0,0,0):e.subVectors(this.max,this.min)}expandByPoint(e){return this.min.min(e),this.max.max(e),this}expandByVector(e){return this.min.sub(e),this.max.add(e),this}expandByScalar(e){return this.min.addScalar(-e),this.max.addScalar(e),this}expandByObject(e){e.updateWorldMatrix(!1,!1);const t=e.geometry;void 0!==t&&(null===t.boundingBox&&t.computeBoundingBox(),sn.copy(t.boundingBox),sn.applyMatrix4(e.matrixWorld),this.union(sn));const i=e.children;for(let e=0,t=i.length;e<t;e++)this.expandByObject(i[e]);return this}containsPoint(e){return!(e.x<this.min.x||e.x>this.max.x||e.y<this.min.y||e.y>this.max.y||e.z<this.min.z||e.z>this.max.z)}containsBox(e){return this.min.x<=e.min.x&&e.max.x<=this.max.x&&this.min.y<=e.min.y&&e.max.y<=this.max.y&&this.min.z<=e.min.z&&e.max.z<=this.max.z}getParameter(e,t){return t.set((e.x-this.min.x)/(this.max.x-this.min.x),(e.y-this.min.y)/(this.max.y-this.min.y),(e.z-this.min.z)/(this.max.z-this.min.z))}intersectsBox(e){return!(e.max.x<this.min.x||e.min.x>this.max.x||e.max.y<this.min.y||e.min.y>this.max.y||e.max.z<this.min.z||e.min.z>this.max.z)}intersectsSphere(e){return this.clampPoint(e.center,rn),rn.distanceToSquared(e.center)<=e.radius*e.radius}intersectsPlane(e){let t,i;return e.normal.x>0?(t=e.normal.x*this.min.x,i=e.normal.x*this.max.x):(t=e.normal.x*this.max.x,i=e.normal.x*this.min.x),e.normal.y>0?(t+=e.normal.y*this.min.y,i+=e.normal.y*this.max.y):(t+=e.normal.y*this.max.y,i+=e.normal.y*this.min.y),e.normal.z>0?(t+=e.normal.z*this.min.z,i+=e.normal.z*this.max.z):(t+=e.normal.z*this.max.z,i+=e.normal.z*this.min.z),t<=-e.constant&&i>=-e.constant}intersectsTriangle(e){if(this.isEmpty())return!1;this.getCenter(dn),pn.subVectors(this.max,dn),an.subVectors(e.a,dn),on.subVectors(e.b,dn),hn.subVectors(e.c,dn),cn.subVectors(on,an),ln.subVectors(hn,on),un.subVectors(an,hn);let t=[0,-cn.z,cn.y,0,-ln.z,ln.y,0,-un.z,un.y,cn.z,0,-cn.x,ln.z,0,-ln.x,un.z,0,-un.x,-cn.y,cn.x,0,-ln.y,ln.x,0,-un.y,un.x,0];return!!gn(t,an,on,hn,pn)&&(t=[1,0,0,0,1,0,0,0,1],!!gn(t,an,on,hn,pn)&&(mn.crossVectors(cn,ln),t=[mn.x,mn.y,mn.z],gn(t,an,on,hn,pn)))}clampPoint(e,t){return t.copy(e).clamp(this.min,this.max)}distanceToPoint(e){return rn.copy(e).clamp(this.min,this.max).sub(e).length()}getBoundingSphere(e){return this.getCenter(e.center),e.radius=.5*this.getSize(rn).length(),e}intersect(e){return this.min.max(e.min),this.max.min(e.max),this.isEmpty()&&this.makeEmpty(),this}union(e){return this.min.min(e.min),this.max.max(e.max),this}applyMatrix4(e){return this.isEmpty()||(nn[0].set(this.min.x,this.min.y,this.min.z).applyMatrix4(e),nn[1].set(this.min.x,this.min.y,this.max.z).applyMatrix4(e),nn[2].set(this.min.x,this.max.y,this.min.z).applyMatrix4(e),nn[3].set(this.min.x,this.max.y,this.max.z).applyMatrix4(e),nn[4].set(this.max.x,this.min.y,this.min.z).applyMatrix4(e),nn[5].set(this.max.x,this.min.y,this.max.z).applyMatrix4(e),nn[6].set(this.max.x,this.max.y,this.min.z).applyMatrix4(e),nn[7].set(this.max.x,this.max.y,this.max.z).applyMatrix4(e),this.setFromPoints(nn)),this}translate(e){return this.min.add(e),this.max.add(e),this}equals(e){return e.min.equals(this.min)&&e.max.equals(this.max)}}tn.prototype.isBox3=!0;const nn=[new Ki,new Ki,new Ki,new Ki,new Ki,new Ki,new Ki,new Ki],rn=new Ki,sn=new tn,an=new Ki,on=new Ki,hn=new Ki,cn=new Ki,ln=new Ki,un=new Ki,dn=new Ki,pn=new Ki,mn=new Ki,fn=new Ki;function gn(e,t,i,n,r){for(let s=0,a=e.length-3;s<=a;s+=3){fn.fromArray(e,s);const a=r.x*Math.abs(fn.x)+r.y*Math.abs(fn.y)+r.z*Math.abs(fn.z),o=t.dot(fn),h=i.dot(fn),c=n.dot(fn);if(Math.max(-Math.max(o,h,c),Math.min(o,h,c))>a)return!1}return!0}const _n=new tn,vn=new Ki,yn=new Ki,bn=new Ki;class xn{constructor(e=new Ki,t=-1){this.center=e,this.radius=t}set(e,t){return this.center.copy(e),this.radius=t,this}setFromPoints(e,t){const i=this.center;void 0!==t?i.copy(t):_n.setFromPoints(e).getCenter(i);let n=0;for(let t=0,r=e.length;t<r;t++)n=Math.max(n,i.distanceToSquared(e[t]));return this.radius=Math.sqrt(n),this}copy(e){return this.center.copy(e.center),this.radius=e.radius,this}isEmpty(){return this.radius<0}makeEmpty(){return this.center.set(0,0,0),this.radius=-1,this}containsPoint(e){return e.distanceToSquared(this.center)<=this.radius*this.radius}distanceToPoint(e){return e.distanceTo(this.center)-this.radius}intersectsSphere(e){const t=this.radius+e.radius;return e.center.distanceToSquared(this.center)<=t*t}intersectsBox(e){return e.intersectsSphere(this)}intersectsPlane(e){return Math.abs(e.distanceToPoint(this.center))<=this.radius}clampPoint(e,t){const i=this.center.distanceToSquared(e);return t.copy(e),i>this.radius*this.radius&&(t.sub(this.center).normalize(),t.multiplyScalar(this.radius).add(this.center)),t}getBoundingBox(e){return this.isEmpty()?(e.makeEmpty(),e):(e.set(this.center,this.center),e.expandByScalar(this.radius),e)}applyMatrix4(e){return this.center.applyMatrix4(e),this.radius=this.radius*e.getMaxScaleOnAxis(),this}translate(e){return this.center.add(e),this}expandByPoint(e){bn.subVectors(e,this.center);const t=bn.lengthSq();if(t>this.radius*this.radius){const e=Math.sqrt(t),i=.5*(e-this.radius);this.center.add(bn.multiplyScalar(i/e)),this.radius+=i}return this}union(e){return yn.subVectors(e.center,this.center).normalize().multiplyScalar(e.radius),this.expandByPoint(vn.copy(e.center).add(yn)),this.expandByPoint(vn.copy(e.center).sub(yn)),this}equals(e){return e.center.equals(this.center)&&e.radius===this.radius}clone(){return(new this.constructor).copy(this)}}const wn=new Ki,Mn=new Ki,Sn=new Ki,Tn=new Ki,Cn=new Ki,En=new Ki,An=new Ki;class In{constructor(e=new Ki,t=new Ki(0,0,-1)){this.origin=e,this.direction=t}set(e,t){return this.origin.copy(e),this.direction.copy(t),this}copy(e){return this.origin.copy(e.origin),this.direction.copy(e.direction),this}at(e,t){return t.copy(this.direction).multiplyScalar(e).add(this.origin)}lookAt(e){return this.direction.copy(e).sub(this.origin).normalize(),this}recast(e){return this.origin.copy(this.at(e,wn)),this}closestPointToPoint(e,t){t.subVectors(e,this.origin);const i=t.dot(this.direction);return i<0?t.copy(this.origin):t.copy(this.direction).multiplyScalar(i).add(this.origin)}distanceToPoint(e){return Math.sqrt(this.distanceSqToPoint(e))}distanceSqToPoint(e){const t=wn.subVectors(e,this.origin).dot(this.direction);return t<0?this.origin.distanceToSquared(e):(wn.copy(this.direction).multiplyScalar(t).add(this.origin),wn.distanceToSquared(e))}distanceSqToSegment(e,t,i,n){Mn.copy(e).add(t).multiplyScalar(.5),Sn.copy(t).sub(e).normalize(),Tn.copy(this.origin).sub(Mn);const r=.5*e.distanceTo(t),s=-this.direction.dot(Sn),a=Tn.dot(this.direction),o=-Tn.dot(Sn),h=Tn.lengthSq(),c=Math.abs(1-s*s);let l,u,d,p;if(c>0)if(l=s*o-a,u=s*a-o,p=r*c,l>=0)if(u>=-p)if(u<=p){const e=1/c;l*=e,u*=e,d=l*(l+s*u+2*a)+u*(s*l+u+2*o)+h}else u=r,l=Math.max(0,-(s*u+a)),d=-l*l+u*(u+2*o)+h;else u=-r,l=Math.max(0,-(s*u+a)),d=-l*l+u*(u+2*o)+h;else u<=-p?(l=Math.max(0,-(-s*r+a)),u=l>0?-r:Math.min(Math.max(-r,-o),r),d=-l*l+u*(u+2*o)+h):u<=p?(l=0,u=Math.min(Math.max(-r,-o),r),d=u*(u+2*o)+h):(l=Math.max(0,-(s*r+a)),u=l>0?r:Math.min(Math.max(-r,-o),r),d=-l*l+u*(u+2*o)+h);else u=s>0?-r:r,l=Math.max(0,-(s*u+a)),d=-l*l+u*(u+2*o)+h;return i&&i.copy(this.direction).multiplyScalar(l).add(this.origin),n&&n.copy(Sn).multiplyScalar(u).add(Mn),d}intersectSphere(e,t){wn.subVectors(e.center,this.origin);const i=wn.dot(this.direction),n=wn.dot(wn)-i*i,r=e.radius*e.radius;if(n>r)return null;const s=Math.sqrt(r-n),a=i-s,o=i+s;return a<0&&o<0?null:a<0?this.at(o,t):this.at(a,t)}intersectsSphere(e){return this.distanceSqToPoint(e.center)<=e.radius*e.radius}distanceToPlane(e){const t=e.normal.dot(this.direction);if(0===t)return 0===e.distanceToPoint(this.origin)?0:null;const i=-(this.origin.dot(e.normal)+e.constant)/t;return i>=0?i:null}intersectPlane(e,t){const i=this.distanceToPlane(e);return null===i?null:this.at(i,t)}intersectsPlane(e){const t=e.distanceToPoint(this.origin);if(0===t)return!0;return e.normal.dot(this.direction)*t<0}intersectBox(e,t){let i,n,r,s,a,o;const h=1/this.direction.x,c=1/this.direction.y,l=1/this.direction.z,u=this.origin;return h>=0?(i=(e.min.x-u.x)*h,n=(e.max.x-u.x)*h):(i=(e.max.x-u.x)*h,n=(e.min.x-u.x)*h),c>=0?(r=(e.min.y-u.y)*c,s=(e.max.y-u.y)*c):(r=(e.max.y-u.y)*c,s=(e.min.y-u.y)*c),i>s||r>n?null:((r>i||i!=i)&&(i=r),(s<n||n!=n)&&(n=s),l>=0?(a=(e.min.z-u.z)*l,o=(e.max.z-u.z)*l):(a=(e.max.z-u.z)*l,o=(e.min.z-u.z)*l),i>o||a>n?null:((a>i||i!=i)&&(i=a),(o<n||n!=n)&&(n=o),n<0?null:this.at(i>=0?i:n,t)))}intersectsBox(e){return null!==this.intersectBox(e,wn)}intersectTriangle(e,t,i,n,r){Cn.subVectors(t,e),En.subVectors(i,e),An.crossVectors(Cn,En);let s,a=this.direction.dot(An);if(a>0){if(n)return null;s=1}else{if(!(a<0))return null;s=-1,a=-a}Tn.subVectors(this.origin,e);const o=s*this.direction.dot(En.crossVectors(Tn,En));if(o<0)return null;const h=s*this.direction.dot(Cn.cross(Tn));if(h<0)return null;if(o+h>a)return null;const c=-s*Tn.dot(An);return c<0?null:this.at(c/a,r)}applyMatrix4(e){return this.origin.applyMatrix4(e),this.direction.transformDirection(e),this}equals(e){return e.origin.equals(this.origin)&&e.direction.equals(this.direction)}clone(){return(new this.constructor).copy(this)}}class Rn{constructor(){this.elements=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],arguments.length>0&&console.error("THREE.Matrix4: the constructor no longer reads arguments. use .set() instead.")}set(e,t,i,n,r,s,a,o,h,c,l,u,d,p,m,f){const g=this.elements;return g[0]=e,g[4]=t,g[8]=i,g[12]=n,g[1]=r,g[5]=s,g[9]=a,g[13]=o,g[2]=h,g[6]=c,g[10]=l,g[14]=u,g[3]=d,g[7]=p,g[11]=m,g[15]=f,this}identity(){return this.set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1),this}clone(){return(new Rn).fromArray(this.elements)}copy(e){const t=this.elements,i=e.elements;return t[0]=i[0],t[1]=i[1],t[2]=i[2],t[3]=i[3],t[4]=i[4],t[5]=i[5],t[6]=i[6],t[7]=i[7],t[8]=i[8],t[9]=i[9],t[10]=i[10],t[11]=i[11],t[12]=i[12],t[13]=i[13],t[14]=i[14],t[15]=i[15],this}copyPosition(e){const t=this.elements,i=e.elements;return t[12]=i[12],t[13]=i[13],t[14]=i[14],this}setFromMatrix3(e){const t=e.elements;return this.set(t[0],t[3],t[6],0,t[1],t[4],t[7],0,t[2],t[5],t[8],0,0,0,0,1),this}extractBasis(e,t,i){return e.setFromMatrixColumn(this,0),t.setFromMatrixColumn(this,1),i.setFromMatrixColumn(this,2),this}makeBasis(e,t,i){return this.set(e.x,t.x,i.x,0,e.y,t.y,i.y,0,e.z,t.z,i.z,0,0,0,0,1),this}extractRotation(e){const t=this.elements,i=e.elements,n=1/Pn.setFromMatrixColumn(e,0).length(),r=1/Pn.setFromMatrixColumn(e,1).length(),s=1/Pn.setFromMatrixColumn(e,2).length();return t[0]=i[0]*n,t[1]=i[1]*n,t[2]=i[2]*n,t[3]=0,t[4]=i[4]*r,t[5]=i[5]*r,t[6]=i[6]*r,t[7]=0,t[8]=i[8]*s,t[9]=i[9]*s,t[10]=i[10]*s,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromEuler(e){e&&e.isEuler||console.error("THREE.Matrix4: .makeRotationFromEuler() now expects a Euler rotation rather than a Vector3 and order.");const t=this.elements,i=e.x,n=e.y,r=e.z,s=Math.cos(i),a=Math.sin(i),o=Math.cos(n),h=Math.sin(n),c=Math.cos(r),l=Math.sin(r);if("XYZ"===e.order){const e=s*c,i=s*l,n=a*c,r=a*l;t[0]=o*c,t[4]=-o*l,t[8]=h,t[1]=i+n*h,t[5]=e-r*h,t[9]=-a*o,t[2]=r-e*h,t[6]=n+i*h,t[10]=s*o}else if("YXZ"===e.order){const e=o*c,i=o*l,n=h*c,r=h*l;t[0]=e+r*a,t[4]=n*a-i,t[8]=s*h,t[1]=s*l,t[5]=s*c,t[9]=-a,t[2]=i*a-n,t[6]=r+e*a,t[10]=s*o}else if("ZXY"===e.order){const e=o*c,i=o*l,n=h*c,r=h*l;t[0]=e-r*a,t[4]=-s*l,t[8]=n+i*a,t[1]=i+n*a,t[5]=s*c,t[9]=r-e*a,t[2]=-s*h,t[6]=a,t[10]=s*o}else if("ZYX"===e.order){const e=s*c,i=s*l,n=a*c,r=a*l;t[0]=o*c,t[4]=n*h-i,t[8]=e*h+r,t[1]=o*l,t[5]=r*h+e,t[9]=i*h-n,t[2]=-h,t[6]=a*o,t[10]=s*o}else if("YZX"===e.order){const e=s*o,i=s*h,n=a*o,r=a*h;t[0]=o*c,t[4]=r-e*l,t[8]=n*l+i,t[1]=l,t[5]=s*c,t[9]=-a*c,t[2]=-h*c,t[6]=i*l+n,t[10]=e-r*l}else if("XZY"===e.order){const e=s*o,i=s*h,n=a*o,r=a*h;t[0]=o*c,t[4]=-l,t[8]=h*c,t[1]=e*l+r,t[5]=s*c,t[9]=i*l-n,t[2]=n*l-i,t[6]=a*c,t[10]=r*l+e}return t[3]=0,t[7]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,this}makeRotationFromQuaternion(e){return this.compose(Dn,e,Nn)}lookAt(e,t,i){const n=this.elements;return On.subVectors(e,t),0===On.lengthSq()&&(On.z=1),On.normalize(),$n.crossVectors(i,On),0===$n.lengthSq()&&(1===Math.abs(i.z)?On.x+=1e-4:On.z+=1e-4,On.normalize(),$n.crossVectors(i,On)),$n.normalize(),kn.crossVectors(On,$n),n[0]=$n.x,n[4]=kn.x,n[8]=On.x,n[1]=$n.y,n[5]=kn.y,n[9]=On.y,n[2]=$n.z,n[6]=kn.z,n[10]=On.z,this}multiply(e,t){return void 0!==t?(console.warn("THREE.Matrix4: .multiply() now only accepts one argument. Use .multiplyMatrices( a, b ) instead."),this.multiplyMatrices(e,t)):this.multiplyMatrices(this,e)}premultiply(e){return this.multiplyMatrices(e,this)}multiplyMatrices(e,t){const i=e.elements,n=t.elements,r=this.elements,s=i[0],a=i[4],o=i[8],h=i[12],c=i[1],l=i[5],u=i[9],d=i[13],p=i[2],m=i[6],f=i[10],g=i[14],_=i[3],v=i[7],y=i[11],b=i[15],x=n[0],w=n[4],M=n[8],S=n[12],T=n[1],C=n[5],E=n[9],A=n[13],I=n[2],R=n[6],P=n[10],L=n[14],D=n[3],N=n[7],$=n[11],k=n[15];return r[0]=s*x+a*T+o*I+h*D,r[4]=s*w+a*C+o*R+h*N,r[8]=s*M+a*E+o*P+h*$,r[12]=s*S+a*A+o*L+h*k,r[1]=c*x+l*T+u*I+d*D,r[5]=c*w+l*C+u*R+d*N,r[9]=c*M+l*E+u*P+d*$,r[13]=c*S+l*A+u*L+d*k,r[2]=p*x+m*T+f*I+g*D,r[6]=p*w+m*C+f*R+g*N,r[10]=p*M+m*E+f*P+g*$,r[14]=p*S+m*A+f*L+g*k,r[3]=_*x+v*T+y*I+b*D,r[7]=_*w+v*C+y*R+b*N,r[11]=_*M+v*E+y*P+b*$,r[15]=_*S+v*A+y*L+b*k,this}multiplyScalar(e){const t=this.elements;return t[0]*=e,t[4]*=e,t[8]*=e,t[12]*=e,t[1]*=e,t[5]*=e,t[9]*=e,t[13]*=e,t[2]*=e,t[6]*=e,t[10]*=e,t[14]*=e,t[3]*=e,t[7]*=e,t[11]*=e,t[15]*=e,this}determinant(){const e=this.elements,t=e[0],i=e[4],n=e[8],r=e[12],s=e[1],a=e[5],o=e[9],h=e[13],c=e[2],l=e[6],u=e[10],d=e[14];return e[3]*(+r*o*l-n*h*l-r*a*u+i*h*u+n*a*d-i*o*d)+e[7]*(+t*o*d-t*h*u+r*s*u-n*s*d+n*h*c-r*o*c)+e[11]*(+t*h*l-t*a*d-r*s*l+i*s*d+r*a*c-i*h*c)+e[15]*(-n*a*c-t*o*l+t*a*u+n*s*l-i*s*u+i*o*c)}transpose(){const e=this.elements;let t;return t=e[1],e[1]=e[4],e[4]=t,t=e[2],e[2]=e[8],e[8]=t,t=e[6],e[6]=e[9],e[9]=t,t=e[3],e[3]=e[12],e[12]=t,t=e[7],e[7]=e[13],e[13]=t,t=e[11],e[11]=e[14],e[14]=t,this}setPosition(e,t,i){const n=this.elements;return e.isVector3?(n[12]=e.x,n[13]=e.y,n[14]=e.z):(n[12]=e,n[13]=t,n[14]=i),this}invert(){const e=this.elements,t=e[0],i=e[1],n=e[2],r=e[3],s=e[4],a=e[5],o=e[6],h=e[7],c=e[8],l=e[9],u=e[10],d=e[11],p=e[12],m=e[13],f=e[14],g=e[15],_=l*f*h-m*u*h+m*o*d-a*f*d-l*o*g+a*u*g,v=p*u*h-c*f*h-p*o*d+s*f*d+c*o*g-s*u*g,y=c*m*h-p*l*h+p*a*d-s*m*d-c*a*g+s*l*g,b=p*l*o-c*m*o-p*a*u+s*m*u+c*a*f-s*l*f,x=t*_+i*v+n*y+r*b;if(0===x)return this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);const w=1/x;return e[0]=_*w,e[1]=(m*u*r-l*f*r-m*n*d+i*f*d+l*n*g-i*u*g)*w,e[2]=(a*f*r-m*o*r+m*n*h-i*f*h-a*n*g+i*o*g)*w,e[3]=(l*o*r-a*u*r-l*n*h+i*u*h+a*n*d-i*o*d)*w,e[4]=v*w,e[5]=(c*f*r-p*u*r+p*n*d-t*f*d-c*n*g+t*u*g)*w,e[6]=(p*o*r-s*f*r-p*n*h+t*f*h+s*n*g-t*o*g)*w,e[7]=(s*u*r-c*o*r+c*n*h-t*u*h-s*n*d+t*o*d)*w,e[8]=y*w,e[9]=(p*l*r-c*m*r-p*i*d+t*m*d+c*i*g-t*l*g)*w,e[10]=(s*m*r-p*a*r+p*i*h-t*m*h-s*i*g+t*a*g)*w,e[11]=(c*a*r-s*l*r-c*i*h+t*l*h+s*i*d-t*a*d)*w,e[12]=b*w,e[13]=(c*m*n-p*l*n+p*i*u-t*m*u-c*i*f+t*l*f)*w,e[14]=(p*a*n-s*m*n-p*i*o+t*m*o+s*i*f-t*a*f)*w,e[15]=(s*l*n-c*a*n+c*i*o-t*l*o-s*i*u+t*a*u)*w,this}scale(e){const t=this.elements,i=e.x,n=e.y,r=e.z;return t[0]*=i,t[4]*=n,t[8]*=r,t[1]*=i,t[5]*=n,t[9]*=r,t[2]*=i,t[6]*=n,t[10]*=r,t[3]*=i,t[7]*=n,t[11]*=r,this}getMaxScaleOnAxis(){const e=this.elements,t=e[0]*e[0]+e[1]*e[1]+e[2]*e[2],i=e[4]*e[4]+e[5]*e[5]+e[6]*e[6],n=e[8]*e[8]+e[9]*e[9]+e[10]*e[10];return Math.sqrt(Math.max(t,i,n))}makeTranslation(e,t,i){return this.set(1,0,0,e,0,1,0,t,0,0,1,i,0,0,0,1),this}makeRotationX(e){const t=Math.cos(e),i=Math.sin(e);return this.set(1,0,0,0,0,t,-i,0,0,i,t,0,0,0,0,1),this}makeRotationY(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,0,i,0,0,1,0,0,-i,0,t,0,0,0,0,1),this}makeRotationZ(e){const t=Math.cos(e),i=Math.sin(e);return this.set(t,-i,0,0,i,t,0,0,0,0,1,0,0,0,0,1),this}makeRotationAxis(e,t){const i=Math.cos(t),n=Math.sin(t),r=1-i,s=e.x,a=e.y,o=e.z,h=r*s,c=r*a;return this.set(h*s+i,h*a-n*o,h*o+n*a,0,h*a+n*o,c*a+i,c*o-n*s,0,h*o-n*a,c*o+n*s,r*o*o+i,0,0,0,0,1),this}makeScale(e,t,i){return this.set(e,0,0,0,0,t,0,0,0,0,i,0,0,0,0,1),this}makeShear(e,t,i,n,r,s){return this.set(1,i,r,0,e,1,s,0,t,n,1,0,0,0,0,1),this}compose(e,t,i){const n=this.elements,r=t._x,s=t._y,a=t._z,o=t._w,h=r+r,c=s+s,l=a+a,u=r*h,d=r*c,p=r*l,m=s*c,f=s*l,g=a*l,_=o*h,v=o*c,y=o*l,b=i.x,x=i.y,w=i.z;return n[0]=(1-(m+g))*b,n[1]=(d+y)*b,n[2]=(p-v)*b,n[3]=0,n[4]=(d-y)*x,n[5]=(1-(u+g))*x,n[6]=(f+_)*x,n[7]=0,n[8]=(p+v)*w,n[9]=(f-_)*w,n[10]=(1-(u+m))*w,n[11]=0,n[12]=e.x,n[13]=e.y,n[14]=e.z,n[15]=1,this}decompose(e,t,i){const n=this.elements;let r=Pn.set(n[0],n[1],n[2]).length();const s=Pn.set(n[4],n[5],n[6]).length(),a=Pn.set(n[8],n[9],n[10]).length();this.determinant()<0&&(r=-r),e.x=n[12],e.y=n[13],e.z=n[14],Ln.copy(this);const o=1/r,h=1/s,c=1/a;return Ln.elements[0]*=o,Ln.elements[1]*=o,Ln.elements[2]*=o,Ln.elements[4]*=h,Ln.elements[5]*=h,Ln.elements[6]*=h,Ln.elements[8]*=c,Ln.elements[9]*=c,Ln.elements[10]*=c,t.setFromRotationMatrix(Ln),i.x=r,i.y=s,i.z=a,this}makePerspective(e,t,i,n,r,s){void 0===s&&console.warn("THREE.Matrix4: .makePerspective() has been redefined and has a new signature. Please check the docs.");const a=this.elements,o=2*r/(t-e),h=2*r/(i-n),c=(t+e)/(t-e),l=(i+n)/(i-n),u=-(s+r)/(s-r),d=-2*s*r/(s-r);return a[0]=o,a[4]=0,a[8]=c,a[12]=0,a[1]=0,a[5]=h,a[9]=l,a[13]=0,a[2]=0,a[6]=0,a[10]=u,a[14]=d,a[3]=0,a[7]=0,a[11]=-1,a[15]=0,this}makeOrthographic(e,t,i,n,r,s){const a=this.elements,o=1/(t-e),h=1/(i-n),c=1/(s-r),l=(t+e)*o,u=(i+n)*h,d=(s+r)*c;return a[0]=2*o,a[4]=0,a[8]=0,a[12]=-l,a[1]=0,a[5]=2*h,a[9]=0,a[13]=-u,a[2]=0,a[6]=0,a[10]=-2*c,a[14]=-d,a[3]=0,a[7]=0,a[11]=0,a[15]=1,this}equals(e){const t=this.elements,i=e.elements;for(let e=0;e<16;e++)if(t[e]!==i[e])return!1;return!0}fromArray(e,t=0){for(let i=0;i<16;i++)this.elements[i]=e[i+t];return this}toArray(e=[],t=0){const i=this.elements;return e[t]=i[0],e[t+1]=i[1],e[t+2]=i[2],e[t+3]=i[3],e[t+4]=i[4],e[t+5]=i[5],e[t+6]=i[6],e[t+7]=i[7],e[t+8]=i[8],e[t+9]=i[9],e[t+10]=i[10],e[t+11]=i[11],e[t+12]=i[12],e[t+13]=i[13],e[t+14]=i[14],e[t+15]=i[15],e}}Rn.prototype.isMatrix4=!0;const Pn=new Ki,Ln=new Rn,Dn=new Ki(0,0,0),Nn=new Ki(1,1,1),$n=new Ki,kn=new Ki,On=new Ki,zn=new Rn,Fn=new Ji;class Bn{constructor(e=0,t=0,i=0,n=Bn.DefaultOrder){this._x=e,this._y=t,this._z=i,this._order=n}get x(){return this._x}set x(e){this._x=e,this._onChangeCallback()}get y(){return this._y}set y(e){this._y=e,this._onChangeCallback()}get z(){return this._z}set z(e){this._z=e,this._onChangeCallback()}get order(){return this._order}set order(e){this._order=e,this._onChangeCallback()}set(e,t,i,n=this._order){return this._x=e,this._y=t,this._z=i,this._order=n,this._onChangeCallback(),this}clone(){return new this.constructor(this._x,this._y,this._z,this._order)}copy(e){return this._x=e._x,this._y=e._y,this._z=e._z,this._order=e._order,this._onChangeCallback(),this}setFromRotationMatrix(e,t=this._order,i=!0){const n=e.elements,r=n[0],s=n[4],a=n[8],o=n[1],h=n[5],c=n[9],l=n[2],u=n[6],d=n[10];switch(t){case"XYZ":this._y=Math.asin(Li(a,-1,1)),Math.abs(a)<.9999999?(this._x=Math.atan2(-c,d),this._z=Math.atan2(-s,r)):(this._x=Math.atan2(u,h),this._z=0);break;case"YXZ":this._x=Math.asin(-Li(c,-1,1)),Math.abs(c)<.9999999?(this._y=Math.atan2(a,d),this._z=Math.atan2(o,h)):(this._y=Math.atan2(-l,r),this._z=0);break;case"ZXY":this._x=Math.asin(Li(u,-1,1)),Math.abs(u)<.9999999?(this._y=Math.atan2(-l,d),this._z=Math.atan2(-s,h)):(this._y=0,this._z=Math.atan2(o,r));break;case"ZYX":this._y=Math.asin(-Li(l,-1,1)),Math.abs(l)<.9999999?(this._x=Math.atan2(u,d),this._z=Math.atan2(o,r)):(this._x=0,this._z=Math.atan2(-s,h));break;case"YZX":this._z=Math.asin(Li(o,-1,1)),Math.abs(o)<.9999999?(this._x=Math.atan2(-c,h),this._y=Math.atan2(-l,r)):(this._x=0,this._y=Math.atan2(a,d));break;case"XZY":this._z=Math.asin(-Li(s,-1,1)),Math.abs(s)<.9999999?(this._x=Math.atan2(u,h),this._y=Math.atan2(a,r)):(this._x=Math.atan2(-c,d),this._y=0);break;default:console.warn("THREE.Euler: .setFromRotationMatrix() encountered an unknown order: "+t)}return this._order=t,!0===i&&this._onChangeCallback(),this}setFromQuaternion(e,t,i){return zn.makeRotationFromQuaternion(e),this.setFromRotationMatrix(zn,t,i)}setFromVector3(e,t=this._order){return this.set(e.x,e.y,e.z,t)}reorder(e){return Fn.setFromEuler(this),this.setFromQuaternion(Fn,e)}equals(e){return e._x===this._x&&e._y===this._y&&e._z===this._z&&e._order===this._order}fromArray(e){return this._x=e[0],this._y=e[1],this._z=e[2],void 0!==e[3]&&(this._order=e[3]),this._onChangeCallback(),this}toArray(e=[],t=0){return e[t]=this._x,e[t+1]=this._y,e[t+2]=this._z,e[t+3]=this._order,e}toVector3(e){return e?e.set(this._x,this._y,this._z):new Ki(this._x,this._y,this._z)}_onChange(e){return this._onChangeCallback=e,this}_onChangeCallback(){}}Bn.prototype.isEuler=!0,Bn.DefaultOrder="XYZ",Bn.RotationOrders=["XYZ","YZX","ZXY","XZY","YXZ","ZYX"];class Un{constructor(){this.mask=1}set(e){this.mask=1<<e|0}enable(e){this.mask|=1<<e|0}enableAll(){this.mask=-1}toggle(e){this.mask^=1<<e|0}disable(e){this.mask&=~(1<<e|0)}disableAll(){this.mask=0}test(e){return 0!=(this.mask&e.mask)}}let Vn=0;const Hn=new Ki,jn=new Ji,Gn=new Rn,Wn=new Ki,qn=new Ki,Xn=new Ki,Zn=new Ji,Yn=new Ki(1,0,0),Jn=new Ki(0,1,0),Kn=new Ki(0,0,1),Qn={type:"added"},er={type:"removed"};class tr extends Ti{constructor(){super(),Object.defineProperty(this,"id",{value:Vn++}),this.uuid=Pi(),this.name="",this.type="Object3D",this.parent=null,this.children=[],this.up=tr.DefaultUp.clone();const e=new Ki,t=new Bn,i=new Ji,n=new Ki(1,1,1);t._onChange((function(){i.setFromEuler(t,!1)})),i._onChange((function(){t.setFromQuaternion(i,void 0,!1)})),Object.defineProperties(this,{position:{configurable:!0,enumerable:!0,value:e},rotation:{configurable:!0,enumerable:!0,value:t},quaternion:{configurable:!0,enumerable:!0,value:i},scale:{configurable:!0,enumerable:!0,value:n},modelViewMatrix:{value:new Rn},normalMatrix:{value:new Fi}}),this.matrix=new Rn,this.matrixWorld=new Rn,this.matrixAutoUpdate=tr.DefaultMatrixAutoUpdate,this.matrixWorldNeedsUpdate=!1,this.layers=new Un,this.visible=!0,this.castShadow=!1,this.receiveShadow=!1,this.frustumCulled=!0,this.renderOrder=0,this.animations=[],this.userData={}}onBeforeRender(){}onAfterRender(){}applyMatrix4(e){this.matrixAutoUpdate&&this.updateMatrix(),this.matrix.premultiply(e),this.matrix.decompose(this.position,this.quaternion,this.scale)}applyQuaternion(e){return this.quaternion.premultiply(e),this}setRotationFromAxisAngle(e,t){this.quaternion.setFromAxisAngle(e,t)}setRotationFromEuler(e){this.quaternion.setFromEuler(e,!0)}setRotationFromMatrix(e){this.quaternion.setFromRotationMatrix(e)}setRotationFromQuaternion(e){this.quaternion.copy(e)}rotateOnAxis(e,t){return jn.setFromAxisAngle(e,t),this.quaternion.multiply(jn),this}rotateOnWorldAxis(e,t){return jn.setFromAxisAngle(e,t),this.quaternion.premultiply(jn),this}rotateX(e){return this.rotateOnAxis(Yn,e)}rotateY(e){return this.rotateOnAxis(Jn,e)}rotateZ(e){return this.rotateOnAxis(Kn,e)}translateOnAxis(e,t){return Hn.copy(e).applyQuaternion(this.quaternion),this.position.add(Hn.multiplyScalar(t)),this}translateX(e){return this.translateOnAxis(Yn,e)}translateY(e){return this.translateOnAxis(Jn,e)}translateZ(e){return this.translateOnAxis(Kn,e)}localToWorld(e){return e.applyMatrix4(this.matrixWorld)}worldToLocal(e){return e.applyMatrix4(Gn.copy(this.matrixWorld).invert())}lookAt(e,t,i){e.isVector3?Wn.copy(e):Wn.set(e,t,i);const n=this.parent;this.updateWorldMatrix(!0,!1),qn.setFromMatrixPosition(this.matrixWorld),this.isCamera||this.isLight?Gn.lookAt(qn,Wn,this.up):Gn.lookAt(Wn,qn,this.up),this.quaternion.setFromRotationMatrix(Gn),n&&(Gn.extractRotation(n.matrixWorld),jn.setFromRotationMatrix(Gn),this.quaternion.premultiply(jn.invert()))}add(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.add(arguments[e]);return this}return e===this?(console.error("THREE.Object3D.add: object can't be added as a child of itself.",e),this):(e&&e.isObject3D?(null!==e.parent&&e.parent.remove(e),e.parent=this,this.children.push(e),e.dispatchEvent(Qn)):console.error("THREE.Object3D.add: object not an instance of THREE.Object3D.",e),this)}remove(e){if(arguments.length>1){for(let e=0;e<arguments.length;e++)this.remove(arguments[e]);return this}const t=this.children.indexOf(e);return-1!==t&&(e.parent=null,this.children.splice(t,1),e.dispatchEvent(er)),this}removeFromParent(){const e=this.parent;return null!==e&&e.remove(this),this}clear(){for(let e=0;e<this.children.length;e++){const t=this.children[e];t.parent=null,t.dispatchEvent(er)}return this.children.length=0,this}attach(e){return this.updateWorldMatrix(!0,!1),Gn.copy(this.matrixWorld).invert(),null!==e.parent&&(e.parent.updateWorldMatrix(!0,!1),Gn.multiply(e.parent.matrixWorld)),e.applyMatrix4(Gn),this.add(e),e.updateWorldMatrix(!1,!0),this}getObjectById(e){return this.getObjectByProperty("id",e)}getObjectByName(e){return this.getObjectByProperty("name",e)}getObjectByProperty(e,t){if(this[e]===t)return this;for(let i=0,n=this.children.length;i<n;i++){const n=this.children[i].getObjectByProperty(e,t);if(void 0!==n)return n}}getWorldPosition(e){return this.updateWorldMatrix(!0,!1),e.setFromMatrixPosition(this.matrixWorld)}getWorldQuaternion(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(qn,e,Xn),e}getWorldScale(e){return this.updateWorldMatrix(!0,!1),this.matrixWorld.decompose(qn,Zn,e),e}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(t[8],t[9],t[10]).normalize()}raycast(){}traverse(e){e(this);const t=this.children;for(let i=0,n=t.length;i<n;i++)t[i].traverse(e)}traverseVisible(e){if(!1===this.visible)return;e(this);const t=this.children;for(let i=0,n=t.length;i<n;i++)t[i].traverseVisible(e)}traverseAncestors(e){const t=this.parent;null!==t&&(e(t),t.traverseAncestors(e))}updateMatrix(){this.matrix.compose(this.position,this.quaternion,this.scale),this.matrixWorldNeedsUpdate=!0}updateMatrixWorld(e){this.matrixAutoUpdate&&this.updateMatrix(),(this.matrixWorldNeedsUpdate||e)&&(null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),this.matrixWorldNeedsUpdate=!1,e=!0);const t=this.children;for(let i=0,n=t.length;i<n;i++)t[i].updateMatrixWorld(e)}updateWorldMatrix(e,t){const i=this.parent;if(!0===e&&null!==i&&i.updateWorldMatrix(!0,!1),this.matrixAutoUpdate&&this.updateMatrix(),null===this.parent?this.matrixWorld.copy(this.matrix):this.matrixWorld.multiplyMatrices(this.parent.matrixWorld,this.matrix),!0===t){const e=this.children;for(let t=0,i=e.length;t<i;t++)e[t].updateWorldMatrix(!1,!0)}}toJSON(e){const t=void 0===e||"string"==typeof e,i={};t&&(e={geometries:{},materials:{},textures:{},images:{},shapes:{},skeletons:{},animations:{}},i.metadata={version:4.5,type:"Object",generator:"Object3D.toJSON"});const n={};function r(t,i){return void 0===t[i.uuid]&&(t[i.uuid]=i.toJSON(e)),i.uuid}if(n.uuid=this.uuid,n.type=this.type,""!==this.name&&(n.name=this.name),!0===this.castShadow&&(n.castShadow=!0),!0===this.receiveShadow&&(n.receiveShadow=!0),!1===this.visible&&(n.visible=!1),!1===this.frustumCulled&&(n.frustumCulled=!1),0!==this.renderOrder&&(n.renderOrder=this.renderOrder),"{}"!==JSON.stringify(this.userData)&&(n.userData=this.userData),n.layers=this.layers.mask,n.matrix=this.matrix.toArray(),!1===this.matrixAutoUpdate&&(n.matrixAutoUpdate=!1),this.isInstancedMesh&&(n.type="InstancedMesh",n.count=this.count,n.instanceMatrix=this.instanceMatrix.toJSON(),null!==this.instanceColor&&(n.instanceColor=this.instanceColor.toJSON())),this.isScene)this.background&&(this.background.isColor?n.background=this.background.toJSON():this.background.isTexture&&(n.background=this.background.toJSON(e).uuid)),this.environment&&this.environment.isTexture&&(n.environment=this.environment.toJSON(e).uuid);else if(this.isMesh||this.isLine||this.isPoints){n.geometry=r(e.geometries,this.geometry);const t=this.geometry.parameters;if(void 0!==t&&void 0!==t.shapes){const i=t.shapes;if(Array.isArray(i))for(let t=0,n=i.length;t<n;t++){const n=i[t];r(e.shapes,n)}else r(e.shapes,i)}}if(this.isSkinnedMesh&&(n.bindMode=this.bindMode,n.bindMatrix=this.bindMatrix.toArray(),void 0!==this.skeleton&&(r(e.skeletons,this.skeleton),n.skeleton=this.skeleton.uuid)),void 0!==this.material)if(Array.isArray(this.material)){const t=[];for(let i=0,n=this.material.length;i<n;i++)t.push(r(e.materials,this.material[i]));n.material=t}else n.material=r(e.materials,this.material);if(this.children.length>0){n.children=[];for(let t=0;t<this.children.length;t++)n.children.push(this.children[t].toJSON(e).object)}if(this.animations.length>0){n.animations=[];for(let t=0;t<this.animations.length;t++){const i=this.animations[t];n.animations.push(r(e.animations,i))}}if(t){const t=s(e.geometries),n=s(e.materials),r=s(e.textures),a=s(e.images),o=s(e.shapes),h=s(e.skeletons),c=s(e.animations);t.length>0&&(i.geometries=t),n.length>0&&(i.materials=n),r.length>0&&(i.textures=r),a.length>0&&(i.images=a),o.length>0&&(i.shapes=o),h.length>0&&(i.skeletons=h),c.length>0&&(i.animations=c)}return i.object=n,i;function s(e){const t=[];for(const i in e){const n=e[i];delete n.metadata,t.push(n)}return t}}clone(e){return(new this.constructor).copy(this,e)}copy(e,t=!0){if(this.name=e.name,this.up.copy(e.up),this.position.copy(e.position),this.rotation.order=e.rotation.order,this.quaternion.copy(e.quaternion),this.scale.copy(e.scale),this.matrix.copy(e.matrix),this.matrixWorld.copy(e.matrixWorld),this.matrixAutoUpdate=e.matrixAutoUpdate,this.matrixWorldNeedsUpdate=e.matrixWorldNeedsUpdate,this.layers.mask=e.layers.mask,this.visible=e.visible,this.castShadow=e.castShadow,this.receiveShadow=e.receiveShadow,this.frustumCulled=e.frustumCulled,this.renderOrder=e.renderOrder,this.userData=JSON.parse(JSON.stringify(e.userData)),!0===t)for(let t=0;t<e.children.length;t++){const i=e.children[t];this.add(i.clone())}return this}}tr.DefaultUp=new Ki(0,1,0),tr.DefaultMatrixAutoUpdate=!0,tr.prototype.isObject3D=!0;const ir=new Ki,nr=new Ki,rr=new Ki,sr=new Ki,ar=new Ki,or=new Ki,hr=new Ki,cr=new Ki,lr=new Ki,ur=new Ki;class dr{constructor(e=new Ki,t=new Ki,i=new Ki){this.a=e,this.b=t,this.c=i}static getNormal(e,t,i,n){n.subVectors(i,t),ir.subVectors(e,t),n.cross(ir);const r=n.lengthSq();return r>0?n.multiplyScalar(1/Math.sqrt(r)):n.set(0,0,0)}static getBarycoord(e,t,i,n,r){ir.subVectors(n,t),nr.subVectors(i,t),rr.subVectors(e,t);const s=ir.dot(ir),a=ir.dot(nr),o=ir.dot(rr),h=nr.dot(nr),c=nr.dot(rr),l=s*h-a*a;if(0===l)return r.set(-2,-1,-1);const u=1/l,d=(h*o-a*c)*u,p=(s*c-a*o)*u;return r.set(1-d-p,p,d)}static containsPoint(e,t,i,n){return this.getBarycoord(e,t,i,n,sr),sr.x>=0&&sr.y>=0&&sr.x+sr.y<=1}static getUV(e,t,i,n,r,s,a,o){return this.getBarycoord(e,t,i,n,sr),o.set(0,0),o.addScaledVector(r,sr.x),o.addScaledVector(s,sr.y),o.addScaledVector(a,sr.z),o}static isFrontFacing(e,t,i,n){return ir.subVectors(i,t),nr.subVectors(e,t),ir.cross(nr).dot(n)<0}set(e,t,i){return this.a.copy(e),this.b.copy(t),this.c.copy(i),this}setFromPointsAndIndices(e,t,i,n){return this.a.copy(e[t]),this.b.copy(e[i]),this.c.copy(e[n]),this}setFromAttributeAndIndices(e,t,i,n){return this.a.fromBufferAttribute(e,t),this.b.fromBufferAttribute(e,i),this.c.fromBufferAttribute(e,n),this}clone(){return(new this.constructor).copy(this)}copy(e){return this.a.copy(e.a),this.b.copy(e.b),this.c.copy(e.c),this}getArea(){return ir.subVectors(this.c,this.b),nr.subVectors(this.a,this.b),.5*ir.cross(nr).length()}getMidpoint(e){return e.addVectors(this.a,this.b).add(this.c).multiplyScalar(1/3)}getNormal(e){return dr.getNormal(this.a,this.b,this.c,e)}getPlane(e){return e.setFromCoplanarPoints(this.a,this.b,this.c)}getBarycoord(e,t){return dr.getBarycoord(e,this.a,this.b,this.c,t)}getUV(e,t,i,n,r){return dr.getUV(e,this.a,this.b,this.c,t,i,n,r)}containsPoint(e){return dr.containsPoint(e,this.a,this.b,this.c)}isFrontFacing(e){return dr.isFrontFacing(this.a,this.b,this.c,e)}intersectsBox(e){return e.intersectsTriangle(this)}closestPointToPoint(e,t){const i=this.a,n=this.b,r=this.c;let s,a;ar.subVectors(n,i),or.subVectors(r,i),cr.subVectors(e,i);const o=ar.dot(cr),h=or.dot(cr);if(o<=0&&h<=0)return t.copy(i);lr.subVectors(e,n);const c=ar.dot(lr),l=or.dot(lr);if(c>=0&&l<=c)return t.copy(n);const u=o*l-c*h;if(u<=0&&o>=0&&c<=0)return s=o/(o-c),t.copy(i).addScaledVector(ar,s);ur.subVectors(e,r);const d=ar.dot(ur),p=or.dot(ur);if(p>=0&&d<=p)return t.copy(r);const m=d*h-o*p;if(m<=0&&h>=0&&p<=0)return a=h/(h-p),t.copy(i).addScaledVector(or,a);const f=c*p-d*l;if(f<=0&&l-c>=0&&d-p>=0)return hr.subVectors(r,n),a=(l-c)/(l-c+(d-p)),t.copy(n).addScaledVector(hr,a);const g=1/(f+m+u);return s=m*g,a=u*g,t.copy(i).addScaledVector(ar,s).addScaledVector(or,a)}equals(e){return e.a.equals(this.a)&&e.b.equals(this.b)&&e.c.equals(this.c)}}let pr=0;class mr extends Ti{constructor(){super(),Object.defineProperty(this,"id",{value:pr++}),this.uuid=Pi(),this.name="",this.type="Material",this.fog=!0,this.blending=1,this.side=0,this.vertexColors=!1,this.opacity=1,this.format=oi,this.transparent=!1,this.blendSrc=204,this.blendDst=205,this.blendEquation=jt,this.blendSrcAlpha=null,this.blendDstAlpha=null,this.blendEquationAlpha=null,this.depthFunc=3,this.depthTest=!0,this.depthWrite=!0,this.stencilWriteMask=255,this.stencilFunc=519,this.stencilRef=0,this.stencilFuncMask=255,this.stencilFail=xi,this.stencilZFail=xi,this.stencilZPass=xi,this.stencilWrite=!1,this.clippingPlanes=null,this.clipIntersection=!1,this.clipShadows=!1,this.shadowSide=null,this.colorWrite=!0,this.precision=null,this.polygonOffset=!1,this.polygonOffsetFactor=0,this.polygonOffsetUnits=0,this.dithering=!1,this.alphaToCoverage=!1,this.premultipliedAlpha=!1,this.visible=!0,this.toneMapped=!0,this.userData={},this.version=0,this._alphaTest=0}get alphaTest(){return this._alphaTest}set alphaTest(e){this._alphaTest>0!=e>0&&this.version++,this._alphaTest=e}onBuild(){}onBeforeRender(){}onBeforeCompile(){}customProgramCacheKey(){return this.onBeforeCompile.toString()}setValues(e){if(void 0!==e)for(const t in e){const i=e[t];if(void 0===i){console.warn("THREE.Material: '"+t+"' parameter is undefined.");continue}if("shading"===t){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===i;continue}const n=this[t];void 0!==n?n&&n.isColor?n.set(i):n&&n.isVector3&&i&&i.isVector3?n.copy(i):this[t]=i:console.warn("THREE."+this.type+": '"+t+"' is not a property of this material.")}}toJSON(e){const t=void 0===e||"string"==typeof e;t&&(e={textures:{},images:{}});const i={metadata:{version:4.5,type:"Material",generator:"Material.toJSON"}};function n(e){const t=[];for(const i in e){const n=e[i];delete n.metadata,t.push(n)}return t}if(i.uuid=this.uuid,i.type=this.type,""!==this.name&&(i.name=this.name),this.color&&this.color.isColor&&(i.color=this.color.getHex()),void 0!==this.roughness&&(i.roughness=this.roughness),void 0!==this.metalness&&(i.metalness=this.metalness),void 0!==this.sheen&&(i.sheen=this.sheen),this.sheenColor&&this.sheenColor.isColor&&(i.sheenColor=this.sheenColor.getHex()),void 0!==this.sheenRoughness&&(i.sheenRoughness=this.sheenRoughness),this.emissive&&this.emissive.isColor&&(i.emissive=this.emissive.getHex()),this.emissiveIntensity&&1!==this.emissiveIntensity&&(i.emissiveIntensity=this.emissiveIntensity),this.specular&&this.specular.isColor&&(i.specular=this.specular.getHex()),void 0!==this.specularIntensity&&(i.specularIntensity=this.specularIntensity),this.specularColor&&this.specularColor.isColor&&(i.specularColor=this.specularColor.getHex()),void 0!==this.shininess&&(i.shininess=this.shininess),void 0!==this.clearcoat&&(i.clearcoat=this.clearcoat),void 0!==this.clearcoatRoughness&&(i.clearcoatRoughness=this.clearcoatRoughness),this.clearcoatMap&&this.clearcoatMap.isTexture&&(i.clearcoatMap=this.clearcoatMap.toJSON(e).uuid),this.clearcoatRoughnessMap&&this.clearcoatRoughnessMap.isTexture&&(i.clearcoatRoughnessMap=this.clearcoatRoughnessMap.toJSON(e).uuid),this.clearcoatNormalMap&&this.clearcoatNormalMap.isTexture&&(i.clearcoatNormalMap=this.clearcoatNormalMap.toJSON(e).uuid,i.clearcoatNormalScale=this.clearcoatNormalScale.toArray()),this.map&&this.map.isTexture&&(i.map=this.map.toJSON(e).uuid),this.matcap&&this.matcap.isTexture&&(i.matcap=this.matcap.toJSON(e).uuid),this.alphaMap&&this.alphaMap.isTexture&&(i.alphaMap=this.alphaMap.toJSON(e).uuid),this.lightMap&&this.lightMap.isTexture&&(i.lightMap=this.lightMap.toJSON(e).uuid,i.lightMapIntensity=this.lightMapIntensity),this.aoMap&&this.aoMap.isTexture&&(i.aoMap=this.aoMap.toJSON(e).uuid,i.aoMapIntensity=this.aoMapIntensity),this.bumpMap&&this.bumpMap.isTexture&&(i.bumpMap=this.bumpMap.toJSON(e).uuid,i.bumpScale=this.bumpScale),this.normalMap&&this.normalMap.isTexture&&(i.normalMap=this.normalMap.toJSON(e).uuid,i.normalMapType=this.normalMapType,i.normalScale=this.normalScale.toArray()),this.displacementMap&&this.displacementMap.isTexture&&(i.displacementMap=this.displacementMap.toJSON(e).uuid,i.displacementScale=this.displacementScale,i.displacementBias=this.displacementBias),this.roughnessMap&&this.roughnessMap.isTexture&&(i.roughnessMap=this.roughnessMap.toJSON(e).uuid),this.metalnessMap&&this.metalnessMap.isTexture&&(i.metalnessMap=this.metalnessMap.toJSON(e).uuid),this.emissiveMap&&this.emissiveMap.isTexture&&(i.emissiveMap=this.emissiveMap.toJSON(e).uuid),this.specularMap&&this.specularMap.isTexture&&(i.specularMap=this.specularMap.toJSON(e).uuid),this.specularIntensityMap&&this.specularIntensityMap.isTexture&&(i.specularIntensityMap=this.specularIntensityMap.toJSON(e).uuid),this.specularColorMap&&this.specularColorMap.isTexture&&(i.specularColorMap=this.specularColorMap.toJSON(e).uuid),this.envMap&&this.envMap.isTexture&&(i.envMap=this.envMap.toJSON(e).uuid,void 0!==this.combine&&(i.combine=this.combine)),void 0!==this.envMapIntensity&&(i.envMapIntensity=this.envMapIntensity),void 0!==this.reflectivity&&(i.reflectivity=this.reflectivity),void 0!==this.refractionRatio&&(i.refractionRatio=this.refractionRatio),this.gradientMap&&this.gradientMap.isTexture&&(i.gradientMap=this.gradientMap.toJSON(e).uuid),void 0!==this.transmission&&(i.transmission=this.transmission),this.transmissionMap&&this.transmissionMap.isTexture&&(i.transmissionMap=this.transmissionMap.toJSON(e).uuid),void 0!==this.thickness&&(i.thickness=this.thickness),this.thicknessMap&&this.thicknessMap.isTexture&&(i.thicknessMap=this.thicknessMap.toJSON(e).uuid),void 0!==this.attenuationDistance&&(i.attenuationDistance=this.attenuationDistance),void 0!==this.attenuationColor&&(i.attenuationColor=this.attenuationColor.getHex()),void 0!==this.size&&(i.size=this.size),null!==this.shadowSide&&(i.shadowSide=this.shadowSide),void 0!==this.sizeAttenuation&&(i.sizeAttenuation=this.sizeAttenuation),1!==this.blending&&(i.blending=this.blending),0!==this.side&&(i.side=this.side),this.vertexColors&&(i.vertexColors=!0),this.opacity<1&&(i.opacity=this.opacity),this.format!==oi&&(i.format=this.format),!0===this.transparent&&(i.transparent=this.transparent),i.depthFunc=this.depthFunc,i.depthTest=this.depthTest,i.depthWrite=this.depthWrite,i.colorWrite=this.colorWrite,i.stencilWrite=this.stencilWrite,i.stencilWriteMask=this.stencilWriteMask,i.stencilFunc=this.stencilFunc,i.stencilRef=this.stencilRef,i.stencilFuncMask=this.stencilFuncMask,i.stencilFail=this.stencilFail,i.stencilZFail=this.stencilZFail,i.stencilZPass=this.stencilZPass,this.rotation&&0!==this.rotation&&(i.rotation=this.rotation),!0===this.polygonOffset&&(i.polygonOffset=!0),0!==this.polygonOffsetFactor&&(i.polygonOffsetFactor=this.polygonOffsetFactor),0!==this.polygonOffsetUnits&&(i.polygonOffsetUnits=this.polygonOffsetUnits),this.linewidth&&1!==this.linewidth&&(i.linewidth=this.linewidth),void 0!==this.dashSize&&(i.dashSize=this.dashSize),void 0!==this.gapSize&&(i.gapSize=this.gapSize),void 0!==this.scale&&(i.scale=this.scale),!0===this.dithering&&(i.dithering=!0),this.alphaTest>0&&(i.alphaTest=this.alphaTest),!0===this.alphaToCoverage&&(i.alphaToCoverage=this.alphaToCoverage),!0===this.premultipliedAlpha&&(i.premultipliedAlpha=this.premultipliedAlpha),!0===this.wireframe&&(i.wireframe=this.wireframe),this.wireframeLinewidth>1&&(i.wireframeLinewidth=this.wireframeLinewidth),"round"!==this.wireframeLinecap&&(i.wireframeLinecap=this.wireframeLinecap),"round"!==this.wireframeLinejoin&&(i.wireframeLinejoin=this.wireframeLinejoin),!0===this.flatShading&&(i.flatShading=this.flatShading),!1===this.visible&&(i.visible=!1),!1===this.toneMapped&&(i.toneMapped=!1),"{}"!==JSON.stringify(this.userData)&&(i.userData=this.userData),t){const t=n(e.textures),r=n(e.images);t.length>0&&(i.textures=t),r.length>0&&(i.images=r)}return i}clone(){return(new this.constructor).copy(this)}copy(e){this.name=e.name,this.fog=e.fog,this.blending=e.blending,this.side=e.side,this.vertexColors=e.vertexColors,this.opacity=e.opacity,this.format=e.format,this.transparent=e.transparent,this.blendSrc=e.blendSrc,this.blendDst=e.blendDst,this.blendEquation=e.blendEquation,this.blendSrcAlpha=e.blendSrcAlpha,this.blendDstAlpha=e.blendDstAlpha,this.blendEquationAlpha=e.blendEquationAlpha,this.depthFunc=e.depthFunc,this.depthTest=e.depthTest,this.depthWrite=e.depthWrite,this.stencilWriteMask=e.stencilWriteMask,this.stencilFunc=e.stencilFunc,this.stencilRef=e.stencilRef,this.stencilFuncMask=e.stencilFuncMask,this.stencilFail=e.stencilFail,this.stencilZFail=e.stencilZFail,this.stencilZPass=e.stencilZPass,this.stencilWrite=e.stencilWrite;const t=e.clippingPlanes;let i=null;if(null!==t){const e=t.length;i=new Array(e);for(let n=0;n!==e;++n)i[n]=t[n].clone()}return this.clippingPlanes=i,this.clipIntersection=e.clipIntersection,this.clipShadows=e.clipShadows,this.shadowSide=e.shadowSide,this.colorWrite=e.colorWrite,this.precision=e.precision,this.polygonOffset=e.polygonOffset,this.polygonOffsetFactor=e.polygonOffsetFactor,this.polygonOffsetUnits=e.polygonOffsetUnits,this.dithering=e.dithering,this.alphaTest=e.alphaTest,this.alphaToCoverage=e.alphaToCoverage,this.premultipliedAlpha=e.premultipliedAlpha,this.visible=e.visible,this.toneMapped=e.toneMapped,this.userData=JSON.parse(JSON.stringify(e.userData)),this}dispose(){this.dispatchEvent({type:"dispose"})}set needsUpdate(e){!0===e&&this.version++}}mr.prototype.isMaterial=!0;const fr={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074},gr={h:0,s:0,l:0},_r={h:0,s:0,l:0};function vr(e,t,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+6*(t-e)*(2/3-i):e}function yr(e){return e<.04045?.0773993808*e:Math.pow(.9478672986*e+.0521327014,2.4)}function br(e){return e<.0031308?12.92*e:1.055*Math.pow(e,.41666)-.055}class xr{constructor(e,t,i){return void 0===t&&void 0===i?this.set(e):this.setRGB(e,t,i)}set(e){return e&&e.isColor?this.copy(e):"number"==typeof e?this.setHex(e):"string"==typeof e&&this.setStyle(e),this}setScalar(e){return this.r=e,this.g=e,this.b=e,this}setHex(e){return e=Math.floor(e),this.r=(e>>16&255)/255,this.g=(e>>8&255)/255,this.b=(255&e)/255,this}setRGB(e,t,i){return this.r=e,this.g=t,this.b=i,this}setHSL(e,t,i){if(e=Di(e,1),t=Li(t,0,1),i=Li(i,0,1),0===t)this.r=this.g=this.b=i;else{const n=i<=.5?i*(1+t):i+t-i*t,r=2*i-n;this.r=vr(r,n,e+1/3),this.g=vr(r,n,e),this.b=vr(r,n,e-1/3)}return this}setStyle(e){function t(t){void 0!==t&&parseFloat(t)<1&&console.warn("THREE.Color: Alpha component of "+e+" will be ignored.")}let i;if(i=/^((?:rgb|hsl)a?)\(([^\)]*)\)/.exec(e)){let e;const n=i[1],r=i[2];switch(n){case"rgb":case"rgba":if(e=/^\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(255,parseInt(e[1],10))/255,this.g=Math.min(255,parseInt(e[2],10))/255,this.b=Math.min(255,parseInt(e[3],10))/255,t(e[4]),this;if(e=/^\s*(\d+)\%\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r))return this.r=Math.min(100,parseInt(e[1],10))/100,this.g=Math.min(100,parseInt(e[2],10))/100,this.b=Math.min(100,parseInt(e[3],10))/100,t(e[4]),this;break;case"hsl":case"hsla":if(e=/^\s*(\d*\.?\d+)\s*,\s*(\d+)\%\s*,\s*(\d+)\%\s*(?:,\s*(\d*\.?\d+)\s*)?$/.exec(r)){const i=parseFloat(e[1])/360,n=parseInt(e[2],10)/100,r=parseInt(e[3],10)/100;return t(e[4]),this.setHSL(i,n,r)}}}else if(i=/^\#([A-Fa-f\d]+)$/.exec(e)){const e=i[1],t=e.length;if(3===t)return this.r=parseInt(e.charAt(0)+e.charAt(0),16)/255,this.g=parseInt(e.charAt(1)+e.charAt(1),16)/255,this.b=parseInt(e.charAt(2)+e.charAt(2),16)/255,this;if(6===t)return this.r=parseInt(e.charAt(0)+e.charAt(1),16)/255,this.g=parseInt(e.charAt(2)+e.charAt(3),16)/255,this.b=parseInt(e.charAt(4)+e.charAt(5),16)/255,this}return e&&e.length>0?this.setColorName(e):this}setColorName(e){const t=fr[e.toLowerCase()];return void 0!==t?this.setHex(t):console.warn("THREE.Color: Unknown color "+e),this}clone(){return new this.constructor(this.r,this.g,this.b)}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,this}copyGammaToLinear(e,t=2){return this.r=Math.pow(e.r,t),this.g=Math.pow(e.g,t),this.b=Math.pow(e.b,t),this}copyLinearToGamma(e,t=2){const i=t>0?1/t:1;return this.r=Math.pow(e.r,i),this.g=Math.pow(e.g,i),this.b=Math.pow(e.b,i),this}convertGammaToLinear(e){return this.copyGammaToLinear(this,e),this}convertLinearToGamma(e){return this.copyLinearToGamma(this,e),this}copySRGBToLinear(e){return this.r=yr(e.r),this.g=yr(e.g),this.b=yr(e.b),this}copyLinearToSRGB(e){return this.r=br(e.r),this.g=br(e.g),this.b=br(e.b),this}convertSRGBToLinear(){return this.copySRGBToLinear(this),this}convertLinearToSRGB(){return this.copyLinearToSRGB(this),this}getHex(){return 255*this.r<<16^255*this.g<<8^255*this.b<<0}getHexString(){return("000000"+this.getHex().toString(16)).slice(-6)}getHSL(e){const t=this.r,i=this.g,n=this.b,r=Math.max(t,i,n),s=Math.min(t,i,n);let a,o;const h=(s+r)/2;if(s===r)a=0,o=0;else{const e=r-s;switch(o=h<=.5?e/(r+s):e/(2-r-s),r){case t:a=(i-n)/e+(i<n?6:0);break;case i:a=(n-t)/e+2;break;case n:a=(t-i)/e+4}a/=6}return e.h=a,e.s=o,e.l=h,e}getStyle(){return"rgb("+(255*this.r|0)+","+(255*this.g|0)+","+(255*this.b|0)+")"}offsetHSL(e,t,i){return this.getHSL(gr),gr.h+=e,gr.s+=t,gr.l+=i,this.setHSL(gr.h,gr.s,gr.l),this}add(e){return this.r+=e.r,this.g+=e.g,this.b+=e.b,this}addColors(e,t){return this.r=e.r+t.r,this.g=e.g+t.g,this.b=e.b+t.b,this}addScalar(e){return this.r+=e,this.g+=e,this.b+=e,this}sub(e){return this.r=Math.max(0,this.r-e.r),this.g=Math.max(0,this.g-e.g),this.b=Math.max(0,this.b-e.b),this}multiply(e){return this.r*=e.r,this.g*=e.g,this.b*=e.b,this}multiplyScalar(e){return this.r*=e,this.g*=e,this.b*=e,this}lerp(e,t){return this.r+=(e.r-this.r)*t,this.g+=(e.g-this.g)*t,this.b+=(e.b-this.b)*t,this}lerpColors(e,t,i){return this.r=e.r+(t.r-e.r)*i,this.g=e.g+(t.g-e.g)*i,this.b=e.b+(t.b-e.b)*i,this}lerpHSL(e,t){this.getHSL(gr),e.getHSL(_r);const i=Ni(gr.h,_r.h,t),n=Ni(gr.s,_r.s,t),r=Ni(gr.l,_r.l,t);return this.setHSL(i,n,r),this}equals(e){return e.r===this.r&&e.g===this.g&&e.b===this.b}fromArray(e,t=0){return this.r=e[t],this.g=e[t+1],this.b=e[t+2],this}toArray(e=[],t=0){return e[t]=this.r,e[t+1]=this.g,e[t+2]=this.b,e}fromBufferAttribute(e,t){return this.r=e.getX(t),this.g=e.getY(t),this.b=e.getZ(t),!0===e.normalized&&(this.r/=255,this.g/=255,this.b/=255),this}toJSON(){return this.getHex()}}xr.NAMES=fr,xr.prototype.isColor=!0,xr.prototype.r=1,xr.prototype.g=1,xr.prototype.b=1;class wr extends mr{constructor(e){super(),this.type="MeshBasicMaterial",this.color=new xr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this}}wr.prototype.isMeshBasicMaterial=!0;const Mr=new Ki,Sr=new zi;class Tr{constructor(e,t,i){if(Array.isArray(e))throw new TypeError("THREE.BufferAttribute: array should be a Typed Array.");this.name="",this.array=e,this.itemSize=t,this.count=void 0!==e?e.length/t:0,this.normalized=!0===i,this.usage=wi,this.updateRange={offset:0,count:-1},this.version=0}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.name=e.name,this.array=new e.array.constructor(e.array),this.itemSize=e.itemSize,this.count=e.count,this.normalized=e.normalized,this.usage=e.usage,this}copyAt(e,t,i){e*=this.itemSize,i*=t.itemSize;for(let n=0,r=this.itemSize;n<r;n++)this.array[e+n]=t.array[i+n];return this}copyArray(e){return this.array.set(e),this}copyColorsArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyColorsArray(): color is undefined",n),r=new xr),t[i++]=r.r,t[i++]=r.g,t[i++]=r.b}return this}copyVector2sArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector2sArray(): vector is undefined",n),r=new zi),t[i++]=r.x,t[i++]=r.y}return this}copyVector3sArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector3sArray(): vector is undefined",n),r=new Ki),t[i++]=r.x,t[i++]=r.y,t[i++]=r.z}return this}copyVector4sArray(e){const t=this.array;let i=0;for(let n=0,r=e.length;n<r;n++){let r=e[n];void 0===r&&(console.warn("THREE.BufferAttribute.copyVector4sArray(): vector is undefined",n),r=new Xi),t[i++]=r.x,t[i++]=r.y,t[i++]=r.z,t[i++]=r.w}return this}applyMatrix3(e){if(2===this.itemSize)for(let t=0,i=this.count;t<i;t++)Sr.fromBufferAttribute(this,t),Sr.applyMatrix3(e),this.setXY(t,Sr.x,Sr.y);else if(3===this.itemSize)for(let t=0,i=this.count;t<i;t++)Mr.fromBufferAttribute(this,t),Mr.applyMatrix3(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}applyMatrix4(e){for(let t=0,i=this.count;t<i;t++)Mr.x=this.getX(t),Mr.y=this.getY(t),Mr.z=this.getZ(t),Mr.applyMatrix4(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}applyNormalMatrix(e){for(let t=0,i=this.count;t<i;t++)Mr.x=this.getX(t),Mr.y=this.getY(t),Mr.z=this.getZ(t),Mr.applyNormalMatrix(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}transformDirection(e){for(let t=0,i=this.count;t<i;t++)Mr.x=this.getX(t),Mr.y=this.getY(t),Mr.z=this.getZ(t),Mr.transformDirection(e),this.setXYZ(t,Mr.x,Mr.y,Mr.z);return this}set(e,t=0){return this.array.set(e,t),this}getX(e){return this.array[e*this.itemSize]}setX(e,t){return this.array[e*this.itemSize]=t,this}getY(e){return this.array[e*this.itemSize+1]}setY(e,t){return this.array[e*this.itemSize+1]=t,this}getZ(e){return this.array[e*this.itemSize+2]}setZ(e,t){return this.array[e*this.itemSize+2]=t,this}getW(e){return this.array[e*this.itemSize+3]}setW(e,t){return this.array[e*this.itemSize+3]=t,this}setXY(e,t,i){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=i,this}setXYZ(e,t,i,n){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=i,this.array[e+2]=n,this}setXYZW(e,t,i,n,r){return e*=this.itemSize,this.array[e+0]=t,this.array[e+1]=i,this.array[e+2]=n,this.array[e+3]=r,this}onUpload(e){return this.onUploadCallback=e,this}clone(){return new this.constructor(this.array,this.itemSize).copy(this)}toJSON(){const e={itemSize:this.itemSize,type:this.array.constructor.name,array:Array.prototype.slice.call(this.array),normalized:this.normalized};return""!==this.name&&(e.name=this.name),this.usage!==wi&&(e.usage=this.usage),0===this.updateRange.offset&&-1===this.updateRange.count||(e.updateRange=this.updateRange),e}}Tr.prototype.isBufferAttribute=!0;class Cr extends Tr{constructor(e,t,i){super(new Uint16Array(e),t,i)}}class Er extends Tr{constructor(e,t,i){super(new Uint32Array(e),t,i)}}(class extends Tr{constructor(e,t,i){super(new Uint16Array(e),t,i)}}).prototype.isFloat16BufferAttribute=!0;class Ar extends Tr{constructor(e,t,i){super(new Float32Array(e),t,i)}}let Ir=0;const Rr=new Rn,Pr=new tr,Lr=new Ki,Dr=new tn,Nr=new tn,$r=new Ki;class kr extends Ti{constructor(){super(),Object.defineProperty(this,"id",{value:Ir++}),this.uuid=Pi(),this.name="",this.type="BufferGeometry",this.index=null,this.attributes={},this.morphAttributes={},this.morphTargetsRelative=!1,this.groups=[],this.boundingBox=null,this.boundingSphere=null,this.drawRange={start:0,count:1/0},this.userData={}}getIndex(){return this.index}setIndex(e){return Array.isArray(e)?this.index=new(Bi(e)>65535?Er:Cr)(e,1):this.index=e,this}getAttribute(e){return this.attributes[e]}setAttribute(e,t){return this.attributes[e]=t,this}deleteAttribute(e){return delete this.attributes[e],this}hasAttribute(e){return void 0!==this.attributes[e]}addGroup(e,t,i=0){this.groups.push({start:e,count:t,materialIndex:i})}clearGroups(){this.groups=[]}setDrawRange(e,t){this.drawRange.start=e,this.drawRange.count=t}applyMatrix4(e){const t=this.attributes.position;void 0!==t&&(t.applyMatrix4(e),t.needsUpdate=!0);const i=this.attributes.normal;if(void 0!==i){const t=(new Fi).getNormalMatrix(e);i.applyNormalMatrix(t),i.needsUpdate=!0}const n=this.attributes.tangent;return void 0!==n&&(n.transformDirection(e),n.needsUpdate=!0),null!==this.boundingBox&&this.computeBoundingBox(),null!==this.boundingSphere&&this.computeBoundingSphere(),this}applyQuaternion(e){return Rr.makeRotationFromQuaternion(e),this.applyMatrix4(Rr),this}rotateX(e){return Rr.makeRotationX(e),this.applyMatrix4(Rr),this}rotateY(e){return Rr.makeRotationY(e),this.applyMatrix4(Rr),this}rotateZ(e){return Rr.makeRotationZ(e),this.applyMatrix4(Rr),this}translate(e,t,i){return Rr.makeTranslation(e,t,i),this.applyMatrix4(Rr),this}scale(e,t,i){return Rr.makeScale(e,t,i),this.applyMatrix4(Rr),this}lookAt(e){return Pr.lookAt(e),Pr.updateMatrix(),this.applyMatrix4(Pr.matrix),this}center(){return this.computeBoundingBox(),this.boundingBox.getCenter(Lr).negate(),this.translate(Lr.x,Lr.y,Lr.z),this}setFromPoints(e){const t=[];for(let i=0,n=e.length;i<n;i++){const n=e[i];t.push(n.x,n.y,n.z||0)}return this.setAttribute("position",new Ar(t,3)),this}computeBoundingBox(){null===this.boundingBox&&(this.boundingBox=new tn);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set "mesh.frustumCulled" to "false".',this),void this.boundingBox.set(new Ki(-1/0,-1/0,-1/0),new Ki(1/0,1/0,1/0));if(void 0!==e){if(this.boundingBox.setFromBufferAttribute(e),t)for(let e=0,i=t.length;e<i;e++){const i=t[e];Dr.setFromBufferAttribute(i),this.morphTargetsRelative?($r.addVectors(this.boundingBox.min,Dr.min),this.boundingBox.expandByPoint($r),$r.addVectors(this.boundingBox.max,Dr.max),this.boundingBox.expandByPoint($r)):(this.boundingBox.expandByPoint(Dr.min),this.boundingBox.expandByPoint(Dr.max))}}else this.boundingBox.makeEmpty();(isNaN(this.boundingBox.min.x)||isNaN(this.boundingBox.min.y)||isNaN(this.boundingBox.min.z))&&console.error('THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The "position" attribute is likely to have NaN values.',this)}computeBoundingSphere(){null===this.boundingSphere&&(this.boundingSphere=new xn);const e=this.attributes.position,t=this.morphAttributes.position;if(e&&e.isGLBufferAttribute)return console.error('THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set "mesh.frustumCulled" to "false".',this),void this.boundingSphere.set(new Ki,1/0);if(e){const i=this.boundingSphere.center;if(Dr.setFromBufferAttribute(e),t)for(let e=0,i=t.length;e<i;e++){const i=t[e];Nr.setFromBufferAttribute(i),this.morphTargetsRelative?($r.addVectors(Dr.min,Nr.min),Dr.expandByPoint($r),$r.addVectors(Dr.max,Nr.max),Dr.expandByPoint($r)):(Dr.expandByPoint(Nr.min),Dr.expandByPoint(Nr.max))}Dr.getCenter(i);let n=0;for(let t=0,r=e.count;t<r;t++)$r.fromBufferAttribute(e,t),n=Math.max(n,i.distanceToSquared($r));if(t)for(let r=0,s=t.length;r<s;r++){const s=t[r],a=this.morphTargetsRelative;for(let t=0,r=s.count;t<r;t++)$r.fromBufferAttribute(s,t),a&&(Lr.fromBufferAttribute(e,t),$r.add(Lr)),n=Math.max(n,i.distanceToSquared($r))}this.boundingSphere.radius=Math.sqrt(n),isNaN(this.boundingSphere.radius)&&console.error('THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The "position" attribute is likely to have NaN values.',this)}}computeTangents(){const e=this.index,t=this.attributes;if(null===e||void 0===t.position||void 0===t.normal||void 0===t.uv)return void console.error("THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)");const i=e.array,n=t.position.array,r=t.normal.array,s=t.uv.array,a=n.length/3;void 0===t.tangent&&this.setAttribute("tangent",new Tr(new Float32Array(4*a),4));const o=t.tangent.array,h=[],c=[];for(let e=0;e<a;e++)h[e]=new Ki,c[e]=new Ki;const l=new Ki,u=new Ki,d=new Ki,p=new zi,m=new zi,f=new zi,g=new Ki,_=new Ki;function v(e,t,i){l.fromArray(n,3*e),u.fromArray(n,3*t),d.fromArray(n,3*i),p.fromArray(s,2*e),m.fromArray(s,2*t),f.fromArray(s,2*i),u.sub(l),d.sub(l),m.sub(p),f.sub(p);const r=1/(m.x*f.y-f.x*m.y);isFinite(r)&&(g.copy(u).multiplyScalar(f.y).addScaledVector(d,-m.y).multiplyScalar(r),_.copy(d).multiplyScalar(m.x).addScaledVector(u,-f.x).multiplyScalar(r),h[e].add(g),h[t].add(g),h[i].add(g),c[e].add(_),c[t].add(_),c[i].add(_))}let y=this.groups;0===y.length&&(y=[{start:0,count:i.length}]);for(let e=0,t=y.length;e<t;++e){const t=y[e],n=t.start;for(let e=n,r=n+t.count;e<r;e+=3)v(i[e+0],i[e+1],i[e+2])}const b=new Ki,x=new Ki,w=new Ki,M=new Ki;function S(e){w.fromArray(r,3*e),M.copy(w);const t=h[e];b.copy(t),b.sub(w.multiplyScalar(w.dot(t))).normalize(),x.crossVectors(M,t);const i=x.dot(c[e])<0?-1:1;o[4*e]=b.x,o[4*e+1]=b.y,o[4*e+2]=b.z,o[4*e+3]=i}for(let e=0,t=y.length;e<t;++e){const t=y[e],n=t.start;for(let e=n,r=n+t.count;e<r;e+=3)S(i[e+0]),S(i[e+1]),S(i[e+2])}}computeVertexNormals(){const e=this.index,t=this.getAttribute("position");if(void 0!==t){let i=this.getAttribute("normal");if(void 0===i)i=new Tr(new Float32Array(3*t.count),3),this.setAttribute("normal",i);else for(let e=0,t=i.count;e<t;e++)i.setXYZ(e,0,0,0);const n=new Ki,r=new Ki,s=new Ki,a=new Ki,o=new Ki,h=new Ki,c=new Ki,l=new Ki;if(e)for(let u=0,d=e.count;u<d;u+=3){const d=e.getX(u+0),p=e.getX(u+1),m=e.getX(u+2);n.fromBufferAttribute(t,d),r.fromBufferAttribute(t,p),s.fromBufferAttribute(t,m),c.subVectors(s,r),l.subVectors(n,r),c.cross(l),a.fromBufferAttribute(i,d),o.fromBufferAttribute(i,p),h.fromBufferAttribute(i,m),a.add(c),o.add(c),h.add(c),i.setXYZ(d,a.x,a.y,a.z),i.setXYZ(p,o.x,o.y,o.z),i.setXYZ(m,h.x,h.y,h.z)}else for(let e=0,a=t.count;e<a;e+=3)n.fromBufferAttribute(t,e+0),r.fromBufferAttribute(t,e+1),s.fromBufferAttribute(t,e+2),c.subVectors(s,r),l.subVectors(n,r),c.cross(l),i.setXYZ(e+0,c.x,c.y,c.z),i.setXYZ(e+1,c.x,c.y,c.z),i.setXYZ(e+2,c.x,c.y,c.z);this.normalizeNormals(),i.needsUpdate=!0}}merge(e,t){if(!e||!e.isBufferGeometry)return void console.error("THREE.BufferGeometry.merge(): geometry not an instance of THREE.BufferGeometry.",e);void 0===t&&(t=0,console.warn("THREE.BufferGeometry.merge(): Overwriting original geometry, starting at offset=0. Use BufferGeometryUtils.mergeBufferGeometries() for lossless merge."));const i=this.attributes;for(const n in i){if(void 0===e.attributes[n])continue;const r=i[n].array,s=e.attributes[n],a=s.array,o=s.itemSize*t,h=Math.min(a.length,r.length-o);for(let e=0,t=o;e<h;e++,t++)r[t]=a[e]}return this}normalizeNormals(){const e=this.attributes.normal;for(let t=0,i=e.count;t<i;t++)$r.fromBufferAttribute(e,t),$r.normalize(),e.setXYZ(t,$r.x,$r.y,$r.z)}toNonIndexed(){function e(e,t){const i=e.array,n=e.itemSize,r=e.normalized,s=new i.constructor(t.length*n);let a=0,o=0;for(let r=0,h=t.length;r<h;r++){a=e.isInterleavedBufferAttribute?t[r]*e.data.stride+e.offset:t[r]*n;for(let e=0;e<n;e++)s[o++]=i[a++]}return new Tr(s,n,r)}if(null===this.index)return console.warn("THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed."),this;const t=new kr,i=this.index.array,n=this.attributes;for(const r in n){const s=e(n[r],i);t.setAttribute(r,s)}const r=this.morphAttributes;for(const n in r){const s=[],a=r[n];for(let t=0,n=a.length;t<n;t++){const n=e(a[t],i);s.push(n)}t.morphAttributes[n]=s}t.morphTargetsRelative=this.morphTargetsRelative;const s=this.groups;for(let e=0,i=s.length;e<i;e++){const i=s[e];t.addGroup(i.start,i.count,i.materialIndex)}return t}toJSON(){const e={metadata:{version:4.5,type:"BufferGeometry",generator:"BufferGeometry.toJSON"}};if(e.uuid=this.uuid,e.type=this.type,""!==this.name&&(e.name=this.name),Object.keys(this.userData).length>0&&(e.userData=this.userData),void 0!==this.parameters){const t=this.parameters;for(const i in t)void 0!==t[i]&&(e[i]=t[i]);return e}e.data={attributes:{}};const t=this.index;null!==t&&(e.data.index={type:t.array.constructor.name,array:Array.prototype.slice.call(t.array)});const i=this.attributes;for(const t in i){const n=i[t];e.data.attributes[t]=n.toJSON(e.data)}const n={};let r=!1;for(const t in this.morphAttributes){const i=this.morphAttributes[t],s=[];for(let t=0,n=i.length;t<n;t++){const n=i[t];s.push(n.toJSON(e.data))}s.length>0&&(n[t]=s,r=!0)}r&&(e.data.morphAttributes=n,e.data.morphTargetsRelative=this.morphTargetsRelative);const s=this.groups;s.length>0&&(e.data.groups=JSON.parse(JSON.stringify(s)));const a=this.boundingSphere;return null!==a&&(e.data.boundingSphere={center:a.center.toArray(),radius:a.radius}),e}clone(){return(new this.constructor).copy(this)}copy(e){this.index=null,this.attributes={},this.morphAttributes={},this.groups=[],this.boundingBox=null,this.boundingSphere=null;const t={};this.name=e.name;const i=e.index;null!==i&&this.setIndex(i.clone(t));const n=e.attributes;for(const e in n){const i=n[e];this.setAttribute(e,i.clone(t))}const r=e.morphAttributes;for(const e in r){const i=[],n=r[e];for(let e=0,r=n.length;e<r;e++)i.push(n[e].clone(t));this.morphAttributes[e]=i}this.morphTargetsRelative=e.morphTargetsRelative;const s=e.groups;for(let e=0,t=s.length;e<t;e++){const t=s[e];this.addGroup(t.start,t.count,t.materialIndex)}const a=e.boundingBox;null!==a&&(this.boundingBox=a.clone());const o=e.boundingSphere;return null!==o&&(this.boundingSphere=o.clone()),this.drawRange.start=e.drawRange.start,this.drawRange.count=e.drawRange.count,this.userData=e.userData,void 0!==e.parameters&&(this.parameters=Object.assign({},e.parameters)),this}dispose(){this.dispatchEvent({type:"dispose"})}}kr.prototype.isBufferGeometry=!0;const Or=new Rn,zr=new In,Fr=new xn,Br=new Ki,Ur=new Ki,Vr=new Ki,Hr=new Ki,jr=new Ki,Gr=new Ki,Wr=new Ki,qr=new Ki,Xr=new Ki,Zr=new zi,Yr=new zi,Jr=new zi,Kr=new Ki,Qr=new Ki;class es extends tr{constructor(e=new kr,t=new wr){super(),this.type="Mesh",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e){return super.copy(e),void 0!==e.morphTargetInfluences&&(this.morphTargetInfluences=e.morphTargetInfluences.slice()),void 0!==e.morphTargetDictionary&&(this.morphTargetDictionary=Object.assign({},e.morphTargetDictionary)),this.material=e.material,this.geometry=e.geometry,this}updateMorphTargets(){const e=this.geometry;if(e.isBufferGeometry){const t=e.morphAttributes,i=Object.keys(t);if(i.length>0){const e=t[i[0]];if(void 0!==e){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,i=e.length;t<i;t++){const i=e[t].name||String(t);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}}}else{const t=e.morphTargets;void 0!==t&&t.length>0&&console.error("THREE.Mesh.updateMorphTargets() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}raycast(e,t){const i=this.geometry,n=this.material,r=this.matrixWorld;if(void 0===n)return;if(null===i.boundingSphere&&i.computeBoundingSphere(),Fr.copy(i.boundingSphere),Fr.applyMatrix4(r),!1===e.ray.intersectsSphere(Fr))return;if(Or.copy(r).invert(),zr.copy(e.ray).applyMatrix4(Or),null!==i.boundingBox&&!1===zr.intersectsBox(i.boundingBox))return;let s;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position,o=i.morphAttributes.position,h=i.morphTargetsRelative,c=i.attributes.uv,l=i.attributes.uv2,u=i.groups,d=i.drawRange;if(null!==r)if(Array.isArray(n))for(let i=0,p=u.length;i<p;i++){const p=u[i],m=n[p.materialIndex];for(let i=Math.max(p.start,d.start),n=Math.min(r.count,Math.min(p.start+p.count,d.start+d.count));i<n;i+=3){const n=r.getX(i),u=r.getX(i+1),d=r.getX(i+2);s=ts(this,m,e,zr,a,o,h,c,l,n,u,d),s&&(s.faceIndex=Math.floor(i/3),s.face.materialIndex=p.materialIndex,t.push(s))}}else{for(let i=Math.max(0,d.start),u=Math.min(r.count,d.start+d.count);i<u;i+=3){const u=r.getX(i),d=r.getX(i+1),p=r.getX(i+2);s=ts(this,n,e,zr,a,o,h,c,l,u,d,p),s&&(s.faceIndex=Math.floor(i/3),t.push(s))}}else if(void 0!==a)if(Array.isArray(n))for(let i=0,r=u.length;i<r;i++){const r=u[i],p=n[r.materialIndex];for(let i=Math.max(r.start,d.start),n=Math.min(a.count,Math.min(r.start+r.count,d.start+d.count));i<n;i+=3){s=ts(this,p,e,zr,a,o,h,c,l,i,i+1,i+2),s&&(s.faceIndex=Math.floor(i/3),s.face.materialIndex=r.materialIndex,t.push(s))}}else{for(let i=Math.max(0,d.start),r=Math.min(a.count,d.start+d.count);i<r;i+=3){s=ts(this,n,e,zr,a,o,h,c,l,i,i+1,i+2),s&&(s.faceIndex=Math.floor(i/3),t.push(s))}}}else i.isGeometry&&console.error("THREE.Mesh.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}}function ts(e,t,i,n,r,s,a,o,h,c,l,u){Br.fromBufferAttribute(r,c),Ur.fromBufferAttribute(r,l),Vr.fromBufferAttribute(r,u);const d=e.morphTargetInfluences;if(s&&d){Wr.set(0,0,0),qr.set(0,0,0),Xr.set(0,0,0);for(let e=0,t=s.length;e<t;e++){const t=d[e],i=s[e];0!==t&&(Hr.fromBufferAttribute(i,c),jr.fromBufferAttribute(i,l),Gr.fromBufferAttribute(i,u),a?(Wr.addScaledVector(Hr,t),qr.addScaledVector(jr,t),Xr.addScaledVector(Gr,t)):(Wr.addScaledVector(Hr.sub(Br),t),qr.addScaledVector(jr.sub(Ur),t),Xr.addScaledVector(Gr.sub(Vr),t)))}Br.add(Wr),Ur.add(qr),Vr.add(Xr)}e.isSkinnedMesh&&(e.boneTransform(c,Br),e.boneTransform(l,Ur),e.boneTransform(u,Vr));const p=function(e,t,i,n,r,s,a,o){let h;if(h=1===t.side?n.intersectTriangle(a,s,r,!0,o):n.intersectTriangle(r,s,a,2!==t.side,o),null===h)return null;Qr.copy(o),Qr.applyMatrix4(e.matrixWorld);const c=i.ray.origin.distanceTo(Qr);return c<i.near||c>i.far?null:{distance:c,point:Qr.clone(),object:e}}(e,t,i,n,Br,Ur,Vr,Kr);if(p){o&&(Zr.fromBufferAttribute(o,c),Yr.fromBufferAttribute(o,l),Jr.fromBufferAttribute(o,u),p.uv=dr.getUV(Kr,Br,Ur,Vr,Zr,Yr,Jr,new zi)),h&&(Zr.fromBufferAttribute(h,c),Yr.fromBufferAttribute(h,l),Jr.fromBufferAttribute(h,u),p.uv2=dr.getUV(Kr,Br,Ur,Vr,Zr,Yr,Jr,new zi));const e={a:c,b:l,c:u,normal:new Ki,materialIndex:0};dr.getNormal(Br,Ur,Vr,e.normal),p.face=e}return p}es.prototype.isMesh=!0;class is extends kr{constructor(e=1,t=1,i=1,n=1,r=1,s=1){super(),this.type="BoxGeometry",this.parameters={width:e,height:t,depth:i,widthSegments:n,heightSegments:r,depthSegments:s};const a=this;n=Math.floor(n),r=Math.floor(r),s=Math.floor(s);const o=[],h=[],c=[],l=[];let u=0,d=0;function p(e,t,i,n,r,s,p,m,f,g,_){const v=s/f,y=p/g,b=s/2,x=p/2,w=m/2,M=f+1,S=g+1;let T=0,C=0;const E=new Ki;for(let s=0;s<S;s++){const a=s*y-x;for(let o=0;o<M;o++){const u=o*v-b;E[e]=u*n,E[t]=a*r,E[i]=w,h.push(E.x,E.y,E.z),E[e]=0,E[t]=0,E[i]=m>0?1:-1,c.push(E.x,E.y,E.z),l.push(o/f),l.push(1-s/g),T+=1}}for(let e=0;e<g;e++)for(let t=0;t<f;t++){const i=u+t+M*e,n=u+t+M*(e+1),r=u+(t+1)+M*(e+1),s=u+(t+1)+M*e;o.push(i,n,s),o.push(n,r,s),C+=6}a.addGroup(d,C,_),d+=C,u+=T}p("z","y","x",-1,-1,i,t,e,s,r,0),p("z","y","x",1,-1,i,t,-e,s,r,1),p("x","z","y",1,1,e,i,t,n,s,2),p("x","z","y",1,-1,e,i,-t,n,s,3),p("x","y","z",1,-1,e,t,i,n,r,4),p("x","y","z",-1,-1,e,t,-i,n,r,5),this.setIndex(o),this.setAttribute("position",new Ar(h,3)),this.setAttribute("normal",new Ar(c,3)),this.setAttribute("uv",new Ar(l,2))}static fromJSON(e){return new is(e.width,e.height,e.depth,e.widthSegments,e.heightSegments,e.depthSegments)}}function ns(e){const t={};for(const i in e){t[i]={};for(const n in e[i]){const r=e[i][n];r&&(r.isColor||r.isMatrix3||r.isMatrix4||r.isVector2||r.isVector3||r.isVector4||r.isTexture||r.isQuaternion)?t[i][n]=r.clone():Array.isArray(r)?t[i][n]=r.slice():t[i][n]=r}}return t}function rs(e){const t={};for(let i=0;i<e.length;i++){const n=ns(e[i]);for(const e in n)t[e]=n[e]}return t}const ss={clone:ns,merge:rs};class as extends mr{constructor(e){super(),this.type="ShaderMaterial",this.defines={},this.uniforms={},this.vertexShader="void main() {\n\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n}",this.fragmentShader="void main() {\n\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\n}",this.linewidth=1,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.lights=!1,this.clipping=!1,this.extensions={derivatives:!1,fragDepth:!1,drawBuffers:!1,shaderTextureLOD:!1},this.defaultAttributeValues={color:[1,1,1],uv:[0,0],uv2:[0,0]},this.index0AttributeName=void 0,this.uniformsNeedUpdate=!1,this.glslVersion=null,void 0!==e&&(void 0!==e.attributes&&console.error("THREE.ShaderMaterial: attributes should now be defined in THREE.BufferGeometry instead."),this.setValues(e))}copy(e){return super.copy(e),this.fragmentShader=e.fragmentShader,this.vertexShader=e.vertexShader,this.uniforms=ns(e.uniforms),this.defines=Object.assign({},e.defines),this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.lights=e.lights,this.clipping=e.clipping,this.extensions=Object.assign({},e.extensions),this.glslVersion=e.glslVersion,this}toJSON(e){const t=super.toJSON(e);t.glslVersion=this.glslVersion,t.uniforms={};for(const i in this.uniforms){const n=this.uniforms[i].value;n&&n.isTexture?t.uniforms[i]={type:"t",value:n.toJSON(e).uuid}:n&&n.isColor?t.uniforms[i]={type:"c",value:n.getHex()}:n&&n.isVector2?t.uniforms[i]={type:"v2",value:n.toArray()}:n&&n.isVector3?t.uniforms[i]={type:"v3",value:n.toArray()}:n&&n.isVector4?t.uniforms[i]={type:"v4",value:n.toArray()}:n&&n.isMatrix3?t.uniforms[i]={type:"m3",value:n.toArray()}:n&&n.isMatrix4?t.uniforms[i]={type:"m4",value:n.toArray()}:t.uniforms[i]={value:n}}Object.keys(this.defines).length>0&&(t.defines=this.defines),t.vertexShader=this.vertexShader,t.fragmentShader=this.fragmentShader;const i={};for(const e in this.extensions)!0===this.extensions[e]&&(i[e]=!0);return Object.keys(i).length>0&&(t.extensions=i),t}}as.prototype.isShaderMaterial=!0;class os extends tr{constructor(){super(),this.type="Camera",this.matrixWorldInverse=new Rn,this.projectionMatrix=new Rn,this.projectionMatrixInverse=new Rn}copy(e,t){return super.copy(e,t),this.matrixWorldInverse.copy(e.matrixWorldInverse),this.projectionMatrix.copy(e.projectionMatrix),this.projectionMatrixInverse.copy(e.projectionMatrixInverse),this}getWorldDirection(e){this.updateWorldMatrix(!0,!1);const t=this.matrixWorld.elements;return e.set(-t[8],-t[9],-t[10]).normalize()}updateMatrixWorld(e){super.updateMatrixWorld(e),this.matrixWorldInverse.copy(this.matrixWorld).invert()}updateWorldMatrix(e,t){super.updateWorldMatrix(e,t),this.matrixWorldInverse.copy(this.matrixWorld).invert()}clone(){return(new this.constructor).copy(this)}}os.prototype.isCamera=!0;class hs extends os{constructor(e=50,t=1,i=.1,n=2e3){super(),this.type="PerspectiveCamera",this.fov=e,this.zoom=1,this.near=i,this.far=n,this.focus=10,this.aspect=t,this.view=null,this.filmGauge=35,this.filmOffset=0,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.fov=e.fov,this.zoom=e.zoom,this.near=e.near,this.far=e.far,this.focus=e.focus,this.aspect=e.aspect,this.view=null===e.view?null:Object.assign({},e.view),this.filmGauge=e.filmGauge,this.filmOffset=e.filmOffset,this}setFocalLength(e){const t=.5*this.getFilmHeight()/e;this.fov=2*Ai*Math.atan(t),this.updateProjectionMatrix()}getFocalLength(){const e=Math.tan(.5*Ei*this.fov);return.5*this.getFilmHeight()/e}getEffectiveFOV(){return 2*Ai*Math.atan(Math.tan(.5*Ei*this.fov)/this.zoom)}getFilmWidth(){return this.filmGauge*Math.min(this.aspect,1)}getFilmHeight(){return this.filmGauge/Math.max(this.aspect,1)}setViewOffset(e,t,i,n,r,s){this.aspect=e/t,null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=this.near;let t=e*Math.tan(.5*Ei*this.fov)/this.zoom,i=2*t,n=this.aspect*i,r=-.5*n;const s=this.view;if(null!==this.view&&this.view.enabled){const e=s.fullWidth,a=s.fullHeight;r+=s.offsetX*n/e,t-=s.offsetY*i/a,n*=s.width/e,i*=s.height/a}const a=this.filmOffset;0!==a&&(r+=e*a/this.getFilmWidth()),this.projectionMatrix.makePerspective(r,r+n,t,t-i,e,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.fov=this.fov,t.object.zoom=this.zoom,t.object.near=this.near,t.object.far=this.far,t.object.focus=this.focus,t.object.aspect=this.aspect,null!==this.view&&(t.object.view=Object.assign({},this.view)),t.object.filmGauge=this.filmGauge,t.object.filmOffset=this.filmOffset,t}}hs.prototype.isPerspectiveCamera=!0;const cs=90;class ls extends tr{constructor(e,t,i){if(super(),this.type="CubeCamera",!0!==i.isWebGLCubeRenderTarget)return void console.error("THREE.CubeCamera: The constructor now expects an instance of WebGLCubeRenderTarget as third parameter.");this.renderTarget=i;const n=new hs(cs,1,e,t);n.layers=this.layers,n.up.set(0,-1,0),n.lookAt(new Ki(1,0,0)),this.add(n);const r=new hs(cs,1,e,t);r.layers=this.layers,r.up.set(0,-1,0),r.lookAt(new Ki(-1,0,0)),this.add(r);const s=new hs(cs,1,e,t);s.layers=this.layers,s.up.set(0,0,1),s.lookAt(new Ki(0,1,0)),this.add(s);const a=new hs(cs,1,e,t);a.layers=this.layers,a.up.set(0,0,-1),a.lookAt(new Ki(0,-1,0)),this.add(a);const o=new hs(cs,1,e,t);o.layers=this.layers,o.up.set(0,-1,0),o.lookAt(new Ki(0,0,1)),this.add(o);const h=new hs(cs,1,e,t);h.layers=this.layers,h.up.set(0,-1,0),h.lookAt(new Ki(0,0,-1)),this.add(h)}update(e,t){null===this.parent&&this.updateMatrixWorld();const i=this.renderTarget,[n,r,s,a,o,h]=this.children,c=e.xr.enabled,l=e.getRenderTarget();e.xr.enabled=!1;const u=i.texture.generateMipmaps;i.texture.generateMipmaps=!1,e.setRenderTarget(i,0),e.render(t,n),e.setRenderTarget(i,1),e.render(t,r),e.setRenderTarget(i,2),e.render(t,s),e.setRenderTarget(i,3),e.render(t,a),e.setRenderTarget(i,4),e.render(t,o),i.texture.generateMipmaps=u,e.setRenderTarget(i,5),e.render(t,h),e.setRenderTarget(l),e.xr.enabled=c}}class us extends Wi{constructor(e,t,i,n,r,s,a,o,h,c){super(e=void 0!==e?e:[],t=void 0!==t?t:Gt,i,n,r,s,a,o,h,c),this.flipY=!1}get images(){return this.image}set images(e){this.image=e}}us.prototype.isCubeTexture=!0;class ds extends Zi{constructor(e,t,i){Number.isInteger(t)&&(console.warn("THREE.WebGLCubeRenderTarget: constructor signature is now WebGLCubeRenderTarget( size, options )"),t=i),super(e,e,t),t=t||{},this.texture=new us(void 0,t.mapping,t.wrapS,t.wrapT,t.magFilter,t.minFilter,t.format,t.type,t.anisotropy,t.encoding),this.texture.isRenderTargetTexture=!0,this.texture.generateMipmaps=void 0!==t.generateMipmaps&&t.generateMipmaps,this.texture.minFilter=void 0!==t.minFilter?t.minFilter:Kt,this.texture._needsFlipEnvMap=!1}fromEquirectangularTexture(e,t){this.texture.type=t.type,this.texture.format=oi,this.texture.encoding=t.encoding,this.texture.generateMipmaps=t.generateMipmaps,this.texture.minFilter=t.minFilter,this.texture.magFilter=t.magFilter;const i={uniforms:{tEquirect:{value:null}},vertexShader:"\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t",fragmentShader:"\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t"},n=new is(5,5,5),r=new as({name:"CubemapFromEquirect",uniforms:ns(i.uniforms),vertexShader:i.vertexShader,fragmentShader:i.fragmentShader,side:1,blending:0});r.uniforms.tEquirect.value=t;const s=new es(n,r),a=t.minFilter;t.minFilter===Qt&&(t.minFilter=Kt);return new ls(1,10,this).update(e,s),t.minFilter=a,s.geometry.dispose(),s.material.dispose(),this}clear(e,t,i,n){const r=e.getRenderTarget();for(let r=0;r<6;r++)e.setRenderTarget(this,r),e.clear(t,i,n);e.setRenderTarget(r)}}ds.prototype.isWebGLCubeRenderTarget=!0;const ps=new Ki,ms=new Ki,fs=new Fi;class gs{constructor(e=new Ki(1,0,0),t=0){this.normal=e,this.constant=t}set(e,t){return this.normal.copy(e),this.constant=t,this}setComponents(e,t,i,n){return this.normal.set(e,t,i),this.constant=n,this}setFromNormalAndCoplanarPoint(e,t){return this.normal.copy(e),this.constant=-t.dot(this.normal),this}setFromCoplanarPoints(e,t,i){const n=ps.subVectors(i,t).cross(ms.subVectors(e,t)).normalize();return this.setFromNormalAndCoplanarPoint(n,e),this}copy(e){return this.normal.copy(e.normal),this.constant=e.constant,this}normalize(){const e=1/this.normal.length();return this.normal.multiplyScalar(e),this.constant*=e,this}negate(){return this.constant*=-1,this.normal.negate(),this}distanceToPoint(e){return this.normal.dot(e)+this.constant}distanceToSphere(e){return this.distanceToPoint(e.center)-e.radius}projectPoint(e,t){return t.copy(this.normal).multiplyScalar(-this.distanceToPoint(e)).add(e)}intersectLine(e,t){const i=e.delta(ps),n=this.normal.dot(i);if(0===n)return 0===this.distanceToPoint(e.start)?t.copy(e.start):null;const r=-(e.start.dot(this.normal)+this.constant)/n;return r<0||r>1?null:t.copy(i).multiplyScalar(r).add(e.start)}intersectsLine(e){const t=this.distanceToPoint(e.start),i=this.distanceToPoint(e.end);return t<0&&i>0||i<0&&t>0}intersectsBox(e){return e.intersectsPlane(this)}intersectsSphere(e){return e.intersectsPlane(this)}coplanarPoint(e){return e.copy(this.normal).multiplyScalar(-this.constant)}applyMatrix4(e,t){const i=t||fs.getNormalMatrix(e),n=this.coplanarPoint(ps).applyMatrix4(e),r=this.normal.applyMatrix3(i).normalize();return this.constant=-n.dot(r),this}translate(e){return this.constant-=e.dot(this.normal),this}equals(e){return e.normal.equals(this.normal)&&e.constant===this.constant}clone(){return(new this.constructor).copy(this)}}gs.prototype.isPlane=!0;const _s=new xn,vs=new Ki;class ys{constructor(e=new gs,t=new gs,i=new gs,n=new gs,r=new gs,s=new gs){this.planes=[e,t,i,n,r,s]}set(e,t,i,n,r,s){const a=this.planes;return a[0].copy(e),a[1].copy(t),a[2].copy(i),a[3].copy(n),a[4].copy(r),a[5].copy(s),this}copy(e){const t=this.planes;for(let i=0;i<6;i++)t[i].copy(e.planes[i]);return this}setFromProjectionMatrix(e){const t=this.planes,i=e.elements,n=i[0],r=i[1],s=i[2],a=i[3],o=i[4],h=i[5],c=i[6],l=i[7],u=i[8],d=i[9],p=i[10],m=i[11],f=i[12],g=i[13],_=i[14],v=i[15];return t[0].setComponents(a-n,l-o,m-u,v-f).normalize(),t[1].setComponents(a+n,l+o,m+u,v+f).normalize(),t[2].setComponents(a+r,l+h,m+d,v+g).normalize(),t[3].setComponents(a-r,l-h,m-d,v-g).normalize(),t[4].setComponents(a-s,l-c,m-p,v-_).normalize(),t[5].setComponents(a+s,l+c,m+p,v+_).normalize(),this}intersectsObject(e){const t=e.geometry;return null===t.boundingSphere&&t.computeBoundingSphere(),_s.copy(t.boundingSphere).applyMatrix4(e.matrixWorld),this.intersectsSphere(_s)}intersectsSprite(e){return _s.center.set(0,0,0),_s.radius=.7071067811865476,_s.applyMatrix4(e.matrixWorld),this.intersectsSphere(_s)}intersectsSphere(e){const t=this.planes,i=e.center,n=-e.radius;for(let e=0;e<6;e++){if(t[e].distanceToPoint(i)<n)return!1}return!0}intersectsBox(e){const t=this.planes;for(let i=0;i<6;i++){const n=t[i];if(vs.x=n.normal.x>0?e.max.x:e.min.x,vs.y=n.normal.y>0?e.max.y:e.min.y,vs.z=n.normal.z>0?e.max.z:e.min.z,n.distanceToPoint(vs)<0)return!1}return!0}containsPoint(e){const t=this.planes;for(let i=0;i<6;i++)if(t[i].distanceToPoint(e)<0)return!1;return!0}clone(){return(new this.constructor).copy(this)}}function bs(){let e=null,t=!1,i=null,n=null;function r(t,s){i(t,s),n=e.requestAnimationFrame(r)}return{start:function(){!0!==t&&null!==i&&(n=e.requestAnimationFrame(r),t=!0)},stop:function(){e.cancelAnimationFrame(n),t=!1},setAnimationLoop:function(e){i=e},setContext:function(t){e=t}}}function xs(e,t){const i=t.isWebGL2,n=new WeakMap;return{get:function(e){return e.isInterleavedBufferAttribute&&(e=e.data),n.get(e)},remove:function(t){t.isInterleavedBufferAttribute&&(t=t.data);const i=n.get(t);i&&(e.deleteBuffer(i.buffer),n.delete(t))},update:function(t,r){if(t.isGLBufferAttribute){const e=n.get(t);return void((!e||e.version<t.version)&&n.set(t,{buffer:t.buffer,type:t.type,bytesPerElement:t.elementSize,version:t.version}))}t.isInterleavedBufferAttribute&&(t=t.data);const s=n.get(t);void 0===s?n.set(t,function(t,n){const r=t.array,s=t.usage,a=e.createBuffer();e.bindBuffer(n,a),e.bufferData(n,r,s),t.onUploadCallback();let o=5126;return r instanceof Float32Array?o=5126:r instanceof Float64Array?console.warn("THREE.WebGLAttributes: Unsupported data buffer format: Float64Array."):r instanceof Uint16Array?t.isFloat16BufferAttribute?i?o=5131:console.warn("THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2."):o=5123:r instanceof Int16Array?o=5122:r instanceof Uint32Array?o=5125:r instanceof Int32Array?o=5124:r instanceof Int8Array?o=5120:(r instanceof Uint8Array||r instanceof Uint8ClampedArray)&&(o=5121),{buffer:a,type:o,bytesPerElement:r.BYTES_PER_ELEMENT,version:t.version}}(t,r)):s.version<t.version&&(!function(t,n,r){const s=n.array,a=n.updateRange;e.bindBuffer(r,t),-1===a.count?e.bufferSubData(r,0,s):(i?e.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s,a.offset,a.count):e.bufferSubData(r,a.offset*s.BYTES_PER_ELEMENT,s.subarray(a.offset,a.offset+a.count)),a.count=-1)}(s.buffer,t,r),s.version=t.version)}}}class ws extends kr{constructor(e=1,t=1,i=1,n=1){super(),this.type="PlaneGeometry",this.parameters={width:e,height:t,widthSegments:i,heightSegments:n};const r=e/2,s=t/2,a=Math.floor(i),o=Math.floor(n),h=a+1,c=o+1,l=e/a,u=t/o,d=[],p=[],m=[],f=[];for(let e=0;e<c;e++){const t=e*u-s;for(let i=0;i<h;i++){const n=i*l-r;p.push(n,-t,0),m.push(0,0,1),f.push(i/a),f.push(1-e/o)}}for(let e=0;e<o;e++)for(let t=0;t<a;t++){const i=t+h*e,n=t+h*(e+1),r=t+1+h*(e+1),s=t+1+h*e;d.push(i,n,s),d.push(n,r,s)}this.setIndex(d),this.setAttribute("position",new Ar(p,3)),this.setAttribute("normal",new Ar(m,3)),this.setAttribute("uv",new Ar(f,2))}static fromJSON(e){return new ws(e.width,e.height,e.widthSegments,e.heightSegments)}}const Ms={alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef USE_ALPHATEST\n\tif ( diffuseColor.a < alphaTest ) discard;\n#endif",alphatest_pars_fragment:"#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",begin_vertex:"vec3 transformed = vec3( position );",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\n\treturn RECIPROCAL_PI * diffuseColor;\n}\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\n\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\n\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\n}\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\n\tfloat a2 = pow2( alpha );\n\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\n\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\n\treturn 0.5 / max( gv + gl, EPSILON );\n}\nfloat D_GGX( const in float alpha, const in float dotNH ) {\n\tfloat a2 = pow2( alpha );\n\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\n\treturn RECIPROCAL_PI * a2 / pow2( denom );\n}\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\n\tfloat alpha = pow2( roughness );\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( f0, f90, dotVH );\n\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\tfloat D = D_GGX( alpha, dotNH );\n\treturn F * ( V * D );\n}\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\n\tconst float LUT_SIZE = 64.0;\n\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\n\tfloat dotNV = saturate( dot( N, V ) );\n\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\n\tuv = uv * LUT_SCALE + LUT_BIAS;\n\treturn uv;\n}\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\n\tfloat l = length( f );\n\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\n}\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\n\tfloat x = dot( v1, v2 );\n\tfloat y = abs( x );\n\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\n\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\n\tfloat v = a / b;\n\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\n\treturn cross( v1, v2 ) * theta_sintheta;\n}\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\n\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\n\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\n\tvec3 lightNormal = cross( v1, v2 );\n\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\n\tvec3 T1, T2;\n\tT1 = normalize( V - N * dot( V, N ) );\n\tT2 = - cross( N, T1 );\n\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\n\tvec3 coords[ 4 ];\n\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\n\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\n\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\n\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\n\tcoords[ 0 ] = normalize( coords[ 0 ] );\n\tcoords[ 1 ] = normalize( coords[ 1 ] );\n\tcoords[ 2 ] = normalize( coords[ 2 ] );\n\tcoords[ 3 ] = normalize( coords[ 3 ] );\n\tvec3 vectorFormFactor = vec3( 0.0 );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\n\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\n\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\n\treturn vec3( result );\n}\nfloat G_BlinnPhong_Implicit( ) {\n\treturn 0.25;\n}\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\n\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\n}\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\n\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\n\tfloat G = G_BlinnPhong_Implicit( );\n\tfloat D = D_BlinnPhong( shininess, dotNH );\n\treturn F * ( G * D );\n}\n#if defined( USE_SHEEN )\nfloat D_Charlie( float roughness, float dotNH ) {\n\tfloat alpha = pow2( roughness );\n\tfloat invAlpha = 1.0 / alpha;\n\tfloat cos2h = dotNH * dotNH;\n\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\n\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\n}\nfloat V_Neubelt( float dotNV, float dotNL ) {\n\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\n}\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\n\tvec3 halfDir = normalize( lightDir + viewDir );\n\tfloat dotNL = saturate( dot( normal, lightDir ) );\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tfloat dotNH = saturate( dot( normal, halfDir ) );\n\tfloat D = D_Charlie( sheenRoughness, dotNH );\n\tfloat V = V_Neubelt( dotNV, dotNL );\n\treturn sheenColor * ( D * V );\n}\n#endif",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vUv );\n\t\tvec2 dSTdy = dFdy( vUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\n\t\treturn vec2( dBx, dBy );\n\t}\n\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\n\t\tvec3 vSigmaX = vec3( dFdx( surf_pos.x ), dFdx( surf_pos.y ), dFdx( surf_pos.z ) );\n\t\tvec3 vSigmaY = vec3( dFdy( surf_pos.x ), dFdy( surf_pos.y ), dFdy( surf_pos.z ) );\n\t\tvec3 vN = surf_norm;\n\t\tvec3 R1 = cross( vSigmaY, vN );\n\t\tvec3 R2 = cross( vN, vSigmaX );\n\t\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\n\t\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\n\t\treturn normalize( abs( fDet ) * surf_norm - vGrad );\n\t}\n#endif",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\tplane = clippingPlanes[ i ];\n\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t}\n\t#pragma unroll_loop_end\n\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\tbool clipped = true;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\tif ( clipped ) discard;\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\n\tvColor = vec3( 1.0 );\n#endif\n#ifdef USE_COLOR\n\tvColor *= color;\n#endif\n#ifdef USE_INSTANCING_COLOR\n\tvColor.xyz *= instanceColor.xyz;\n#endif",common:"#define PI 3.141592653589793\n#define PI2 6.283185307179586\n#define PI_HALF 1.5707963267948966\n#define RECIPROCAL_PI 0.3183098861837907\n#define RECIPROCAL_PI2 0.15915494309189535\n#define EPSILON 1e-6\n#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\nfloat pow2( const in float x ) { return x*x; }\nfloat pow3( const in float x ) { return x*x*x; }\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\nfloat average( const in vec3 color ) { return dot( color, vec3( 0.3333 ) ); }\nhighp float rand( const in vec2 uv ) {\n\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\n\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\n\treturn fract( sin( sn ) * c );\n}\n#ifdef HIGH_PRECISION\n\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\n#else\n\tfloat precisionSafeLength( vec3 v ) {\n\t\tfloat maxComponent = max3( abs( v ) );\n\t\treturn length( v / maxComponent ) * maxComponent;\n\t}\n#endif\nstruct IncidentLight {\n\tvec3 color;\n\tvec3 direction;\n\tbool visible;\n};\nstruct ReflectedLight {\n\tvec3 directDiffuse;\n\tvec3 directSpecular;\n\tvec3 indirectDiffuse;\n\tvec3 indirectSpecular;\n};\nstruct GeometricContext {\n\tvec3 position;\n\tvec3 normal;\n\tvec3 viewDir;\n#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal;\n#endif\n};\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n}\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\n\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\n}\nmat3 transposeMat3( const in mat3 m ) {\n\tmat3 tmp;\n\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\n\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\n\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\n\treturn tmp;\n}\nfloat linearToRelativeLuminance( const in vec3 color ) {\n\tvec3 weights = vec3( 0.2126, 0.7152, 0.0722 );\n\treturn dot( weights, color.rgb );\n}\nbool isPerspectiveMatrix( mat4 m ) {\n\treturn m[ 2 ][ 3 ] == - 1.0;\n}\nvec2 equirectUv( in vec3 dir ) {\n\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\n\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\n\treturn vec2( u, v );\n}",cube_uv_reflection_fragment:"#ifdef ENVMAP_TYPE_CUBE_UV\n\t#define cubeUV_maxMipLevel 8.0\n\t#define cubeUV_minMipLevel 4.0\n\t#define cubeUV_maxTileSize 256.0\n\t#define cubeUV_minTileSize 16.0\n\tfloat getFace( vec3 direction ) {\n\t\tvec3 absDirection = abs( direction );\n\t\tfloat face = - 1.0;\n\t\tif ( absDirection.x > absDirection.z ) {\n\t\t\tif ( absDirection.x > absDirection.y )\n\t\t\t\tface = direction.x > 0.0 ? 0.0 : 3.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t} else {\n\t\t\tif ( absDirection.z > absDirection.y )\n\t\t\t\tface = direction.z > 0.0 ? 2.0 : 5.0;\n\t\t\telse\n\t\t\t\tface = direction.y > 0.0 ? 1.0 : 4.0;\n\t\t}\n\t\treturn face;\n\t}\n\tvec2 getUV( vec3 direction, float face ) {\n\t\tvec2 uv;\n\t\tif ( face == 0.0 ) {\n\t\t\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 1.0 ) {\n\t\t\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\n\t\t} else if ( face == 2.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\n\t\t} else if ( face == 3.0 ) {\n\t\t\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\n\t\t} else if ( face == 4.0 ) {\n\t\t\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\n\t\t} else {\n\t\t\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\n\t\t}\n\t\treturn 0.5 * ( uv + 1.0 );\n\t}\n\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\n\t\tfloat face = getFace( direction );\n\t\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\n\t\tmipInt = max( mipInt, cubeUV_minMipLevel );\n\t\tfloat faceSize = exp2( mipInt );\n\t\tfloat texelSize = 1.0 / ( 3.0 * cubeUV_maxTileSize );\n\t\tvec2 uv = getUV( direction, face ) * ( faceSize - 1.0 );\n\t\tvec2 f = fract( uv );\n\t\tuv += 0.5 - f;\n\t\tif ( face > 2.0 ) {\n\t\t\tuv.y += faceSize;\n\t\t\tface -= 3.0;\n\t\t}\n\t\tuv.x += face * faceSize;\n\t\tif ( mipInt < cubeUV_maxMipLevel ) {\n\t\t\tuv.y += 2.0 * cubeUV_maxTileSize;\n\t\t}\n\t\tuv.y += filterInt * 2.0 * cubeUV_minTileSize;\n\t\tuv.x += 3.0 * max( 0.0, cubeUV_maxTileSize - 2.0 * faceSize );\n\t\tuv *= texelSize;\n\t\tvec3 tl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x += texelSize;\n\t\tvec3 tr = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.y += texelSize;\n\t\tvec3 br = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tuv.x -= texelSize;\n\t\tvec3 bl = envMapTexelToLinear( texture2D( envMap, uv ) ).rgb;\n\t\tvec3 tm = mix( tl, tr, f.x );\n\t\tvec3 bm = mix( bl, br, f.x );\n\t\treturn mix( tm, bm, f.y );\n\t}\n\t#define r0 1.0\n\t#define v0 0.339\n\t#define m0 - 2.0\n\t#define r1 0.8\n\t#define v1 0.276\n\t#define m1 - 1.0\n\t#define r4 0.4\n\t#define v4 0.046\n\t#define m4 2.0\n\t#define r5 0.305\n\t#define v5 0.016\n\t#define m5 3.0\n\t#define r6 0.21\n\t#define v6 0.0038\n\t#define m6 4.0\n\tfloat roughnessToMip( float roughness ) {\n\t\tfloat mip = 0.0;\n\t\tif ( roughness >= r1 ) {\n\t\t\tmip = ( r0 - roughness ) * ( m1 - m0 ) / ( r0 - r1 ) + m0;\n\t\t} else if ( roughness >= r4 ) {\n\t\t\tmip = ( r1 - roughness ) * ( m4 - m1 ) / ( r1 - r4 ) + m1;\n\t\t} else if ( roughness >= r5 ) {\n\t\t\tmip = ( r4 - roughness ) * ( m5 - m4 ) / ( r4 - r5 ) + m4;\n\t\t} else if ( roughness >= r6 ) {\n\t\t\tmip = ( r5 - roughness ) * ( m6 - m5 ) / ( r5 - r6 ) + m5;\n\t\t} else {\n\t\t\tmip = - 2.0 * log2( 1.16 * roughness );\t\t}\n\t\treturn mip;\n\t}\n\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\n\t\tfloat mip = clamp( roughnessToMip( roughness ), m0, cubeUV_maxMipLevel );\n\t\tfloat mipF = fract( mip );\n\t\tfloat mipInt = floor( mip );\n\t\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\n\t\tif ( mipF == 0.0 ) {\n\t\t\treturn vec4( color0, 1.0 );\n\t\t} else {\n\t\t\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\n\t\t\treturn vec4( mix( color0, color1, mipF ), 1.0 );\n\t\t}\n\t}\n#endif",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_INSTANCING\n\tmat3 m = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\n\ttransformedNormal = m * transformedNormal;\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\n\temissiveColor.rgb = emissiveMapTexelToLinear( emissiveColor ).rgb;\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",encodings_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",encodings_pars_fragment:"\nvec4 LinearToLinear( in vec4 value ) {\n\treturn value;\n}\nvec4 GammaToLinear( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( gammaFactor ) ), value.a );\n}\nvec4 LinearToGamma( in vec4 value, in float gammaFactor ) {\n\treturn vec4( pow( value.rgb, vec3( 1.0 / gammaFactor ) ), value.a );\n}\nvec4 sRGBToLinear( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 LinearTosRGB( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\n}\nvec4 RGBEToLinear( in vec4 value ) {\n\treturn vec4( value.rgb * exp2( value.a * 255.0 - 128.0 ), 1.0 );\n}\nvec4 LinearToRGBE( in vec4 value ) {\n\tfloat maxComponent = max( max( value.r, value.g ), value.b );\n\tfloat fExp = clamp( ceil( log2( maxComponent ) ), -128.0, 127.0 );\n\treturn vec4( value.rgb / exp2( fExp ), ( fExp + 128.0 ) / 255.0 );\n}\nvec4 RGBMToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * value.a * maxRange, 1.0 );\n}\nvec4 LinearToRGBM( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat M = clamp( maxRGB / maxRange, 0.0, 1.0 );\n\tM = ceil( M * 255.0 ) / 255.0;\n\treturn vec4( value.rgb / ( M * maxRange ), M );\n}\nvec4 RGBDToLinear( in vec4 value, in float maxRange ) {\n\treturn vec4( value.rgb * ( ( maxRange / 255.0 ) / value.a ), 1.0 );\n}\nvec4 LinearToRGBD( in vec4 value, in float maxRange ) {\n\tfloat maxRGB = max( value.r, max( value.g, value.b ) );\n\tfloat D = max( maxRange / maxRGB, 1.0 );\n\tD = clamp( floor( D ) / 255.0, 0.0, 1.0 );\n\treturn vec4( value.rgb * ( D * ( 255.0 / maxRange ) ), D );\n}\nconst mat3 cLogLuvM = mat3( 0.2209, 0.3390, 0.4184, 0.1138, 0.6780, 0.7319, 0.0102, 0.1130, 0.2969 );\nvec4 LinearToLogLuv( in vec4 value ) {\n\tvec3 Xp_Y_XYZp = cLogLuvM * value.rgb;\n\tXp_Y_XYZp = max( Xp_Y_XYZp, vec3( 1e-6, 1e-6, 1e-6 ) );\n\tvec4 vResult;\n\tvResult.xy = Xp_Y_XYZp.xy / Xp_Y_XYZp.z;\n\tfloat Le = 2.0 * log2(Xp_Y_XYZp.y) + 127.0;\n\tvResult.w = fract( Le );\n\tvResult.z = ( Le - ( floor( vResult.w * 255.0 ) ) / 255.0 ) / 255.0;\n\treturn vResult;\n}\nconst mat3 cLogLuvInverseM = mat3( 6.0014, -2.7008, -1.7996, -1.3320, 3.1029, -5.7721, 0.3008, -1.0882, 5.6268 );\nvec4 LogLuvToLinear( in vec4 value ) {\n\tfloat Le = value.z * 255.0 + value.w;\n\tvec3 Xp_Y_XYZp;\n\tXp_Y_XYZp.y = exp2( ( Le - 127.0 ) / 2.0 );\n\tXp_Y_XYZp.z = Xp_Y_XYZp.y / value.y;\n\tXp_Y_XYZp.x = value.x * Xp_Y_XYZp.z;\n\tvec3 vRGB = cLogLuvInverseM * Xp_Y_XYZp.rgb;\n\treturn vec4( max( vRGB, 0.0 ), 1.0 );\n}",envmap_fragment:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvec3 cameraToFrag;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\n\t\t#else\n\t\t\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\n\t\t#endif\n\t#else\n\t\tvec3 reflectVec = vReflect;\n\t#endif\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\n\t\tenvColor = envMapTexelToLinear( envColor );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 envColor = textureCubeUV( envMap, reflectVec, 0.0 );\n\t#else\n\t\tvec4 envColor = vec4( 0.0 );\n\t#endif\n\t#ifdef ENVMAP_BLENDING_MULTIPLY\n\t\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_MIX )\n\t\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\n\t#elif defined( ENVMAP_BLENDING_ADD )\n\t\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\n\t#endif\n#endif",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform int maxMipLevel;\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tuniform samplerCube envMap;\n\t#else\n\t\tuniform sampler2D envMap;\n\t#endif\n\t\n#endif",envmap_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float reflectivity;\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\tvarying vec3 vWorldPosition;\n\t\tuniform float refractionRatio;\n\t#else\n\t\tvarying vec3 vReflect;\n\t#endif\n#endif",envmap_pars_vertex:"#ifdef USE_ENVMAP\n\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) ||defined( PHONG )\n\t\t#define ENV_WORLDPOS\n\t#endif\n\t#ifdef ENV_WORLDPOS\n\t\t\n\t\tvarying vec3 vWorldPosition;\n\t#else\n\t\tvarying vec3 vReflect;\n\t\tuniform float refractionRatio;\n\t#endif\n#endif",envmap_physical_pars_fragment:"#if defined( USE_ENVMAP )\n\t#ifdef ENVMAP_MODE_REFRACTION\n\t\tuniform float refractionRatio;\n\t#endif\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\n\t\t\treturn PI * envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\n\t\t#if defined( ENVMAP_TYPE_CUBE_UV )\n\t\t\tvec3 reflectVec;\n\t\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\t\treflectVec = reflect( - viewDir, normal );\n\t\t\t\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\n\t\t\t#else\n\t\t\t\treflectVec = refract( - viewDir, normal, refractionRatio );\n\t\t\t#endif\n\t\t\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\n\t\t\treturn envMapColor.rgb * envMapIntensity;\n\t\t#else\n\t\t\treturn vec3( 0.0 );\n\t\t#endif\n\t}\n#endif",envmap_vertex:"#ifdef USE_ENVMAP\n\t#ifdef ENV_WORLDPOS\n\t\tvWorldPosition = worldPosition.xyz;\n\t#else\n\t\tvec3 cameraToVertex;\n\t\tif ( isOrthographic ) {\n\t\t\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\n\t\t} else {\n\t\t\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\n\t\t}\n\t\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\t#ifdef ENVMAP_MODE_REFLECTION\n\t\t\tvReflect = reflect( cameraToVertex, worldNormal );\n\t\t#else\n\t\t\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\n\t\t#endif\n\t#endif\n#endif",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",fog_fragment:"#ifdef USE_FOG\n\t#ifdef FOG_EXP2\n\t\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\n\t#else\n\t\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\n\t#endif\n\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\n#endif",fog_pars_fragment:"#ifdef USE_FOG\n\tuniform vec3 fogColor;\n\tvarying float vFogDepth;\n\t#ifdef FOG_EXP2\n\t\tuniform float fogDensity;\n\t#else\n\t\tuniform float fogNear;\n\t\tuniform float fogFar;\n\t#endif\n#endif",gradientmap_pars_fragment:"#ifdef USE_GRADIENTMAP\n\tuniform sampler2D gradientMap;\n#endif\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\n\tfloat dotNL = dot( normal, lightDirection );\n\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\n\t#ifdef USE_GRADIENTMAP\n\t\treturn texture2D( gradientMap, coord ).rgb;\n\t#else\n\t\treturn ( coord.x < 0.7 ) ? vec3( 0.7 ) : vec3( 1.0 );\n\t#endif\n}",lightmap_fragment:"#ifdef USE_LIGHTMAP\n\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\tlightMapIrradiance *= PI;\n\t#endif\n\treflectedLight.indirectDiffuse += lightMapIrradiance;\n#endif",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_vertex:"vec3 diffuse = vec3( 1.0 );\nGeometricContext geometry;\ngeometry.position = mvPosition.xyz;\ngeometry.normal = normalize( transformedNormal );\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\nGeometricContext backGeometry;\nbackGeometry.position = geometry.position;\nbackGeometry.normal = -geometry.normal;\nbackGeometry.viewDir = geometry.viewDir;\nvLightFront = vec3( 0.0 );\nvIndirectFront = vec3( 0.0 );\n#ifdef DOUBLE_SIDED\n\tvLightBack = vec3( 0.0 );\n\tvIndirectBack = vec3( 0.0 );\n#endif\nIncidentLight directLight;\nfloat dotNL;\nvec3 directLightColor_Diffuse;\nvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\nvIndirectFront += getLightProbeIrradiance( lightProbe, geometry.normal );\n#ifdef DOUBLE_SIDED\n\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometry.normal );\n#endif\n#if NUM_POINT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tgetPointLightInfo( pointLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tgetSpotLightInfo( spotLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_DIR_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tgetDirectionalLightInfo( directionalLights[ i ], geometry, directLight );\n\t\tdotNL = dot( geometry.normal, directLight.direction );\n\t\tdirectLightColor_Diffuse = directLight.color;\n\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometry.normal );\n\t\t#endif\n\t}\n\t#pragma unroll_loop_end\n#endif",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\nuniform vec3 lightProbe[ 9 ];\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\tfloat x = normal.x, y = normal.y, z = normal.z;\n\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\treturn result;\n}\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\n\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\n\treturn irradiance;\n}\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\n\tvec3 irradiance = ambientLightColor;\n\treturn irradiance;\n}\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\n\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\n\t\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\t\tif ( cutoffDistance > 0.0 ) {\n\t\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t\t}\n\t\treturn distanceFalloff;\n\t#else\n\t\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\n\t\t\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\n\t\t}\n\t\treturn 1.0;\n\t#endif\n}\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\n\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\n}\n#if NUM_DIR_LIGHTS > 0\n\tstruct DirectionalLight {\n\t\tvec3 direction;\n\t\tvec3 color;\n\t};\n\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\n\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tlight.color = directionalLight.color;\n\t\tlight.direction = directionalLight.direction;\n\t\tlight.visible = true;\n\t}\n#endif\n#if NUM_POINT_LIGHTS > 0\n\tstruct PointLight {\n\t\tvec3 position;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t};\n\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\n\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat lightDistance = length( lVector );\n\t\tlight.color = pointLight.color;\n\t\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\n\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t}\n#endif\n#if NUM_SPOT_LIGHTS > 0\n\tstruct SpotLight {\n\t\tvec3 position;\n\t\tvec3 direction;\n\t\tvec3 color;\n\t\tfloat distance;\n\t\tfloat decay;\n\t\tfloat coneCos;\n\t\tfloat penumbraCos;\n\t};\n\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\n\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometry.position;\n\t\tlight.direction = normalize( lVector );\n\t\tfloat angleCos = dot( light.direction, spotLight.direction );\n\t\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\n\t\tif ( spotAttenuation > 0.0 ) {\n\t\t\tfloat lightDistance = length( lVector );\n\t\t\tlight.color = spotLight.color * spotAttenuation;\n\t\t\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\n\t\t\tlight.visible = ( light.color != vec3( 0.0 ) );\n\t\t} else {\n\t\t\tlight.color = vec3( 0.0 );\n\t\t\tlight.visible = false;\n\t\t}\n\t}\n#endif\n#if NUM_RECT_AREA_LIGHTS > 0\n\tstruct RectAreaLight {\n\t\tvec3 color;\n\t\tvec3 position;\n\t\tvec3 halfWidth;\n\t\tvec3 halfHeight;\n\t};\n\tuniform sampler2D ltc_1;\tuniform sampler2D ltc_2;\n\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\n#endif\n#if NUM_HEMI_LIGHTS > 0\n\tstruct HemisphereLight {\n\t\tvec3 direction;\n\t\tvec3 skyColor;\n\t\tvec3 groundColor;\n\t};\n\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\n\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\n\t\tfloat dotNL = dot( normal, hemiLight.direction );\n\t\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\n\t\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\n\t\treturn irradiance;\n\t}\n#endif",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_Toon\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Toon\n#define Material_LightProbeLOD( material )\t(0)",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",lights_phong_pars_fragment:"varying vec3 vViewPosition;\nstruct BlinnPhongMaterial {\n\tvec3 diffuseColor;\n\tvec3 specularColor;\n\tfloat specularShininess;\n\tfloat specularStrength;\n};\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\n#define RE_Direct\t\t\t\tRE_Direct_BlinnPhong\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_BlinnPhong\n#define Material_LightProbeLOD( material )\t(0)",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\nmaterial.roughness = min( material.roughness, 1.0 );\n#ifdef IOR\n\t#ifdef SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULARINTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\n\t\t#endif\n\t\t#ifdef USE_SPECULARCOLORMAP\n\t\t\tspecularColorFactor *= specularColorMapTexelToLinear( texture2D( specularColorMap, vUv ) ).rgb;\n\t\t#endif\n\t\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\n\t#else\n\t\tfloat specularIntensityFactor = 1.0;\n\t\tvec3 specularColorFactor = vec3( 1.0 );\n\t\tmaterial.specularF90 = 1.0;\n\t#endif\n\tmaterial.specularColor = mix( min( pow2( ( ior - 1.0 ) / ( ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\n#else\n\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\n\tmaterial.specularF90 = 1.0;\n#endif\n#ifdef USE_CLEARCOAT\n\tmaterial.clearcoat = clearcoat;\n\tmaterial.clearcoatRoughness = clearcoatRoughness;\n\tmaterial.clearcoatF0 = vec3( 0.04 );\n\tmaterial.clearcoatF90 = 1.0;\n\t#ifdef USE_CLEARCOATMAP\n\t\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\n\t#endif\n\tmaterial.clearcoat = saturate( material.clearcoat );\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\n\tmaterial.clearcoatRoughness += geometryRoughness;\n\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\n#endif\n#ifdef USE_SHEEN\n\tmaterial.sheenColor = sheenColor;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tmaterial.sheenColor *= sheenColorMapTexelToLinear( texture2D( sheenColorMap, vUv ) ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\n\t#endif\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat clearcoat;\n\t\tfloat clearcoatRoughness;\n\t\tvec3 clearcoatF0;\n\t\tfloat clearcoatF90;\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tvec3 sheenColor;\n\t\tfloat sheenRoughness;\n\t#endif\n};\nvec3 clearcoatSpecular = vec3( 0.0 );\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\n\tfloat dotNV = saturate( dot( normal, viewDir ) );\n\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\n\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\n\tvec4 r = roughness * c0 + c1;\n\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\n\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\n\treturn fab;\n}\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\treturn specularColor * fab.x + specularF90 * fab.y;\n}\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\n\tvec2 fab = DFGApprox( normal, viewDir, roughness );\n\tvec3 FssEss = specularColor * fab.x + specularF90 * fab.y;\n\tfloat Ess = fab.x + fab.y;\n\tfloat Ems = 1.0 - Ess;\n\tvec3 Favg = specularColor + ( 1.0 - specularColor ) * 0.047619;\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\n\tsingleScatter += FssEss;\n\tmultiScatter += Fms * Ems;\n}\n#if NUM_RECT_AREA_LIGHTS > 0\n\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometry.normal;\n\t\tvec3 viewDir = geometry.viewDir;\n\t\tvec3 position = geometry.position;\n\t\tvec3 lightPos = rectAreaLight.position;\n\t\tvec3 halfWidth = rectAreaLight.halfWidth;\n\t\tvec3 halfHeight = rectAreaLight.halfHeight;\n\t\tvec3 lightColor = rectAreaLight.color;\n\t\tfloat roughness = material.roughness;\n\t\tvec3 rectCoords[ 4 ];\n\t\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\t\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\n\t\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\n\t\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\n\t\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\n\t\tvec4 t1 = texture2D( ltc_1, uv );\n\t\tvec4 t2 = texture2D( ltc_2, uv );\n\t\tmat3 mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3(    0, 1,    0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t);\n\t\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\n\t\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\n\t\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\n\t}\n#endif\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\treflectedLight.directSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\tvec3 singleScattering = vec3( 0.0 );\n\tvec3 multiScattering = vec3( 0.0 );\n\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\n\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\n\tvec3 diffuse = material.diffuseColor * ( 1.0 - ( singleScattering + multiScattering ) );\n\treflectedLight.indirectSpecular += radiance * singleScattering;\n\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\n\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\n}\n#define RE_Direct\t\t\t\tRE_Direct_Physical\n#define RE_Direct_RectArea\t\tRE_Direct_RectArea_Physical\n#define RE_IndirectDiffuse\t\tRE_IndirectDiffuse_Physical\n#define RE_IndirectSpecular\t\tRE_IndirectSpecular_Physical\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\n\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\n}",lights_fragment_begin:"\nGeometricContext geometry;\ngeometry.position = - vViewPosition;\ngeometry.normal = normal;\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n#ifdef USE_CLEARCOAT\n\tgeometry.clearcoatNormal = clearcoatNormal;\n#endif\nIncidentLight directLight;\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\t\tpointLight = pointLights[ i ];\n\t\tgetPointLightInfo( pointLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\tSpotLight spotLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\t\tspotLight = spotLights[ i ];\n\t\tgetSpotLightInfo( spotLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\t\tdirectionalLight = directionalLights[ i ];\n\t\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= all( bvec2( directLight.visible, receiveShadow ) ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\tRectAreaLight rectAreaLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\n\t}\n\t#pragma unroll_loop_end\n#endif\n#if defined( RE_IndirectDiffuse )\n\tvec3 iblIrradiance = vec3( 0.0 );\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#endif\n#endif\n#if defined( RE_IndirectSpecular )\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n#endif",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\n\t\tvec3 lightMapIrradiance = lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t\t#ifndef PHYSICALLY_CORRECT_LIGHTS\n\t\t\tlightMapIrradiance *= PI;\n\t\t#endif\n\t\tirradiance += lightMapIrradiance;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\n\t\tiblIrradiance += getIBLIrradiance( geometry.normal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvarying float vFragDepth;\n\t\tvarying float vIsPerspective;\n\t#else\n\t\tuniform float logDepthBufFC;\n\t#endif\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\t#ifdef USE_LOGDEPTHBUF_EXT\n\t\tvFragDepth = 1.0 + gl_Position.w;\n\t\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n\t#else\n\t\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\n\t\t\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\n\t\t\tgl_Position.z *= gl_Position.w;\n\t\t}\n\t#endif\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 texelColor = texture2D( map, vUv );\n\ttexelColor = mapTexelToLinear( texelColor );\n\tdiffuseColor *= texelColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n#endif\n#ifdef USE_MAP\n\tvec4 mapTexel = texture2D( map, uv );\n\tdiffuseColor *= mapTexelToLinear( mapTexel );\n#endif\n#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\n#endif",map_particle_pars_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\tuniform mat3 uvTransform;\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1, 2 ) * morphTargetInfluences[ i ];\n\t\t}\n\t#else\n\t\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\n\t\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\n\t\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\n\t\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\n\t#endif\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\tuniform float morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t\tuniform sampler2DArray morphTargetsTexture;\n\t\tuniform vec2 morphTargetsTextureSize;\n\t\tvec3 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset, const in int stride ) {\n\t\t\tfloat texelIndex = float( vertexIndex * stride + offset );\n\t\t\tfloat y = floor( texelIndex / morphTargetsTextureSize.x );\n\t\t\tfloat x = texelIndex - y * morphTargetsTextureSize.x;\n\t\t\tvec3 morphUV = vec3( ( x + 0.5 ) / morphTargetsTextureSize.x, y / morphTargetsTextureSize.y, morphTargetIndex );\n\t\t\treturn texture( morphTargetsTexture, morphUV ).xyz;\n\t\t}\n\t#else\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\tuniform float morphTargetInfluences[ 8 ];\n\t\t#else\n\t\t\tuniform float morphTargetInfluences[ 4 ];\n\t\t#endif\n\t#endif\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\t#ifdef MORPHTARGETS_TEXTURE\n\t\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\t\t#ifndef USE_MORPHNORMALS\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 1 ) * morphTargetInfluences[ i ];\n\t\t\t#else\n\t\t\t\tif ( morphTargetInfluences[ i ] > 0.0 ) transformed += getMorph( gl_VertexID, i, 0, 2 ) * morphTargetInfluences[ i ];\n\t\t\t#endif\n\t\t}\n\t#else\n\t\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\n\t\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\n\t\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\n\t\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\n\t\t#ifndef USE_MORPHNORMALS\n\t\t\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\n\t\t\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\n\t\t\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\n\t\t\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\n\t\t#endif\n\t#endif\n#endif",normal_fragment_begin:"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\n#ifdef FLAT_SHADED\n\tvec3 fdx = vec3( dFdx( vViewPosition.x ), dFdx( vViewPosition.y ), dFdx( vViewPosition.z ) );\n\tvec3 fdy = vec3( dFdy( vViewPosition.x ), dFdy( vViewPosition.y ), dFdy( vViewPosition.z ) );\n\tvec3 normal = normalize( cross( fdx, fdy ) );\n#else\n\tvec3 normal = normalize( vNormal );\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\t#ifdef USE_TANGENT\n\t\tvec3 tangent = normalize( vTangent );\n\t\tvec3 bitangent = normalize( vBitangent );\n\t\t#ifdef DOUBLE_SIDED\n\t\t\ttangent = tangent * faceDirection;\n\t\t\tbitangent = bitangent * faceDirection;\n\t\t#endif\n\t\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tmat3 vTBN = mat3( tangent, bitangent, normal );\n\t\t#endif\n\t#endif\n#endif\nvec3 geometryNormal = normal;",normal_fragment_maps:"#ifdef OBJECTSPACE_NORMALMAP\n\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\t#ifdef FLIP_SIDED\n\t\tnormal = - normal;\n\t#endif\n\t#ifdef DOUBLE_SIDED\n\t\tnormal = normal * faceDirection;\n\t#endif\n\tnormal = normalize( normalMatrix * normal );\n#elif defined( TANGENTSPACE_NORMALMAP )\n\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\t#ifdef USE_TANGENT\n\t\tnormal = normalize( vTBN * mapN );\n\t#else\n\t\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\n\t#endif\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",normal_pars_fragment:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_pars_vertex:"#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n\t#ifdef USE_TANGENT\n\t\tvarying vec3 vTangent;\n\t\tvarying vec3 vBitangent;\n\t#endif\n#endif",normal_vertex:"#ifndef FLAT_SHADED\n\tvNormal = normalize( transformedNormal );\n\t#ifdef USE_TANGENT\n\t\tvTangent = normalize( transformedTangent );\n\t\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\n\t#endif\n#endif",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef OBJECTSPACE_NORMALMAP\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\n\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\n\t\tvec3 q0 = vec3( dFdx( eye_pos.x ), dFdx( eye_pos.y ), dFdx( eye_pos.z ) );\n\t\tvec3 q1 = vec3( dFdy( eye_pos.x ), dFdy( eye_pos.y ), dFdy( eye_pos.z ) );\n\t\tvec2 st0 = dFdx( vUv.st );\n\t\tvec2 st1 = dFdy( vUv.st );\n\t\tvec3 N = surf_norm;\n\t\tvec3 q1perp = cross( q1, N );\n\t\tvec3 q0perp = cross( N, q0 );\n\t\tvec3 T = q1perp * st0.x + q0perp * st1.x;\n\t\tvec3 B = q1perp * st0.y + q0perp * st1.y;\n\t\tfloat det = max( dot( T, T ), dot( B, B ) );\n\t\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\n\t\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = geometryNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\t#ifdef USE_TANGENT\n\t\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\n\t#else\n\t\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\n\t#endif\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif",output_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= transmissionAlpha + 0.1;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",packing:"vec3 packNormalToRGB( const in vec3 normal ) {\n\treturn normalize( normal ) * 0.5 + 0.5;\n}\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\n\treturn 2.0 * rgb.xyz - 1.0;\n}\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\nconst float ShiftRight8 = 1. / 256.;\nvec4 packDepthToRGBA( const in float v ) {\n\tvec4 r = vec4( fract( v * PackFactors ), v );\n\tr.yzw -= r.xyz * ShiftRight8;\treturn r * PackUpscale;\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors );\n}\nvec4 pack2HalfToRGBA( vec2 v ) {\n\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\n\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\n}\nvec2 unpackRGBATo2Half( vec4 v ) {\n\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\n}\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( viewZ + near ) / ( near - far );\n}\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\n\treturn linearClipZ * ( near - far ) - near;\n}\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\n\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\n}\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",dithering_pars_fragment:"#ifdef DITHERING\n\tvec3 dithering( vec3 color ) {\n\t\tfloat grid_position = rand( gl_FragCoord.xy );\n\t\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\n\t\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\n\t\treturn color + dither_shift_RGB;\n\t}\n#endif",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\n\t\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\n\t}\n\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\n\t\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\n\t}\n\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\n\t\tfloat occlusion = 1.0;\n\t\tvec2 distribution = texture2DDistribution( shadow, uv );\n\t\tfloat hard_shadow = step( compare , distribution.x );\n\t\tif (hard_shadow != 1.0 ) {\n\t\t\tfloat distance = compare - distribution.x ;\n\t\t\tfloat variance = max( 0.00000, distribution.y * distribution.y );\n\t\t\tfloat softness_probability = variance / (variance + distance * distance );\t\t\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\t\t\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\n\t\t}\n\t\treturn occlusion;\n\t}\n\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\n\t\tfloat shadow = 1.0;\n\t\tshadowCoord.xyz /= shadowCoord.w;\n\t\tshadowCoord.z += shadowBias;\n\t\tbvec4 inFrustumVec = bvec4 ( shadowCoord.x >= 0.0, shadowCoord.x <= 1.0, shadowCoord.y >= 0.0, shadowCoord.y <= 1.0 );\n\t\tbool inFrustum = all( inFrustumVec );\n\t\tbvec2 frustumTestVec = bvec2( inFrustum, shadowCoord.z <= 1.0 );\n\t\tbool frustumTest = all( frustumTestVec );\n\t\tif ( frustumTest ) {\n\t\t#if defined( SHADOWMAP_TYPE_PCF )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx0 = - texelSize.x * shadowRadius;\n\t\t\tfloat dy0 = - texelSize.y * shadowRadius;\n\t\t\tfloat dx1 = + texelSize.x * shadowRadius;\n\t\t\tfloat dy1 = + texelSize.y * shadowRadius;\n\t\t\tfloat dx2 = dx0 / 2.0;\n\t\t\tfloat dy2 = dy0 / 2.0;\n\t\t\tfloat dx3 = dx1 / 2.0;\n\t\t\tfloat dy3 = dy1 / 2.0;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\n\t\t\t) * ( 1.0 / 17.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\n\t\t\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\n\t\t\tfloat dx = texelSize.x;\n\t\t\tfloat dy = texelSize.y;\n\t\t\tvec2 uv = shadowCoord.xy;\n\t\t\tvec2 f = fract( uv * shadowMapSize + 0.5 );\n\t\t\tuv -= f * texelSize;\n\t\t\tshadow = (\n\t\t\t\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\n\t\t\t\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\n\t\t\t\t\t f.x ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t f.y ) +\n\t\t\t\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ), \n\t\t\t\t\t\t  texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\n\t\t\t\t\t\t  f.x ),\n\t\t\t\t\t f.y )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#elif defined( SHADOWMAP_TYPE_VSM )\n\t\t\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#else\n\t\t\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\n\t\t#endif\n\t\t}\n\t\treturn shadow;\n\t}\n\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\n\t\tvec3 absV = abs( v );\n\t\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\n\t\tabsV *= scaleToCube;\n\t\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\n\t\tvec2 planar = v.xy;\n\t\tfloat almostATexel = 1.5 * texelSizeY;\n\t\tfloat almostOne = 1.0 - almostATexel;\n\t\tif ( absV.z >= almostOne ) {\n\t\t\tif ( v.z > 0.0 )\n\t\t\t\tplanar.x = 4.0 - v.x;\n\t\t} else if ( absV.x >= almostOne ) {\n\t\t\tfloat signX = sign( v.x );\n\t\t\tplanar.x = v.z * signX + 2.0 * signX;\n\t\t} else if ( absV.y >= almostOne ) {\n\t\t\tfloat signY = sign( v.y );\n\t\t\tplanar.x = v.x + 2.0 * signY + 2.0;\n\t\t\tplanar.y = v.z * signY - 2.0;\n\t\t}\n\t\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\n\t}\n\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\tdp += shadowBias;\n\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\treturn (\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t) * ( 1.0 / 9.0 );\n\t\t#else\n\t\t\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t#endif\n\t}\n#endif",shadowmap_pars_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\n\t\tstruct DirectionalLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 spotShadowMatrix[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vSpotShadowCoord[ NUM_SPOT_LIGHT_SHADOWS ];\n\t\tstruct SpotLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t};\n\t\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\n\t\tstruct PointLightShadow {\n\t\t\tfloat shadowBias;\n\t\t\tfloat shadowNormalBias;\n\t\t\tfloat shadowRadius;\n\t\t\tvec2 shadowMapSize;\n\t\t\tfloat shadowCameraNear;\n\t\t\tfloat shadowCameraFar;\n\t\t};\n\t\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\n\t#endif\n#endif",shadowmap_vertex:"#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0 || NUM_SPOT_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0\n\t\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\n\t\tvec4 shadowWorldPosition;\n\t#endif\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvSpotShadowCoord[ i ] = spotShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\n\t\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n#endif",shadowmask_pars_fragment:"float getShadowMask() {\n\tfloat shadow = 1.0;\n\t#ifdef USE_SHADOWMAP\n\t#if NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\n\t\tdirectionalLight = directionalLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\n\t\tspotLight = spotLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotShadowCoord[ i ] ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#if NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLight;\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\n\t\tpointLight = pointLightShadows[ i ];\n\t\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\n\t}\n\t#pragma unroll_loop_end\n\t#endif\n\t#endif\n\treturn shadow;\n}",skinbase_vertex:"#ifdef USE_SKINNING\n\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\n\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\n\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\n\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\n#endif",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\t#ifdef BONE_TEXTURE\n\t\tuniform highp sampler2D boneTexture;\n\t\tuniform int boneTextureSize;\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tfloat j = i * 4.0;\n\t\t\tfloat x = mod( j, float( boneTextureSize ) );\n\t\t\tfloat y = floor( j / float( boneTextureSize ) );\n\t\t\tfloat dx = 1.0 / float( boneTextureSize );\n\t\t\tfloat dy = 1.0 / float( boneTextureSize );\n\t\t\ty = dy * ( y + 0.5 );\n\t\t\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\n\t\t\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\n\t\t\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\n\t\t\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\n\t\t\tmat4 bone = mat4( v1, v2, v3, v4 );\n\t\t\treturn bone;\n\t\t}\n\t#else\n\t\tuniform mat4 boneMatrices[ MAX_BONES ];\n\t\tmat4 getBoneMatrix( const in float i ) {\n\t\t\tmat4 bone = boneMatrices[ int(i) ];\n\t\t\treturn bone;\n\t\t}\n\t#endif\n#endif",skinning_vertex:"#ifdef USE_SKINNING\n\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\n\tvec4 skinned = vec4( 0.0 );\n\tskinned += boneMatX * skinVertex * skinWeight.x;\n\tskinned += boneMatY * skinVertex * skinWeight.y;\n\tskinned += boneMatZ * skinVertex * skinWeight.z;\n\tskinned += boneMatW * skinVertex * skinWeight.w;\n\ttransformed = ( bindMatrixInverse * skinned ).xyz;\n#endif",skinnormal_vertex:"#ifdef USE_SKINNING\n\tmat4 skinMatrix = mat4( 0.0 );\n\tskinMatrix += skinWeight.x * boneMatX;\n\tskinMatrix += skinWeight.y * boneMatY;\n\tskinMatrix += skinWeight.z * boneMatZ;\n\tskinMatrix += skinWeight.w * boneMatW;\n\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\n\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\n\t#ifdef USE_TANGENT\n\t\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\n\t#endif\n#endif",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",tonemapping_pars_fragment:"#ifndef saturate\n#define saturate( a ) clamp( a, 0.0, 1.0 )\n#endif\nuniform float toneMappingExposure;\nvec3 LinearToneMapping( vec3 color ) {\n\treturn toneMappingExposure * color;\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 OptimizedCineonToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\tcolor = max( vec3( 0.0 ), color - 0.004 );\n\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\n}\nvec3 RRTAndODTFit( vec3 v ) {\n\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\treturn a / b;\n}\nvec3 ACESFilmicToneMapping( vec3 color ) {\n\tconst mat3 ACESInputMat = mat3(\n\t\tvec3( 0.59719, 0.07600, 0.02840 ),\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t);\n\tconst mat3 ACESOutputMat = mat3(\n\t\tvec3(  1.60475, -0.10208, -0.00327 ),\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t);\n\tcolor *= toneMappingExposure / 0.6;\n\tcolor = ACESInputMat * color;\n\tcolor = RRTAndODTFit( color );\n\tcolor = ACESOutputMat * color;\n\treturn saturate( color );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",transmission_fragment:"#ifdef USE_TRANSMISSION\n\tfloat transmissionAlpha = 1.0;\n\tfloat transmissionFactor = transmission;\n\tfloat thicknessFactor = thickness;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\ttransmissionFactor *= texture2D( transmissionMap, vUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tthicknessFactor *= texture2D( thicknessMap, vUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmission = getIBLVolumeRefraction(\n\t\tn, v, roughnessFactor, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, ior, thicknessFactor,\n\t\tattenuationColor, attenuationDistance );\n\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor );\n\ttransmissionAlpha = mix( transmissionAlpha, transmission.a, transmissionFactor );\n#endif",transmission_pars_fragment:"#ifdef USE_TRANSMISSION\n\tuniform float transmission;\n\tuniform float thickness;\n\tuniform float attenuationDistance;\n\tuniform vec3 attenuationColor;\n\t#ifdef USE_TRANSMISSIONMAP\n\t\tuniform sampler2D transmissionMap;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tuniform sampler2D thicknessMap;\n\t#endif\n\tuniform vec2 transmissionSamplerSize;\n\tuniform sampler2D transmissionSamplerMap;\n\tuniform mat4 modelMatrix;\n\tuniform mat4 projectionMatrix;\n\tvarying vec3 vWorldPosition;\n\tvec3 getVolumeTransmissionRay( vec3 n, vec3 v, float thickness, float ior, mat4 modelMatrix ) {\n\t\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\n\t\tvec3 modelScale;\n\t\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\n\t\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\n\t\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\n\t\treturn normalize( refractionVector ) * thickness * modelScale;\n\t}\n\tfloat applyIorToRoughness( float roughness, float ior ) {\n\t\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\n\t}\n\tvec4 getTransmissionSample( vec2 fragCoord, float roughness, float ior ) {\n\t\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\t#ifdef TEXTURE_LOD_EXT\n\t\t\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#else\n\t\t\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\n\t\t#endif\n\t}\n\tvec3 applyVolumeAttenuation( vec3 radiance, float transmissionDistance, vec3 attenuationColor, float attenuationDistance ) {\n\t\tif ( attenuationDistance == 0.0 ) {\n\t\t\treturn radiance;\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance * radiance;\n\t\t}\n\t}\n\tvec4 getIBLVolumeRefraction( vec3 n, vec3 v, float roughness, vec3 diffuseColor, vec3 specularColor, float specularF90,\n\t\tvec3 position, mat4 modelMatrix, mat4 viewMatrix, mat4 projMatrix, float ior, float thickness,\n\t\tvec3 attenuationColor, float attenuationDistance ) {\n\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\trefractionCoords += 1.0;\n\t\trefractionCoords /= 2.0;\n\t\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\n\t}\n#endif",uv_pars_fragment:"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\n\tvarying vec2 vUv;\n#endif",uv_pars_vertex:"#ifdef USE_UV\n\t#ifdef UVS_VERTEX_ONLY\n\t\tvec2 vUv;\n\t#else\n\t\tvarying vec2 vUv;\n\t#endif\n\tuniform mat3 uvTransform;\n#endif",uv_vertex:"#ifdef USE_UV\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n#endif",uv2_pars_fragment:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvarying vec2 vUv2;\n#endif",uv2_pars_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tattribute vec2 uv2;\n\tvarying vec2 vUv2;\n\tuniform mat3 uv2Transform;\n#endif",uv2_vertex:"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\n\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\n#endif",worldpos_vertex:"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION )\n\tvec4 worldPosition = vec4( transformed, 1.0 );\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"varying vec2 vUv;\nuniform mat3 uvTransform;\nvoid main() {\n\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\tgl_Position = vec4( position.xy, 1.0, 1.0 );\n}",background_frag:"uniform sampler2D t2D;\nvarying vec2 vUv;\nvoid main() {\n\tvec4 texColor = texture2D( t2D, vUv );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",cube_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n\tgl_Position.z = gl_Position.w;\n}",cube_frag:"#include <envmap_common_pars_fragment>\nuniform float opacity;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\tvec3 vReflect = vWorldDirection;\n\t#include <envmap_fragment>\n\tgl_FragColor = envColor;\n\tgl_FragColor.a *= opacity;\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",depth_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvHighPrecisionZW = gl_Position.zw;\n}",depth_frag:"#if DEPTH_PACKING == 3200\n\tuniform float opacity;\n#endif\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#if DEPTH_PACKING == 3200\n\t\tdiffuseColor.a = opacity;\n\t#endif\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <logdepthbuf_fragment>\n\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\n\t#if DEPTH_PACKING == 3200\n\t\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\n\t#elif DEPTH_PACKING == 3201\n\t\tgl_FragColor = packDepthToRGBA( fragCoordZ );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <skinbase_vertex>\n\t#ifdef USE_DISPLACEMENTMAP\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <clipping_planes_vertex>\n\tvWorldPosition = worldPosition.xyz;\n}",distanceRGBA_frag:"#define DISTANCE\nuniform vec3 referencePosition;\nuniform float nearDistance;\nuniform float farDistance;\nvarying vec3 vWorldPosition;\n#include <common>\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",equirect_frag:"uniform sampler2D tEquirect;\nvarying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvec3 direction = normalize( vWorldDirection );\n\tvec2 sampleUV = equirectUv( direction );\n\tvec4 texColor = texture2D( tEquirect, sampleUV );\n\tgl_FragColor = mapTexelToLinear( texColor );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\tvLineDistance = scale * lineDistance;\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",linedashed_frag:"uniform vec3 diffuse;\nuniform float opacity;\nuniform float dashSize;\nuniform float totalSize;\nvarying float vLineDistance;\n#include <common>\n#include <color_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshbasic_vert:"#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\n\t\t#include <beginnormal_vertex>\n\t\t#include <morphnormal_vertex>\n\t\t#include <skinbase_vertex>\n\t\t#include <skinnormal_vertex>\n\t\t#include <defaultnormal_vertex>\n\t#endif\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <fog_vertex>\n}",meshbasic_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#ifndef FLAT_SHADED\n\tvarying vec3 vNormal;\n#endif\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel= texture2D( lightMap, vUv2 );\n\t\treflectedLight.indirectDiffuse += lightMapTexelToLinear( lightMapTexel ).rgb * lightMapIntensity;\n\t#else\n\t\treflectedLight.indirectDiffuse += vec3( 1.0 );\n\t#endif\n\t#include <aomap_fragment>\n\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\n\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <envmap_pars_vertex>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <lights_lambert_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshlambert_frag:"uniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\nvarying vec3 vLightFront;\nvarying vec3 vIndirectFront;\n#ifdef DOUBLE_SIDED\n\tvarying vec3 vLightBack;\n\tvarying vec3 vIndirectBack;\n#endif\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <fog_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <emissivemap_fragment>\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\t#else\n\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\t#endif\n\t#include <lightmap_fragment>\n\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\t#ifdef DOUBLE_SIDED\n\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\t#else\n\t\treflectedLight.directDiffuse = vLightFront;\n\t#endif\n\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <color_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n\tvViewPosition = - mvPosition.xyz;\n}",meshmatcap_frag:"#define MATCAP\nuniform vec3 diffuse;\nuniform float opacity;\nuniform sampler2D matcap;\nvarying vec3 vViewPosition;\n#include <common>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tvec3 viewDir = normalize( vViewPosition );\n\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\n\tvec3 y = cross( viewDir, x );\n\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\n\t#ifdef USE_MATCAP\n\t\tvec4 matcapColor = texture2D( matcap, uv );\n\t\tmatcapColor = matcapTexelToLinear( matcapColor );\n\t#else\n\t\tvec4 matcapColor = vec4( 1.0 );\n\t#endif\n\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\n\tvarying vec3 vViewPosition;\n#endif\n#include <packing>\n#include <uv_pars_fragment>\n#include <normal_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\t#include <logdepthbuf_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <envmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <envmap_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshphong_frag:"#define PHONG\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform vec3 specular;\nuniform float shininess;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_pars_fragment>\n#include <cube_uv_reflection_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_phong_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <specularmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <specularmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_phong_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\n\t#include <envmap_fragment>\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n#ifdef USE_TRANSMISSION\n\tvWorldPosition = worldPosition.xyz;\n#endif\n}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define SPECULAR\n#endif\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float roughness;\nuniform float metalness;\nuniform float opacity;\n#ifdef IOR\n\tuniform float ior;\n#endif\n#ifdef SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULARINTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n\t#ifdef USE_SPECULARCOLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_SHEEN\n\tuniform vec3 sheenColor;\n\tuniform float sheenRoughness;\n\t#ifdef USE_SHEENCOLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEENROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\nvarying vec3 vViewPosition;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <bsdfs>\n#include <cube_uv_reflection_fragment>\n#include <envmap_common_pars_fragment>\n#include <envmap_physical_pars_fragment>\n#include <fog_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_physical_pars_fragment>\n#include <transmission_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <clearcoat_pars_fragment>\n#include <roughnessmap_pars_fragment>\n#include <metalnessmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <roughnessmap_fragment>\n\t#include <metalnessmap_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <clearcoat_normal_fragment_begin>\n\t#include <clearcoat_normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_physical_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\n\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\n\t#include <transmission_fragment>\n\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - clearcoat * Fcc ) + clearcoatSpecular * clearcoat;\n\t#endif\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <uv_pars_vertex>\n#include <uv2_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\t#include <uv2_vertex>\n\t#include <color_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\tvViewPosition = - mvPosition.xyz;\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",meshtoon_frag:"#define TOON\nuniform vec3 diffuse;\nuniform vec3 emissive;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <dithering_pars_fragment>\n#include <color_pars_fragment>\n#include <uv_pars_fragment>\n#include <uv2_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\n#include <gradientmap_pars_fragment>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <lights_toon_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\tvec3 totalEmissiveRadiance = emissive;\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\t#include <emissivemap_fragment>\n\t#include <lights_toon_fragment>\n\t#include <lights_fragment_begin>\n\t#include <lights_fragment_maps>\n\t#include <lights_fragment_end>\n\t#include <aomap_fragment>\n\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",points_vert:"uniform float size;\nuniform float scale;\n#include <common>\n#include <color_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <color_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <project_vertex>\n\tgl_PointSize = size;\n\t#ifdef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\n\t#endif\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <worldpos_vertex>\n\t#include <fog_vertex>\n}",points_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <color_pars_fragment>\n#include <map_particle_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",shadow_vert:"#include <common>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <project_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"uniform vec3 color;\nuniform float opacity;\n#include <common>\n#include <packing>\n#include <fog_pars_fragment>\n#include <bsdfs>\n#include <lights_pars_begin>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"uniform float rotation;\nuniform vec2 center;\n#include <common>\n#include <uv_pars_vertex>\n#include <fog_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\nvoid main() {\n\t#include <uv_vertex>\n\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\n\tvec2 scale;\n\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\n\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\n\t#ifndef USE_SIZEATTENUATION\n\t\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\n\t\tif ( isPerspective ) scale *= - mvPosition.z;\n\t#endif\n\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\n\tvec2 rotatedPosition;\n\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\n\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\n\tmvPosition.xy += rotatedPosition;\n\tgl_Position = projectionMatrix * mvPosition;\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\t#include <fog_vertex>\n}",sprite_frag:"uniform vec3 diffuse;\nuniform float opacity;\n#include <common>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <output_fragment>\n\t#include <tonemapping_fragment>\n\t#include <encodings_fragment>\n\t#include <fog_fragment>\n}"},Ss={common:{diffuse:{value:new xr(16777215)},opacity:{value:1},map:{value:null},uvTransform:{value:new Fi},uv2Transform:{value:new Fi},alphaMap:{value:null},alphaTest:{value:0}},specularmap:{specularMap:{value:null}},envmap:{envMap:{value:null},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98},maxMipLevel:{value:0}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1}},emissivemap:{emissiveMap:{value:null}},bumpmap:{bumpMap:{value:null},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalScale:{value:new zi(1,1)}},displacementmap:{displacementMap:{value:null},displacementScale:{value:1},displacementBias:{value:0}},roughnessmap:{roughnessMap:{value:null}},metalnessmap:{metalnessMap:{value:null}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new xr(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotShadowMap:{value:[]},spotShadowMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new xr(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Fi}},sprite:{diffuse:{value:new xr(16777215)},opacity:{value:1},center:{value:new zi(.5,.5)},rotation:{value:0},map:{value:null},alphaMap:{value:null},alphaTest:{value:0},uvTransform:{value:new Fi}}},Ts={basic:{uniforms:rs([Ss.common,Ss.specularmap,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.fog]),vertexShader:Ms.meshbasic_vert,fragmentShader:Ms.meshbasic_frag},lambert:{uniforms:rs([Ss.common,Ss.specularmap,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)}}]),vertexShader:Ms.meshlambert_vert,fragmentShader:Ms.meshlambert_frag},phong:{uniforms:rs([Ss.common,Ss.specularmap,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)},specular:{value:new xr(1118481)},shininess:{value:30}}]),vertexShader:Ms.meshphong_vert,fragmentShader:Ms.meshphong_frag},standard:{uniforms:rs([Ss.common,Ss.envmap,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.roughnessmap,Ss.metalnessmap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Ms.meshphysical_vert,fragmentShader:Ms.meshphysical_frag},toon:{uniforms:rs([Ss.common,Ss.aomap,Ss.lightmap,Ss.emissivemap,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.gradientmap,Ss.fog,Ss.lights,{emissive:{value:new xr(0)}}]),vertexShader:Ms.meshtoon_vert,fragmentShader:Ms.meshtoon_frag},matcap:{uniforms:rs([Ss.common,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,Ss.fog,{matcap:{value:null}}]),vertexShader:Ms.meshmatcap_vert,fragmentShader:Ms.meshmatcap_frag},points:{uniforms:rs([Ss.points,Ss.fog]),vertexShader:Ms.points_vert,fragmentShader:Ms.points_frag},dashed:{uniforms:rs([Ss.common,Ss.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Ms.linedashed_vert,fragmentShader:Ms.linedashed_frag},depth:{uniforms:rs([Ss.common,Ss.displacementmap]),vertexShader:Ms.depth_vert,fragmentShader:Ms.depth_frag},normal:{uniforms:rs([Ss.common,Ss.bumpmap,Ss.normalmap,Ss.displacementmap,{opacity:{value:1}}]),vertexShader:Ms.meshnormal_vert,fragmentShader:Ms.meshnormal_frag},sprite:{uniforms:rs([Ss.sprite,Ss.fog]),vertexShader:Ms.sprite_vert,fragmentShader:Ms.sprite_frag},background:{uniforms:{uvTransform:{value:new Fi},t2D:{value:null}},vertexShader:Ms.background_vert,fragmentShader:Ms.background_frag},cube:{uniforms:rs([Ss.envmap,{opacity:{value:1}}]),vertexShader:Ms.cube_vert,fragmentShader:Ms.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Ms.equirect_vert,fragmentShader:Ms.equirect_frag},distanceRGBA:{uniforms:rs([Ss.common,Ss.displacementmap,{referencePosition:{value:new Ki},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Ms.distanceRGBA_vert,fragmentShader:Ms.distanceRGBA_frag},shadow:{uniforms:rs([Ss.lights,Ss.fog,{color:{value:new xr(0)},opacity:{value:1}}]),vertexShader:Ms.shadow_vert,fragmentShader:Ms.shadow_frag}};function Cs(e,t,i,n,r){const s=new xr(0);let a,o,h=0,c=null,l=0,u=null;function d(e,t){i.buffers.color.setClear(e.r,e.g,e.b,t,r)}return{getClearColor:function(){return s},setClearColor:function(e,t=1){s.set(e),h=t,d(s,h)},getClearAlpha:function(){return h},setClearAlpha:function(e){h=e,d(s,h)},render:function(i,r){let p=!1,m=!0===r.isScene?r.background:null;m&&m.isTexture&&(m=t.get(m));const f=e.xr,g=f.getSession&&f.getSession();g&&"additive"===g.environmentBlendMode&&(m=null),null===m?d(s,h):m&&m.isColor&&(d(m,1),p=!0),(e.autoClear||p)&&e.clear(e.autoClearColor,e.autoClearDepth,e.autoClearStencil),m&&(m.isCubeTexture||m.mapping===qt)?(void 0===o&&(o=new es(new is(1,1,1),new as({name:"BackgroundCubeMaterial",uniforms:ns(Ts.cube.uniforms),vertexShader:Ts.cube.vertexShader,fragmentShader:Ts.cube.fragmentShader,side:1,depthTest:!1,depthWrite:!1,fog:!1})),o.geometry.deleteAttribute("normal"),o.geometry.deleteAttribute("uv"),o.onBeforeRender=function(e,t,i){this.matrixWorld.copyPosition(i.matrixWorld)},Object.defineProperty(o.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),n.update(o)),o.material.uniforms.envMap.value=m,o.material.uniforms.flipEnvMap.value=m.isCubeTexture&&!1===m.isRenderTargetTexture?-1:1,c===m&&l===m.version&&u===e.toneMapping||(o.material.needsUpdate=!0,c=m,l=m.version,u=e.toneMapping),i.unshift(o,o.geometry,o.material,0,0,null)):m&&m.isTexture&&(void 0===a&&(a=new es(new ws(2,2),new as({name:"BackgroundMaterial",uniforms:ns(Ts.background.uniforms),vertexShader:Ts.background.vertexShader,fragmentShader:Ts.background.fragmentShader,side:0,depthTest:!1,depthWrite:!1,fog:!1})),a.geometry.deleteAttribute("normal"),Object.defineProperty(a.material,"map",{get:function(){return this.uniforms.t2D.value}}),n.update(a)),a.material.uniforms.t2D.value=m,!0===m.matrixAutoUpdate&&m.updateMatrix(),a.material.uniforms.uvTransform.value.copy(m.matrix),c===m&&l===m.version&&u===e.toneMapping||(a.material.needsUpdate=!0,c=m,l=m.version,u=e.toneMapping),i.unshift(a,a.geometry,a.material,0,0,null))}}}function Es(e,t,i,n){const r=e.getParameter(34921),s=n.isWebGL2?null:t.get("OES_vertex_array_object"),a=n.isWebGL2||null!==s,o={},h=d(null);let c=h;function l(t){return n.isWebGL2?e.bindVertexArray(t):s.bindVertexArrayOES(t)}function u(t){return n.isWebGL2?e.deleteVertexArray(t):s.deleteVertexArrayOES(t)}function d(e){const t=[],i=[],n=[];for(let e=0;e<r;e++)t[e]=0,i[e]=0,n[e]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:t,enabledAttributes:i,attributeDivisors:n,object:e,attributes:{},index:null}}function p(){const e=c.newAttributes;for(let t=0,i=e.length;t<i;t++)e[t]=0}function m(e){f(e,0)}function f(i,r){const s=c.newAttributes,a=c.enabledAttributes,o=c.attributeDivisors;if(s[i]=1,0===a[i]&&(e.enableVertexAttribArray(i),a[i]=1),o[i]!==r){(n.isWebGL2?e:t.get("ANGLE_instanced_arrays"))[n.isWebGL2?"vertexAttribDivisor":"vertexAttribDivisorANGLE"](i,r),o[i]=r}}function g(){const t=c.newAttributes,i=c.enabledAttributes;for(let n=0,r=i.length;n<r;n++)i[n]!==t[n]&&(e.disableVertexAttribArray(n),i[n]=0)}function _(t,i,r,s,a,o){!0!==n.isWebGL2||5124!==r&&5125!==r?e.vertexAttribPointer(t,i,r,s,a,o):e.vertexAttribIPointer(t,i,r,a,o)}function v(){y(),c!==h&&(c=h,l(c.object))}function y(){h.geometry=null,h.program=null,h.wireframe=!1}return{setup:function(r,h,u,v,y){let b=!1;if(a){const t=function(t,i,r){const a=!0===r.wireframe;let h=o[t.id];void 0===h&&(h={},o[t.id]=h);let c=h[i.id];void 0===c&&(c={},h[i.id]=c);let l=c[a];void 0===l&&(l=d(n.isWebGL2?e.createVertexArray():s.createVertexArrayOES()),c[a]=l);return l}(v,u,h);c!==t&&(c=t,l(c.object)),b=function(e,t){const i=c.attributes,n=e.attributes;let r=0;for(const e in n){const t=i[e],s=n[e];if(void 0===t)return!0;if(t.attribute!==s)return!0;if(t.data!==s.data)return!0;r++}return c.attributesNum!==r||c.index!==t}(v,y),b&&function(e,t){const i={},n=e.attributes;let r=0;for(const e in n){const t=n[e],s={};s.attribute=t,t.data&&(s.data=t.data),i[e]=s,r++}c.attributes=i,c.attributesNum=r,c.index=t}(v,y)}else{const e=!0===h.wireframe;c.geometry===v.id&&c.program===u.id&&c.wireframe===e||(c.geometry=v.id,c.program=u.id,c.wireframe=e,b=!0)}!0===r.isInstancedMesh&&(b=!0),null!==y&&i.update(y,34963),b&&(!function(r,s,a,o){if(!1===n.isWebGL2&&(r.isInstancedMesh||o.isInstancedBufferGeometry)&&null===t.get("ANGLE_instanced_arrays"))return;p();const h=o.attributes,c=a.getAttributes(),l=s.defaultAttributeValues;for(const t in c){const n=c[t];if(n.location>=0){let s=h[t];if(void 0===s&&("instanceMatrix"===t&&r.instanceMatrix&&(s=r.instanceMatrix),"instanceColor"===t&&r.instanceColor&&(s=r.instanceColor)),void 0!==s){const t=s.normalized,a=s.itemSize,h=i.get(s);if(void 0===h)continue;const c=h.buffer,l=h.type,u=h.bytesPerElement;if(s.isInterleavedBufferAttribute){const i=s.data,h=i.stride,d=s.offset;if(i&&i.isInstancedInterleavedBuffer){for(let e=0;e<n.locationSize;e++)f(n.location+e,i.meshPerAttribute);!0!==r.isInstancedMesh&&void 0===o._maxInstanceCount&&(o._maxInstanceCount=i.meshPerAttribute*i.count)}else for(let e=0;e<n.locationSize;e++)m(n.location+e);e.bindBuffer(34962,c);for(let e=0;e<n.locationSize;e++)_(n.location+e,a/n.locationSize,l,t,h*u,(d+a/n.locationSize*e)*u)}else{if(s.isInstancedBufferAttribute){for(let e=0;e<n.locationSize;e++)f(n.location+e,s.meshPerAttribute);!0!==r.isInstancedMesh&&void 0===o._maxInstanceCount&&(o._maxInstanceCount=s.meshPerAttribute*s.count)}else for(let e=0;e<n.locationSize;e++)m(n.location+e);e.bindBuffer(34962,c);for(let e=0;e<n.locationSize;e++)_(n.location+e,a/n.locationSize,l,t,a*u,a/n.locationSize*e*u)}}else if(void 0!==l){const i=l[t];if(void 0!==i)switch(i.length){case 2:e.vertexAttrib2fv(n.location,i);break;case 3:e.vertexAttrib3fv(n.location,i);break;case 4:e.vertexAttrib4fv(n.location,i);break;default:e.vertexAttrib1fv(n.location,i)}}}}g()}(r,h,u,v),null!==y&&e.bindBuffer(34963,i.get(y).buffer))},reset:v,resetDefaultState:y,dispose:function(){v();for(const e in o){const t=o[e];for(const e in t){const i=t[e];for(const e in i)u(i[e].object),delete i[e];delete t[e]}delete o[e]}},releaseStatesOfGeometry:function(e){if(void 0===o[e.id])return;const t=o[e.id];for(const e in t){const i=t[e];for(const e in i)u(i[e].object),delete i[e];delete t[e]}delete o[e.id]},releaseStatesOfProgram:function(e){for(const t in o){const i=o[t];if(void 0===i[e.id])continue;const n=i[e.id];for(const e in n)u(n[e].object),delete n[e];delete i[e.id]}},initAttributes:p,enableAttribute:m,disableUnusedAttributes:g}}function As(e,t,i,n){const r=n.isWebGL2;let s;this.setMode=function(e){s=e},this.render=function(t,n){e.drawArrays(s,t,n),i.update(n,s,1)},this.renderInstances=function(n,a,o){if(0===o)return;let h,c;if(r)h=e,c="drawArraysInstanced";else if(h=t.get("ANGLE_instanced_arrays"),c="drawArraysInstancedANGLE",null===h)return void console.error("THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");h[c](s,n,a,o),i.update(a,s,o)}}function Is(e,t,i){let n;function r(t){if("highp"===t){if(e.getShaderPrecisionFormat(35633,36338).precision>0&&e.getShaderPrecisionFormat(35632,36338).precision>0)return"highp";t="mediump"}return"mediump"===t&&e.getShaderPrecisionFormat(35633,36337).precision>0&&e.getShaderPrecisionFormat(35632,36337).precision>0?"mediump":"lowp"}const s="undefined"!=typeof WebGL2RenderingContext&&e instanceof WebGL2RenderingContext||"undefined"!=typeof WebGL2ComputeRenderingContext&&e instanceof WebGL2ComputeRenderingContext;let a=void 0!==i.precision?i.precision:"highp";const o=r(a);o!==a&&(console.warn("THREE.WebGLRenderer:",a,"not supported, using",o,"instead."),a=o);const h=s||t.has("WEBGL_draw_buffers"),c=!0===i.logarithmicDepthBuffer,l=e.getParameter(34930),u=e.getParameter(35660),d=e.getParameter(3379),p=e.getParameter(34076),m=e.getParameter(34921),f=e.getParameter(36347),g=e.getParameter(36348),_=e.getParameter(36349),v=u>0,y=s||t.has("OES_texture_float");return{isWebGL2:s,drawBuffers:h,getMaxAnisotropy:function(){if(void 0!==n)return n;if(!0===t.has("EXT_texture_filter_anisotropic")){const i=t.get("EXT_texture_filter_anisotropic");n=e.getParameter(i.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else n=0;return n},getMaxPrecision:r,precision:a,logarithmicDepthBuffer:c,maxTextures:l,maxVertexTextures:u,maxTextureSize:d,maxCubemapSize:p,maxAttributes:m,maxVertexUniforms:f,maxVaryings:g,maxFragmentUniforms:_,vertexTextures:v,floatFragmentTextures:y,floatVertexTextures:v&&y,maxSamples:s?e.getParameter(36183):0}}function Rs(e){const t=this;let i=null,n=0,r=!1,s=!1;const a=new gs,o=new Fi,h={value:null,needsUpdate:!1};function c(){h.value!==i&&(h.value=i,h.needsUpdate=n>0),t.numPlanes=n,t.numIntersection=0}function l(e,i,n,r){const s=null!==e?e.length:0;let c=null;if(0!==s){if(c=h.value,!0!==r||null===c){const t=n+4*s,r=i.matrixWorldInverse;o.getNormalMatrix(r),(null===c||c.length<t)&&(c=new Float32Array(t));for(let t=0,i=n;t!==s;++t,i+=4)a.copy(e[t]).applyMatrix4(r,o),a.normal.toArray(c,i),c[i+3]=a.constant}h.value=c,h.needsUpdate=!0}return t.numPlanes=s,t.numIntersection=0,c}this.uniform=h,this.numPlanes=0,this.numIntersection=0,this.init=function(e,t,s){const a=0!==e.length||t||0!==n||r;return r=t,i=l(e,s,0),n=e.length,a},this.beginShadows=function(){s=!0,l(null)},this.endShadows=function(){s=!1,c()},this.setState=function(t,a,o){const u=t.clippingPlanes,d=t.clipIntersection,p=t.clipShadows,m=e.get(t);if(!r||null===u||0===u.length||s&&!p)s?l(null):c();else{const e=s?0:n,t=4*e;let r=m.clippingState||null;h.value=r,r=l(u,a,t,o);for(let e=0;e!==t;++e)r[e]=i[e];m.clippingState=r,this.numIntersection=d?this.numPlanes:0,this.numPlanes+=e}}}function Ps(e){let t=new WeakMap;function i(e,t){return 303===t?e.mapping=Gt:304===t&&(e.mapping=Wt),e}function n(e){const i=e.target;i.removeEventListener("dispose",n);const r=t.get(i);void 0!==r&&(t.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping;if(303===s||304===s){if(t.has(r)){return i(t.get(r).texture,r.mapping)}{const s=r.image;if(s&&s.height>0){const a=e.getRenderTarget(),o=new ds(s.height/2);return o.fromEquirectangularTexture(e,r),t.set(r,o),e.setRenderTarget(a),r.addEventListener("dispose",n),i(o.texture,r.mapping)}return null}}}return r},dispose:function(){t=new WeakMap}}}Ts.physical={uniforms:rs([Ts.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatNormalScale:{value:new zi(1,1)},clearcoatNormalMap:{value:null},sheen:{value:0},sheenColor:{value:new xr(0)},sheenColorMap:{value:null},sheenRoughness:{value:0},sheenRoughnessMap:{value:null},transmission:{value:0},transmissionMap:{value:null},transmissionSamplerSize:{value:new zi},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},attenuationDistance:{value:0},attenuationColor:{value:new xr(0)},specularIntensity:{value:0},specularIntensityMap:{value:null},specularColor:{value:new xr(1,1,1)},specularColorMap:{value:null}}]),vertexShader:Ms.meshphysical_vert,fragmentShader:Ms.meshphysical_frag};class Ls extends os{constructor(e=-1,t=1,i=1,n=-1,r=.1,s=2e3){super(),this.type="OrthographicCamera",this.zoom=1,this.view=null,this.left=e,this.right=t,this.top=i,this.bottom=n,this.near=r,this.far=s,this.updateProjectionMatrix()}copy(e,t){return super.copy(e,t),this.left=e.left,this.right=e.right,this.top=e.top,this.bottom=e.bottom,this.near=e.near,this.far=e.far,this.zoom=e.zoom,this.view=null===e.view?null:Object.assign({},e.view),this}setViewOffset(e,t,i,n,r,s){null===this.view&&(this.view={enabled:!0,fullWidth:1,fullHeight:1,offsetX:0,offsetY:0,width:1,height:1}),this.view.enabled=!0,this.view.fullWidth=e,this.view.fullHeight=t,this.view.offsetX=i,this.view.offsetY=n,this.view.width=r,this.view.height=s,this.updateProjectionMatrix()}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){const e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),i=(this.right+this.left)/2,n=(this.top+this.bottom)/2;let r=i-e,s=i+e,a=n+t,o=n-t;if(null!==this.view&&this.view.enabled){const e=(this.right-this.left)/this.view.fullWidth/this.zoom,t=(this.top-this.bottom)/this.view.fullHeight/this.zoom;r+=e*this.view.offsetX,s=r+e*this.view.width,a-=t*this.view.offsetY,o=a-t*this.view.height}this.projectionMatrix.makeOrthographic(r,s,a,o,this.near,this.far),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()}toJSON(e){const t=super.toJSON(e);return t.object.zoom=this.zoom,t.object.left=this.left,t.object.right=this.right,t.object.top=this.top,t.object.bottom=this.bottom,t.object.near=this.near,t.object.far=this.far,null!==this.view&&(t.object.view=Object.assign({},this.view)),t}}Ls.prototype.isOrthographicCamera=!0;class Ds extends as{constructor(e){super(e),this.type="RawShaderMaterial"}}Ds.prototype.isRawShaderMaterial=!0;const Ns=Math.pow(2,8),$s=[.125,.215,.35,.446,.526,.582],ks=5+$s.length,Os=20,zs={[_i]:0,[vi]:1,[bi]:2,3004:3,3005:4,3006:5,[yi]:6},Fs=new Ls,{_lodPlanes:Bs,_sizeLods:Us,_sigmas:Vs}=Ys(),Hs=new xr;let js=null;const Gs=(1+Math.sqrt(5))/2,Ws=1/Gs,qs=[new Ki(1,1,1),new Ki(-1,1,1),new Ki(1,1,-1),new Ki(-1,1,-1),new Ki(0,Gs,Ws),new Ki(0,Gs,-Ws),new Ki(Ws,0,Gs),new Ki(-Ws,0,Gs),new Ki(Gs,Ws,0),new Ki(-Gs,Ws,0)];class Xs{constructor(e){this._renderer=e,this._pingPongRenderTarget=null,this._blurMaterial=function(e){const t=new Float32Array(e),i=new Ki(0,1,0);return new Ds({name:"SphericalGaussianBlur",defines:{n:e},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:t},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:i},inputEncoding:{value:zs[3e3]},outputEncoding:{value:zs[3e3]}},vertexShader:ta(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t${ia()}\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}(Os),this._equirectShader=null,this._cubemapShader=null,this._compileMaterial(this._blurMaterial)}fromScene(e,t=0,i=.1,n=100){js=this._renderer.getRenderTarget();const r=this._allocateTargets();return this._sceneToCubeUV(e,i,n,r),t>0&&this._blur(r,0,0,t),this._applyPMREM(r),this._cleanup(r),r}fromEquirectangular(e){return this._fromTexture(e)}fromCubemap(e){return this._fromTexture(e)}compileCubemapShader(){null===this._cubemapShader&&(this._cubemapShader=ea(),this._compileMaterial(this._cubemapShader))}compileEquirectangularShader(){null===this._equirectShader&&(this._equirectShader=Qs(),this._compileMaterial(this._equirectShader))}dispose(){this._blurMaterial.dispose(),null!==this._cubemapShader&&this._cubemapShader.dispose(),null!==this._equirectShader&&this._equirectShader.dispose();for(let e=0;e<Bs.length;e++)Bs[e].dispose()}_cleanup(e){this._pingPongRenderTarget.dispose(),this._renderer.setRenderTarget(js),e.scissorTest=!1,Ks(e,0,0,e.width,e.height)}_fromTexture(e){js=this._renderer.getRenderTarget();const t=this._allocateTargets(e);return this._textureToCubeUV(e,t),this._applyPMREM(t),this._cleanup(t),t}_allocateTargets(e){const t={magFilter:Jt,minFilter:Jt,generateMipmaps:!1,type:ei,format:1023,encoding:Zs(e)?e.encoding:bi,depthBuffer:!1},i=Js(t);return i.depthBuffer=!e,this._pingPongRenderTarget=Js(t),i}_compileMaterial(e){const t=new es(Bs[0],e);this._renderer.compile(t,Fs)}_sceneToCubeUV(e,t,i,n){const r=new hs(90,1,t,i),s=[1,-1,1,1,1,1],a=[1,1,1,-1,-1,-1],o=this._renderer,h=o.autoClear,c=o.outputEncoding,l=o.toneMapping;o.getClearColor(Hs),o.toneMapping=0,o.outputEncoding=_i,o.autoClear=!1;const u=new wr({name:"PMREM.Background",side:1,depthWrite:!1,depthTest:!1}),d=new es(new is,u);let p=!1;const m=e.background;m?m.isColor&&(u.color.copy(m),e.background=null,p=!0):(u.color.copy(Hs),p=!0);for(let t=0;t<6;t++){const i=t%3;0==i?(r.up.set(0,s[t],0),r.lookAt(a[t],0,0)):1==i?(r.up.set(0,0,s[t]),r.lookAt(0,a[t],0)):(r.up.set(0,s[t],0),r.lookAt(0,0,a[t])),Ks(n,i*Ns,t>2?Ns:0,Ns,Ns),o.setRenderTarget(n),p&&o.render(d,r),o.render(e,r)}d.geometry.dispose(),d.material.dispose(),o.toneMapping=l,o.outputEncoding=c,o.autoClear=h,e.background=m}_setEncoding(e,t){!0===this._renderer.capabilities.isWebGL2&&t.format===oi&&t.type===ei&&t.encoding===vi?e.value=zs[3e3]:e.value=zs[t.encoding]}_textureToCubeUV(e,t){const i=this._renderer,n=e.mapping===Gt||e.mapping===Wt;n?null==this._cubemapShader&&(this._cubemapShader=ea()):null==this._equirectShader&&(this._equirectShader=Qs());const r=n?this._cubemapShader:this._equirectShader,s=new es(Bs[0],r),a=r.uniforms;a.envMap.value=e,n||a.texelSize.value.set(1/e.image.width,1/e.image.height),this._setEncoding(a.inputEncoding,e),this._setEncoding(a.outputEncoding,t.texture),Ks(t,0,0,3*Ns,2*Ns),i.setRenderTarget(t),i.render(s,Fs)}_applyPMREM(e){const t=this._renderer,i=t.autoClear;t.autoClear=!1;for(let t=1;t<ks;t++){const i=Math.sqrt(Vs[t]*Vs[t]-Vs[t-1]*Vs[t-1]),n=qs[(t-1)%qs.length];this._blur(e,t-1,t,i,n)}t.autoClear=i}_blur(e,t,i,n,r){const s=this._pingPongRenderTarget;this._halfBlur(e,s,t,i,n,"latitudinal",r),this._halfBlur(s,e,i,i,n,"longitudinal",r)}_halfBlur(e,t,i,n,r,s,a){const o=this._renderer,h=this._blurMaterial;"latitudinal"!==s&&"longitudinal"!==s&&console.error("blur direction must be either latitudinal or longitudinal!");const c=new es(Bs[n],h),l=h.uniforms,u=Us[i]-1,d=isFinite(r)?Math.PI/(2*u):2*Math.PI/39,p=r/d,m=isFinite(r)?1+Math.floor(3*p):Os;m>Os&&console.warn(`sigmaRadians, ${r}, is too large and will clip, as it requested ${m} samples when the maximum is set to 20`);const f=[];let g=0;for(let e=0;e<Os;++e){const t=e/p,i=Math.exp(-t*t/2);f.push(i),0==e?g+=i:e<m&&(g+=2*i)}for(let e=0;e<f.length;e++)f[e]=f[e]/g;l.envMap.value=e.texture,l.samples.value=m,l.weights.value=f,l.latitudinal.value="latitudinal"===s,a&&(l.poleAxis.value=a),l.dTheta.value=d,l.mipInt.value=8-i,this._setEncoding(l.inputEncoding,e.texture),this._setEncoding(l.outputEncoding,e.texture);const _=Us[n];Ks(t,3*Math.max(0,Ns-2*_),(0===n?0:2*Ns)+2*_*(n>4?n-8+4:0),3*_,2*_),o.setRenderTarget(t),o.render(c,Fs)}}function Zs(e){return void 0!==e&&e.type===ei&&(e.encoding===_i||e.encoding===vi||e.encoding===yi)}function Ys(){const e=[],t=[],i=[];let n=8;for(let r=0;r<ks;r++){const s=Math.pow(2,n);t.push(s);let a=1/s;r>4?a=$s[r-8+4-1]:0==r&&(a=0),i.push(a);const o=1/(s-1),h=-o/2,c=1+o/2,l=[h,h,c,h,c,c,h,h,c,c,h,c],u=6,d=6,p=3,m=2,f=1,g=new Float32Array(p*d*u),_=new Float32Array(m*d*u),v=new Float32Array(f*d*u);for(let e=0;e<u;e++){const t=e%3*2/3-1,i=e>2?0:-1,n=[t,i,0,t+2/3,i,0,t+2/3,i+1,0,t,i,0,t+2/3,i+1,0,t,i+1,0];g.set(n,p*d*e),_.set(l,m*d*e);const r=[e,e,e,e,e,e];v.set(r,f*d*e)}const y=new kr;y.setAttribute("position",new Tr(g,p)),y.setAttribute("uv",new Tr(_,m)),y.setAttribute("faceIndex",new Tr(v,f)),e.push(y),n>4&&n--}return{_lodPlanes:e,_sizeLods:t,_sigmas:i}}function Js(e){const t=new Zi(3*Ns,3*Ns,e);return t.texture.mapping=qt,t.texture.name="PMREM.cubeUv",t.scissorTest=!0,t}function Ks(e,t,i,n,r){e.viewport.set(t,i,n,r),e.scissor.set(t,i,n,r)}function Qs(){const e=new zi(1,1);return new Ds({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null},texelSize:{value:e},inputEncoding:{value:zs[3e3]},outputEncoding:{value:zs[3e3]}},vertexShader:ta(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform vec2 texelSize;\n\n\t\t\t${ia()}\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tvec2 f = fract( uv / texelSize - 0.5 );\n\t\t\t\tuv -= f * texelSize;\n\t\t\t\tvec3 tl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x += texelSize.x;\n\t\t\t\tvec3 tr = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.y += texelSize.y;\n\t\t\t\tvec3 br = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\t\t\t\tuv.x -= texelSize.x;\n\t\t\t\tvec3 bl = envMapTexelToLinear( texture2D ( envMap, uv ) ).rgb;\n\n\t\t\t\tvec3 tm = mix( tl, tr, f.x );\n\t\t\t\tvec3 bm = mix( bl, br, f.x );\n\t\t\t\tgl_FragColor.rgb = mix( tm, bm, f.y );\n\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function ea(){return new Ds({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},inputEncoding:{value:zs[3e3]},outputEncoding:{value:zs[3e3]}},vertexShader:ta(),fragmentShader:`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\t${ia()}\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb = envMapTexelToLinear( textureCube( envMap, vec3( - vOutputDirection.x, vOutputDirection.yz ) ) ).rgb;\n\t\t\t\tgl_FragColor = linearToOutputTexel( gl_FragColor );\n\n\t\t\t}\n\t\t`,blending:0,depthTest:!1,depthWrite:!1})}function ta(){return"\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t"}function ia(){return"\n\n\t\tuniform int inputEncoding;\n\t\tuniform int outputEncoding;\n\n\t\t#include <encodings_pars_fragment>\n\n\t\tvec4 inputTexelToLinear( vec4 value ) {\n\n\t\t\tif ( inputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( inputEncoding == 1 ) {\n\n\t\t\t\treturn sRGBToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 2 ) {\n\n\t\t\t\treturn RGBEToLinear( value );\n\n\t\t\t} else if ( inputEncoding == 3 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 7.0 );\n\n\t\t\t} else if ( inputEncoding == 4 ) {\n\n\t\t\t\treturn RGBMToLinear( value, 16.0 );\n\n\t\t\t} else if ( inputEncoding == 5 ) {\n\n\t\t\t\treturn RGBDToLinear( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn GammaToLinear( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 linearToOutputTexel( vec4 value ) {\n\n\t\t\tif ( outputEncoding == 0 ) {\n\n\t\t\t\treturn value;\n\n\t\t\t} else if ( outputEncoding == 1 ) {\n\n\t\t\t\treturn LinearTosRGB( value );\n\n\t\t\t} else if ( outputEncoding == 2 ) {\n\n\t\t\t\treturn LinearToRGBE( value );\n\n\t\t\t} else if ( outputEncoding == 3 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 7.0 );\n\n\t\t\t} else if ( outputEncoding == 4 ) {\n\n\t\t\t\treturn LinearToRGBM( value, 16.0 );\n\n\t\t\t} else if ( outputEncoding == 5 ) {\n\n\t\t\t\treturn LinearToRGBD( value, 256.0 );\n\n\t\t\t} else {\n\n\t\t\t\treturn LinearToGamma( value, 2.2 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tvec4 envMapTexelToLinear( vec4 color ) {\n\n\t\t\treturn inputTexelToLinear( color );\n\n\t\t}\n\t"}function na(e){let t=new WeakMap,i=null;function n(e){const i=e.target;i.removeEventListener("dispose",n);const r=t.get(i);void 0!==r&&(t.delete(i),r.dispose())}return{get:function(r){if(r&&r.isTexture&&!1===r.isRenderTargetTexture){const s=r.mapping,a=303===s||304===s,o=s===Gt||s===Wt;if(a||o){if(t.has(r))return t.get(r).texture;{const s=r.image;if(a&&s&&s.height>0||o&&s&&function(e){let t=0;const i=6;for(let n=0;n<i;n++)void 0!==e[n]&&t++;return t===i}(s)){const s=e.getRenderTarget();null===i&&(i=new Xs(e));const o=a?i.fromEquirectangular(r):i.fromCubemap(r);return t.set(r,o),e.setRenderTarget(s),r.addEventListener("dispose",n),o.texture}return null}}}return r},dispose:function(){t=new WeakMap,null!==i&&(i.dispose(),i=null)}}}function ra(e){const t={};function i(i){if(void 0!==t[i])return t[i];let n;switch(i){case"WEBGL_depth_texture":n=e.getExtension("WEBGL_depth_texture")||e.getExtension("MOZ_WEBGL_depth_texture")||e.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":n=e.getExtension("EXT_texture_filter_anisotropic")||e.getExtension("MOZ_EXT_texture_filter_anisotropic")||e.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":n=e.getExtension("WEBGL_compressed_texture_s3tc")||e.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":n=e.getExtension("WEBGL_compressed_texture_pvrtc")||e.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:n=e.getExtension(i)}return t[i]=n,n}return{has:function(e){return null!==i(e)},init:function(e){e.isWebGL2?i("EXT_color_buffer_float"):(i("WEBGL_depth_texture"),i("OES_texture_float"),i("OES_texture_half_float"),i("OES_texture_half_float_linear"),i("OES_standard_derivatives"),i("OES_element_index_uint"),i("OES_vertex_array_object"),i("ANGLE_instanced_arrays")),i("OES_texture_float_linear"),i("EXT_color_buffer_half_float")},get:function(e){const t=i(e);return null===t&&console.warn("THREE.WebGLRenderer: "+e+" extension not supported."),t}}}function sa(e,t,i,n){const r={},s=new WeakMap;function a(e){const o=e.target;null!==o.index&&t.remove(o.index);for(const e in o.attributes)t.remove(o.attributes[e]);o.removeEventListener("dispose",a),delete r[o.id];const h=s.get(o);h&&(t.remove(h),s.delete(o)),n.releaseStatesOfGeometry(o),!0===o.isInstancedBufferGeometry&&delete o._maxInstanceCount,i.memory.geometries--}function o(e){const i=[],n=e.index,r=e.attributes.position;let a=0;if(null!==n){const e=n.array;a=n.version;for(let t=0,n=e.length;t<n;t+=3){const n=e[t+0],r=e[t+1],s=e[t+2];i.push(n,r,r,s,s,n)}}else{const e=r.array;a=r.version;for(let t=0,n=e.length/3-1;t<n;t+=3){const e=t+0,n=t+1,r=t+2;i.push(e,n,n,r,r,e)}}const o=new(Bi(i)>65535?Er:Cr)(i,1);o.version=a;const h=s.get(e);h&&t.remove(h),s.set(e,o)}return{get:function(e,t){return!0===r[t.id]||(t.addEventListener("dispose",a),r[t.id]=!0,i.memory.geometries++),t},update:function(e){const i=e.attributes;for(const e in i)t.update(i[e],34962);const n=e.morphAttributes;for(const e in n){const i=n[e];for(let e=0,n=i.length;e<n;e++)t.update(i[e],34962)}},getWireframeAttribute:function(e){const t=s.get(e);if(t){const i=e.index;null!==i&&t.version<i.version&&o(e)}else o(e);return s.get(e)}}}function aa(e,t,i,n){const r=n.isWebGL2;let s,a,o;this.setMode=function(e){s=e},this.setIndex=function(e){a=e.type,o=e.bytesPerElement},this.render=function(t,n){e.drawElements(s,n,a,t*o),i.update(n,s,1)},this.renderInstances=function(n,h,c){if(0===c)return;let l,u;if(r)l=e,u="drawElementsInstanced";else if(l=t.get("ANGLE_instanced_arrays"),u="drawElementsInstancedANGLE",null===l)return void console.error("THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.");l[u](s,h,a,n*o,c),i.update(h,s,c)}}function oa(e){const t={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:t,programs:null,autoReset:!0,reset:function(){t.frame++,t.calls=0,t.triangles=0,t.points=0,t.lines=0},update:function(e,i,n){switch(t.calls++,i){case 4:t.triangles+=n*(e/3);break;case 1:t.lines+=n*(e/2);break;case 3:t.lines+=n*(e-1);break;case 2:t.lines+=n*e;break;case 0:t.points+=n*e;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",i)}}}}class ha extends Wi{constructor(e=null,t=1,i=1,n=1){super(null),this.image={data:e,width:t,height:i,depth:n},this.magFilter=Jt,this.minFilter=Jt,this.wrapR=Zt,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}function ca(e,t){return e[0]-t[0]}function la(e,t){return Math.abs(t[1])-Math.abs(e[1])}function ua(e,t){let i=1;const n=t.isInterleavedBufferAttribute?t.data.array:t.array;n instanceof Int8Array?i=127:n instanceof Int16Array?i=32767:n instanceof Int32Array?i=2147483647:console.error("THREE.WebGLMorphtargets: Unsupported morph attribute data type: ",n),e.divideScalar(i)}function da(e,t,i){const n={},r=new Float32Array(8),s=new WeakMap,a=new Ki,o=[];for(let e=0;e<8;e++)o[e]=[e,0];return{update:function(h,c,l,u){const d=h.morphTargetInfluences;if(!0===t.isWebGL2){const n=c.morphAttributes.position.length;let r=s.get(c);if(void 0===r||r.count!==n){void 0!==r&&r.texture.dispose();const e=void 0!==c.morphAttributes.normal,i=c.morphAttributes.position,o=c.morphAttributes.normal||[],h=!0===e?2:1;let l=c.attributes.position.count*h,u=1;l>t.maxTextureSize&&(u=Math.ceil(l/t.maxTextureSize),l=t.maxTextureSize);const d=new Float32Array(l*u*4*n),p=new ha(d,l,u,n);p.format=oi,p.type=ni;const m=4*h;for(let t=0;t<n;t++){const n=i[t],r=o[t],s=l*u*4*t;for(let t=0;t<n.count;t++){a.fromBufferAttribute(n,t),!0===n.normalized&&ua(a,n);const i=t*m;d[s+i+0]=a.x,d[s+i+1]=a.y,d[s+i+2]=a.z,d[s+i+3]=0,!0===e&&(a.fromBufferAttribute(r,t),!0===r.normalized&&ua(a,r),d[s+i+4]=a.x,d[s+i+5]=a.y,d[s+i+6]=a.z,d[s+i+7]=0)}}r={count:n,texture:p,size:new zi(l,u)},s.set(c,r)}let o=0;for(let e=0;e<d.length;e++)o+=d[e];const h=c.morphTargetsRelative?1:1-o;u.getUniforms().setValue(e,"morphTargetBaseInfluence",h),u.getUniforms().setValue(e,"morphTargetInfluences",d),u.getUniforms().setValue(e,"morphTargetsTexture",r.texture,i),u.getUniforms().setValue(e,"morphTargetsTextureSize",r.size)}else{const t=void 0===d?0:d.length;let i=n[c.id];if(void 0===i||i.length!==t){i=[];for(let e=0;e<t;e++)i[e]=[e,0];n[c.id]=i}for(let e=0;e<t;e++){const t=i[e];t[0]=e,t[1]=d[e]}i.sort(la);for(let e=0;e<8;e++)e<t&&i[e][1]?(o[e][0]=i[e][0],o[e][1]=i[e][1]):(o[e][0]=Number.MAX_SAFE_INTEGER,o[e][1]=0);o.sort(ca);const s=c.morphAttributes.position,a=c.morphAttributes.normal;let h=0;for(let e=0;e<8;e++){const t=o[e],i=t[0],n=t[1];i!==Number.MAX_SAFE_INTEGER&&n?(s&&c.getAttribute("morphTarget"+e)!==s[i]&&c.setAttribute("morphTarget"+e,s[i]),a&&c.getAttribute("morphNormal"+e)!==a[i]&&c.setAttribute("morphNormal"+e,a[i]),r[e]=n,h+=n):(s&&!0===c.hasAttribute("morphTarget"+e)&&c.deleteAttribute("morphTarget"+e),a&&!0===c.hasAttribute("morphNormal"+e)&&c.deleteAttribute("morphNormal"+e),r[e]=0)}const l=c.morphTargetsRelative?1:1-h;u.getUniforms().setValue(e,"morphTargetBaseInfluence",l),u.getUniforms().setValue(e,"morphTargetInfluences",r)}}}}function pa(e,t,i,n){let r=new WeakMap;function s(e){const t=e.target;t.removeEventListener("dispose",s),i.remove(t.instanceMatrix),null!==t.instanceColor&&i.remove(t.instanceColor)}return{update:function(e){const a=n.render.frame,o=e.geometry,h=t.get(e,o);return r.get(h)!==a&&(t.update(h),r.set(h,a)),e.isInstancedMesh&&(!1===e.hasEventListener("dispose",s)&&e.addEventListener("dispose",s),i.update(e.instanceMatrix,34962),null!==e.instanceColor&&i.update(e.instanceColor,34962)),h},dispose:function(){r=new WeakMap}}}ha.prototype.isDataTexture2DArray=!0;class ma extends Wi{constructor(e=null,t=1,i=1,n=1){super(null),this.image={data:e,width:t,height:i,depth:n},this.magFilter=Jt,this.minFilter=Jt,this.wrapR=Zt,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}ma.prototype.isDataTexture3D=!0;const fa=new Wi,ga=new ha,_a=new ma,va=new us,ya=[],ba=[],xa=new Float32Array(16),wa=new Float32Array(9),Ma=new Float32Array(4);function Sa(e,t,i){const n=e[0];if(n<=0||n>0)return e;const r=t*i;let s=ya[r];if(void 0===s&&(s=new Float32Array(r),ya[r]=s),0!==t){n.toArray(s,0);for(let n=1,r=0;n!==t;++n)r+=i,e[n].toArray(s,r)}return s}function Ta(e,t){if(e.length!==t.length)return!1;for(let i=0,n=e.length;i<n;i++)if(e[i]!==t[i])return!1;return!0}function Ca(e,t){for(let i=0,n=t.length;i<n;i++)e[i]=t[i]}function Ea(e,t){let i=ba[t];void 0===i&&(i=new Int32Array(t),ba[t]=i);for(let n=0;n!==t;++n)i[n]=e.allocateTextureUnit();return i}function Aa(e,t){const i=this.cache;i[0]!==t&&(e.uniform1f(this.addr,t),i[0]=t)}function Ia(e,t){const i=this.cache;if(void 0!==t.x)i[0]===t.x&&i[1]===t.y||(e.uniform2f(this.addr,t.x,t.y),i[0]=t.x,i[1]=t.y);else{if(Ta(i,t))return;e.uniform2fv(this.addr,t),Ca(i,t)}}function Ra(e,t){const i=this.cache;if(void 0!==t.x)i[0]===t.x&&i[1]===t.y&&i[2]===t.z||(e.uniform3f(this.addr,t.x,t.y,t.z),i[0]=t.x,i[1]=t.y,i[2]=t.z);else if(void 0!==t.r)i[0]===t.r&&i[1]===t.g&&i[2]===t.b||(e.uniform3f(this.addr,t.r,t.g,t.b),i[0]=t.r,i[1]=t.g,i[2]=t.b);else{if(Ta(i,t))return;e.uniform3fv(this.addr,t),Ca(i,t)}}function Pa(e,t){const i=this.cache;if(void 0!==t.x)i[0]===t.x&&i[1]===t.y&&i[2]===t.z&&i[3]===t.w||(e.uniform4f(this.addr,t.x,t.y,t.z,t.w),i[0]=t.x,i[1]=t.y,i[2]=t.z,i[3]=t.w);else{if(Ta(i,t))return;e.uniform4fv(this.addr,t),Ca(i,t)}}function La(e,t){const i=this.cache,n=t.elements;if(void 0===n){if(Ta(i,t))return;e.uniformMatrix2fv(this.addr,!1,t),Ca(i,t)}else{if(Ta(i,n))return;Ma.set(n),e.uniformMatrix2fv(this.addr,!1,Ma),Ca(i,n)}}function Da(e,t){const i=this.cache,n=t.elements;if(void 0===n){if(Ta(i,t))return;e.uniformMatrix3fv(this.addr,!1,t),Ca(i,t)}else{if(Ta(i,n))return;wa.set(n),e.uniformMatrix3fv(this.addr,!1,wa),Ca(i,n)}}function Na(e,t){const i=this.cache,n=t.elements;if(void 0===n){if(Ta(i,t))return;e.uniformMatrix4fv(this.addr,!1,t),Ca(i,t)}else{if(Ta(i,n))return;xa.set(n),e.uniformMatrix4fv(this.addr,!1,xa),Ca(i,n)}}function $a(e,t){const i=this.cache;i[0]!==t&&(e.uniform1i(this.addr,t),i[0]=t)}function ka(e,t){const i=this.cache;Ta(i,t)||(e.uniform2iv(this.addr,t),Ca(i,t))}function Oa(e,t){const i=this.cache;Ta(i,t)||(e.uniform3iv(this.addr,t),Ca(i,t))}function za(e,t){const i=this.cache;Ta(i,t)||(e.uniform4iv(this.addr,t),Ca(i,t))}function Fa(e,t){const i=this.cache;i[0]!==t&&(e.uniform1ui(this.addr,t),i[0]=t)}function Ba(e,t){const i=this.cache;Ta(i,t)||(e.uniform2uiv(this.addr,t),Ca(i,t))}function Ua(e,t){const i=this.cache;Ta(i,t)||(e.uniform3uiv(this.addr,t),Ca(i,t))}function Va(e,t){const i=this.cache;Ta(i,t)||(e.uniform4uiv(this.addr,t),Ca(i,t))}function Ha(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.safeSetTexture2D(t||fa,r)}function ja(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.setTexture3D(t||_a,r)}function Ga(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.safeSetTextureCube(t||va,r)}function Wa(e,t,i){const n=this.cache,r=i.allocateTextureUnit();n[0]!==r&&(e.uniform1i(this.addr,r),n[0]=r),i.setTexture2DArray(t||ga,r)}function qa(e,t){e.uniform1fv(this.addr,t)}function Xa(e,t){const i=Sa(t,this.size,2);e.uniform2fv(this.addr,i)}function Za(e,t){const i=Sa(t,this.size,3);e.uniform3fv(this.addr,i)}function Ya(e,t){const i=Sa(t,this.size,4);e.uniform4fv(this.addr,i)}function Ja(e,t){const i=Sa(t,this.size,4);e.uniformMatrix2fv(this.addr,!1,i)}function Ka(e,t){const i=Sa(t,this.size,9);e.uniformMatrix3fv(this.addr,!1,i)}function Qa(e,t){const i=Sa(t,this.size,16);e.uniformMatrix4fv(this.addr,!1,i)}function eo(e,t){e.uniform1iv(this.addr,t)}function to(e,t){e.uniform2iv(this.addr,t)}function io(e,t){e.uniform3iv(this.addr,t)}function no(e,t){e.uniform4iv(this.addr,t)}function ro(e,t){e.uniform1uiv(this.addr,t)}function so(e,t){e.uniform2uiv(this.addr,t)}function ao(e,t){e.uniform3uiv(this.addr,t)}function oo(e,t){e.uniform4uiv(this.addr,t)}function ho(e,t,i){const n=t.length,r=Ea(i,n);e.uniform1iv(this.addr,r);for(let e=0;e!==n;++e)i.safeSetTexture2D(t[e]||fa,r[e])}function co(e,t,i){const n=t.length,r=Ea(i,n);e.uniform1iv(this.addr,r);for(let e=0;e!==n;++e)i.safeSetTextureCube(t[e]||va,r[e])}function lo(e,t,i){this.id=e,this.addr=i,this.cache=[],this.setValue=function(e){switch(e){case 5126:return Aa;case 35664:return Ia;case 35665:return Ra;case 35666:return Pa;case 35674:return La;case 35675:return Da;case 35676:return Na;case 5124:case 35670:return $a;case 35667:case 35671:return ka;case 35668:case 35672:return Oa;case 35669:case 35673:return za;case 5125:return Fa;case 36294:return Ba;case 36295:return Ua;case 36296:return Va;case 35678:case 36198:case 36298:case 36306:case 35682:return Ha;case 35679:case 36299:case 36307:return ja;case 35680:case 36300:case 36308:case 36293:return Ga;case 36289:case 36303:case 36311:case 36292:return Wa}}(t.type)}function uo(e,t,i){this.id=e,this.addr=i,this.cache=[],this.size=t.size,this.setValue=function(e){switch(e){case 5126:return qa;case 35664:return Xa;case 35665:return Za;case 35666:return Ya;case 35674:return Ja;case 35675:return Ka;case 35676:return Qa;case 5124:case 35670:return eo;case 35667:case 35671:return to;case 35668:case 35672:return io;case 35669:case 35673:return no;case 5125:return ro;case 36294:return so;case 36295:return ao;case 36296:return oo;case 35678:case 36198:case 36298:case 36306:case 35682:return ho;case 35680:case 36300:case 36308:case 36293:return co}}(t.type)}function po(e){this.id=e,this.seq=[],this.map={}}uo.prototype.updateCache=function(e){const t=this.cache;e instanceof Float32Array&&t.length!==e.length&&(this.cache=new Float32Array(e.length)),Ca(t,e)},po.prototype.setValue=function(e,t,i){const n=this.seq;for(let r=0,s=n.length;r!==s;++r){const s=n[r];s.setValue(e,t[s.id],i)}};const mo=/(\w+)(\])?(\[|\.)?/g;function fo(e,t){e.seq.push(t),e.map[t.id]=t}function go(e,t,i){const n=e.name,r=n.length;for(mo.lastIndex=0;;){const s=mo.exec(n),a=mo.lastIndex;let o=s[1];const h="]"===s[2],c=s[3];if(h&&(o|=0),void 0===c||"["===c&&a+2===r){fo(i,void 0===c?new lo(o,e,t):new uo(o,e,t));break}{let e=i.map[o];void 0===e&&(e=new po(o),fo(i,e)),i=e}}}function _o(e,t){this.seq=[],this.map={};const i=e.getProgramParameter(t,35718);for(let n=0;n<i;++n){const i=e.getActiveUniform(t,n);go(i,e.getUniformLocation(t,i.name),this)}}function vo(e,t,i){const n=e.createShader(t);return e.shaderSource(n,i),e.compileShader(n),n}_o.prototype.setValue=function(e,t,i,n){const r=this.map[t];void 0!==r&&r.setValue(e,i,n)},_o.prototype.setOptional=function(e,t,i){const n=t[i];void 0!==n&&this.setValue(e,i,n)},_o.upload=function(e,t,i,n){for(let r=0,s=t.length;r!==s;++r){const s=t[r],a=i[s.id];!1!==a.needsUpdate&&s.setValue(e,a.value,n)}},_o.seqWithValue=function(e,t){const i=[];for(let n=0,r=e.length;n!==r;++n){const r=e[n];r.id in t&&i.push(r)}return i};let yo=0;function bo(e){switch(e){case _i:return["Linear","( value )"];case vi:return["sRGB","( value )"];case bi:return["RGBE","( value )"];case 3004:return["RGBM","( value, 7.0 )"];case 3005:return["RGBM","( value, 16.0 )"];case 3006:return["RGBD","( value, 256.0 )"];case yi:return["Gamma","( value, float( GAMMA_FACTOR ) )"];case 3003:return["LogLuv","( value )"];default:return console.warn("THREE.WebGLProgram: Unsupported encoding:",e),["Linear","( value )"]}}function xo(e,t,i){const n=e.getShaderParameter(t,35713),r=e.getShaderInfoLog(t).trim();return n&&""===r?"":i.toUpperCase()+"\n\n"+r+"\n\n"+function(e){const t=e.split("\n");for(let e=0;e<t.length;e++)t[e]=e+1+": "+t[e];return t.join("\n")}(e.getShaderSource(t))}function wo(e,t){const i=bo(t);return"vec4 "+e+"( vec4 value ) { return "+i[0]+"ToLinear"+i[1]+"; }"}function Mo(e,t){const i=bo(t);return"vec4 "+e+"( vec4 value ) { return LinearTo"+i[0]+i[1]+"; }"}function So(e,t){let i;switch(t){case 1:i="Linear";break;case 2:i="Reinhard";break;case 3:i="OptimizedCineon";break;case 4:i="ACESFilmic";break;case 5:i="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",t),i="Linear"}return"vec3 "+e+"( vec3 color ) { return "+i+"ToneMapping( color ); }"}function To(e){return""!==e}function Co(e,t){return e.replace(/NUM_DIR_LIGHTS/g,t.numDirLights).replace(/NUM_SPOT_LIGHTS/g,t.numSpotLights).replace(/NUM_RECT_AREA_LIGHTS/g,t.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,t.numPointLights).replace(/NUM_HEMI_LIGHTS/g,t.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,t.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS/g,t.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,t.numPointLightShadows)}function Eo(e,t){return e.replace(/NUM_CLIPPING_PLANES/g,t.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,t.numClippingPlanes-t.numClipIntersection)}const Ao=/^[ \t]*#include +<([\w\d./]+)>/gm;function Io(e){return e.replace(Ao,Ro)}function Ro(e,t){const i=Ms[t];if(void 0===i)throw new Error("Can not resolve #include <"+t+">");return Io(i)}const Po=/#pragma unroll_loop[\s]+?for \( int i \= (\d+)\; i < (\d+)\; i \+\+ \) \{([\s\S]+?)(?=\})\}/g,Lo=/#pragma unroll_loop_start\s+for\s*\(\s*int\s+i\s*=\s*(\d+)\s*;\s*i\s*<\s*(\d+)\s*;\s*i\s*\+\+\s*\)\s*{([\s\S]+?)}\s+#pragma unroll_loop_end/g;function Do(e){return e.replace(Lo,$o).replace(Po,No)}function No(e,t,i,n){return console.warn("WebGLProgram: #pragma unroll_loop shader syntax is deprecated. Please use #pragma unroll_loop_start syntax instead."),$o(e,t,i,n)}function $o(e,t,i,n){let r="";for(let e=parseInt(t);e<parseInt(i);e++)r+=n.replace(/\[\s*i\s*\]/g,"[ "+e+" ]").replace(/UNROLLED_LOOP_INDEX/g,e);return r}function ko(e){let t="precision "+e.precision+" float;\nprecision "+e.precision+" int;";return"highp"===e.precision?t+="\n#define HIGH_PRECISION":"mediump"===e.precision?t+="\n#define MEDIUM_PRECISION":"lowp"===e.precision&&(t+="\n#define LOW_PRECISION"),t}function Oo(e,t,i,n){const r=e.getContext(),s=i.defines;let a=i.vertexShader,o=i.fragmentShader;const h=function(e){let t="SHADOWMAP_TYPE_BASIC";return 1===e.shadowMapType?t="SHADOWMAP_TYPE_PCF":2===e.shadowMapType?t="SHADOWMAP_TYPE_PCF_SOFT":3===e.shadowMapType&&(t="SHADOWMAP_TYPE_VSM"),t}(i),c=function(e){let t="ENVMAP_TYPE_CUBE";if(e.envMap)switch(e.envMapMode){case Gt:case Wt:t="ENVMAP_TYPE_CUBE";break;case qt:case 307:t="ENVMAP_TYPE_CUBE_UV"}return t}(i),l=function(e){let t="ENVMAP_MODE_REFLECTION";if(e.envMap)switch(e.envMapMode){case Wt:case 307:t="ENVMAP_MODE_REFRACTION"}return t}(i),u=function(e){let t="ENVMAP_BLENDING_NONE";if(e.envMap)switch(e.combine){case 0:t="ENVMAP_BLENDING_MULTIPLY";break;case 1:t="ENVMAP_BLENDING_MIX";break;case 2:t="ENVMAP_BLENDING_ADD"}return t}(i),d=e.gammaFactor>0?e.gammaFactor:1,p=i.isWebGL2?"":function(e){return[e.extensionDerivatives||e.envMapCubeUV||e.bumpMap||e.tangentSpaceNormalMap||e.clearcoatNormalMap||e.flatShading||"physical"===e.shaderID?"#extension GL_OES_standard_derivatives : enable":"",(e.extensionFragDepth||e.logarithmicDepthBuffer)&&e.rendererExtensionFragDepth?"#extension GL_EXT_frag_depth : enable":"",e.extensionDrawBuffers&&e.rendererExtensionDrawBuffers?"#extension GL_EXT_draw_buffers : require":"",(e.extensionShaderTextureLOD||e.envMap||e.transmission)&&e.rendererExtensionShaderTextureLod?"#extension GL_EXT_shader_texture_lod : enable":""].filter(To).join("\n")}(i),m=function(e){const t=[];for(const i in e){const n=e[i];!1!==n&&t.push("#define "+i+" "+n)}return t.join("\n")}(s),f=r.createProgram();let g,_,v=i.glslVersion?"#version "+i.glslVersion+"\n":"";i.isRawShaderMaterial?(g=[m].filter(To).join("\n"),g.length>0&&(g+="\n"),_=[p,m].filter(To).join("\n"),_.length>0&&(_+="\n")):(g=[ko(i),"#define SHADER_NAME "+i.shaderName,m,i.instancing?"#define USE_INSTANCING":"",i.instancingColor?"#define USE_INSTANCING_COLOR":"",i.supportsVertexTextures?"#define VERTEX_TEXTURES":"","#define GAMMA_FACTOR "+d,"#define MAX_BONES "+i.maxBones,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+l:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.displacementMap&&i.supportsVertexTextures?"#define USE_DISPLACEMENTMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.flatShading?"#define FLAT_SHADED":"",i.skinning?"#define USE_SKINNING":"",i.useVertexTexture?"#define BONE_TEXTURE":"",i.morphTargets?"#define USE_MORPHTARGETS":"",i.morphNormals&&!1===i.flatShading?"#define USE_MORPHNORMALS":"",i.morphTargets&&i.isWebGL2?"#define MORPHTARGETS_TEXTURE":"",i.morphTargets&&i.isWebGL2?"#define MORPHTARGETS_COUNT "+i.morphTargetsCount:"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+h:"",i.sizeAttenuation?"#define USE_SIZEATTENUATION":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )","\tattribute vec3 morphTarget0;","\tattribute vec3 morphTarget1;","\tattribute vec3 morphTarget2;","\tattribute vec3 morphTarget3;","\t#ifdef USE_MORPHNORMALS","\t\tattribute vec3 morphNormal0;","\t\tattribute vec3 morphNormal1;","\t\tattribute vec3 morphNormal2;","\t\tattribute vec3 morphNormal3;","\t#else","\t\tattribute vec3 morphTarget4;","\t\tattribute vec3 morphTarget5;","\t\tattribute vec3 morphTarget6;","\t\tattribute vec3 morphTarget7;","\t#endif","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(To).join("\n"),_=[p,ko(i),"#define SHADER_NAME "+i.shaderName,m,"#define GAMMA_FACTOR "+d,i.useFog&&i.fog?"#define USE_FOG":"",i.useFog&&i.fogExp2?"#define FOG_EXP2":"",i.map?"#define USE_MAP":"",i.matcap?"#define USE_MATCAP":"",i.envMap?"#define USE_ENVMAP":"",i.envMap?"#define "+c:"",i.envMap?"#define "+l:"",i.envMap?"#define "+u:"",i.lightMap?"#define USE_LIGHTMAP":"",i.aoMap?"#define USE_AOMAP":"",i.emissiveMap?"#define USE_EMISSIVEMAP":"",i.bumpMap?"#define USE_BUMPMAP":"",i.normalMap?"#define USE_NORMALMAP":"",i.normalMap&&i.objectSpaceNormalMap?"#define OBJECTSPACE_NORMALMAP":"",i.normalMap&&i.tangentSpaceNormalMap?"#define TANGENTSPACE_NORMALMAP":"",i.clearcoat?"#define USE_CLEARCOAT":"",i.clearcoatMap?"#define USE_CLEARCOATMAP":"",i.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",i.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",i.specularMap?"#define USE_SPECULARMAP":"",i.specularIntensityMap?"#define USE_SPECULARINTENSITYMAP":"",i.specularColorMap?"#define USE_SPECULARCOLORMAP":"",i.roughnessMap?"#define USE_ROUGHNESSMAP":"",i.metalnessMap?"#define USE_METALNESSMAP":"",i.alphaMap?"#define USE_ALPHAMAP":"",i.alphaTest?"#define USE_ALPHATEST":"",i.sheen?"#define USE_SHEEN":"",i.sheenColorMap?"#define USE_SHEENCOLORMAP":"",i.sheenRoughnessMap?"#define USE_SHEENROUGHNESSMAP":"",i.transmission?"#define USE_TRANSMISSION":"",i.transmissionMap?"#define USE_TRANSMISSIONMAP":"",i.thicknessMap?"#define USE_THICKNESSMAP":"",i.vertexTangents?"#define USE_TANGENT":"",i.vertexColors||i.instancingColor?"#define USE_COLOR":"",i.vertexAlphas?"#define USE_COLOR_ALPHA":"",i.vertexUvs?"#define USE_UV":"",i.uvsVertexOnly?"#define UVS_VERTEX_ONLY":"",i.gradientMap?"#define USE_GRADIENTMAP":"",i.flatShading?"#define FLAT_SHADED":"",i.doubleSided?"#define DOUBLE_SIDED":"",i.flipSided?"#define FLIP_SIDED":"",i.shadowMapEnabled?"#define USE_SHADOWMAP":"",i.shadowMapEnabled?"#define "+h:"",i.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",i.physicallyCorrectLights?"#define PHYSICALLY_CORRECT_LIGHTS":"",i.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",i.logarithmicDepthBuffer&&i.rendererExtensionFragDepth?"#define USE_LOGDEPTHBUF_EXT":"",(i.extensionShaderTextureLOD||i.envMap)&&i.rendererExtensionShaderTextureLod?"#define TEXTURE_LOD_EXT":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",0!==i.toneMapping?"#define TONE_MAPPING":"",0!==i.toneMapping?Ms.tonemapping_pars_fragment:"",0!==i.toneMapping?So("toneMapping",i.toneMapping):"",i.dithering?"#define DITHERING":"",i.format===ai?"#define OPAQUE":"",Ms.encodings_pars_fragment,i.map?wo("mapTexelToLinear",i.mapEncoding):"",i.matcap?wo("matcapTexelToLinear",i.matcapEncoding):"",i.envMap?wo("envMapTexelToLinear",i.envMapEncoding):"",i.emissiveMap?wo("emissiveMapTexelToLinear",i.emissiveMapEncoding):"",i.specularColorMap?wo("specularColorMapTexelToLinear",i.specularColorMapEncoding):"",i.sheenColorMap?wo("sheenColorMapTexelToLinear",i.sheenColorMapEncoding):"",i.lightMap?wo("lightMapTexelToLinear",i.lightMapEncoding):"",Mo("linearToOutputTexel",i.outputEncoding),i.depthPacking?"#define DEPTH_PACKING "+i.depthPacking:"","\n"].filter(To).join("\n")),a=Io(a),a=Co(a,i),a=Eo(a,i),o=Io(o),o=Co(o,i),o=Eo(o,i),a=Do(a),o=Do(o),i.isWebGL2&&!0!==i.isRawShaderMaterial&&(v="#version 300 es\n",g=["precision mediump sampler2DArray;","#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+g,_=["#define varying in",i.glslVersion===Si?"":"out highp vec4 pc_fragColor;",i.glslVersion===Si?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+_);const y=v+_+o,b=vo(r,35633,v+g+a),x=vo(r,35632,y);if(r.attachShader(f,b),r.attachShader(f,x),void 0!==i.index0AttributeName?r.bindAttribLocation(f,0,i.index0AttributeName):!0===i.morphTargets&&r.bindAttribLocation(f,0,"position"),r.linkProgram(f),e.debug.checkShaderErrors){const e=r.getProgramInfoLog(f).trim(),t=r.getShaderInfoLog(b).trim(),i=r.getShaderInfoLog(x).trim();let n=!0,s=!0;if(!1===r.getProgramParameter(f,35714)){n=!1;const t=xo(r,b,"vertex"),i=xo(r,x,"fragment");console.error("THREE.WebGLProgram: Shader Error "+r.getError()+" - VALIDATE_STATUS "+r.getProgramParameter(f,35715)+"\n\nProgram Info Log: "+e+"\n"+t+"\n"+i)}else""!==e?console.warn("THREE.WebGLProgram: Program Info Log:",e):""!==t&&""!==i||(s=!1);s&&(this.diagnostics={runnable:n,programLog:e,vertexShader:{log:t,prefix:g},fragmentShader:{log:i,prefix:_}})}let w,M;return r.deleteShader(b),r.deleteShader(x),this.getUniforms=function(){return void 0===w&&(w=new _o(r,f)),w},this.getAttributes=function(){return void 0===M&&(M=function(e,t){const i={},n=e.getProgramParameter(t,35721);for(let r=0;r<n;r++){const n=e.getActiveAttrib(t,r),s=n.name;let a=1;35674===n.type&&(a=2),35675===n.type&&(a=3),35676===n.type&&(a=4),i[s]={type:n.type,location:e.getAttribLocation(t,s),locationSize:a}}return i}(r,f)),M},this.destroy=function(){n.releaseStatesOfProgram(this),r.deleteProgram(f),this.program=void 0},this.name=i.shaderName,this.id=yo++,this.cacheKey=t,this.usedTimes=1,this.program=f,this.vertexShader=b,this.fragmentShader=x,this}function zo(e,t,i,n,r,s,a){const o=[],h=r.isWebGL2,c=r.logarithmicDepthBuffer,l=r.floatVertexTextures,u=r.maxVertexUniforms,d=r.vertexTextures;let p=r.precision;const m={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"},f=["precision","isWebGL2","supportsVertexTextures","outputEncoding","instancing","instancingColor","map","mapEncoding","matcap","matcapEncoding","envMap","envMapMode","envMapEncoding","envMapCubeUV","lightMap","lightMapEncoding","aoMap","emissiveMap","emissiveMapEncoding","bumpMap","normalMap","objectSpaceNormalMap","tangentSpaceNormalMap","clearcoat","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","displacementMap","specularMap",,"roughnessMap","metalnessMap","gradientMap","alphaMap","alphaTest","combine","vertexColors","vertexAlphas","vertexTangents","vertexUvs","uvsVertexOnly","fog","useFog","fogExp2","flatShading","sizeAttenuation","logarithmicDepthBuffer","skinning","maxBones","useVertexTexture","morphTargets","morphNormals","morphTargetsCount","premultipliedAlpha","numDirLights","numPointLights","numSpotLights","numHemiLights","numRectAreaLights","numDirLightShadows","numPointLightShadows","numSpotLightShadows","shadowMapEnabled","shadowMapType","toneMapping","physicallyCorrectLights","doubleSided","flipSided","numClippingPlanes","numClipIntersection","depthPacking","dithering","format","specularIntensityMap","specularColorMap","specularColorMapEncoding","transmission","transmissionMap","thicknessMap","sheen","sheenColorMap","sheenColorMapEncoding","sheenRoughnessMap"];function g(e){let t;return e&&e.isTexture?t=e.encoding:e&&e.isWebGLRenderTarget?(console.warn("THREE.WebGLPrograms.getTextureEncodingFromMap: don't use render targets as textures. Use their .texture property instead."),t=e.texture.encoding):t=_i,h&&e&&e.isTexture&&e.format===oi&&e.type===ei&&e.encoding===vi&&(t=_i),t}return{getParameters:function(s,o,f,_,v){const y=_.fog,b=s.isMeshStandardMaterial?_.environment:null,x=(s.isMeshStandardMaterial?i:t).get(s.envMap||b),w=m[s.type],M=v.isSkinnedMesh?function(e){const t=e.skeleton.bones;if(l)return 1024;{const e=u,i=Math.floor((e-20)/4),n=Math.min(i,t.length);return n<t.length?(console.warn("THREE.WebGLRenderer: Skeleton has "+t.length+" bones. This GPU supports "+n+"."),0):n}}(v):0;let S,T;if(null!==s.precision&&(p=r.getMaxPrecision(s.precision),p!==s.precision&&console.warn("THREE.WebGLProgram.getParameters:",s.precision,"not supported, using",p,"instead.")),w){const e=Ts[w];S=e.vertexShader,T=e.fragmentShader}else S=s.vertexShader,T=s.fragmentShader;const C=e.getRenderTarget(),E=s.alphaTest>0,A=s.clearcoat>0;return{isWebGL2:h,shaderID:w,shaderName:s.type,vertexShader:S,fragmentShader:T,defines:s.defines,isRawShaderMaterial:!0===s.isRawShaderMaterial,glslVersion:s.glslVersion,precision:p,instancing:!0===v.isInstancedMesh,instancingColor:!0===v.isInstancedMesh&&null!==v.instanceColor,supportsVertexTextures:d,outputEncoding:null!==C?g(C.texture):e.outputEncoding,map:!!s.map,mapEncoding:g(s.map),matcap:!!s.matcap,matcapEncoding:g(s.matcap),envMap:!!x,envMapMode:x&&x.mapping,envMapEncoding:g(x),envMapCubeUV:!!x&&(x.mapping===qt||307===x.mapping),lightMap:!!s.lightMap,lightMapEncoding:g(s.lightMap),aoMap:!!s.aoMap,emissiveMap:!!s.emissiveMap,emissiveMapEncoding:g(s.emissiveMap),bumpMap:!!s.bumpMap,normalMap:!!s.normalMap,objectSpaceNormalMap:1===s.normalMapType,tangentSpaceNormalMap:0===s.normalMapType,clearcoat:A,clearcoatMap:A&&!!s.clearcoatMap,clearcoatRoughnessMap:A&&!!s.clearcoatRoughnessMap,clearcoatNormalMap:A&&!!s.clearcoatNormalMap,displacementMap:!!s.displacementMap,roughnessMap:!!s.roughnessMap,metalnessMap:!!s.metalnessMap,specularMap:!!s.specularMap,specularIntensityMap:!!s.specularIntensityMap,specularColorMap:!!s.specularColorMap,specularColorMapEncoding:g(s.specularColorMap),alphaMap:!!s.alphaMap,alphaTest:E,gradientMap:!!s.gradientMap,sheen:s.sheen>0,sheenColorMap:!!s.sheenColorMap,sheenColorMapEncoding:g(s.sheenColorMap),sheenRoughnessMap:!!s.sheenRoughnessMap,transmission:s.transmission>0,transmissionMap:!!s.transmissionMap,thicknessMap:!!s.thicknessMap,combine:s.combine,vertexTangents:!!s.normalMap&&!!v.geometry&&!!v.geometry.attributes.tangent,vertexColors:s.vertexColors,vertexAlphas:!0===s.vertexColors&&!!v.geometry&&!!v.geometry.attributes.color&&4===v.geometry.attributes.color.itemSize,vertexUvs:!!s.map||!!s.bumpMap||!!s.normalMap||!!s.specularMap||!!s.alphaMap||!!s.emissiveMap||!!s.roughnessMap||!!s.metalnessMap||!!s.clearcoatMap||!!s.clearcoatRoughnessMap||!!s.clearcoatNormalMap||!!s.displacementMap||!!s.transmissionMap||!!s.thicknessMap||!!s.specularIntensityMap||!!s.specularColorMap||!!s.sheenColorMap||s.sheenRoughnessMap,uvsVertexOnly:!(s.map||s.bumpMap||s.normalMap||s.specularMap||s.alphaMap||s.emissiveMap||s.roughnessMap||s.metalnessMap||s.clearcoatNormalMap||s.transmission>0||s.transmissionMap||s.thicknessMap||s.specularIntensityMap||s.specularColorMap||!!s.sheen>0||s.sheenColorMap||s.sheenRoughnessMap||!s.displacementMap),fog:!!y,useFog:s.fog,fogExp2:y&&y.isFogExp2,flatShading:!!s.flatShading,sizeAttenuation:s.sizeAttenuation,logarithmicDepthBuffer:c,skinning:!0===v.isSkinnedMesh&&M>0,maxBones:M,useVertexTexture:l,morphTargets:!!v.geometry&&!!v.geometry.morphAttributes.position,morphNormals:!!v.geometry&&!!v.geometry.morphAttributes.normal,morphTargetsCount:v.geometry&&v.geometry.morphAttributes.position?v.geometry.morphAttributes.position.length:0,numDirLights:o.directional.length,numPointLights:o.point.length,numSpotLights:o.spot.length,numRectAreaLights:o.rectArea.length,numHemiLights:o.hemi.length,numDirLightShadows:o.directionalShadowMap.length,numPointLightShadows:o.pointShadowMap.length,numSpotLightShadows:o.spotShadowMap.length,numClippingPlanes:a.numPlanes,numClipIntersection:a.numIntersection,format:s.format,dithering:s.dithering,shadowMapEnabled:e.shadowMap.enabled&&f.length>0,shadowMapType:e.shadowMap.type,toneMapping:s.toneMapped?e.toneMapping:0,physicallyCorrectLights:e.physicallyCorrectLights,premultipliedAlpha:s.premultipliedAlpha,doubleSided:2===s.side,flipSided:1===s.side,depthPacking:void 0!==s.depthPacking&&s.depthPacking,index0AttributeName:s.index0AttributeName,extensionDerivatives:s.extensions&&s.extensions.derivatives,extensionFragDepth:s.extensions&&s.extensions.fragDepth,extensionDrawBuffers:s.extensions&&s.extensions.drawBuffers,extensionShaderTextureLOD:s.extensions&&s.extensions.shaderTextureLOD,rendererExtensionFragDepth:h||n.has("EXT_frag_depth"),rendererExtensionDrawBuffers:h||n.has("WEBGL_draw_buffers"),rendererExtensionShaderTextureLod:h||n.has("EXT_shader_texture_lod"),customProgramCacheKey:s.customProgramCacheKey()}},getProgramCacheKey:function(t){const i=[];if(t.shaderID?i.push(t.shaderID):(i.push(Vi(t.fragmentShader)),i.push(Vi(t.vertexShader))),void 0!==t.defines)for(const e in t.defines)i.push(e),i.push(t.defines[e]);if(!1===t.isRawShaderMaterial){for(let e=0;e<f.length;e++)i.push(t[f[e]]);i.push(e.outputEncoding),i.push(e.gammaFactor)}return i.push(t.customProgramCacheKey),i.join()},getUniforms:function(e){const t=m[e.type];let i;if(t){const e=Ts[t];i=ss.clone(e.uniforms)}else i=e.uniforms;return i},acquireProgram:function(t,i){let n;for(let e=0,t=o.length;e<t;e++){const t=o[e];if(t.cacheKey===i){n=t,++n.usedTimes;break}}return void 0===n&&(n=new Oo(e,i,t,s),o.push(n)),n},releaseProgram:function(e){if(0==--e.usedTimes){const t=o.indexOf(e);o[t]=o[o.length-1],o.pop(),e.destroy()}},programs:o}}function Fo(){let e=new WeakMap;return{get:function(t){let i=e.get(t);return void 0===i&&(i={},e.set(t,i)),i},remove:function(t){e.delete(t)},update:function(t,i,n){e.get(t)[i]=n},dispose:function(){e=new WeakMap}}}function Bo(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.program!==t.program?e.program.id-t.program.id:e.material.id!==t.material.id?e.material.id-t.material.id:e.z!==t.z?e.z-t.z:e.id-t.id}function Uo(e,t){return e.groupOrder!==t.groupOrder?e.groupOrder-t.groupOrder:e.renderOrder!==t.renderOrder?e.renderOrder-t.renderOrder:e.z!==t.z?t.z-e.z:e.id-t.id}function Vo(e){const t=[];let i=0;const n=[],r=[],s=[],a={id:-1};function o(n,r,s,o,h,c){let l=t[i];const u=e.get(s);return void 0===l?(l={id:n.id,object:n,geometry:r,material:s,program:u.program||a,groupOrder:o,renderOrder:n.renderOrder,z:h,group:c},t[i]=l):(l.id=n.id,l.object=n,l.geometry=r,l.material=s,l.program=u.program||a,l.groupOrder=o,l.renderOrder=n.renderOrder,l.z=h,l.group=c),i++,l}return{opaque:n,transmissive:r,transparent:s,init:function(){i=0,n.length=0,r.length=0,s.length=0},push:function(e,t,i,a,h,c){const l=o(e,t,i,a,h,c);i.transmission>0?r.push(l):!0===i.transparent?s.push(l):n.push(l)},unshift:function(e,t,i,a,h,c){const l=o(e,t,i,a,h,c);i.transmission>0?r.unshift(l):!0===i.transparent?s.unshift(l):n.unshift(l)},finish:function(){for(let e=i,n=t.length;e<n;e++){const i=t[e];if(null===i.id)break;i.id=null,i.object=null,i.geometry=null,i.material=null,i.program=null,i.group=null}},sort:function(e,t){n.length>1&&n.sort(e||Bo),r.length>1&&r.sort(t||Uo),s.length>1&&s.sort(t||Uo)}}}function Ho(e){let t=new WeakMap;return{get:function(i,n){let r;return!1===t.has(i)?(r=new Vo(e),t.set(i,[r])):n>=t.get(i).length?(r=new Vo(e),t.get(i).push(r)):r=t.get(i)[n],r},dispose:function(){t=new WeakMap}}}function jo(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":i={direction:new Ki,color:new xr};break;case"SpotLight":i={position:new Ki,direction:new Ki,color:new xr,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":i={position:new Ki,color:new xr,distance:0,decay:0};break;case"HemisphereLight":i={direction:new Ki,skyColor:new xr,groundColor:new xr};break;case"RectAreaLight":i={color:new xr,position:new Ki,halfWidth:new Ki,halfHeight:new Ki}}return e[t.id]=i,i}}}let Go=0;function Wo(e,t){return(t.castShadow?1:0)-(e.castShadow?1:0)}function qo(e,t){const i=new jo,n=function(){const e={};return{get:function(t){if(void 0!==e[t.id])return e[t.id];let i;switch(t.type){case"DirectionalLight":case"SpotLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new zi};break;case"PointLight":i={shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new zi,shadowCameraNear:1,shadowCameraFar:1e3}}return e[t.id]=i,i}}}(),r={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotShadow:[],spotShadowMap:[],spotShadowMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[]};for(let e=0;e<9;e++)r.probe.push(new Ki);const s=new Ki,a=new Rn,o=new Rn;return{setup:function(s,a){let o=0,h=0,c=0;for(let e=0;e<9;e++)r.probe[e].set(0,0,0);let l=0,u=0,d=0,p=0,m=0,f=0,g=0,_=0;s.sort(Wo);const v=!0!==a?Math.PI:1;for(let e=0,t=s.length;e<t;e++){const t=s[e],a=t.color,y=t.intensity,b=t.distance,x=t.shadow&&t.shadow.map?t.shadow.map.texture:null;if(t.isAmbientLight)o+=a.r*y*v,h+=a.g*y*v,c+=a.b*y*v;else if(t.isLightProbe)for(let e=0;e<9;e++)r.probe[e].addScaledVector(t.sh.coefficients[e],y);else if(t.isDirectionalLight){const e=i.get(t);if(e.color.copy(t.color).multiplyScalar(t.intensity*v),t.castShadow){const e=t.shadow,i=n.get(t);i.shadowBias=e.bias,i.shadowNormalBias=e.normalBias,i.shadowRadius=e.radius,i.shadowMapSize=e.mapSize,r.directionalShadow[l]=i,r.directionalShadowMap[l]=x,r.directionalShadowMatrix[l]=t.shadow.matrix,f++}r.directional[l]=e,l++}else if(t.isSpotLight){const e=i.get(t);if(e.position.setFromMatrixPosition(t.matrixWorld),e.color.copy(a).multiplyScalar(y*v),e.distance=b,e.coneCos=Math.cos(t.angle),e.penumbraCos=Math.cos(t.angle*(1-t.penumbra)),e.decay=t.decay,t.castShadow){const e=t.shadow,i=n.get(t);i.shadowBias=e.bias,i.shadowNormalBias=e.normalBias,i.shadowRadius=e.radius,i.shadowMapSize=e.mapSize,r.spotShadow[d]=i,r.spotShadowMap[d]=x,r.spotShadowMatrix[d]=t.shadow.matrix,_++}r.spot[d]=e,d++}else if(t.isRectAreaLight){const e=i.get(t);e.color.copy(a).multiplyScalar(y),e.halfWidth.set(.5*t.width,0,0),e.halfHeight.set(0,.5*t.height,0),r.rectArea[p]=e,p++}else if(t.isPointLight){const e=i.get(t);if(e.color.copy(t.color).multiplyScalar(t.intensity*v),e.distance=t.distance,e.decay=t.decay,t.castShadow){const e=t.shadow,i=n.get(t);i.shadowBias=e.bias,i.shadowNormalBias=e.normalBias,i.shadowRadius=e.radius,i.shadowMapSize=e.mapSize,i.shadowCameraNear=e.camera.near,i.shadowCameraFar=e.camera.far,r.pointShadow[u]=i,r.pointShadowMap[u]=x,r.pointShadowMatrix[u]=t.shadow.matrix,g++}r.point[u]=e,u++}else if(t.isHemisphereLight){const e=i.get(t);e.skyColor.copy(t.color).multiplyScalar(y*v),e.groundColor.copy(t.groundColor).multiplyScalar(y*v),r.hemi[m]=e,m++}}p>0&&(t.isWebGL2||!0===e.has("OES_texture_float_linear")?(r.rectAreaLTC1=Ss.LTC_FLOAT_1,r.rectAreaLTC2=Ss.LTC_FLOAT_2):!0===e.has("OES_texture_half_float_linear")?(r.rectAreaLTC1=Ss.LTC_HALF_1,r.rectAreaLTC2=Ss.LTC_HALF_2):console.error("THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.")),r.ambient[0]=o,r.ambient[1]=h,r.ambient[2]=c;const y=r.hash;y.directionalLength===l&&y.pointLength===u&&y.spotLength===d&&y.rectAreaLength===p&&y.hemiLength===m&&y.numDirectionalShadows===f&&y.numPointShadows===g&&y.numSpotShadows===_||(r.directional.length=l,r.spot.length=d,r.rectArea.length=p,r.point.length=u,r.hemi.length=m,r.directionalShadow.length=f,r.directionalShadowMap.length=f,r.pointShadow.length=g,r.pointShadowMap.length=g,r.spotShadow.length=_,r.spotShadowMap.length=_,r.directionalShadowMatrix.length=f,r.pointShadowMatrix.length=g,r.spotShadowMatrix.length=_,y.directionalLength=l,y.pointLength=u,y.spotLength=d,y.rectAreaLength=p,y.hemiLength=m,y.numDirectionalShadows=f,y.numPointShadows=g,y.numSpotShadows=_,r.version=Go++)},setupView:function(e,t){let i=0,n=0,h=0,c=0,l=0;const u=t.matrixWorldInverse;for(let t=0,d=e.length;t<d;t++){const d=e[t];if(d.isDirectionalLight){const e=r.directional[i];e.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),e.direction.sub(s),e.direction.transformDirection(u),i++}else if(d.isSpotLight){const e=r.spot[h];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),e.direction.setFromMatrixPosition(d.matrixWorld),s.setFromMatrixPosition(d.target.matrixWorld),e.direction.sub(s),e.direction.transformDirection(u),h++}else if(d.isRectAreaLight){const e=r.rectArea[c];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),o.identity(),a.copy(d.matrixWorld),a.premultiply(u),o.extractRotation(a),e.halfWidth.set(.5*d.width,0,0),e.halfHeight.set(0,.5*d.height,0),e.halfWidth.applyMatrix4(o),e.halfHeight.applyMatrix4(o),c++}else if(d.isPointLight){const e=r.point[n];e.position.setFromMatrixPosition(d.matrixWorld),e.position.applyMatrix4(u),n++}else if(d.isHemisphereLight){const e=r.hemi[l];e.direction.setFromMatrixPosition(d.matrixWorld),e.direction.transformDirection(u),e.direction.normalize(),l++}}},state:r}}function Xo(e,t){const i=new qo(e,t),n=[],r=[];return{init:function(){n.length=0,r.length=0},state:{lightsArray:n,shadowsArray:r,lights:i},setupLights:function(e){i.setup(n,e)},setupLightsView:function(e){i.setupView(n,e)},pushLight:function(e){n.push(e)},pushShadow:function(e){r.push(e)}}}function Zo(e,t){let i=new WeakMap;return{get:function(n,r=0){let s;return!1===i.has(n)?(s=new Xo(e,t),i.set(n,[s])):r>=i.get(n).length?(s=new Xo(e,t),i.get(n).push(s)):s=i.get(n)[r],s},dispose:function(){i=new WeakMap}}}class Yo extends mr{constructor(e){super(),this.type="MeshDepthMaterial",this.depthPacking=3200,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.setValues(e)}copy(e){return super.copy(e),this.depthPacking=e.depthPacking,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this}}Yo.prototype.isMeshDepthMaterial=!0;class Jo extends mr{constructor(e){super(),this.type="MeshDistanceMaterial",this.referencePosition=new Ki,this.nearDistance=1,this.farDistance=1e3,this.map=null,this.alphaMap=null,this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.fog=!1,this.setValues(e)}copy(e){return super.copy(e),this.referencePosition.copy(e.referencePosition),this.nearDistance=e.nearDistance,this.farDistance=e.farDistance,this.map=e.map,this.alphaMap=e.alphaMap,this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this}}Jo.prototype.isMeshDistanceMaterial=!0;function Ko(e,t,i){let n=new ys;const r=new zi,s=new zi,a=new Xi,o=new Yo({depthPacking:3201}),h=new Jo,c={},l=i.maxTextureSize,u={0:1,1:0,2:2},d=new as({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new zi},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"uniform sampler2D shadow_pass;\nuniform vec2 resolution;\nuniform float radius;\n#include <packing>\nvoid main() {\n\tconst float samples = float( VSM_SAMPLES );\n\tfloat mean = 0.0;\n\tfloat squared_mean = 0.0;\n\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\n\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\n\tfor ( float i = 0.0; i < samples; i ++ ) {\n\t\tfloat uvOffset = uvStart + i * uvStride;\n\t\t#ifdef HORIZONTAL_PASS\n\t\t\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\n\t\t\tmean += distribution.x;\n\t\t\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\n\t\t#else\n\t\t\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\n\t\t\tmean += depth;\n\t\t\tsquared_mean += depth * depth;\n\t\t#endif\n\t}\n\tmean = mean / samples;\n\tsquared_mean = squared_mean / samples;\n\tfloat std_dev = sqrt( squared_mean - mean * mean );\n\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\n}"}),p=d.clone();p.defines.HORIZONTAL_PASS=1;const m=new kr;m.setAttribute("position",new Tr(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const f=new es(m,d),g=this;function _(i,n){const r=t.update(f);d.defines.VSM_SAMPLES!==i.blurSamples&&(d.defines.VSM_SAMPLES=i.blurSamples,p.defines.VSM_SAMPLES=i.blurSamples,d.needsUpdate=!0,p.needsUpdate=!0),d.uniforms.shadow_pass.value=i.map.texture,d.uniforms.resolution.value=i.mapSize,d.uniforms.radius.value=i.radius,e.setRenderTarget(i.mapPass),e.clear(),e.renderBufferDirect(n,null,r,d,f,null),p.uniforms.shadow_pass.value=i.mapPass.texture,p.uniforms.resolution.value=i.mapSize,p.uniforms.radius.value=i.radius,e.setRenderTarget(i.map),e.clear(),e.renderBufferDirect(n,null,r,p,f,null)}function v(t,i,n,r,s,a,l){let d=null;const p=!0===r.isPointLight?t.customDistanceMaterial:t.customDepthMaterial;if(d=void 0!==p?p:!0===r.isPointLight?h:o,e.localClippingEnabled&&!0===n.clipShadows&&0!==n.clippingPlanes.length||n.displacementMap&&0!==n.displacementScale||n.alphaMap&&n.alphaTest>0){const e=d.uuid,t=n.uuid;let i=c[e];void 0===i&&(i={},c[e]=i);let r=i[t];void 0===r&&(r=d.clone(),i[t]=r),d=r}return d.visible=n.visible,d.wireframe=n.wireframe,d.side=3===l?null!==n.shadowSide?n.shadowSide:n.side:null!==n.shadowSide?n.shadowSide:u[n.side],d.alphaMap=n.alphaMap,d.alphaTest=n.alphaTest,d.clipShadows=n.clipShadows,d.clippingPlanes=n.clippingPlanes,d.clipIntersection=n.clipIntersection,d.displacementMap=n.displacementMap,d.displacementScale=n.displacementScale,d.displacementBias=n.displacementBias,d.wireframeLinewidth=n.wireframeLinewidth,d.linewidth=n.linewidth,!0===r.isPointLight&&!0===d.isMeshDistanceMaterial&&(d.referencePosition.setFromMatrixPosition(r.matrixWorld),d.nearDistance=s,d.farDistance=a),d}function y(i,r,s,a,o){if(!1===i.visible)return;if(i.layers.test(r.layers)&&(i.isMesh||i.isLine||i.isPoints)&&(i.castShadow||i.receiveShadow&&3===o)&&(!i.frustumCulled||n.intersectsObject(i))){i.modelViewMatrix.multiplyMatrices(s.matrixWorldInverse,i.matrixWorld);const n=t.update(i),r=i.material;if(Array.isArray(r)){const t=n.groups;for(let h=0,c=t.length;h<c;h++){const c=t[h],l=r[c.materialIndex];if(l&&l.visible){const t=v(i,0,l,a,s.near,s.far,o);e.renderBufferDirect(s,null,n,t,i,c)}}}else if(r.visible){const t=v(i,0,r,a,s.near,s.far,o);e.renderBufferDirect(s,null,n,t,i,null)}}const h=i.children;for(let e=0,t=h.length;e<t;e++)y(h[e],r,s,a,o)}this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=1,this.render=function(t,i,o){if(!1===g.enabled)return;if(!1===g.autoUpdate&&!1===g.needsUpdate)return;if(0===t.length)return;const h=e.getRenderTarget(),c=e.getActiveCubeFace(),u=e.getActiveMipmapLevel(),d=e.state;d.setBlending(0),d.buffers.color.setClear(1,1,1,1),d.buffers.depth.setTest(!0),d.setScissorTest(!1);for(let h=0,c=t.length;h<c;h++){const c=t[h],u=c.shadow;if(void 0===u){console.warn("THREE.WebGLShadowMap:",c,"has no shadow.");continue}if(!1===u.autoUpdate&&!1===u.needsUpdate)continue;r.copy(u.mapSize);const p=u.getFrameExtents();if(r.multiply(p),s.copy(u.mapSize),(r.x>l||r.y>l)&&(r.x>l&&(s.x=Math.floor(l/p.x),r.x=s.x*p.x,u.mapSize.x=s.x),r.y>l&&(s.y=Math.floor(l/p.y),r.y=s.y*p.y,u.mapSize.y=s.y)),null===u.map&&!u.isPointLightShadow&&3===this.type){const e={minFilter:Kt,magFilter:Kt,format:oi};u.map=new Zi(r.x,r.y,e),u.map.texture.name=c.name+".shadowMap",u.mapPass=new Zi(r.x,r.y,e),u.camera.updateProjectionMatrix()}if(null===u.map){const e={minFilter:Jt,magFilter:Jt,format:oi};u.map=new Zi(r.x,r.y,e),u.map.texture.name=c.name+".shadowMap",u.camera.updateProjectionMatrix()}e.setRenderTarget(u.map),e.clear();const m=u.getViewportCount();for(let e=0;e<m;e++){const t=u.getViewport(e);a.set(s.x*t.x,s.y*t.y,s.x*t.z,s.y*t.w),d.viewport(a),u.updateMatrices(c,e),n=u.getFrustum(),y(i,o,u.camera,c,this.type)}u.isPointLightShadow||3!==this.type||_(u,o),u.needsUpdate=!1}g.needsUpdate=!1,e.setRenderTarget(h,c,u)}}function Qo(e,t,i){const n=i.isWebGL2;const r=new function(){let t=!1;const i=new Xi;let n=null;const r=new Xi(0,0,0,0);return{setMask:function(i){n===i||t||(e.colorMask(i,i,i,i),n=i)},setLocked:function(e){t=e},setClear:function(t,n,s,a,o){!0===o&&(t*=a,n*=a,s*=a),i.set(t,n,s,a),!1===r.equals(i)&&(e.clearColor(t,n,s,a),r.copy(i))},reset:function(){t=!1,n=null,r.set(-1,0,0,0)}}},s=new function(){let t=!1,i=null,n=null,r=null;return{setTest:function(e){e?O(2929):z(2929)},setMask:function(n){i===n||t||(e.depthMask(n),i=n)},setFunc:function(t){if(n!==t){if(t)switch(t){case 0:e.depthFunc(512);break;case 1:e.depthFunc(519);break;case 2:e.depthFunc(513);break;case 3:e.depthFunc(515);break;case 4:e.depthFunc(514);break;case 5:e.depthFunc(518);break;case 6:e.depthFunc(516);break;case 7:e.depthFunc(517);break;default:e.depthFunc(515)}else e.depthFunc(515);n=t}},setLocked:function(e){t=e},setClear:function(t){r!==t&&(e.clearDepth(t),r=t)},reset:function(){t=!1,i=null,n=null,r=null}}},a=new function(){let t=!1,i=null,n=null,r=null,s=null,a=null,o=null,h=null,c=null;return{setTest:function(e){t||(e?O(2960):z(2960))},setMask:function(n){i===n||t||(e.stencilMask(n),i=n)},setFunc:function(t,i,a){n===t&&r===i&&s===a||(e.stencilFunc(t,i,a),n=t,r=i,s=a)},setOp:function(t,i,n){a===t&&o===i&&h===n||(e.stencilOp(t,i,n),a=t,o=i,h=n)},setLocked:function(e){t=e},setClear:function(t){c!==t&&(e.clearStencil(t),c=t)},reset:function(){t=!1,i=null,n=null,r=null,s=null,a=null,o=null,h=null,c=null}}};let o={},h=null,c={},l=null,u=!1,d=null,p=null,m=null,f=null,g=null,_=null,v=null,y=!1,b=null,x=null,w=null,M=null,S=null;const T=e.getParameter(35661);let C=!1,E=0;const A=e.getParameter(7938);-1!==A.indexOf("WebGL")?(E=parseFloat(/^WebGL (\d)/.exec(A)[1]),C=E>=1):-1!==A.indexOf("OpenGL ES")&&(E=parseFloat(/^OpenGL ES (\d)/.exec(A)[1]),C=E>=2);let I=null,R={};const P=e.getParameter(3088),L=e.getParameter(2978),D=(new Xi).fromArray(P),N=(new Xi).fromArray(L);function $(t,i,n){const r=new Uint8Array(4),s=e.createTexture();e.bindTexture(t,s),e.texParameteri(t,10241,9728),e.texParameteri(t,10240,9728);for(let t=0;t<n;t++)e.texImage2D(i+t,0,6408,1,1,0,6408,5121,r);return s}const k={};function O(t){!0!==o[t]&&(e.enable(t),o[t]=!0)}function z(t){!1!==o[t]&&(e.disable(t),o[t]=!1)}k[3553]=$(3553,3553,1),k[34067]=$(34067,34069,6),r.setClear(0,0,0,1),s.setClear(1),a.setClear(0),O(2929),s.setFunc(3),V(!1),H(1),O(2884),U(0);const F={[jt]:32774,101:32778,102:32779};if(n)F[103]=32775,F[104]=32776;else{const e=t.get("EXT_blend_minmax");null!==e&&(F[103]=e.MIN_EXT,F[104]=e.MAX_EXT)}const B={200:0,201:1,202:768,204:770,210:776,208:774,206:772,203:769,205:771,209:775,207:773};function U(t,i,n,r,s,a,o,h){if(0!==t){if(!1===u&&(O(3042),u=!0),5===t)s=s||i,a=a||n,o=o||r,i===p&&s===g||(e.blendEquationSeparate(F[i],F[s]),p=i,g=s),n===m&&r===f&&a===_&&o===v||(e.blendFuncSeparate(B[n],B[r],B[a],B[o]),m=n,f=r,_=a,v=o),d=t,y=null;else if(t!==d||h!==y){if(p===jt&&g===jt||(e.blendEquation(32774),p=jt,g=jt),h)switch(t){case 1:e.blendFuncSeparate(1,771,1,771);break;case 2:e.blendFunc(1,1);break;case 3:e.blendFuncSeparate(0,0,769,771);break;case 4:e.blendFuncSeparate(0,768,0,770);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}else switch(t){case 1:e.blendFuncSeparate(770,771,1,771);break;case 2:e.blendFunc(770,1);break;case 3:e.blendFunc(0,769);break;case 4:e.blendFunc(0,768);break;default:console.error("THREE.WebGLState: Invalid blending: ",t)}m=null,f=null,_=null,v=null,d=t,y=h}}else!0===u&&(z(3042),u=!1)}function V(t){b!==t&&(t?e.frontFace(2304):e.frontFace(2305),b=t)}function H(t){0!==t?(O(2884),t!==x&&(1===t?e.cullFace(1029):2===t?e.cullFace(1028):e.cullFace(1032))):z(2884),x=t}function j(t,i,n){t?(O(32823),M===i&&S===n||(e.polygonOffset(i,n),M=i,S=n)):z(32823)}function G(t){void 0===t&&(t=33984+T-1),I!==t&&(e.activeTexture(t),I=t)}return{buffers:{color:r,depth:s,stencil:a},enable:O,disable:z,bindFramebuffer:function(t,i){return null===i&&null!==h&&(i=h),c[t]!==i&&(e.bindFramebuffer(t,i),c[t]=i,n&&(36009===t&&(c[36160]=i),36160===t&&(c[36009]=i)),!0)},bindXRFramebuffer:function(t){t!==h&&(e.bindFramebuffer(36160,t),h=t)},useProgram:function(t){return l!==t&&(e.useProgram(t),l=t,!0)},setBlending:U,setMaterial:function(e,t){2===e.side?z(2884):O(2884);let i=1===e.side;t&&(i=!i),V(i),1===e.blending&&!1===e.transparent?U(0):U(e.blending,e.blendEquation,e.blendSrc,e.blendDst,e.blendEquationAlpha,e.blendSrcAlpha,e.blendDstAlpha,e.premultipliedAlpha),s.setFunc(e.depthFunc),s.setTest(e.depthTest),s.setMask(e.depthWrite),r.setMask(e.colorWrite);const n=e.stencilWrite;a.setTest(n),n&&(a.setMask(e.stencilWriteMask),a.setFunc(e.stencilFunc,e.stencilRef,e.stencilFuncMask),a.setOp(e.stencilFail,e.stencilZFail,e.stencilZPass)),j(e.polygonOffset,e.polygonOffsetFactor,e.polygonOffsetUnits),!0===e.alphaToCoverage?O(32926):z(32926)},setFlipSided:V,setCullFace:H,setLineWidth:function(t){t!==w&&(C&&e.lineWidth(t),w=t)},setPolygonOffset:j,setScissorTest:function(e){e?O(3089):z(3089)},activeTexture:G,bindTexture:function(t,i){null===I&&G();let n=R[I];void 0===n&&(n={type:void 0,texture:void 0},R[I]=n),n.type===t&&n.texture===i||(e.bindTexture(t,i||k[t]),n.type=t,n.texture=i)},unbindTexture:function(){const t=R[I];void 0!==t&&void 0!==t.type&&(e.bindTexture(t.type,null),t.type=void 0,t.texture=void 0)},compressedTexImage2D:function(){try{e.compressedTexImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage2D:function(){try{e.texImage2D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},texImage3D:function(){try{e.texImage3D.apply(e,arguments)}catch(e){console.error("THREE.WebGLState:",e)}},scissor:function(t){!1===D.equals(t)&&(e.scissor(t.x,t.y,t.z,t.w),D.copy(t))},viewport:function(t){!1===N.equals(t)&&(e.viewport(t.x,t.y,t.z,t.w),N.copy(t))},reset:function(){e.disable(3042),e.disable(2884),e.disable(2929),e.disable(32823),e.disable(3089),e.disable(2960),e.disable(32926),e.blendEquation(32774),e.blendFunc(1,0),e.blendFuncSeparate(1,0,1,0),e.colorMask(!0,!0,!0,!0),e.clearColor(0,0,0,0),e.depthMask(!0),e.depthFunc(513),e.clearDepth(1),e.stencilMask(4294967295),e.stencilFunc(519,0,4294967295),e.stencilOp(7680,7680,7680),e.clearStencil(0),e.cullFace(1029),e.frontFace(2305),e.polygonOffset(0,0),e.activeTexture(33984),e.bindFramebuffer(36160,null),!0===n&&(e.bindFramebuffer(36009,null),e.bindFramebuffer(36008,null)),e.useProgram(null),e.lineWidth(1),e.scissor(0,0,e.canvas.width,e.canvas.height),e.viewport(0,0,e.canvas.width,e.canvas.height),o={},I=null,R={},h=null,c={},l=null,u=!1,d=null,p=null,m=null,f=null,g=null,_=null,v=null,y=!1,b=null,x=null,w=null,M=null,S=null,D.set(0,0,e.canvas.width,e.canvas.height),N.set(0,0,e.canvas.width,e.canvas.height),r.reset(),s.reset(),a.reset()}}}function eh(e,t,i,n,r,s,a){const o=r.isWebGL2,h=r.maxTextures,c=r.maxCubemapSize,l=r.maxTextureSize,u=r.maxSamples,d=new WeakMap;let p,m=!1;try{m="undefined"!=typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(e){}function f(e,t){return m?new OffscreenCanvas(e,t):Ui("canvas")}function g(e,t,i,n){let r=1;if((e.width>n||e.height>n)&&(r=n/Math.max(e.width,e.height)),r<1||!0===t){if("undefined"!=typeof HTMLImageElement&&e instanceof HTMLImageElement||"undefined"!=typeof HTMLCanvasElement&&e instanceof HTMLCanvasElement||"undefined"!=typeof ImageBitmap&&e instanceof ImageBitmap){const n=t?ki:Math.floor,s=n(r*e.width),a=n(r*e.height);void 0===p&&(p=f(s,a));const o=i?f(s,a):p;o.width=s,o.height=a;return o.getContext("2d").drawImage(e,0,0,s,a),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+e.width+"x"+e.height+") to ("+s+"x"+a+")."),o}return"data"in e&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+e.width+"x"+e.height+")."),e}return e}function _(e){return $i(e.width)&&$i(e.height)}function v(e,t){return e.generateMipmaps&&t&&e.minFilter!==Jt&&e.minFilter!==Kt}function y(t,i,r,s,a=1){e.generateMipmap(t);n.get(i).__maxMipLevel=Math.log2(Math.max(r,s,a))}function b(i,n,r,s){if(!1===o)return n;if(null!==i){if(void 0!==e[i])return e[i];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+i+"'")}let a=n;return 6403===n&&(5126===r&&(a=33326),5131===r&&(a=33325),5121===r&&(a=33321)),6407===n&&(5126===r&&(a=34837),5131===r&&(a=34843),5121===r&&(a=32849)),6408===n&&(5126===r&&(a=34836),5131===r&&(a=34842),5121===r&&(a=s===vi?35907:32856)),33325!==a&&33326!==a&&34842!==a&&34836!==a||t.get("EXT_color_buffer_float"),a}function x(e){return e===Jt||1004===e||1005===e?9728:9729}function w(t){const i=t.target;i.removeEventListener("dispose",w),function(t){const i=n.get(t);if(void 0===i.__webglInit)return;e.deleteTexture(i.__webglTexture),n.remove(t)}(i),i.isVideoTexture&&d.delete(i),a.memory.textures--}function M(t){const i=t.target;i.removeEventListener("dispose",M),function(t){const i=t.texture,r=n.get(t),s=n.get(i);if(!t)return;void 0!==s.__webglTexture&&(e.deleteTexture(s.__webglTexture),a.memory.textures--);t.depthTexture&&t.depthTexture.dispose();if(t.isWebGLCubeRenderTarget)for(let t=0;t<6;t++)e.deleteFramebuffer(r.__webglFramebuffer[t]),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer[t]);else e.deleteFramebuffer(r.__webglFramebuffer),r.__webglDepthbuffer&&e.deleteRenderbuffer(r.__webglDepthbuffer),r.__webglMultisampledFramebuffer&&e.deleteFramebuffer(r.__webglMultisampledFramebuffer),r.__webglColorRenderbuffer&&e.deleteRenderbuffer(r.__webglColorRenderbuffer),r.__webglDepthRenderbuffer&&e.deleteRenderbuffer(r.__webglDepthRenderbuffer);if(t.isWebGLMultipleRenderTargets)for(let t=0,r=i.length;t<r;t++){const r=n.get(i[t]);r.__webglTexture&&(e.deleteTexture(r.__webglTexture),a.memory.textures--),n.remove(i[t])}n.remove(i),n.remove(t)}(i)}let S=0;function T(e,t){const r=n.get(e);if(e.isVideoTexture&&function(e){const t=a.render.frame;d.get(e)!==t&&(d.set(e,t),e.update())}(e),e.version>0&&r.__version!==e.version){const i=e.image;if(void 0===i)console.warn("THREE.WebGLRenderer: Texture marked for update but image is undefined");else{if(!1!==i.complete)return void P(r,e,t);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}i.activeTexture(33984+t),i.bindTexture(3553,r.__webglTexture)}function C(t,r){const a=n.get(t);t.version>0&&a.__version!==t.version?function(t,n,r){if(6!==n.image.length)return;R(t,n),i.activeTexture(33984+r),i.bindTexture(34067,t.__webglTexture),e.pixelStorei(37440,n.flipY),e.pixelStorei(37441,n.premultiplyAlpha),e.pixelStorei(3317,n.unpackAlignment),e.pixelStorei(37443,0);const a=n&&(n.isCompressedTexture||n.image[0].isCompressedTexture),h=n.image[0]&&n.image[0].isDataTexture,l=[];for(let e=0;e<6;e++)l[e]=a||h?h?n.image[e].image:n.image[e]:g(n.image[e],!1,!0,c);const u=l[0],d=_(u)||o,p=s.convert(n.format),m=s.convert(n.type),f=b(n.internalFormat,p,m,n.encoding);let x;if(I(34067,n,d),a){for(let e=0;e<6;e++){x=l[e].mipmaps;for(let t=0;t<x.length;t++){const r=x[t];n.format!==oi&&n.format!==ai?null!==p?i.compressedTexImage2D(34069+e,t,f,r.width,r.height,0,r.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):i.texImage2D(34069+e,t,f,r.width,r.height,0,p,m,r.data)}}t.__maxMipLevel=x.length-1}else{x=n.mipmaps;for(let e=0;e<6;e++)if(h){i.texImage2D(34069+e,0,f,l[e].width,l[e].height,0,p,m,l[e].data);for(let t=0;t<x.length;t++){const n=x[t].image[e].image;i.texImage2D(34069+e,t+1,f,n.width,n.height,0,p,m,n.data)}}else{i.texImage2D(34069+e,0,f,p,m,l[e]);for(let t=0;t<x.length;t++){const n=x[t];i.texImage2D(34069+e,t+1,f,p,m,n.image[e])}}t.__maxMipLevel=x.length}v(n,d)&&y(34067,n,u.width,u.height);t.__version=n.version,n.onUpdate&&n.onUpdate(n)}(a,t,r):(i.activeTexture(33984+r),i.bindTexture(34067,a.__webglTexture))}const E={[Xt]:10497,[Zt]:33071,[Yt]:33648},A={[Jt]:9728,1004:9984,1005:9986,[Kt]:9729,1007:9985,[Qt]:9987};function I(i,s,a){if(a?(e.texParameteri(i,10242,E[s.wrapS]),e.texParameteri(i,10243,E[s.wrapT]),32879!==i&&35866!==i||e.texParameteri(i,32882,E[s.wrapR]),e.texParameteri(i,10240,A[s.magFilter]),e.texParameteri(i,10241,A[s.minFilter])):(e.texParameteri(i,10242,33071),e.texParameteri(i,10243,33071),32879!==i&&35866!==i||e.texParameteri(i,32882,33071),s.wrapS===Zt&&s.wrapT===Zt||console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping."),e.texParameteri(i,10240,x(s.magFilter)),e.texParameteri(i,10241,x(s.minFilter)),s.minFilter!==Jt&&s.minFilter!==Kt&&console.warn("THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.")),!0===t.has("EXT_texture_filter_anisotropic")){const a=t.get("EXT_texture_filter_anisotropic");if(s.type===ni&&!1===t.has("OES_texture_float_linear"))return;if(!1===o&&s.type===ri&&!1===t.has("OES_texture_half_float_linear"))return;(s.anisotropy>1||n.get(s).__currentAnisotropy)&&(e.texParameterf(i,a.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(s.anisotropy,r.getMaxAnisotropy())),n.get(s).__currentAnisotropy=s.anisotropy)}}function R(t,i){void 0===t.__webglInit&&(t.__webglInit=!0,i.addEventListener("dispose",w),t.__webglTexture=e.createTexture(),a.memory.textures++)}function P(t,n,r){let a=3553;n.isDataTexture2DArray&&(a=35866),n.isDataTexture3D&&(a=32879),R(t,n),i.activeTexture(33984+r),i.bindTexture(a,t.__webglTexture),e.pixelStorei(37440,n.flipY),e.pixelStorei(37441,n.premultiplyAlpha),e.pixelStorei(3317,n.unpackAlignment),e.pixelStorei(37443,0);const h=function(e){return!o&&(e.wrapS!==Zt||e.wrapT!==Zt||e.minFilter!==Jt&&e.minFilter!==Kt)}(n)&&!1===_(n.image),c=g(n.image,h,!1,l),u=_(c)||o,d=s.convert(n.format);let p,m=s.convert(n.type),f=b(n.internalFormat,d,m,n.encoding);I(a,n,u);const x=n.mipmaps;if(n.isDepthTexture)f=6402,o?f=n.type===ni?36012:n.type===ii?33190:n.type===si?35056:33189:n.type===ni&&console.error("WebGLRenderer: Floating point depth texture requires WebGL2."),n.format===hi&&6402===f&&n.type!==ti&&n.type!==ii&&(console.warn("THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture."),n.type=ti,m=s.convert(n.type)),n.format===ci&&6402===f&&(f=34041,n.type!==si&&(console.warn("THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture."),n.type=si,m=s.convert(n.type))),i.texImage2D(3553,0,f,c.width,c.height,0,d,m,null);else if(n.isDataTexture)if(x.length>0&&u){for(let e=0,t=x.length;e<t;e++)p=x[e],i.texImage2D(3553,e,f,p.width,p.height,0,d,m,p.data);n.generateMipmaps=!1,t.__maxMipLevel=x.length-1}else i.texImage2D(3553,0,f,c.width,c.height,0,d,m,c.data),t.__maxMipLevel=0;else if(n.isCompressedTexture){for(let e=0,t=x.length;e<t;e++)p=x[e],n.format!==oi&&n.format!==ai?null!==d?i.compressedTexImage2D(3553,e,f,p.width,p.height,0,p.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):i.texImage2D(3553,e,f,p.width,p.height,0,d,m,p.data);t.__maxMipLevel=x.length-1}else if(n.isDataTexture2DArray)i.texImage3D(35866,0,f,c.width,c.height,c.depth,0,d,m,c.data),t.__maxMipLevel=0;else if(n.isDataTexture3D)i.texImage3D(32879,0,f,c.width,c.height,c.depth,0,d,m,c.data),t.__maxMipLevel=0;else if(x.length>0&&u){for(let e=0,t=x.length;e<t;e++)p=x[e],i.texImage2D(3553,e,f,d,m,p);n.generateMipmaps=!1,t.__maxMipLevel=x.length-1}else i.texImage2D(3553,0,f,d,m,c),t.__maxMipLevel=0;v(n,u)&&y(a,n,c.width,c.height),t.__version=n.version,n.onUpdate&&n.onUpdate(n)}function L(t,r,a,o,h){const c=s.convert(a.format),l=s.convert(a.type),u=b(a.internalFormat,c,l,a.encoding);32879===h||35866===h?i.texImage3D(h,0,u,r.width,r.height,r.depth,0,c,l,null):i.texImage2D(h,0,u,r.width,r.height,0,c,l,null),i.bindFramebuffer(36160,t),e.framebufferTexture2D(36160,o,h,n.get(a).__webglTexture,0),i.bindFramebuffer(36160,null)}function D(t,i,n){if(e.bindRenderbuffer(36161,t),i.depthBuffer&&!i.stencilBuffer){let r=33189;if(n){const t=i.depthTexture;t&&t.isDepthTexture&&(t.type===ni?r=36012:t.type===ii&&(r=33190));const n=$(i);e.renderbufferStorageMultisample(36161,n,r,i.width,i.height)}else e.renderbufferStorage(36161,r,i.width,i.height);e.framebufferRenderbuffer(36160,36096,36161,t)}else if(i.depthBuffer&&i.stencilBuffer){if(n){const t=$(i);e.renderbufferStorageMultisample(36161,t,35056,i.width,i.height)}else e.renderbufferStorage(36161,34041,i.width,i.height);e.framebufferRenderbuffer(36160,33306,36161,t)}else{const t=!0===i.isWebGLMultipleRenderTargets?i.texture[0]:i.texture,r=s.convert(t.format),a=s.convert(t.type),o=b(t.internalFormat,r,a,t.encoding);if(n){const t=$(i);e.renderbufferStorageMultisample(36161,t,o,i.width,i.height)}else e.renderbufferStorage(36161,o,i.width,i.height)}e.bindRenderbuffer(36161,null)}function N(t){const r=n.get(t),s=!0===t.isWebGLCubeRenderTarget;if(t.depthTexture){if(s)throw new Error("target.depthTexture not supported in Cube render targets");!function(t,r){if(r&&r.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(i.bindFramebuffer(36160,t),!r.depthTexture||!r.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");n.get(r.depthTexture).__webglTexture&&r.depthTexture.image.width===r.width&&r.depthTexture.image.height===r.height||(r.depthTexture.image.width=r.width,r.depthTexture.image.height=r.height,r.depthTexture.needsUpdate=!0),T(r.depthTexture,0);const s=n.get(r.depthTexture).__webglTexture;if(r.depthTexture.format===hi)e.framebufferTexture2D(36160,36096,3553,s,0);else{if(r.depthTexture.format!==ci)throw new Error("Unknown depthTexture format");e.framebufferTexture2D(36160,33306,3553,s,0)}}(r.__webglFramebuffer,t)}else if(s){r.__webglDepthbuffer=[];for(let n=0;n<6;n++)i.bindFramebuffer(36160,r.__webglFramebuffer[n]),r.__webglDepthbuffer[n]=e.createRenderbuffer(),D(r.__webglDepthbuffer[n],t,!1)}else i.bindFramebuffer(36160,r.__webglFramebuffer),r.__webglDepthbuffer=e.createRenderbuffer(),D(r.__webglDepthbuffer,t,!1);i.bindFramebuffer(36160,null)}function $(e){return o&&e.isWebGLMultisampleRenderTarget?Math.min(u,e.samples):0}let k=!1,O=!1;this.allocateTextureUnit=function(){const e=S;return e>=h&&console.warn("THREE.WebGLTextures: Trying to use "+e+" texture units while this GPU supports only "+h),S+=1,e},this.resetTextureUnits=function(){S=0},this.setTexture2D=T,this.setTexture2DArray=function(e,t){const r=n.get(e);e.version>0&&r.__version!==e.version?P(r,e,t):(i.activeTexture(33984+t),i.bindTexture(35866,r.__webglTexture))},this.setTexture3D=function(e,t){const r=n.get(e);e.version>0&&r.__version!==e.version?P(r,e,t):(i.activeTexture(33984+t),i.bindTexture(32879,r.__webglTexture))},this.setTextureCube=C,this.setupRenderTarget=function(t){const h=t.texture,c=n.get(t),l=n.get(h);t.addEventListener("dispose",M),!0!==t.isWebGLMultipleRenderTargets&&(l.__webglTexture=e.createTexture(),l.__version=h.version,a.memory.textures++);const u=!0===t.isWebGLCubeRenderTarget,d=!0===t.isWebGLMultipleRenderTargets,p=!0===t.isWebGLMultisampleRenderTarget,m=h.isDataTexture3D||h.isDataTexture2DArray,f=_(t)||o;if(!o||h.format!==ai||h.type!==ni&&h.type!==ri||(h.format=oi,console.warn("THREE.WebGLRenderer: Rendering to textures with RGB format is not supported. Using RGBA format instead.")),u){c.__webglFramebuffer=[];for(let t=0;t<6;t++)c.__webglFramebuffer[t]=e.createFramebuffer()}else if(c.__webglFramebuffer=e.createFramebuffer(),d)if(r.drawBuffers){const i=t.texture;for(let t=0,r=i.length;t<r;t++){const r=n.get(i[t]);void 0===r.__webglTexture&&(r.__webglTexture=e.createTexture(),a.memory.textures++)}}else console.warn("THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.");else if(p)if(o){c.__webglMultisampledFramebuffer=e.createFramebuffer(),c.__webglColorRenderbuffer=e.createRenderbuffer(),e.bindRenderbuffer(36161,c.__webglColorRenderbuffer);const n=s.convert(h.format),r=s.convert(h.type),a=b(h.internalFormat,n,r,h.encoding),o=$(t);e.renderbufferStorageMultisample(36161,o,a,t.width,t.height),i.bindFramebuffer(36160,c.__webglMultisampledFramebuffer),e.framebufferRenderbuffer(36160,36064,36161,c.__webglColorRenderbuffer),e.bindRenderbuffer(36161,null),t.depthBuffer&&(c.__webglDepthRenderbuffer=e.createRenderbuffer(),D(c.__webglDepthRenderbuffer,t,!0)),i.bindFramebuffer(36160,null)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.");if(u){i.bindTexture(34067,l.__webglTexture),I(34067,h,f);for(let e=0;e<6;e++)L(c.__webglFramebuffer[e],t,h,36064,34069+e);v(h,f)&&y(34067,h,t.width,t.height),i.unbindTexture()}else if(d){const e=t.texture;for(let r=0,s=e.length;r<s;r++){const s=e[r],a=n.get(s);i.bindTexture(3553,a.__webglTexture),I(3553,s,f),L(c.__webglFramebuffer,t,s,36064+r,3553),v(s,f)&&y(3553,s,t.width,t.height)}i.unbindTexture()}else{let e=3553;if(m)if(o){e=h.isDataTexture3D?32879:35866}else console.warn("THREE.DataTexture3D and THREE.DataTexture2DArray only supported with WebGL2.");i.bindTexture(e,l.__webglTexture),I(e,h,f),L(c.__webglFramebuffer,t,h,36064,e),v(h,f)&&y(e,h,t.width,t.height,t.depth),i.unbindTexture()}t.depthBuffer&&N(t)},this.updateRenderTargetMipmap=function(e){const t=_(e)||o,r=!0===e.isWebGLMultipleRenderTargets?e.texture:[e.texture];for(let s=0,a=r.length;s<a;s++){const a=r[s];if(v(a,t)){const t=e.isWebGLCubeRenderTarget?34067:3553,r=n.get(a).__webglTexture;i.bindTexture(t,r),y(t,a,e.width,e.height),i.unbindTexture()}}},this.updateMultisampleRenderTarget=function(t){if(t.isWebGLMultisampleRenderTarget)if(o){const r=t.width,s=t.height;let a=16384;t.depthBuffer&&(a|=256),t.stencilBuffer&&(a|=1024);const o=n.get(t);i.bindFramebuffer(36008,o.__webglMultisampledFramebuffer),i.bindFramebuffer(36009,o.__webglFramebuffer),e.blitFramebuffer(0,0,r,s,0,0,r,s,a,9728),i.bindFramebuffer(36008,null),i.bindFramebuffer(36009,o.__webglMultisampledFramebuffer)}else console.warn("THREE.WebGLRenderer: WebGLMultisampleRenderTarget can only be used with WebGL2.")},this.safeSetTexture2D=function(e,t){e&&e.isWebGLRenderTarget&&(!1===k&&(console.warn("THREE.WebGLTextures.safeSetTexture2D: don't use render targets as textures. Use their .texture property instead."),k=!0),e=e.texture),T(e,t)},this.safeSetTextureCube=function(e,t){e&&e.isWebGLCubeRenderTarget&&(!1===O&&(console.warn("THREE.WebGLTextures.safeSetTextureCube: don't use cube render targets as textures. Use their .texture property instead."),O=!0),e=e.texture),C(e,t)}}function th(e,t,i){const n=i.isWebGL2;return{convert:function(e){let i;if(e===ei)return 5121;if(1017===e)return 32819;if(1018===e)return 32820;if(1019===e)return 33635;if(1010===e)return 5120;if(1011===e)return 5122;if(e===ti)return 5123;if(1013===e)return 5124;if(e===ii)return 5125;if(e===ni)return 5126;if(e===ri)return n?5131:(i=t.get("OES_texture_half_float"),null!==i?i.HALF_FLOAT_OES:null);if(1021===e)return 6406;if(e===ai)return 6407;if(e===oi)return 6408;if(1024===e)return 6409;if(1025===e)return 6410;if(e===hi)return 6402;if(e===ci)return 34041;if(1028===e)return 6403;if(1029===e)return 36244;if(1030===e)return 33319;if(1031===e)return 33320;if(1032===e)return 36248;if(1033===e)return 36249;if(33776===e||33777===e||33778===e||33779===e){if(i=t.get("WEBGL_compressed_texture_s3tc"),null===i)return null;if(33776===e)return i.COMPRESSED_RGB_S3TC_DXT1_EXT;if(33777===e)return i.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(33778===e)return i.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(33779===e)return i.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(35840===e||35841===e||35842===e||35843===e){if(i=t.get("WEBGL_compressed_texture_pvrtc"),null===i)return null;if(35840===e)return i.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(35841===e)return i.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(35842===e)return i.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(35843===e)return i.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(36196===e)return i=t.get("WEBGL_compressed_texture_etc1"),null!==i?i.COMPRESSED_RGB_ETC1_WEBGL:null;if((37492===e||37496===e)&&(i=t.get("WEBGL_compressed_texture_etc"),null!==i)){if(37492===e)return i.COMPRESSED_RGB8_ETC2;if(37496===e)return i.COMPRESSED_RGBA8_ETC2_EAC}return 37808===e||37809===e||37810===e||37811===e||37812===e||37813===e||37814===e||37815===e||37816===e||37817===e||37818===e||37819===e||37820===e||37821===e||37840===e||37841===e||37842===e||37843===e||37844===e||37845===e||37846===e||37847===e||37848===e||37849===e||37850===e||37851===e||37852===e||37853===e?(i=t.get("WEBGL_compressed_texture_astc"),null!==i?e:null):36492===e?(i=t.get("EXT_texture_compression_bptc"),null!==i?e:null):e===si?n?34042:(i=t.get("WEBGL_depth_texture"),null!==i?i.UNSIGNED_INT_24_8_WEBGL:null):void 0}}}class ih extends hs{constructor(e=[]){super(),this.cameras=e}}ih.prototype.isArrayCamera=!0;class nh extends tr{constructor(){super(),this.type="Group"}}nh.prototype.isGroup=!0;const rh={type:"move"};class sh{constructor(){this._targetRay=null,this._grip=null,this._hand=null}getHandSpace(){return null===this._hand&&(this._hand=new nh,this._hand.matrixAutoUpdate=!1,this._hand.visible=!1,this._hand.joints={},this._hand.inputState={pinching:!1}),this._hand}getTargetRaySpace(){return null===this._targetRay&&(this._targetRay=new nh,this._targetRay.matrixAutoUpdate=!1,this._targetRay.visible=!1,this._targetRay.hasLinearVelocity=!1,this._targetRay.linearVelocity=new Ki,this._targetRay.hasAngularVelocity=!1,this._targetRay.angularVelocity=new Ki),this._targetRay}getGripSpace(){return null===this._grip&&(this._grip=new nh,this._grip.matrixAutoUpdate=!1,this._grip.visible=!1,this._grip.hasLinearVelocity=!1,this._grip.linearVelocity=new Ki,this._grip.hasAngularVelocity=!1,this._grip.angularVelocity=new Ki),this._grip}dispatchEvent(e){return null!==this._targetRay&&this._targetRay.dispatchEvent(e),null!==this._grip&&this._grip.dispatchEvent(e),null!==this._hand&&this._hand.dispatchEvent(e),this}disconnect(e){return this.dispatchEvent({type:"disconnected",data:e}),null!==this._targetRay&&(this._targetRay.visible=!1),null!==this._grip&&(this._grip.visible=!1),null!==this._hand&&(this._hand.visible=!1),this}update(e,t,i){let n=null,r=null,s=null;const a=this._targetRay,o=this._grip,h=this._hand;if(e&&"visible-blurred"!==t.session.visibilityState)if(null!==a&&(n=t.getPose(e.targetRaySpace,i),null!==n&&(a.matrix.fromArray(n.transform.matrix),a.matrix.decompose(a.position,a.rotation,a.scale),n.linearVelocity?(a.hasLinearVelocity=!0,a.linearVelocity.copy(n.linearVelocity)):a.hasLinearVelocity=!1,n.angularVelocity?(a.hasAngularVelocity=!0,a.angularVelocity.copy(n.angularVelocity)):a.hasAngularVelocity=!1,this.dispatchEvent(rh))),h&&e.hand){s=!0;for(const n of e.hand.values()){const e=t.getJointPose(n,i);if(void 0===h.joints[n.jointName]){const e=new nh;e.matrixAutoUpdate=!1,e.visible=!1,h.joints[n.jointName]=e,h.add(e)}const r=h.joints[n.jointName];null!==e&&(r.matrix.fromArray(e.transform.matrix),r.matrix.decompose(r.position,r.rotation,r.scale),r.jointRadius=e.radius),r.visible=null!==e}const n=h.joints["index-finger-tip"],r=h.joints["thumb-tip"],a=n.position.distanceTo(r.position),o=.02,c=.005;h.inputState.pinching&&a>o+c?(h.inputState.pinching=!1,this.dispatchEvent({type:"pinchend",handedness:e.handedness,target:this})):!h.inputState.pinching&&a<=o-c&&(h.inputState.pinching=!0,this.dispatchEvent({type:"pinchstart",handedness:e.handedness,target:this}))}else null!==o&&e.gripSpace&&(r=t.getPose(e.gripSpace,i),null!==r&&(o.matrix.fromArray(r.transform.matrix),o.matrix.decompose(o.position,o.rotation,o.scale),r.linearVelocity?(o.hasLinearVelocity=!0,o.linearVelocity.copy(r.linearVelocity)):o.hasLinearVelocity=!1,r.angularVelocity?(o.hasAngularVelocity=!0,o.angularVelocity.copy(r.angularVelocity)):o.hasAngularVelocity=!1));return null!==a&&(a.visible=null!==n),null!==o&&(o.visible=null!==r),null!==h&&(h.visible=null!==s),this}}class ah extends Ti{constructor(e,t){super();const i=this,n=e.state;let r=null,s=1,a=null,o="local-floor",h=null,c=null,l=null,u=null,d=null,p=!1,m=null,f=null,g=null,_=null,v=null,y=null;const b=[],x=new Map,w=new hs;w.layers.enable(1),w.viewport=new Xi;const M=new hs;M.layers.enable(2),M.viewport=new Xi;const S=[w,M],T=new ih;T.layers.enable(1),T.layers.enable(2);let C=null,E=null;function A(e){const t=x.get(e.inputSource);t&&t.dispatchEvent({type:e.type,data:e.inputSource})}function I(){x.forEach((function(e,t){e.disconnect(t)})),x.clear(),C=null,E=null,n.bindXRFramebuffer(null),e.setRenderTarget(e.getRenderTarget()),l&&t.deleteFramebuffer(l),m&&t.deleteFramebuffer(m),f&&t.deleteRenderbuffer(f),g&&t.deleteRenderbuffer(g),l=null,m=null,f=null,g=null,d=null,u=null,c=null,r=null,$.stop(),i.isPresenting=!1,i.dispatchEvent({type:"sessionend"})}function R(e){const t=r.inputSources;for(let e=0;e<b.length;e++)x.set(t[e],b[e]);for(let t=0;t<e.removed.length;t++){const i=e.removed[t],n=x.get(i);n&&(n.dispatchEvent({type:"disconnected",data:i}),x.delete(i))}for(let t=0;t<e.added.length;t++){const i=e.added[t],n=x.get(i);n&&n.dispatchEvent({type:"connected",data:i})}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(e){let t=b[e];return void 0===t&&(t=new sh,b[e]=t),t.getTargetRaySpace()},this.getControllerGrip=function(e){let t=b[e];return void 0===t&&(t=new sh,b[e]=t),t.getGripSpace()},this.getHand=function(e){let t=b[e];return void 0===t&&(t=new sh,b[e]=t),t.getHandSpace()},this.setFramebufferScaleFactor=function(e){s=e,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(e){o=e,!0===i.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return a},this.getBaseLayer=function(){return null!==u?u:d},this.getBinding=function(){return c},this.getFrame=function(){return _},this.getSession=function(){return r},this.setSession=async function(e){if(r=e,null!==r){r.addEventListener("select",A),r.addEventListener("selectstart",A),r.addEventListener("selectend",A),r.addEventListener("squeeze",A),r.addEventListener("squeezestart",A),r.addEventListener("squeezeend",A),r.addEventListener("end",I),r.addEventListener("inputsourceschange",R);const e=t.getContextAttributes();if(!0!==e.xrCompatible&&await t.makeXRCompatible(),void 0===r.renderState.layers){const i={antialias:e.antialias,alpha:e.alpha,depth:e.depth,stencil:e.stencil,framebufferScaleFactor:s};d=new XRWebGLLayer(r,t,i),r.updateRenderState({baseLayer:d})}else if(t instanceof WebGLRenderingContext){const i={antialias:!0,alpha:e.alpha,depth:e.depth,stencil:e.stencil,framebufferScaleFactor:s};d=new XRWebGLLayer(r,t,i),r.updateRenderState({layers:[d]})}else{p=e.antialias;let i=null;e.depth&&(y=256,e.stencil&&(y|=1024),v=e.stencil?33306:36096,i=e.stencil?35056:33190);const a={colorFormat:e.alpha?32856:32849,depthFormat:i,scaleFactor:s};c=new XRWebGLBinding(r,t),u=c.createProjectionLayer(a),l=t.createFramebuffer(),r.updateRenderState({layers:[u]}),p&&(m=t.createFramebuffer(),f=t.createRenderbuffer(),t.bindRenderbuffer(36161,f),t.renderbufferStorageMultisample(36161,4,32856,u.textureWidth,u.textureHeight),n.bindFramebuffer(36160,m),t.framebufferRenderbuffer(36160,36064,36161,f),t.bindRenderbuffer(36161,null),null!==i&&(g=t.createRenderbuffer(),t.bindRenderbuffer(36161,g),t.renderbufferStorageMultisample(36161,4,i,u.textureWidth,u.textureHeight),t.framebufferRenderbuffer(36160,v,36161,g),t.bindRenderbuffer(36161,null)),n.bindFramebuffer(36160,null))}a=await r.requestReferenceSpace(o),$.setContext(r),$.start(),i.isPresenting=!0,i.dispatchEvent({type:"sessionstart"})}};const P=new Ki,L=new Ki;function D(e,t){null===t?e.matrixWorld.copy(e.matrix):e.matrixWorld.multiplyMatrices(t.matrixWorld,e.matrix),e.matrixWorldInverse.copy(e.matrixWorld).invert()}this.updateCamera=function(e){if(null===r)return;T.near=M.near=w.near=e.near,T.far=M.far=w.far=e.far,C===T.near&&E===T.far||(r.updateRenderState({depthNear:T.near,depthFar:T.far}),C=T.near,E=T.far);const t=e.parent,i=T.cameras;D(T,t);for(let e=0;e<i.length;e++)D(i[e],t);T.matrixWorld.decompose(T.position,T.quaternion,T.scale),e.position.copy(T.position),e.quaternion.copy(T.quaternion),e.scale.copy(T.scale),e.matrix.copy(T.matrix),e.matrixWorld.copy(T.matrixWorld);const n=e.children;for(let e=0,t=n.length;e<t;e++)n[e].updateMatrixWorld(!0);2===i.length?function(e,t,i){P.setFromMatrixPosition(t.matrixWorld),L.setFromMatrixPosition(i.matrixWorld);const n=P.distanceTo(L),r=t.projectionMatrix.elements,s=i.projectionMatrix.elements,a=r[14]/(r[10]-1),o=r[14]/(r[10]+1),h=(r[9]+1)/r[5],c=(r[9]-1)/r[5],l=(r[8]-1)/r[0],u=(s[8]+1)/s[0],d=a*l,p=a*u,m=n/(-l+u),f=m*-l;t.matrixWorld.decompose(e.position,e.quaternion,e.scale),e.translateX(f),e.translateZ(m),e.matrixWorld.compose(e.position,e.quaternion,e.scale),e.matrixWorldInverse.copy(e.matrixWorld).invert();const g=a+m,_=o+m,v=d-f,y=p+(n-f),b=h*o/_*g,x=c*o/_*g;e.projectionMatrix.makePerspective(v,y,b,x,g,_)}(T,w,M):T.projectionMatrix.copy(w.projectionMatrix)},this.getCamera=function(){return T},this.getFoveation=function(){return null!==u?u.fixedFoveation:null!==d?d.fixedFoveation:void 0},this.setFoveation=function(e){null!==u&&(u.fixedFoveation=e),null!==d&&void 0!==d.fixedFoveation&&(d.fixedFoveation=e)};let N=null;const $=new bs;$.setAnimationLoop((function(e,i){if(h=i.getViewerPose(a),_=i,null!==h){const e=h.views;null!==d&&n.bindXRFramebuffer(d.framebuffer);let i=!1;e.length!==T.cameras.length&&(T.cameras.length=0,i=!0);for(let r=0;r<e.length;r++){const s=e[r];let a=null;if(null!==d)a=d.getViewport(s);else{const e=c.getViewSubImage(u,s);n.bindXRFramebuffer(l),void 0!==e.depthStencilTexture&&t.framebufferTexture2D(36160,v,3553,e.depthStencilTexture,0),t.framebufferTexture2D(36160,36064,3553,e.colorTexture,0),a=e.viewport}const o=S[r];o.matrix.fromArray(s.transform.matrix),o.projectionMatrix.fromArray(s.projectionMatrix),o.viewport.set(a.x,a.y,a.width,a.height),0===r&&T.matrix.copy(o.matrix),!0===i&&T.cameras.push(o)}p&&(n.bindXRFramebuffer(m),null!==y&&t.clear(y))}const s=r.inputSources;for(let e=0;e<b.length;e++){const t=b[e],n=s[e];t.update(n,i,a)}if(N&&N(e,i),p){const e=u.textureWidth,i=u.textureHeight;n.bindFramebuffer(36008,m),n.bindFramebuffer(36009,l),t.invalidateFramebuffer(36008,[v]),t.invalidateFramebuffer(36009,[v]),t.blitFramebuffer(0,0,e,i,0,0,e,i,16384,9728),t.invalidateFramebuffer(36008,[36064]),n.bindFramebuffer(36008,null),n.bindFramebuffer(36009,null),n.bindFramebuffer(36160,m)}_=null})),this.setAnimationLoop=function(e){N=e},this.dispose=function(){}}}function oh(e){function t(t,i){t.opacity.value=i.opacity,i.color&&t.diffuse.value.copy(i.color),i.emissive&&t.emissive.value.copy(i.emissive).multiplyScalar(i.emissiveIntensity),i.map&&(t.map.value=i.map),i.alphaMap&&(t.alphaMap.value=i.alphaMap),i.specularMap&&(t.specularMap.value=i.specularMap),i.alphaTest>0&&(t.alphaTest.value=i.alphaTest);const n=e.get(i).envMap;if(n){t.envMap.value=n,t.flipEnvMap.value=n.isCubeTexture&&!1===n.isRenderTargetTexture?-1:1,t.reflectivity.value=i.reflectivity,t.ior.value=i.ior,t.refractionRatio.value=i.refractionRatio;const r=e.get(n).__maxMipLevel;void 0!==r&&(t.maxMipLevel.value=r)}let r,s;i.lightMap&&(t.lightMap.value=i.lightMap,t.lightMapIntensity.value=i.lightMapIntensity),i.aoMap&&(t.aoMap.value=i.aoMap,t.aoMapIntensity.value=i.aoMapIntensity),i.map?r=i.map:i.specularMap?r=i.specularMap:i.displacementMap?r=i.displacementMap:i.normalMap?r=i.normalMap:i.bumpMap?r=i.bumpMap:i.roughnessMap?r=i.roughnessMap:i.metalnessMap?r=i.metalnessMap:i.alphaMap?r=i.alphaMap:i.emissiveMap?r=i.emissiveMap:i.clearcoatMap?r=i.clearcoatMap:i.clearcoatNormalMap?r=i.clearcoatNormalMap:i.clearcoatRoughnessMap?r=i.clearcoatRoughnessMap:i.specularIntensityMap?r=i.specularIntensityMap:i.specularColorMap?r=i.specularColorMap:i.transmissionMap?r=i.transmissionMap:i.thicknessMap?r=i.thicknessMap:i.sheenColorMap?r=i.sheenColorMap:i.sheenRoughnessMap&&(r=i.sheenRoughnessMap),void 0!==r&&(r.isWebGLRenderTarget&&(r=r.texture),!0===r.matrixAutoUpdate&&r.updateMatrix(),t.uvTransform.value.copy(r.matrix)),i.aoMap?s=i.aoMap:i.lightMap&&(s=i.lightMap),void 0!==s&&(s.isWebGLRenderTarget&&(s=s.texture),!0===s.matrixAutoUpdate&&s.updateMatrix(),t.uv2Transform.value.copy(s.matrix))}function i(t,i){t.roughness.value=i.roughness,t.metalness.value=i.metalness,i.roughnessMap&&(t.roughnessMap.value=i.roughnessMap),i.metalnessMap&&(t.metalnessMap.value=i.metalnessMap),i.emissiveMap&&(t.emissiveMap.value=i.emissiveMap),i.bumpMap&&(t.bumpMap.value=i.bumpMap,t.bumpScale.value=i.bumpScale,1===i.side&&(t.bumpScale.value*=-1)),i.normalMap&&(t.normalMap.value=i.normalMap,t.normalScale.value.copy(i.normalScale),1===i.side&&t.normalScale.value.negate()),i.displacementMap&&(t.displacementMap.value=i.displacementMap,t.displacementScale.value=i.displacementScale,t.displacementBias.value=i.displacementBias);e.get(i).envMap&&(t.envMapIntensity.value=i.envMapIntensity)}return{refreshFogUniforms:function(e,t){e.fogColor.value.copy(t.color),t.isFog?(e.fogNear.value=t.near,e.fogFar.value=t.far):t.isFogExp2&&(e.fogDensity.value=t.density)},refreshMaterialUniforms:function(e,n,r,s,a){n.isMeshBasicMaterial?t(e,n):n.isMeshLambertMaterial?(t(e,n),function(e,t){t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap)}(e,n)):n.isMeshToonMaterial?(t(e,n),function(e,t){t.gradientMap&&(e.gradientMap.value=t.gradientMap);t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshPhongMaterial?(t(e,n),function(e,t){e.specular.value.copy(t.specular),e.shininess.value=Math.max(t.shininess,1e-4),t.emissiveMap&&(e.emissiveMap.value=t.emissiveMap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshStandardMaterial?(t(e,n),n.isMeshPhysicalMaterial?function(e,t,n){i(e,t),e.ior.value=t.ior,t.sheen>0&&(e.sheenColor.value.copy(t.sheenColor).multiplyScalar(t.sheen),e.sheenRoughness.value=t.sheenRoughness,t.sheenColorMap&&(e.sheenColorMap.value=t.sheenColorMap),t.sheenRoughnessMap&&(e.sheenRoughnessMap.value=t.sheenRoughnessMap));t.clearcoat>0&&(e.clearcoat.value=t.clearcoat,e.clearcoatRoughness.value=t.clearcoatRoughness,t.clearcoatMap&&(e.clearcoatMap.value=t.clearcoatMap),t.clearcoatRoughnessMap&&(e.clearcoatRoughnessMap.value=t.clearcoatRoughnessMap),t.clearcoatNormalMap&&(e.clearcoatNormalScale.value.copy(t.clearcoatNormalScale),e.clearcoatNormalMap.value=t.clearcoatNormalMap,1===t.side&&e.clearcoatNormalScale.value.negate()));t.transmission>0&&(e.transmission.value=t.transmission,e.transmissionSamplerMap.value=n.texture,e.transmissionSamplerSize.value.set(n.width,n.height),t.transmissionMap&&(e.transmissionMap.value=t.transmissionMap),e.thickness.value=t.thickness,t.thicknessMap&&(e.thicknessMap.value=t.thicknessMap),e.attenuationDistance.value=t.attenuationDistance,e.attenuationColor.value.copy(t.attenuationColor));e.specularIntensity.value=t.specularIntensity,e.specularColor.value.copy(t.specularColor),t.specularIntensityMap&&(e.specularIntensityMap.value=t.specularIntensityMap);t.specularColorMap&&(e.specularColorMap.value=t.specularColorMap)}(e,n,a):i(e,n)):n.isMeshMatcapMaterial?(t(e,n),function(e,t){t.matcap&&(e.matcap.value=t.matcap);t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshDepthMaterial?(t(e,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isMeshDistanceMaterial?(t(e,n),function(e,t){t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias);e.referencePosition.value.copy(t.referencePosition),e.nearDistance.value=t.nearDistance,e.farDistance.value=t.farDistance}(e,n)):n.isMeshNormalMaterial?(t(e,n),function(e,t){t.bumpMap&&(e.bumpMap.value=t.bumpMap,e.bumpScale.value=t.bumpScale,1===t.side&&(e.bumpScale.value*=-1));t.normalMap&&(e.normalMap.value=t.normalMap,e.normalScale.value.copy(t.normalScale),1===t.side&&e.normalScale.value.negate());t.displacementMap&&(e.displacementMap.value=t.displacementMap,e.displacementScale.value=t.displacementScale,e.displacementBias.value=t.displacementBias)}(e,n)):n.isLineBasicMaterial?(function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity}(e,n),n.isLineDashedMaterial&&function(e,t){e.dashSize.value=t.dashSize,e.totalSize.value=t.dashSize+t.gapSize,e.scale.value=t.scale}(e,n)):n.isPointsMaterial?function(e,t,i,n){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.size.value=t.size*i,e.scale.value=.5*n,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);t.alphaTest>0&&(e.alphaTest.value=t.alphaTest);let r;t.map?r=t.map:t.alphaMap&&(r=t.alphaMap);void 0!==r&&(!0===r.matrixAutoUpdate&&r.updateMatrix(),e.uvTransform.value.copy(r.matrix))}(e,n,r,s):n.isSpriteMaterial?function(e,t){e.diffuse.value.copy(t.color),e.opacity.value=t.opacity,e.rotation.value=t.rotation,t.map&&(e.map.value=t.map);t.alphaMap&&(e.alphaMap.value=t.alphaMap);t.alphaTest>0&&(e.alphaTest.value=t.alphaTest);let i;t.map?i=t.map:t.alphaMap&&(i=t.alphaMap);void 0!==i&&(!0===i.matrixAutoUpdate&&i.updateMatrix(),e.uvTransform.value.copy(i.matrix))}(e,n):n.isShadowMaterial?(e.color.value.copy(n.color),e.opacity.value=n.opacity):n.isShaderMaterial&&(n.uniformsNeedUpdate=!1)}}}function hh(e={}){const t=void 0!==e.canvas?e.canvas:function(){const e=Ui("canvas");return e.style.display="block",e}(),i=void 0!==e.context?e.context:null,n=void 0!==e.alpha&&e.alpha,r=void 0===e.depth||e.depth,s=void 0===e.stencil||e.stencil,a=void 0!==e.antialias&&e.antialias,o=void 0===e.premultipliedAlpha||e.premultipliedAlpha,h=void 0!==e.preserveDrawingBuffer&&e.preserveDrawingBuffer,c=void 0!==e.powerPreference?e.powerPreference:"default",l=void 0!==e.failIfMajorPerformanceCaveat&&e.failIfMajorPerformanceCaveat;let u=null,d=null;const p=[],m=[];this.domElement=t,this.debug={checkShaderErrors:!0},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.gammaFactor=2,this.outputEncoding=_i,this.physicallyCorrectLights=!1,this.toneMapping=0,this.toneMappingExposure=1;const f=this;let g=!1,_=0,v=0,y=null,b=-1,x=null;const w=new Xi,M=new Xi;let S=null,T=t.width,C=t.height,E=1,A=null,I=null;const R=new Xi(0,0,T,C),P=new Xi(0,0,T,C);let L=!1;const D=[],N=new ys;let $=!1,k=!1,O=null;const z=new Rn,F=new Ki,B={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};function U(){return null===y?E:1}let V,H,j,G,W,q,X,Z,Y,J,K,Q,ee,te,ie,ne,re,se,ae,oe,he,ce,le,ue=i;function de(e,i){for(let n=0;n<e.length;n++){const r=e[n],s=t.getContext(r,i);if(null!==s)return s}return null}try{const e={alpha:n,depth:r,stencil:s,antialias:a,premultipliedAlpha:o,preserveDrawingBuffer:h,powerPreference:c,failIfMajorPerformanceCaveat:l};if(t.addEventListener("webglcontextlost",fe,!1),t.addEventListener("webglcontextrestored",ge,!1),null===ue){const t=["webgl2","webgl","experimental-webgl"];if(!0===f.isWebGL1Renderer&&t.shift(),ue=de(t,e),null===ue)throw de(t)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}void 0===ue.getShaderPrecisionFormat&&(ue.getShaderPrecisionFormat=function(){return{rangeMin:1,rangeMax:1,precision:1}})}catch(e){throw console.error("THREE.WebGLRenderer: "+e.message),e}function pe(){V=new ra(ue),H=new Is(ue,V,e),V.init(H),ce=new th(ue,V,H),j=new Qo(ue,V,H),D[0]=1029,G=new oa(ue),W=new Fo,q=new eh(ue,V,j,W,H,ce,G),X=new Ps(f),Z=new na(f),Y=new xs(ue,H),le=new Es(ue,V,Y,H),J=new sa(ue,Y,G,le),K=new pa(ue,J,Y,G),ae=new da(ue,H,q),ne=new Rs(W),Q=new zo(f,X,Z,V,H,le,ne),ee=new oh(W),te=new Ho(W),ie=new Zo(V,H),se=new Cs(f,X,j,K,o),re=new Ko(f,K,H),oe=new As(ue,V,G,H),he=new aa(ue,V,G,H),G.programs=Q.programs,f.capabilities=H,f.extensions=V,f.properties=W,f.renderLists=te,f.shadowMap=re,f.state=j,f.info=G}pe();const me=new ah(f,ue);function fe(e){e.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),g=!0}function ge(){console.log("THREE.WebGLRenderer: Context Restored."),g=!1;const e=G.autoReset,t=re.enabled,i=re.autoUpdate,n=re.needsUpdate,r=re.type;pe(),G.autoReset=e,re.enabled=t,re.autoUpdate=i,re.needsUpdate=n,re.type=r}function _e(e){const t=e.target;t.removeEventListener("dispose",_e),function(e){(function(e){const t=W.get(e).programs;void 0!==t&&t.forEach((function(e){Q.releaseProgram(e)}))})(e),W.remove(e)}(t)}this.xr=me,this.getContext=function(){return ue},this.getContextAttributes=function(){return ue.getContextAttributes()},this.forceContextLoss=function(){const e=V.get("WEBGL_lose_context");e&&e.loseContext()},this.forceContextRestore=function(){const e=V.get("WEBGL_lose_context");e&&e.restoreContext()},this.getPixelRatio=function(){return E},this.setPixelRatio=function(e){void 0!==e&&(E=e,this.setSize(T,C,!1))},this.getSize=function(e){return e.set(T,C)},this.setSize=function(e,i,n){me.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(T=e,C=i,t.width=Math.floor(e*E),t.height=Math.floor(i*E),!1!==n&&(t.style.width=e+"px",t.style.height=i+"px"),this.setViewport(0,0,e,i))},this.getDrawingBufferSize=function(e){return e.set(T*E,C*E).floor()},this.setDrawingBufferSize=function(e,i,n){T=e,C=i,E=n,t.width=Math.floor(e*n),t.height=Math.floor(i*n),this.setViewport(0,0,e,i)},this.getCurrentViewport=function(e){return e.copy(w)},this.getViewport=function(e){return e.copy(R)},this.setViewport=function(e,t,i,n){e.isVector4?R.set(e.x,e.y,e.z,e.w):R.set(e,t,i,n),j.viewport(w.copy(R).multiplyScalar(E).floor())},this.getScissor=function(e){return e.copy(P)},this.setScissor=function(e,t,i,n){e.isVector4?P.set(e.x,e.y,e.z,e.w):P.set(e,t,i,n),j.scissor(M.copy(P).multiplyScalar(E).floor())},this.getScissorTest=function(){return L},this.setScissorTest=function(e){j.setScissorTest(L=e)},this.setOpaqueSort=function(e){A=e},this.setTransparentSort=function(e){I=e},this.getClearColor=function(e){return e.copy(se.getClearColor())},this.setClearColor=function(){se.setClearColor.apply(se,arguments)},this.getClearAlpha=function(){return se.getClearAlpha()},this.setClearAlpha=function(){se.setClearAlpha.apply(se,arguments)},this.clear=function(e,t,i){let n=0;(void 0===e||e)&&(n|=16384),(void 0===t||t)&&(n|=256),(void 0===i||i)&&(n|=1024),ue.clear(n)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){t.removeEventListener("webglcontextlost",fe,!1),t.removeEventListener("webglcontextrestored",ge,!1),te.dispose(),ie.dispose(),W.dispose(),X.dispose(),Z.dispose(),K.dispose(),le.dispose(),me.dispose(),me.removeEventListener("sessionstart",ye),me.removeEventListener("sessionend",be),O&&(O.dispose(),O=null),xe.stop()},this.renderBufferDirect=function(e,t,i,n,r,s){null===t&&(t=B);const a=r.isMesh&&r.matrixWorld.determinant()<0,o=function(e,t,i,n,r){!0!==t.isScene&&(t=B);q.resetTextureUnits();const s=t.fog,a=n.isMeshStandardMaterial?t.environment:null,o=null===y?f.outputEncoding:y.texture.encoding,h=(n.isMeshStandardMaterial?Z:X).get(n.envMap||a),c=!0===n.vertexColors&&!!i.attributes.color&&4===i.attributes.color.itemSize,l=!!n.normalMap&&!!i.attributes.tangent,u=!!i.morphAttributes.position,p=!!i.morphAttributes.normal,m=i.morphAttributes.position?i.morphAttributes.position.length:0,g=W.get(n),_=d.state.lights;if(!0===$&&(!0===k||e!==x)){const t=e===x&&n.id===b;ne.setState(n,e,t)}let v=!1;n.version===g.__version?g.needsLights&&g.lightsStateVersion!==_.state.version||g.outputEncoding!==o||r.isInstancedMesh&&!1===g.instancing?v=!0:r.isInstancedMesh||!0!==g.instancing?r.isSkinnedMesh&&!1===g.skinning?v=!0:r.isSkinnedMesh||!0!==g.skinning?g.envMap!==h||n.fog&&g.fog!==s?v=!0:void 0===g.numClippingPlanes||g.numClippingPlanes===ne.numPlanes&&g.numIntersection===ne.numIntersection?(g.vertexAlphas!==c||g.vertexTangents!==l||g.morphTargets!==u||g.morphNormals!==p||!0===H.isWebGL2&&g.morphTargetsCount!==m)&&(v=!0):v=!0:v=!0:v=!0:(v=!0,g.__version=n.version);let w=g.currentProgram;!0===v&&(w=Ce(n,t,r));let M=!1,S=!1,T=!1;const A=w.getUniforms(),I=g.uniforms;j.useProgram(w.program)&&(M=!0,S=!0,T=!0);n.id!==b&&(b=n.id,S=!0);if(M||x!==e){if(A.setValue(ue,"projectionMatrix",e.projectionMatrix),H.logarithmicDepthBuffer&&A.setValue(ue,"logDepthBufFC",2/(Math.log(e.far+1)/Math.LN2)),x!==e&&(x=e,S=!0,T=!0),n.isShaderMaterial||n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshStandardMaterial||n.envMap){const t=A.map.cameraPosition;void 0!==t&&t.setValue(ue,F.setFromMatrixPosition(e.matrixWorld))}(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial)&&A.setValue(ue,"isOrthographic",!0===e.isOrthographicCamera),(n.isMeshPhongMaterial||n.isMeshToonMaterial||n.isMeshLambertMaterial||n.isMeshBasicMaterial||n.isMeshStandardMaterial||n.isShaderMaterial||n.isShadowMaterial||r.isSkinnedMesh)&&A.setValue(ue,"viewMatrix",e.matrixWorldInverse)}if(r.isSkinnedMesh){A.setOptional(ue,r,"bindMatrix"),A.setOptional(ue,r,"bindMatrixInverse");const e=r.skeleton;e&&(H.floatVertexTextures?(null===e.boneTexture&&e.computeBoneTexture(),A.setValue(ue,"boneTexture",e.boneTexture,q),A.setValue(ue,"boneTextureSize",e.boneTextureSize)):A.setOptional(ue,e,"boneMatrices"))}!i||void 0===i.morphAttributes.position&&void 0===i.morphAttributes.normal||ae.update(r,i,n,w);(S||g.receiveShadow!==r.receiveShadow)&&(g.receiveShadow=r.receiveShadow,A.setValue(ue,"receiveShadow",r.receiveShadow));S&&(A.setValue(ue,"toneMappingExposure",f.toneMappingExposure),g.needsLights&&(P=T,(R=I).ambientLightColor.needsUpdate=P,R.lightProbe.needsUpdate=P,R.directionalLights.needsUpdate=P,R.directionalLightShadows.needsUpdate=P,R.pointLights.needsUpdate=P,R.pointLightShadows.needsUpdate=P,R.spotLights.needsUpdate=P,R.spotLightShadows.needsUpdate=P,R.rectAreaLights.needsUpdate=P,R.hemisphereLights.needsUpdate=P),s&&n.fog&&ee.refreshFogUniforms(I,s),ee.refreshMaterialUniforms(I,n,E,C,O),_o.upload(ue,g.uniformsList,I,q));var R,P;n.isShaderMaterial&&!0===n.uniformsNeedUpdate&&(_o.upload(ue,g.uniformsList,I,q),n.uniformsNeedUpdate=!1);n.isSpriteMaterial&&A.setValue(ue,"center",r.center);return A.setValue(ue,"modelViewMatrix",r.modelViewMatrix),A.setValue(ue,"normalMatrix",r.normalMatrix),A.setValue(ue,"modelMatrix",r.matrixWorld),w}(e,t,i,n,r);j.setMaterial(n,a);let h=i.index;const c=i.attributes.position;if(null===h){if(void 0===c||0===c.count)return}else if(0===h.count)return;let l,u=1;!0===n.wireframe&&(h=J.getWireframeAttribute(i),u=2),le.setup(r,n,o,i,h);let p=oe;null!==h&&(l=Y.get(h),p=he,p.setIndex(l));const m=null!==h?h.count:c.count,g=i.drawRange.start*u,_=i.drawRange.count*u,v=null!==s?s.start*u:0,w=null!==s?s.count*u:1/0,M=Math.max(g,v),S=Math.min(m,g+_,v+w)-1,T=Math.max(0,S-M+1);if(0!==T){if(r.isMesh)!0===n.wireframe?(j.setLineWidth(n.wireframeLinewidth*U()),p.setMode(1)):p.setMode(4);else if(r.isLine){let e=n.linewidth;void 0===e&&(e=1),j.setLineWidth(e*U()),r.isLineSegments?p.setMode(1):r.isLineLoop?p.setMode(2):p.setMode(3)}else r.isPoints?p.setMode(0):r.isSprite&&p.setMode(4);if(r.isInstancedMesh)p.renderInstances(M,T,r.count);else if(i.isInstancedBufferGeometry){const e=Math.min(i.instanceCount,i._maxInstanceCount);p.renderInstances(M,T,e)}else p.render(M,T)}},this.compile=function(e,t){d=ie.get(e),d.init(),m.push(d),e.traverseVisible((function(e){e.isLight&&e.layers.test(t.layers)&&(d.pushLight(e),e.castShadow&&d.pushShadow(e))})),d.setupLights(f.physicallyCorrectLights),e.traverse((function(t){const i=t.material;if(i)if(Array.isArray(i))for(let n=0;n<i.length;n++){Ce(i[n],e,t)}else Ce(i,e,t)})),m.pop(),d=null};let ve=null;function ye(){xe.stop()}function be(){xe.start()}const xe=new bs;function we(e,t,i,n){if(!1===e.visible)return;if(e.layers.test(t.layers))if(e.isGroup)i=e.renderOrder;else if(e.isLOD)!0===e.autoUpdate&&e.update(t);else if(e.isLight)d.pushLight(e),e.castShadow&&d.pushShadow(e);else if(e.isSprite){if(!e.frustumCulled||N.intersectsSprite(e)){n&&F.setFromMatrixPosition(e.matrixWorld).applyMatrix4(z);const t=K.update(e),r=e.material;r.visible&&u.push(e,t,r,i,F.z,null)}}else if((e.isMesh||e.isLine||e.isPoints)&&(e.isSkinnedMesh&&e.skeleton.frame!==G.render.frame&&(e.skeleton.update(),e.skeleton.frame=G.render.frame),!e.frustumCulled||N.intersectsObject(e))){n&&F.setFromMatrixPosition(e.matrixWorld).applyMatrix4(z);const t=K.update(e),r=e.material;if(Array.isArray(r)){const n=t.groups;for(let s=0,a=n.length;s<a;s++){const a=n[s],o=r[a.materialIndex];o&&o.visible&&u.push(e,t,o,i,F.z,a)}}else r.visible&&u.push(e,t,r,i,F.z,null)}const r=e.children;for(let e=0,s=r.length;e<s;e++)we(r[e],t,i,n)}function Me(e,t,i,n){const r=e.opaque,s=e.transmissive,o=e.transparent;d.setupLightsView(i),s.length>0&&function(e,t,i){if(null===O){const e=!0===a&&!0===H.isWebGL2;O=new(e?Yi:Zi)(1024,1024,{generateMipmaps:!0,type:null!==ce.convert(ri)?ri:ei,minFilter:Qt,magFilter:Jt,wrapS:Zt,wrapT:Zt})}const n=f.getRenderTarget();f.setRenderTarget(O),f.clear();const r=f.toneMapping;f.toneMapping=0,Se(e,t,i),f.toneMapping=r,q.updateMultisampleRenderTarget(O),q.updateRenderTargetMipmap(O),f.setRenderTarget(n)}(r,t,i),n&&j.viewport(w.copy(n)),r.length>0&&Se(r,t,i),s.length>0&&Se(s,t,i),o.length>0&&Se(o,t,i)}function Se(e,t,i){const n=!0===t.isScene?t.overrideMaterial:null;for(let r=0,s=e.length;r<s;r++){const s=e[r],a=s.object,o=s.geometry,h=null===n?s.material:n,c=s.group;a.layers.test(i.layers)&&Te(a,t,i,o,h,c)}}function Te(e,t,i,n,r,s){e.onBeforeRender(f,t,i,n,r,s),e.modelViewMatrix.multiplyMatrices(i.matrixWorldInverse,e.matrixWorld),e.normalMatrix.getNormalMatrix(e.modelViewMatrix),r.onBeforeRender(f,t,i,n,e,s),!0===r.transparent&&2===r.side?(r.side=1,r.needsUpdate=!0,f.renderBufferDirect(i,t,n,r,e,s),r.side=0,r.needsUpdate=!0,f.renderBufferDirect(i,t,n,r,e,s),r.side=2):f.renderBufferDirect(i,t,n,r,e,s),e.onAfterRender(f,t,i,n,r,s)}function Ce(e,t,i){!0!==t.isScene&&(t=B);const n=W.get(e),r=d.state.lights,s=d.state.shadowsArray,a=r.state.version,o=Q.getParameters(e,r.state,s,t,i),h=Q.getProgramCacheKey(o);let c=n.programs;n.environment=e.isMeshStandardMaterial?t.environment:null,n.fog=t.fog,n.envMap=(e.isMeshStandardMaterial?Z:X).get(e.envMap||n.environment),void 0===c&&(e.addEventListener("dispose",_e),c=new Map,n.programs=c);let l=c.get(h);if(void 0!==l){if(n.currentProgram===l&&n.lightsStateVersion===a)return Ee(e,o),l}else o.uniforms=Q.getUniforms(e),e.onBuild(i,o,f),e.onBeforeCompile(o,f),l=Q.acquireProgram(o,h),c.set(h,l),n.uniforms=o.uniforms;const u=n.uniforms;(e.isShaderMaterial||e.isRawShaderMaterial)&&!0!==e.clipping||(u.clippingPlanes=ne.uniform),Ee(e,o),n.needsLights=function(e){return e.isMeshLambertMaterial||e.isMeshToonMaterial||e.isMeshPhongMaterial||e.isMeshStandardMaterial||e.isShadowMaterial||e.isShaderMaterial&&!0===e.lights}(e),n.lightsStateVersion=a,n.needsLights&&(u.ambientLightColor.value=r.state.ambient,u.lightProbe.value=r.state.probe,u.directionalLights.value=r.state.directional,u.directionalLightShadows.value=r.state.directionalShadow,u.spotLights.value=r.state.spot,u.spotLightShadows.value=r.state.spotShadow,u.rectAreaLights.value=r.state.rectArea,u.ltc_1.value=r.state.rectAreaLTC1,u.ltc_2.value=r.state.rectAreaLTC2,u.pointLights.value=r.state.point,u.pointLightShadows.value=r.state.pointShadow,u.hemisphereLights.value=r.state.hemi,u.directionalShadowMap.value=r.state.directionalShadowMap,u.directionalShadowMatrix.value=r.state.directionalShadowMatrix,u.spotShadowMap.value=r.state.spotShadowMap,u.spotShadowMatrix.value=r.state.spotShadowMatrix,u.pointShadowMap.value=r.state.pointShadowMap,u.pointShadowMatrix.value=r.state.pointShadowMatrix);const p=l.getUniforms(),m=_o.seqWithValue(p.seq,u);return n.currentProgram=l,n.uniformsList=m,l}function Ee(e,t){const i=W.get(e);i.outputEncoding=t.outputEncoding,i.instancing=t.instancing,i.skinning=t.skinning,i.morphTargets=t.morphTargets,i.morphNormals=t.morphNormals,i.morphTargetsCount=t.morphTargetsCount,i.numClippingPlanes=t.numClippingPlanes,i.numIntersection=t.numClipIntersection,i.vertexAlphas=t.vertexAlphas,i.vertexTangents=t.vertexTangents}xe.setAnimationLoop((function(e){ve&&ve(e)})),"undefined"!=typeof window&&xe.setContext(window),this.setAnimationLoop=function(e){ve=e,me.setAnimationLoop(e),null===e?xe.stop():xe.start()},me.addEventListener("sessionstart",ye),me.addEventListener("sessionend",be),this.render=function(e,t){if(void 0!==t&&!0!==t.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===g)return;!0===e.autoUpdate&&e.updateMatrixWorld(),null===t.parent&&t.updateMatrixWorld(),!0===me.enabled&&!0===me.isPresenting&&(!0===me.cameraAutoUpdate&&me.updateCamera(t),t=me.getCamera()),!0===e.isScene&&e.onBeforeRender(f,e,t,y),d=ie.get(e,m.length),d.init(),m.push(d),z.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),N.setFromProjectionMatrix(z),k=this.localClippingEnabled,$=ne.init(this.clippingPlanes,k,t),u=te.get(e,p.length),u.init(),p.push(u),we(e,t,0,f.sortObjects),u.finish(),!0===f.sortObjects&&u.sort(A,I),!0===$&&ne.beginShadows();const i=d.state.shadowsArray;if(re.render(i,e,t),!0===$&&ne.endShadows(),!0===this.info.autoReset&&this.info.reset(),se.render(u,e),d.setupLights(f.physicallyCorrectLights),t.isArrayCamera){const i=t.cameras;for(let t=0,n=i.length;t<n;t++){const n=i[t];Me(u,e,n,n.viewport)}}else Me(u,e,t);null!==y&&(q.updateMultisampleRenderTarget(y),q.updateRenderTargetMipmap(y)),!0===e.isScene&&e.onAfterRender(f,e,t),j.buffers.depth.setTest(!0),j.buffers.depth.setMask(!0),j.buffers.color.setMask(!0),j.setPolygonOffset(!1),le.resetDefaultState(),b=-1,x=null,m.pop(),d=m.length>0?m[m.length-1]:null,p.pop(),u=p.length>0?p[p.length-1]:null},this.getActiveCubeFace=function(){return _},this.getActiveMipmapLevel=function(){return v},this.getRenderTarget=function(){return y},this.setRenderTarget=function(e,t=0,i=0){y=e,_=t,v=i,e&&void 0===W.get(e).__webglFramebuffer&&q.setupRenderTarget(e);let n=null,r=!1,s=!1;if(e){const i=e.texture;(i.isDataTexture3D||i.isDataTexture2DArray)&&(s=!0);const a=W.get(e).__webglFramebuffer;e.isWebGLCubeRenderTarget?(n=a[t],r=!0):n=e.isWebGLMultisampleRenderTarget?W.get(e).__webglMultisampledFramebuffer:a,w.copy(e.viewport),M.copy(e.scissor),S=e.scissorTest}else w.copy(R).multiplyScalar(E).floor(),M.copy(P).multiplyScalar(E).floor(),S=L;if(j.bindFramebuffer(36160,n)&&H.drawBuffers){let t=!1;if(e)if(e.isWebGLMultipleRenderTargets){const i=e.texture;if(D.length!==i.length||36064!==D[0]){for(let e=0,t=i.length;e<t;e++)D[e]=36064+e;D.length=i.length,t=!0}}else 1===D.length&&36064===D[0]||(D[0]=36064,D.length=1,t=!0);else 1===D.length&&1029===D[0]||(D[0]=1029,D.length=1,t=!0);t&&(H.isWebGL2?ue.drawBuffers(D):V.get("WEBGL_draw_buffers").drawBuffersWEBGL(D))}if(j.viewport(w),j.scissor(M),j.setScissorTest(S),r){const n=W.get(e.texture);ue.framebufferTexture2D(36160,36064,34069+t,n.__webglTexture,i)}else if(s){const n=W.get(e.texture),r=t||0;ue.framebufferTextureLayer(36160,36064,n.__webglTexture,i||0,r)}b=-1},this.readRenderTargetPixels=function(e,t,i,n,r,s,a){if(!e||!e.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let o=W.get(e).__webglFramebuffer;if(e.isWebGLCubeRenderTarget&&void 0!==a&&(o=o[a]),o){j.bindFramebuffer(36160,o);try{const a=e.texture,o=a.format,h=a.type;if(o!==oi&&ce.convert(o)!==ue.getParameter(35739))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");const c=h===ri&&(V.has("EXT_color_buffer_half_float")||H.isWebGL2&&V.has("EXT_color_buffer_float"));if(!(h===ei||ce.convert(h)===ue.getParameter(35738)||h===ni&&(H.isWebGL2||V.has("OES_texture_float")||V.has("WEBGL_color_buffer_float"))||c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");36053===ue.checkFramebufferStatus(36160)?t>=0&&t<=e.width-n&&i>=0&&i<=e.height-r&&ue.readPixels(t,i,n,r,ce.convert(o),ce.convert(h),s):console.error("THREE.WebGLRenderer.readRenderTargetPixels: readPixels from renderTarget failed. Framebuffer not complete.")}finally{const e=null!==y?W.get(y).__webglFramebuffer:null;j.bindFramebuffer(36160,e)}}},this.copyFramebufferToTexture=function(e,t,i=0){const n=Math.pow(2,-i),r=Math.floor(t.image.width*n),s=Math.floor(t.image.height*n);let a=ce.convert(t.format);H.isWebGL2&&(6407===a&&(a=32849),6408===a&&(a=32856)),q.setTexture2D(t,0),ue.copyTexImage2D(3553,i,a,e.x,e.y,r,s,0),j.unbindTexture()},this.copyTextureToTexture=function(e,t,i,n=0){const r=t.image.width,s=t.image.height,a=ce.convert(i.format),o=ce.convert(i.type);q.setTexture2D(i,0),ue.pixelStorei(37440,i.flipY),ue.pixelStorei(37441,i.premultiplyAlpha),ue.pixelStorei(3317,i.unpackAlignment),t.isDataTexture?ue.texSubImage2D(3553,n,e.x,e.y,r,s,a,o,t.image.data):t.isCompressedTexture?ue.compressedTexSubImage2D(3553,n,e.x,e.y,t.mipmaps[0].width,t.mipmaps[0].height,a,t.mipmaps[0].data):ue.texSubImage2D(3553,n,e.x,e.y,a,o,t.image),0===n&&i.generateMipmaps&&ue.generateMipmap(3553),j.unbindTexture()},this.copyTextureToTexture3D=function(e,t,i,n,r=0){if(f.isWebGL1Renderer)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.");const s=e.max.x-e.min.x+1,a=e.max.y-e.min.y+1,o=e.max.z-e.min.z+1,h=ce.convert(n.format),c=ce.convert(n.type);let l;if(n.isDataTexture3D)q.setTexture3D(n,0),l=32879;else{if(!n.isDataTexture2DArray)return void console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.");q.setTexture2DArray(n,0),l=35866}ue.pixelStorei(37440,n.flipY),ue.pixelStorei(37441,n.premultiplyAlpha),ue.pixelStorei(3317,n.unpackAlignment);const u=ue.getParameter(3314),d=ue.getParameter(32878),p=ue.getParameter(3316),m=ue.getParameter(3315),g=ue.getParameter(32877),_=i.isCompressedTexture?i.mipmaps[0]:i.image;ue.pixelStorei(3314,_.width),ue.pixelStorei(32878,_.height),ue.pixelStorei(3316,e.min.x),ue.pixelStorei(3315,e.min.y),ue.pixelStorei(32877,e.min.z),i.isDataTexture||i.isDataTexture3D?ue.texSubImage3D(l,r,t.x,t.y,t.z,s,a,o,h,c,_.data):i.isCompressedTexture?(console.warn("THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture."),ue.compressedTexSubImage3D(l,r,t.x,t.y,t.z,s,a,o,h,_.data)):ue.texSubImage3D(l,r,t.x,t.y,t.z,s,a,o,h,c,_),ue.pixelStorei(3314,u),ue.pixelStorei(32878,d),ue.pixelStorei(3316,p),ue.pixelStorei(3315,m),ue.pixelStorei(32877,g),0===r&&n.generateMipmaps&&ue.generateMipmap(l),j.unbindTexture()},this.initTexture=function(e){q.setTexture2D(e,0),j.unbindTexture()},this.resetState=function(){_=0,v=0,y=null,j.reset(),le.reset()},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}hh.prototype.isWebGLRenderer=!0;(class extends hh{}).prototype.isWebGL1Renderer=!0;class ch extends tr{constructor(){super(),this.type="Scene",this.background=null,this.environment=null,this.fog=null,this.overrideMaterial=null,this.autoUpdate=!0,"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}copy(e,t){return super.copy(e,t),null!==e.background&&(this.background=e.background.clone()),null!==e.environment&&(this.environment=e.environment.clone()),null!==e.fog&&(this.fog=e.fog.clone()),null!==e.overrideMaterial&&(this.overrideMaterial=e.overrideMaterial.clone()),this.autoUpdate=e.autoUpdate,this.matrixAutoUpdate=e.matrixAutoUpdate,this}toJSON(e){const t=super.toJSON(e);return null!==this.fog&&(t.object.fog=this.fog.toJSON()),t}}ch.prototype.isScene=!0;class lh{constructor(e,t){this.array=e,this.stride=t,this.count=void 0!==e?e.length/t:0,this.usage=wi,this.updateRange={offset:0,count:-1},this.version=0,this.uuid=Pi()}onUploadCallback(){}set needsUpdate(e){!0===e&&this.version++}setUsage(e){return this.usage=e,this}copy(e){return this.array=new e.array.constructor(e.array),this.count=e.count,this.stride=e.stride,this.usage=e.usage,this}copyAt(e,t,i){e*=this.stride,i*=t.stride;for(let n=0,r=this.stride;n<r;n++)this.array[e+n]=t.array[i+n];return this}set(e,t=0){return this.array.set(e,t),this}clone(e){void 0===e.arrayBuffers&&(e.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=Pi()),void 0===e.arrayBuffers[this.array.buffer._uuid]&&(e.arrayBuffers[this.array.buffer._uuid]=this.array.slice(0).buffer);const t=new this.array.constructor(e.arrayBuffers[this.array.buffer._uuid]),i=new this.constructor(t,this.stride);return i.setUsage(this.usage),i}onUpload(e){return this.onUploadCallback=e,this}toJSON(e){return void 0===e.arrayBuffers&&(e.arrayBuffers={}),void 0===this.array.buffer._uuid&&(this.array.buffer._uuid=Pi()),void 0===e.arrayBuffers[this.array.buffer._uuid]&&(e.arrayBuffers[this.array.buffer._uuid]=Array.prototype.slice.call(new Uint32Array(this.array.buffer))),{uuid:this.uuid,buffer:this.array.buffer._uuid,type:this.array.constructor.name,stride:this.stride}}}lh.prototype.isInterleavedBuffer=!0;const uh=new Ki;class dh{constructor(e,t,i,n=!1){this.name="",this.data=e,this.itemSize=t,this.offset=i,this.normalized=!0===n}get count(){return this.data.count}get array(){return this.data.array}set needsUpdate(e){this.data.needsUpdate=e}applyMatrix4(e){for(let t=0,i=this.data.count;t<i;t++)uh.x=this.getX(t),uh.y=this.getY(t),uh.z=this.getZ(t),uh.applyMatrix4(e),this.setXYZ(t,uh.x,uh.y,uh.z);return this}applyNormalMatrix(e){for(let t=0,i=this.count;t<i;t++)uh.x=this.getX(t),uh.y=this.getY(t),uh.z=this.getZ(t),uh.applyNormalMatrix(e),this.setXYZ(t,uh.x,uh.y,uh.z);return this}transformDirection(e){for(let t=0,i=this.count;t<i;t++)uh.x=this.getX(t),uh.y=this.getY(t),uh.z=this.getZ(t),uh.transformDirection(e),this.setXYZ(t,uh.x,uh.y,uh.z);return this}setX(e,t){return this.data.array[e*this.data.stride+this.offset]=t,this}setY(e,t){return this.data.array[e*this.data.stride+this.offset+1]=t,this}setZ(e,t){return this.data.array[e*this.data.stride+this.offset+2]=t,this}setW(e,t){return this.data.array[e*this.data.stride+this.offset+3]=t,this}getX(e){return this.data.array[e*this.data.stride+this.offset]}getY(e){return this.data.array[e*this.data.stride+this.offset+1]}getZ(e){return this.data.array[e*this.data.stride+this.offset+2]}getW(e){return this.data.array[e*this.data.stride+this.offset+3]}setXY(e,t,i){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=i,this}setXYZ(e,t,i,n){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=i,this.data.array[e+2]=n,this}setXYZW(e,t,i,n,r){return e=e*this.data.stride+this.offset,this.data.array[e+0]=t,this.data.array[e+1]=i,this.data.array[e+2]=n,this.data.array[e+3]=r,this}clone(e){if(void 0===e){console.log("THREE.InterleavedBufferAttribute.clone(): Cloning an interlaved buffer attribute will deinterleave buffer data.");const e=[];for(let t=0;t<this.count;t++){const i=t*this.data.stride+this.offset;for(let t=0;t<this.itemSize;t++)e.push(this.data.array[i+t])}return new Tr(new this.array.constructor(e),this.itemSize,this.normalized)}return void 0===e.interleavedBuffers&&(e.interleavedBuffers={}),void 0===e.interleavedBuffers[this.data.uuid]&&(e.interleavedBuffers[this.data.uuid]=this.data.clone(e)),new dh(e.interleavedBuffers[this.data.uuid],this.itemSize,this.offset,this.normalized)}toJSON(e){if(void 0===e){console.log("THREE.InterleavedBufferAttribute.toJSON(): Serializing an interlaved buffer attribute will deinterleave buffer data.");const e=[];for(let t=0;t<this.count;t++){const i=t*this.data.stride+this.offset;for(let t=0;t<this.itemSize;t++)e.push(this.data.array[i+t])}return{itemSize:this.itemSize,type:this.array.constructor.name,array:e,normalized:this.normalized}}return void 0===e.interleavedBuffers&&(e.interleavedBuffers={}),void 0===e.interleavedBuffers[this.data.uuid]&&(e.interleavedBuffers[this.data.uuid]=this.data.toJSON(e)),{isInterleavedBufferAttribute:!0,itemSize:this.itemSize,data:this.data.uuid,offset:this.offset,normalized:this.normalized}}}dh.prototype.isInterleavedBufferAttribute=!0;class ph extends mr{constructor(e){super(),this.type="SpriteMaterial",this.color=new xr(16777215),this.map=null,this.alphaMap=null,this.rotation=0,this.sizeAttenuation=!0,this.transparent=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.rotation=e.rotation,this.sizeAttenuation=e.sizeAttenuation,this}}let mh;ph.prototype.isSpriteMaterial=!0;const fh=new Ki,gh=new Ki,_h=new Ki,vh=new zi,yh=new zi,bh=new Rn,xh=new Ki,wh=new Ki,Mh=new Ki,Sh=new zi,Th=new zi,Ch=new zi;class Eh extends tr{constructor(e){if(super(),this.type="Sprite",void 0===mh){mh=new kr;const e=new Float32Array([-.5,-.5,0,0,0,.5,-.5,0,1,0,.5,.5,0,1,1,-.5,.5,0,0,1]),t=new lh(e,5);mh.setIndex([0,1,2,0,2,3]),mh.setAttribute("position",new dh(t,3,0,!1)),mh.setAttribute("uv",new dh(t,2,3,!1))}this.geometry=mh,this.material=void 0!==e?e:new ph,this.center=new zi(.5,.5)}raycast(e,t){null===e.camera&&console.error('THREE.Sprite: "Raycaster.camera" needs to be set in order to raycast against sprites.'),gh.setFromMatrixScale(this.matrixWorld),bh.copy(e.camera.matrixWorld),this.modelViewMatrix.multiplyMatrices(e.camera.matrixWorldInverse,this.matrixWorld),_h.setFromMatrixPosition(this.modelViewMatrix),e.camera.isPerspectiveCamera&&!1===this.material.sizeAttenuation&&gh.multiplyScalar(-_h.z);const i=this.material.rotation;let n,r;0!==i&&(r=Math.cos(i),n=Math.sin(i));const s=this.center;Ah(xh.set(-.5,-.5,0),_h,s,gh,n,r),Ah(wh.set(.5,-.5,0),_h,s,gh,n,r),Ah(Mh.set(.5,.5,0),_h,s,gh,n,r),Sh.set(0,0),Th.set(1,0),Ch.set(1,1);let a=e.ray.intersectTriangle(xh,wh,Mh,!1,fh);if(null===a&&(Ah(wh.set(-.5,.5,0),_h,s,gh,n,r),Th.set(0,1),a=e.ray.intersectTriangle(xh,Mh,wh,!1,fh),null===a))return;const o=e.ray.origin.distanceTo(fh);o<e.near||o>e.far||t.push({distance:o,point:fh.clone(),uv:dr.getUV(fh,xh,wh,Mh,Sh,Th,Ch,new zi),face:null,object:this})}copy(e){return super.copy(e),void 0!==e.center&&this.center.copy(e.center),this.material=e.material,this}}function Ah(e,t,i,n,r,s){vh.subVectors(e,i).addScalar(.5).multiply(n),void 0!==r?(yh.x=s*vh.x-r*vh.y,yh.y=r*vh.x+s*vh.y):yh.copy(vh),e.copy(t),e.x+=yh.x,e.y+=yh.y,e.applyMatrix4(bh)}Eh.prototype.isSprite=!0;const Ih=new Ki,Rh=new Xi,Ph=new Xi,Lh=new Ki,Dh=new Rn;class Nh extends es{constructor(e,t){super(e,t),this.type="SkinnedMesh",this.bindMode="attached",this.bindMatrix=new Rn,this.bindMatrixInverse=new Rn}copy(e){return super.copy(e),this.bindMode=e.bindMode,this.bindMatrix.copy(e.bindMatrix),this.bindMatrixInverse.copy(e.bindMatrixInverse),this.skeleton=e.skeleton,this}bind(e,t){this.skeleton=e,void 0===t&&(this.updateMatrixWorld(!0),this.skeleton.calculateInverses(),t=this.matrixWorld),this.bindMatrix.copy(t),this.bindMatrixInverse.copy(t).invert()}pose(){this.skeleton.pose()}normalizeSkinWeights(){const e=new Xi,t=this.geometry.attributes.skinWeight;for(let i=0,n=t.count;i<n;i++){e.x=t.getX(i),e.y=t.getY(i),e.z=t.getZ(i),e.w=t.getW(i);const n=1/e.manhattanLength();n!==1/0?e.multiplyScalar(n):e.set(1,0,0,0),t.setXYZW(i,e.x,e.y,e.z,e.w)}}updateMatrixWorld(e){super.updateMatrixWorld(e),"attached"===this.bindMode?this.bindMatrixInverse.copy(this.matrixWorld).invert():"detached"===this.bindMode?this.bindMatrixInverse.copy(this.bindMatrix).invert():console.warn("THREE.SkinnedMesh: Unrecognized bindMode: "+this.bindMode)}boneTransform(e,t){const i=this.skeleton,n=this.geometry;Rh.fromBufferAttribute(n.attributes.skinIndex,e),Ph.fromBufferAttribute(n.attributes.skinWeight,e),Ih.copy(t).applyMatrix4(this.bindMatrix),t.set(0,0,0);for(let e=0;e<4;e++){const n=Ph.getComponent(e);if(0!==n){const r=Rh.getComponent(e);Dh.multiplyMatrices(i.bones[r].matrixWorld,i.boneInverses[r]),t.addScaledVector(Lh.copy(Ih).applyMatrix4(Dh),n)}}return t.applyMatrix4(this.bindMatrixInverse)}}Nh.prototype.isSkinnedMesh=!0;(class extends tr{constructor(){super(),this.type="Bone"}}).prototype.isBone=!0;(class extends Wi{constructor(e=null,t=1,i=1,n,r,s,a,o,h=1003,c=1003,l,u){super(null,s,a,o,h,c,n,r,l,u),this.image={data:e,width:t,height:i},this.magFilter=h,this.minFilter=c,this.generateMipmaps=!1,this.flipY=!1,this.unpackAlignment=1,this.needsUpdate=!0}}).prototype.isDataTexture=!0;class $h extends Tr{constructor(e,t,i,n=1){"number"==typeof i&&(n=i,i=!1,console.error("THREE.InstancedBufferAttribute: The constructor now expects normalized as the third argument.")),super(e,t,i),this.meshPerAttribute=n}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}toJSON(){const e=super.toJSON();return e.meshPerAttribute=this.meshPerAttribute,e.isInstancedBufferAttribute=!0,e}}$h.prototype.isInstancedBufferAttribute=!0;const kh=new Rn,Oh=new Rn,zh=[],Fh=new es;(class extends es{constructor(e,t,i){super(e,t),this.instanceMatrix=new $h(new Float32Array(16*i),16),this.instanceColor=null,this.count=i,this.frustumCulled=!1}copy(e){return super.copy(e),this.instanceMatrix.copy(e.instanceMatrix),null!==e.instanceColor&&(this.instanceColor=e.instanceColor.clone()),this.count=e.count,this}getColorAt(e,t){t.fromArray(this.instanceColor.array,3*e)}getMatrixAt(e,t){t.fromArray(this.instanceMatrix.array,16*e)}raycast(e,t){const i=this.matrixWorld,n=this.count;if(Fh.geometry=this.geometry,Fh.material=this.material,void 0!==Fh.material)for(let r=0;r<n;r++){this.getMatrixAt(r,kh),Oh.multiplyMatrices(i,kh),Fh.matrixWorld=Oh,Fh.raycast(e,zh);for(let e=0,i=zh.length;e<i;e++){const i=zh[e];i.instanceId=r,i.object=this,t.push(i)}zh.length=0}}setColorAt(e,t){null===this.instanceColor&&(this.instanceColor=new $h(new Float32Array(3*this.instanceMatrix.count),3)),t.toArray(this.instanceColor.array,3*e)}setMatrixAt(e,t){t.toArray(this.instanceMatrix.array,16*e)}updateMorphTargets(){}dispose(){this.dispatchEvent({type:"dispose"})}}).prototype.isInstancedMesh=!0;class Bh extends mr{constructor(e){super(),this.type="LineBasicMaterial",this.color=new xr(16777215),this.linewidth=1,this.linecap="round",this.linejoin="round",this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.linewidth=e.linewidth,this.linecap=e.linecap,this.linejoin=e.linejoin,this}}Bh.prototype.isLineBasicMaterial=!0;const Uh=new Ki,Vh=new Ki,Hh=new Rn,jh=new In,Gh=new xn;class Wh extends tr{constructor(e=new kr,t=new Bh){super(),this.type="Line",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e){return super.copy(e),this.material=e.material,this.geometry=e.geometry,this}computeLineDistances(){const e=this.geometry;if(e.isBufferGeometry)if(null===e.index){const t=e.attributes.position,i=[0];for(let e=1,n=t.count;e<n;e++)Uh.fromBufferAttribute(t,e-1),Vh.fromBufferAttribute(t,e),i[e]=i[e-1],i[e]+=Uh.distanceTo(Vh);e.setAttribute("lineDistance",new Ar(i,1))}else console.warn("THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else e.isGeometry&&console.error("THREE.Line.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this}raycast(e,t){const i=this.geometry,n=this.matrixWorld,r=e.params.Line.threshold,s=i.drawRange;if(null===i.boundingSphere&&i.computeBoundingSphere(),Gh.copy(i.boundingSphere),Gh.applyMatrix4(n),Gh.radius+=r,!1===e.ray.intersectsSphere(Gh))return;Hh.copy(n).invert(),jh.copy(e.ray).applyMatrix4(Hh);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a,h=new Ki,c=new Ki,l=new Ki,u=new Ki,d=this.isLineSegments?2:1;if(i.isBufferGeometry){const n=i.index,r=i.attributes.position;if(null!==n){for(let i=Math.max(0,s.start),a=Math.min(n.count,s.start+s.count)-1;i<a;i+=d){const s=n.getX(i),a=n.getX(i+1);h.fromBufferAttribute(r,s),c.fromBufferAttribute(r,a);if(jh.distanceSqToSegment(h,c,u,l)>o)continue;u.applyMatrix4(this.matrixWorld);const d=e.ray.origin.distanceTo(u);d<e.near||d>e.far||t.push({distance:d,point:l.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}else{for(let i=Math.max(0,s.start),n=Math.min(r.count,s.start+s.count)-1;i<n;i+=d){h.fromBufferAttribute(r,i),c.fromBufferAttribute(r,i+1);if(jh.distanceSqToSegment(h,c,u,l)>o)continue;u.applyMatrix4(this.matrixWorld);const n=e.ray.origin.distanceTo(u);n<e.near||n>e.far||t.push({distance:n,point:l.clone().applyMatrix4(this.matrixWorld),index:i,face:null,faceIndex:null,object:this})}}}else i.isGeometry&&console.error("THREE.Line.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const e=this.geometry;if(e.isBufferGeometry){const t=e.morphAttributes,i=Object.keys(t);if(i.length>0){const e=t[i[0]];if(void 0!==e){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,i=e.length;t<i;t++){const i=e[t].name||String(t);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}}}else{const t=e.morphTargets;void 0!==t&&t.length>0&&console.error("THREE.Line.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}Wh.prototype.isLine=!0;const qh=new Ki,Xh=new Ki;class Zh extends Wh{constructor(e,t){super(e,t),this.type="LineSegments"}computeLineDistances(){const e=this.geometry;if(e.isBufferGeometry)if(null===e.index){const t=e.attributes.position,i=[];for(let e=0,n=t.count;e<n;e+=2)qh.fromBufferAttribute(t,e),Xh.fromBufferAttribute(t,e+1),i[e]=0===e?0:i[e-1],i[e+1]=i[e]+qh.distanceTo(Xh);e.setAttribute("lineDistance",new Ar(i,1))}else console.warn("THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.");else e.isGeometry&&console.error("THREE.LineSegments.computeLineDistances() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.");return this}}Zh.prototype.isLineSegments=!0;(class extends Wh{constructor(e,t){super(e,t),this.type="LineLoop"}}).prototype.isLineLoop=!0;class Yh extends mr{constructor(e){super(),this.type="PointsMaterial",this.color=new xr(16777215),this.map=null,this.alphaMap=null,this.size=1,this.sizeAttenuation=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.alphaMap=e.alphaMap,this.size=e.size,this.sizeAttenuation=e.sizeAttenuation,this}}Yh.prototype.isPointsMaterial=!0;const Jh=new Rn,Kh=new In,Qh=new xn,ec=new Ki;class tc extends tr{constructor(e=new kr,t=new Yh){super(),this.type="Points",this.geometry=e,this.material=t,this.updateMorphTargets()}copy(e){return super.copy(e),this.material=e.material,this.geometry=e.geometry,this}raycast(e,t){const i=this.geometry,n=this.matrixWorld,r=e.params.Points.threshold,s=i.drawRange;if(null===i.boundingSphere&&i.computeBoundingSphere(),Qh.copy(i.boundingSphere),Qh.applyMatrix4(n),Qh.radius+=r,!1===e.ray.intersectsSphere(Qh))return;Jh.copy(n).invert(),Kh.copy(e.ray).applyMatrix4(Jh);const a=r/((this.scale.x+this.scale.y+this.scale.z)/3),o=a*a;if(i.isBufferGeometry){const r=i.index,a=i.attributes.position;if(null!==r){for(let i=Math.max(0,s.start),h=Math.min(r.count,s.start+s.count);i<h;i++){const s=r.getX(i);ec.fromBufferAttribute(a,s),ic(ec,s,o,n,e,t,this)}}else{for(let i=Math.max(0,s.start),r=Math.min(a.count,s.start+s.count);i<r;i++)ec.fromBufferAttribute(a,i),ic(ec,i,o,n,e,t,this)}}else console.error("THREE.Points.raycast() no longer supports THREE.Geometry. Use THREE.BufferGeometry instead.")}updateMorphTargets(){const e=this.geometry;if(e.isBufferGeometry){const t=e.morphAttributes,i=Object.keys(t);if(i.length>0){const e=t[i[0]];if(void 0!==e){this.morphTargetInfluences=[],this.morphTargetDictionary={};for(let t=0,i=e.length;t<i;t++){const i=e[t].name||String(t);this.morphTargetInfluences.push(0),this.morphTargetDictionary[i]=t}}}}else{const t=e.morphTargets;void 0!==t&&t.length>0&&console.error("THREE.Points.updateMorphTargets() does not support THREE.Geometry. Use THREE.BufferGeometry instead.")}}}function ic(e,t,i,n,r,s,a){const o=Kh.distanceSqToPoint(e);if(o<i){const i=new Ki;Kh.closestPointToPoint(e,i),i.applyMatrix4(n);const h=r.ray.origin.distanceTo(i);if(h<r.near||h>r.far)return;s.push({distance:h,distanceToRay:Math.sqrt(o),point:i,index:t,face:null,object:a})}}tc.prototype.isPoints=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h){super(e,t,i,n,r,s,a,o,h),this.format=void 0!==a?a:ai,this.minFilter=void 0!==s?s:Kt,this.magFilter=void 0!==r?r:Kt,this.generateMipmaps=!1;const c=this;"requestVideoFrameCallback"in e&&e.requestVideoFrameCallback((function t(){c.needsUpdate=!0,e.requestVideoFrameCallback(t)}))}clone(){return new this.constructor(this.image).copy(this)}update(){const e=this.image;!1==="requestVideoFrameCallback"in e&&e.readyState>=e.HAVE_CURRENT_DATA&&(this.needsUpdate=!0)}}).prototype.isVideoTexture=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h,c,l,u){super(null,s,a,o,h,c,n,r,l,u),this.image={width:t,height:i},this.mipmaps=e,this.flipY=!1,this.generateMipmaps=!1}}).prototype.isCompressedTexture=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h){super(e,t,i,n,r,s,a,o,h),this.needsUpdate=!0}}).prototype.isCanvasTexture=!0;(class extends Wi{constructor(e,t,i,n,r,s,a,o,h,c){if((c=void 0!==c?c:hi)!==hi&&c!==ci)throw new Error("DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat");void 0===i&&c===hi&&(i=ti),void 0===i&&c===ci&&(i=si),super(null,n,r,s,a,o,c,i,h),this.image={width:e,height:t},this.magFilter=void 0!==a?a:Jt,this.minFilter=void 0!==o?o:Jt,this.flipY=!1,this.generateMipmaps=!1}}).prototype.isDepthTexture=!0;class nc extends kr{constructor(e=1,t=8,i=0,n=2*Math.PI){super(),this.type="CircleGeometry",this.parameters={radius:e,segments:t,thetaStart:i,thetaLength:n},t=Math.max(3,t);const r=[],s=[],a=[],o=[],h=new Ki,c=new zi;s.push(0,0,0),a.push(0,0,1),o.push(.5,.5);for(let r=0,l=3;r<=t;r++,l+=3){const u=i+r/t*n;h.x=e*Math.cos(u),h.y=e*Math.sin(u),s.push(h.x,h.y,h.z),a.push(0,0,1),c.x=(s[l]/e+1)/2,c.y=(s[l+1]/e+1)/2,o.push(c.x,c.y)}for(let e=1;e<=t;e++)r.push(e,e+1,0);this.setIndex(r),this.setAttribute("position",new Ar(s,3)),this.setAttribute("normal",new Ar(a,3)),this.setAttribute("uv",new Ar(o,2))}static fromJSON(e){return new nc(e.radius,e.segments,e.thetaStart,e.thetaLength)}}new Ki,new Ki,new Ki,new dr;class rc{constructor(){this.type="Curve",this.arcLengthDivisions=200}getPoint(){return console.warn("THREE.Curve: .getPoint() not implemented."),null}getPointAt(e,t){const i=this.getUtoTmapping(e);return this.getPoint(i,t)}getPoints(e=5){const t=[];for(let i=0;i<=e;i++)t.push(this.getPoint(i/e));return t}getSpacedPoints(e=5){const t=[];for(let i=0;i<=e;i++)t.push(this.getPointAt(i/e));return t}getLength(){const e=this.getLengths();return e[e.length-1]}getLengths(e=this.arcLengthDivisions){if(this.cacheArcLengths&&this.cacheArcLengths.length===e+1&&!this.needsUpdate)return this.cacheArcLengths;this.needsUpdate=!1;const t=[];let i,n=this.getPoint(0),r=0;t.push(0);for(let s=1;s<=e;s++)i=this.getPoint(s/e),r+=i.distanceTo(n),t.push(r),n=i;return this.cacheArcLengths=t,t}updateArcLengths(){this.needsUpdate=!0,this.getLengths()}getUtoTmapping(e,t){const i=this.getLengths();let n=0;const r=i.length;let s;s=t||e*i[r-1];let a,o=0,h=r-1;for(;o<=h;)if(n=Math.floor(o+(h-o)/2),a=i[n]-s,a<0)o=n+1;else{if(!(a>0)){h=n;break}h=n-1}if(n=h,i[n]===s)return n/(r-1);const c=i[n];return(n+(s-c)/(i[n+1]-c))/(r-1)}getTangent(e,t){const i=1e-4;let n=e-i,r=e+i;n<0&&(n=0),r>1&&(r=1);const s=this.getPoint(n),a=this.getPoint(r),o=t||(s.isVector2?new zi:new Ki);return o.copy(a).sub(s).normalize(),o}getTangentAt(e,t){const i=this.getUtoTmapping(e);return this.getTangent(i,t)}computeFrenetFrames(e,t){const i=new Ki,n=[],r=[],s=[],a=new Ki,o=new Rn;for(let t=0;t<=e;t++){const i=t/e;n[t]=this.getTangentAt(i,new Ki)}r[0]=new Ki,s[0]=new Ki;let h=Number.MAX_VALUE;const c=Math.abs(n[0].x),l=Math.abs(n[0].y),u=Math.abs(n[0].z);c<=h&&(h=c,i.set(1,0,0)),l<=h&&(h=l,i.set(0,1,0)),u<=h&&i.set(0,0,1),a.crossVectors(n[0],i).normalize(),r[0].crossVectors(n[0],a),s[0].crossVectors(n[0],r[0]);for(let t=1;t<=e;t++){if(r[t]=r[t-1].clone(),s[t]=s[t-1].clone(),a.crossVectors(n[t-1],n[t]),a.length()>Number.EPSILON){a.normalize();const e=Math.acos(Li(n[t-1].dot(n[t]),-1,1));r[t].applyMatrix4(o.makeRotationAxis(a,e))}s[t].crossVectors(n[t],r[t])}if(!0===t){let t=Math.acos(Li(r[0].dot(r[e]),-1,1));t/=e,n[0].dot(a.crossVectors(r[0],r[e]))>0&&(t=-t);for(let i=1;i<=e;i++)r[i].applyMatrix4(o.makeRotationAxis(n[i],t*i)),s[i].crossVectors(n[i],r[i])}return{tangents:n,normals:r,binormals:s}}clone(){return(new this.constructor).copy(this)}copy(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}toJSON(){const e={metadata:{version:4.5,type:"Curve",generator:"Curve.toJSON"}};return e.arcLengthDivisions=this.arcLengthDivisions,e.type=this.type,e}fromJSON(e){return this.arcLengthDivisions=e.arcLengthDivisions,this}}class sc extends rc{constructor(e=0,t=0,i=1,n=1,r=0,s=2*Math.PI,a=!1,o=0){super(),this.type="EllipseCurve",this.aX=e,this.aY=t,this.xRadius=i,this.yRadius=n,this.aStartAngle=r,this.aEndAngle=s,this.aClockwise=a,this.aRotation=o}getPoint(e,t){const i=t||new zi,n=2*Math.PI;let r=this.aEndAngle-this.aStartAngle;const s=Math.abs(r)<Number.EPSILON;for(;r<0;)r+=n;for(;r>n;)r-=n;r<Number.EPSILON&&(r=s?0:n),!0!==this.aClockwise||s||(r===n?r=-n:r-=n);const a=this.aStartAngle+e*r;let o=this.aX+this.xRadius*Math.cos(a),h=this.aY+this.yRadius*Math.sin(a);if(0!==this.aRotation){const e=Math.cos(this.aRotation),t=Math.sin(this.aRotation),i=o-this.aX,n=h-this.aY;o=i*e-n*t+this.aX,h=i*t+n*e+this.aY}return i.set(o,h)}copy(e){return super.copy(e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this}toJSON(){const e=super.toJSON();return e.aX=this.aX,e.aY=this.aY,e.xRadius=this.xRadius,e.yRadius=this.yRadius,e.aStartAngle=this.aStartAngle,e.aEndAngle=this.aEndAngle,e.aClockwise=this.aClockwise,e.aRotation=this.aRotation,e}fromJSON(e){return super.fromJSON(e),this.aX=e.aX,this.aY=e.aY,this.xRadius=e.xRadius,this.yRadius=e.yRadius,this.aStartAngle=e.aStartAngle,this.aEndAngle=e.aEndAngle,this.aClockwise=e.aClockwise,this.aRotation=e.aRotation,this}}sc.prototype.isEllipseCurve=!0;class ac extends sc{constructor(e,t,i,n,r,s){super(e,t,i,i,n,r,s),this.type="ArcCurve"}}function oc(){let e=0,t=0,i=0,n=0;function r(r,s,a,o){e=r,t=a,i=-3*r+3*s-2*a-o,n=2*r-2*s+a+o}return{initCatmullRom:function(e,t,i,n,s){r(t,i,s*(i-e),s*(n-t))},initNonuniformCatmullRom:function(e,t,i,n,s,a,o){let h=(t-e)/s-(i-e)/(s+a)+(i-t)/a,c=(i-t)/a-(n-t)/(a+o)+(n-i)/o;h*=a,c*=a,r(t,i,h,c)},calc:function(r){const s=r*r;return e+t*r+i*s+n*(s*r)}}}ac.prototype.isArcCurve=!0;const hc=new Ki,cc=new oc,lc=new oc,uc=new oc;class dc extends rc{constructor(e=[],t=!1,i="centripetal",n=.5){super(),this.type="CatmullRomCurve3",this.points=e,this.closed=t,this.curveType=i,this.tension=n}getPoint(e,t=new Ki){const i=t,n=this.points,r=n.length,s=(r-(this.closed?0:1))*e;let a,o,h=Math.floor(s),c=s-h;this.closed?h+=h>0?0:(Math.floor(Math.abs(h)/r)+1)*r:0===c&&h===r-1&&(h=r-2,c=1),this.closed||h>0?a=n[(h-1)%r]:(hc.subVectors(n[0],n[1]).add(n[0]),a=hc);const l=n[h%r],u=n[(h+1)%r];if(this.closed||h+2<r?o=n[(h+2)%r]:(hc.subVectors(n[r-1],n[r-2]).add(n[r-1]),o=hc),"centripetal"===this.curveType||"chordal"===this.curveType){const e="chordal"===this.curveType?.5:.25;let t=Math.pow(a.distanceToSquared(l),e),i=Math.pow(l.distanceToSquared(u),e),n=Math.pow(u.distanceToSquared(o),e);i<1e-4&&(i=1),t<1e-4&&(t=i),n<1e-4&&(n=i),cc.initNonuniformCatmullRom(a.x,l.x,u.x,o.x,t,i,n),lc.initNonuniformCatmullRom(a.y,l.y,u.y,o.y,t,i,n),uc.initNonuniformCatmullRom(a.z,l.z,u.z,o.z,t,i,n)}else"catmullrom"===this.curveType&&(cc.initCatmullRom(a.x,l.x,u.x,o.x,this.tension),lc.initCatmullRom(a.y,l.y,u.y,o.y,this.tension),uc.initCatmullRom(a.z,l.z,u.z,o.z,this.tension));return i.set(cc.calc(c),lc.calc(c),uc.calc(c)),i}copy(e){super.copy(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push(i.clone())}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this}toJSON(){const e=super.toJSON();e.points=[];for(let t=0,i=this.points.length;t<i;t++){const i=this.points[t];e.points.push(i.toArray())}return e.closed=this.closed,e.curveType=this.curveType,e.tension=this.tension,e}fromJSON(e){super.fromJSON(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push((new Ki).fromArray(i))}return this.closed=e.closed,this.curveType=e.curveType,this.tension=e.tension,this}}function pc(e,t,i,n,r){const s=.5*(n-t),a=.5*(r-i),o=e*e;return(2*i-2*n+s+a)*(e*o)+(-3*i+3*n-2*s-a)*o+s*e+i}function mc(e,t,i,n){return function(e,t){const i=1-e;return i*i*t}(e,t)+function(e,t){return 2*(1-e)*e*t}(e,i)+function(e,t){return e*e*t}(e,n)}function fc(e,t,i,n,r){return function(e,t){const i=1-e;return i*i*i*t}(e,t)+function(e,t){const i=1-e;return 3*i*i*e*t}(e,i)+function(e,t){return 3*(1-e)*e*e*t}(e,n)+function(e,t){return e*e*e*t}(e,r)}dc.prototype.isCatmullRomCurve3=!0;class gc extends rc{constructor(e=new zi,t=new zi,i=new zi,n=new zi){super(),this.type="CubicBezierCurve",this.v0=e,this.v1=t,this.v2=i,this.v3=n}getPoint(e,t=new zi){const i=t,n=this.v0,r=this.v1,s=this.v2,a=this.v3;return i.set(fc(e,n.x,r.x,s.x,a.x),fc(e,n.y,r.y,s.y,a.y)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this}}gc.prototype.isCubicBezierCurve=!0;class _c extends rc{constructor(e=new Ki,t=new Ki,i=new Ki,n=new Ki){super(),this.type="CubicBezierCurve3",this.v0=e,this.v1=t,this.v2=i,this.v3=n}getPoint(e,t=new Ki){const i=t,n=this.v0,r=this.v1,s=this.v2,a=this.v3;return i.set(fc(e,n.x,r.x,s.x,a.x),fc(e,n.y,r.y,s.y,a.y),fc(e,n.z,r.z,s.z,a.z)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this.v3.copy(e.v3),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e.v3=this.v3.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this.v3.fromArray(e.v3),this}}_c.prototype.isCubicBezierCurve3=!0;class vc extends rc{constructor(e=new zi,t=new zi){super(),this.type="LineCurve",this.v1=e,this.v2=t}getPoint(e,t=new zi){const i=t;return 1===e?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(e).add(this.v1)),i}getPointAt(e,t){return this.getPoint(e,t)}getTangent(e,t){const i=t||new zi;return i.copy(this.v2).sub(this.v1).normalize(),i}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}vc.prototype.isLineCurve=!0;class yc extends rc{constructor(e=new zi,t=new zi,i=new zi){super(),this.type="QuadraticBezierCurve",this.v0=e,this.v1=t,this.v2=i}getPoint(e,t=new zi){const i=t,n=this.v0,r=this.v1,s=this.v2;return i.set(mc(e,n.x,r.x,s.x),mc(e,n.y,r.y,s.y)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}yc.prototype.isQuadraticBezierCurve=!0;class bc extends rc{constructor(e=new Ki,t=new Ki,i=new Ki){super(),this.type="QuadraticBezierCurve3",this.v0=e,this.v1=t,this.v2=i}getPoint(e,t=new Ki){const i=t,n=this.v0,r=this.v1,s=this.v2;return i.set(mc(e,n.x,r.x,s.x),mc(e,n.y,r.y,s.y),mc(e,n.z,r.z,s.z)),i}copy(e){return super.copy(e),this.v0.copy(e.v0),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v0=this.v0.toArray(),e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v0.fromArray(e.v0),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}}bc.prototype.isQuadraticBezierCurve3=!0;class xc extends rc{constructor(e=[]){super(),this.type="SplineCurve",this.points=e}getPoint(e,t=new zi){const i=t,n=this.points,r=(n.length-1)*e,s=Math.floor(r),a=r-s,o=n[0===s?s:s-1],h=n[s],c=n[s>n.length-2?n.length-1:s+1],l=n[s>n.length-3?n.length-1:s+2];return i.set(pc(a,o.x,h.x,c.x,l.x),pc(a,o.y,h.y,c.y,l.y)),i}copy(e){super.copy(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push(i.clone())}return this}toJSON(){const e=super.toJSON();e.points=[];for(let t=0,i=this.points.length;t<i;t++){const i=this.points[t];e.points.push(i.toArray())}return e}fromJSON(e){super.fromJSON(e),this.points=[];for(let t=0,i=e.points.length;t<i;t++){const i=e.points[t];this.points.push((new zi).fromArray(i))}return this}}xc.prototype.isSplineCurve=!0;var wc=Object.freeze({__proto__:null,ArcCurve:ac,CatmullRomCurve3:dc,CubicBezierCurve:gc,CubicBezierCurve3:_c,EllipseCurve:sc,LineCurve:vc,LineCurve3:class extends rc{constructor(e=new Ki,t=new Ki){super(),this.type="LineCurve3",this.isLineCurve3=!0,this.v1=e,this.v2=t}getPoint(e,t=new Ki){const i=t;return 1===e?i.copy(this.v2):(i.copy(this.v2).sub(this.v1),i.multiplyScalar(e).add(this.v1)),i}getPointAt(e,t){return this.getPoint(e,t)}copy(e){return super.copy(e),this.v1.copy(e.v1),this.v2.copy(e.v2),this}toJSON(){const e=super.toJSON();return e.v1=this.v1.toArray(),e.v2=this.v2.toArray(),e}fromJSON(e){return super.fromJSON(e),this.v1.fromArray(e.v1),this.v2.fromArray(e.v2),this}},QuadraticBezierCurve:yc,QuadraticBezierCurve3:bc,SplineCurve:xc});class Mc extends rc{constructor(){super(),this.type="CurvePath",this.curves=[],this.autoClose=!1}add(e){this.curves.push(e)}closePath(){const e=this.curves[0].getPoint(0),t=this.curves[this.curves.length-1].getPoint(1);e.equals(t)||this.curves.push(new vc(t,e))}getPoint(e,t){const i=e*this.getLength(),n=this.getCurveLengths();let r=0;for(;r<n.length;){if(n[r]>=i){const e=n[r]-i,s=this.curves[r],a=s.getLength(),o=0===a?0:1-e/a;return s.getPointAt(o,t)}r++}return null}getLength(){const e=this.getCurveLengths();return e[e.length-1]}updateArcLengths(){this.needsUpdate=!0,this.cacheLengths=null,this.getCurveLengths()}getCurveLengths(){if(this.cacheLengths&&this.cacheLengths.length===this.curves.length)return this.cacheLengths;const e=[];let t=0;for(let i=0,n=this.curves.length;i<n;i++)t+=this.curves[i].getLength(),e.push(t);return this.cacheLengths=e,e}getSpacedPoints(e=40){const t=[];for(let i=0;i<=e;i++)t.push(this.getPoint(i/e));return this.autoClose&&t.push(t[0]),t}getPoints(e=12){const t=[];let i;for(let n=0,r=this.curves;n<r.length;n++){const s=r[n],a=s&&s.isEllipseCurve?2*e:s&&(s.isLineCurve||s.isLineCurve3)?1:s&&s.isSplineCurve?e*s.points.length:e,o=s.getPoints(a);for(let e=0;e<o.length;e++){const n=o[e];i&&i.equals(n)||(t.push(n),i=n)}}return this.autoClose&&t.length>1&&!t[t.length-1].equals(t[0])&&t.push(t[0]),t}copy(e){super.copy(e),this.curves=[];for(let t=0,i=e.curves.length;t<i;t++){const i=e.curves[t];this.curves.push(i.clone())}return this.autoClose=e.autoClose,this}toJSON(){const e=super.toJSON();e.autoClose=this.autoClose,e.curves=[];for(let t=0,i=this.curves.length;t<i;t++){const i=this.curves[t];e.curves.push(i.toJSON())}return e}fromJSON(e){super.fromJSON(e),this.autoClose=e.autoClose,this.curves=[];for(let t=0,i=e.curves.length;t<i;t++){const i=e.curves[t];this.curves.push((new wc[i.type]).fromJSON(i))}return this}}class Sc extends Mc{constructor(e){super(),this.type="Path",this.currentPoint=new zi,e&&this.setFromPoints(e)}setFromPoints(e){this.moveTo(e[0].x,e[0].y);for(let t=1,i=e.length;t<i;t++)this.lineTo(e[t].x,e[t].y);return this}moveTo(e,t){return this.currentPoint.set(e,t),this}lineTo(e,t){const i=new vc(this.currentPoint.clone(),new zi(e,t));return this.curves.push(i),this.currentPoint.set(e,t),this}quadraticCurveTo(e,t,i,n){const r=new yc(this.currentPoint.clone(),new zi(e,t),new zi(i,n));return this.curves.push(r),this.currentPoint.set(i,n),this}bezierCurveTo(e,t,i,n,r,s){const a=new gc(this.currentPoint.clone(),new zi(e,t),new zi(i,n),new zi(r,s));return this.curves.push(a),this.currentPoint.set(r,s),this}splineThru(e){const t=[this.currentPoint.clone()].concat(e),i=new xc(t);return this.curves.push(i),this.currentPoint.copy(e[e.length-1]),this}arc(e,t,i,n,r,s){const a=this.currentPoint.x,o=this.currentPoint.y;return this.absarc(e+a,t+o,i,n,r,s),this}absarc(e,t,i,n,r,s){return this.absellipse(e,t,i,i,n,r,s),this}ellipse(e,t,i,n,r,s,a,o){const h=this.currentPoint.x,c=this.currentPoint.y;return this.absellipse(e+h,t+c,i,n,r,s,a,o),this}absellipse(e,t,i,n,r,s,a,o){const h=new sc(e,t,i,n,r,s,a,o);if(this.curves.length>0){const e=h.getPoint(0);e.equals(this.currentPoint)||this.lineTo(e.x,e.y)}this.curves.push(h);const c=h.getPoint(1);return this.currentPoint.copy(c),this}copy(e){return super.copy(e),this.currentPoint.copy(e.currentPoint),this}toJSON(){const e=super.toJSON();return e.currentPoint=this.currentPoint.toArray(),e}fromJSON(e){return super.fromJSON(e),this.currentPoint.fromArray(e.currentPoint),this}}class Tc extends Sc{constructor(e){super(e),this.uuid=Pi(),this.type="Shape",this.holes=[]}getPointsHoles(e){const t=[];for(let i=0,n=this.holes.length;i<n;i++)t[i]=this.holes[i].getPoints(e);return t}extractPoints(e){return{shape:this.getPoints(e),holes:this.getPointsHoles(e)}}copy(e){super.copy(e),this.holes=[];for(let t=0,i=e.holes.length;t<i;t++){const i=e.holes[t];this.holes.push(i.clone())}return this}toJSON(){const e=super.toJSON();e.uuid=this.uuid,e.holes=[];for(let t=0,i=this.holes.length;t<i;t++){const i=this.holes[t];e.holes.push(i.toJSON())}return e}fromJSON(e){super.fromJSON(e),this.uuid=e.uuid,this.holes=[];for(let t=0,i=e.holes.length;t<i;t++){const i=e.holes[t];this.holes.push((new Sc).fromJSON(i))}return this}}const Cc=function(e,t,i=2){const n=t&&t.length,r=n?t[0]*i:e.length;let s=Ec(e,0,r,i,!0);const a=[];if(!s||s.next===s.prev)return a;let o,h,c,l,u,d,p;if(n&&(s=function(e,t,i,n){const r=[];let s,a,o,h,c;for(s=0,a=t.length;s<a;s++)o=t[s]*n,h=s<a-1?t[s+1]*n:e.length,c=Ec(e,o,h,n,!1),c===c.next&&(c.steiner=!0),r.push(zc(c));for(r.sort(Nc),s=0;s<r.length;s++)$c(r[s],i),i=Ac(i,i.next);return i}(e,t,s,i)),e.length>80*i){o=c=e[0],h=l=e[1];for(let t=i;t<r;t+=i)u=e[t],d=e[t+1],u<o&&(o=u),d<h&&(h=d),u>c&&(c=u),d>l&&(l=d);p=Math.max(c-o,l-h),p=0!==p?1/p:0}return Ic(s,a,i,o,h,p),a};function Ec(e,t,i,n,r){let s,a;if(r===function(e,t,i,n){let r=0;for(let s=t,a=i-n;s<i;s+=n)r+=(e[a]-e[s])*(e[s+1]+e[a+1]),a=s;return r}(e,t,i,n)>0)for(s=t;s<i;s+=n)a=Xc(s,e[s],e[s+1],a);else for(s=i-n;s>=t;s-=n)a=Xc(s,e[s],e[s+1],a);return a&&Vc(a,a.next)&&(Zc(a),a=a.next),a}function Ac(e,t){if(!e)return e;t||(t=e);let i,n=e;do{if(i=!1,n.steiner||!Vc(n,n.next)&&0!==Uc(n.prev,n,n.next))n=n.next;else{if(Zc(n),n=t=n.prev,n===n.next)break;i=!0}}while(i||n!==t);return t}function Ic(e,t,i,n,r,s,a){if(!e)return;!a&&s&&function(e,t,i,n){let r=e;do{null===r.z&&(r.z=Oc(r.x,r.y,t,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){let t,i,n,r,s,a,o,h,c=1;do{for(i=e,e=null,s=null,a=0;i;){for(a++,n=i,o=0,t=0;t<c&&(o++,n=n.nextZ,n);t++);for(h=c;o>0||h>0&&n;)0!==o&&(0===h||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,h--),s?s.nextZ=r:e=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(e,n,r,s);let o,h,c=e;for(;e.prev!==e.next;)if(o=e.prev,h=e.next,s?Pc(e,n,r,s):Rc(e))t.push(o.i/i),t.push(e.i/i),t.push(h.i/i),Zc(e),e=h.next,c=h.next;else if((e=h)===c){a?1===a?Ic(e=Lc(Ac(e),t,i),t,i,n,r,s,2):2===a&&Dc(e,t,i,n,r,s):Ic(Ac(e),t,i,n,r,s,1);break}}function Rc(e){const t=e.prev,i=e,n=e.next;if(Uc(t,i,n)>=0)return!1;let r=e.next.next;for(;r!==e.prev;){if(Fc(t.x,t.y,i.x,i.y,n.x,n.y,r.x,r.y)&&Uc(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Pc(e,t,i,n){const r=e.prev,s=e,a=e.next;if(Uc(r,s,a)>=0)return!1;const o=r.x<s.x?r.x<a.x?r.x:a.x:s.x<a.x?s.x:a.x,h=r.y<s.y?r.y<a.y?r.y:a.y:s.y<a.y?s.y:a.y,c=r.x>s.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,l=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=Oc(o,h,t,i,n),d=Oc(c,l,t,i,n);let p=e.prevZ,m=e.nextZ;for(;p&&p.z>=u&&m&&m.z<=d;){if(p!==e.prev&&p!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Uc(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==e.prev&&m!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&Uc(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==e.prev&&p!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&Uc(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==e.prev&&m!==e.next&&Fc(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&Uc(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Lc(e,t,i){let n=e;do{const r=n.prev,s=n.next.next;!Vc(r,s)&&Hc(r,n,n.next,s)&&Wc(r,s)&&Wc(s,r)&&(t.push(r.i/i),t.push(n.i/i),t.push(s.i/i),Zc(n),Zc(n.next),n=e=s),n=n.next}while(n!==e);return Ac(n)}function Dc(e,t,i,n,r,s){let a=e;do{let e=a.next.next;for(;e!==a.prev;){if(a.i!==e.i&&Bc(a,e)){let o=qc(a,e);return a=Ac(a,a.next),o=Ac(o,o.next),Ic(a,t,i,n,r,s),void Ic(o,t,i,n,r,s)}e=e.next}a=a.next}while(a!==e)}function Nc(e,t){return e.x-t.x}function $c(e,t){if(t=function(e,t){let i=t;const n=e.x,r=e.y;let s,a=-1/0;do{if(r<=i.y&&r>=i.next.y&&i.next.y!==i.y){const e=i.x+(r-i.y)*(i.next.x-i.x)/(i.next.y-i.y);if(e<=n&&e>a){if(a=e,e===n){if(r===i.y)return i;if(r===i.next.y)return i.next}s=i.x<i.next.x?i:i.next}}i=i.next}while(i!==t);if(!s)return null;if(n===a)return s;const o=s,h=s.x,c=s.y;let l,u=1/0;i=s;do{n>=i.x&&i.x>=h&&n!==i.x&&Fc(r<c?n:a,r,h,c,r<c?a:n,r,i.x,i.y)&&(l=Math.abs(r-i.y)/(n-i.x),Wc(i,e)&&(l<u||l===u&&(i.x>s.x||i.x===s.x&&kc(s,i)))&&(s=i,u=l)),i=i.next}while(i!==o);return s}(e,t)){const i=qc(t,e);Ac(t,t.next),Ac(i,i.next)}}function kc(e,t){return Uc(e.prev,e,t.prev)<0&&Uc(t.next,e,e.next)<0}function Oc(e,t,i,n,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*r)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*r)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function zc(e){let t=e,i=e;do{(t.x<i.x||t.x===i.x&&t.y<i.y)&&(i=t),t=t.next}while(t!==e);return i}function Fc(e,t,i,n,r,s,a,o){return(r-a)*(t-o)-(e-a)*(s-o)>=0&&(e-a)*(n-o)-(i-a)*(t-o)>=0&&(i-a)*(s-o)-(r-a)*(n-o)>=0}function Bc(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){let i=e;do{if(i.i!==e.i&&i.next.i!==e.i&&i.i!==t.i&&i.next.i!==t.i&&Hc(i,i.next,e,t))return!0;i=i.next}while(i!==e);return!1}(e,t)&&(Wc(e,t)&&Wc(t,e)&&function(e,t){let i=e,n=!1;const r=(e.x+t.x)/2,s=(e.y+t.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==e);return n}(e,t)&&(Uc(e.prev,e,t.prev)||Uc(e,t.prev,t))||Vc(e,t)&&Uc(e.prev,e,e.next)>0&&Uc(t.prev,t,t.next)>0)}function Uc(e,t,i){return(t.y-e.y)*(i.x-t.x)-(t.x-e.x)*(i.y-t.y)}function Vc(e,t){return e.x===t.x&&e.y===t.y}function Hc(e,t,i,n){const r=Gc(Uc(e,t,i)),s=Gc(Uc(e,t,n)),a=Gc(Uc(i,n,e)),o=Gc(Uc(i,n,t));return r!==s&&a!==o||(!(0!==r||!jc(e,i,t))||(!(0!==s||!jc(e,n,t))||(!(0!==a||!jc(i,e,n))||!(0!==o||!jc(i,t,n)))))}function jc(e,t,i){return t.x<=Math.max(e.x,i.x)&&t.x>=Math.min(e.x,i.x)&&t.y<=Math.max(e.y,i.y)&&t.y>=Math.min(e.y,i.y)}function Gc(e){return e>0?1:e<0?-1:0}function Wc(e,t){return Uc(e.prev,e,e.next)<0?Uc(e,t,e.next)>=0&&Uc(e,e.prev,t)>=0:Uc(e,t,e.prev)<0||Uc(e,e.next,t)<0}function qc(e,t){const i=new Yc(e.i,e.x,e.y),n=new Yc(t.i,t.x,t.y),r=e.next,s=t.prev;return e.next=t,t.prev=e,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function Xc(e,t,i,n){const r=new Yc(e,t,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function Zc(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function Yc(e,t,i){this.i=e,this.x=t,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}class Jc{static area(e){const t=e.length;let i=0;for(let n=t-1,r=0;r<t;n=r++)i+=e[n].x*e[r].y-e[r].x*e[n].y;return.5*i}static isClockWise(e){return Jc.area(e)<0}static triangulateShape(e,t){const i=[],n=[],r=[];Kc(e),Qc(i,e);let s=e.length;t.forEach(Kc);for(let e=0;e<t.length;e++)n.push(s),s+=t[e].length,Qc(i,t[e]);const a=Cc(i,n);for(let e=0;e<a.length;e+=3)r.push(a.slice(e,e+3));return r}}function Kc(e){const t=e.length;t>2&&e[t-1].equals(e[0])&&e.pop()}function Qc(e,t){for(let i=0;i<t.length;i++)e.push(t[i].x),e.push(t[i].y)}class el extends kr{constructor(e=new Tc([new zi(.5,.5),new zi(-.5,.5),new zi(-.5,-.5),new zi(.5,-.5)]),t={}){super(),this.type="ExtrudeGeometry",this.parameters={shapes:e,options:t},e=Array.isArray(e)?e:[e];const i=this,n=[],r=[];for(let t=0,i=e.length;t<i;t++){s(e[t])}function s(e){const s=[],a=void 0!==t.curveSegments?t.curveSegments:12,o=void 0!==t.steps?t.steps:1;let h=void 0!==t.depth?t.depth:1,c=void 0===t.bevelEnabled||t.bevelEnabled,l=void 0!==t.bevelThickness?t.bevelThickness:.2,u=void 0!==t.bevelSize?t.bevelSize:l-.1,d=void 0!==t.bevelOffset?t.bevelOffset:0,p=void 0!==t.bevelSegments?t.bevelSegments:3;const m=t.extrudePath,f=void 0!==t.UVGenerator?t.UVGenerator:tl;void 0!==t.amount&&(console.warn("THREE.ExtrudeBufferGeometry: amount has been renamed to depth."),h=t.amount);let g,_,v,y,b,x=!1;m&&(g=m.getSpacedPoints(o),x=!0,c=!1,_=m.computeFrenetFrames(o,!1),v=new Ki,y=new Ki,b=new Ki),c||(p=0,l=0,u=0,d=0);const w=e.extractPoints(a);let M=w.shape;const S=w.holes;if(!Jc.isClockWise(M)){M=M.reverse();for(let e=0,t=S.length;e<t;e++){const t=S[e];Jc.isClockWise(t)&&(S[e]=t.reverse())}}const T=Jc.triangulateShape(M,S),C=M;for(let e=0,t=S.length;e<t;e++){const t=S[e];M=M.concat(t)}function E(e,t,i){return t||console.error("THREE.ExtrudeGeometry: vec does not exist"),t.clone().multiplyScalar(i).add(e)}const A=M.length,I=T.length;function R(e,t,i){let n,r,s;const a=e.x-t.x,o=e.y-t.y,h=i.x-e.x,c=i.y-e.y,l=a*a+o*o,u=a*c-o*h;if(Math.abs(u)>Number.EPSILON){const u=Math.sqrt(l),d=Math.sqrt(h*h+c*c),p=t.x-o/u,m=t.y+a/u,f=((i.x-c/d-p)*c-(i.y+h/d-m)*h)/(a*c-o*h);n=p+a*f-e.x,r=m+o*f-e.y;const g=n*n+r*r;if(g<=2)return new zi(n,r);s=Math.sqrt(g/2)}else{let e=!1;a>Number.EPSILON?h>Number.EPSILON&&(e=!0):a<-Number.EPSILON?h<-Number.EPSILON&&(e=!0):Math.sign(o)===Math.sign(c)&&(e=!0),e?(n=-o,r=a,s=Math.sqrt(l)):(n=a,r=o,s=Math.sqrt(l/2))}return new zi(n/s,r/s)}const P=[];for(let e=0,t=C.length,i=t-1,n=e+1;e<t;e++,i++,n++)i===t&&(i=0),n===t&&(n=0),P[e]=R(C[e],C[i],C[n]);const L=[];let D,N=P.concat();for(let e=0,t=S.length;e<t;e++){const t=S[e];D=[];for(let e=0,i=t.length,n=i-1,r=e+1;e<i;e++,n++,r++)n===i&&(n=0),r===i&&(r=0),D[e]=R(t[e],t[n],t[r]);L.push(D),N=N.concat(D)}for(let e=0;e<p;e++){const t=e/p,i=l*Math.cos(t*Math.PI/2),n=u*Math.sin(t*Math.PI/2)+d;for(let e=0,t=C.length;e<t;e++){const t=E(C[e],P[e],n);O(t.x,t.y,-i)}for(let e=0,t=S.length;e<t;e++){const t=S[e];D=L[e];for(let e=0,r=t.length;e<r;e++){const r=E(t[e],D[e],n);O(r.x,r.y,-i)}}}const $=u+d;for(let e=0;e<A;e++){const t=c?E(M[e],N[e],$):M[e];x?(y.copy(_.normals[0]).multiplyScalar(t.x),v.copy(_.binormals[0]).multiplyScalar(t.y),b.copy(g[0]).add(y).add(v),O(b.x,b.y,b.z)):O(t.x,t.y,0)}for(let e=1;e<=o;e++)for(let t=0;t<A;t++){const i=c?E(M[t],N[t],$):M[t];x?(y.copy(_.normals[e]).multiplyScalar(i.x),v.copy(_.binormals[e]).multiplyScalar(i.y),b.copy(g[e]).add(y).add(v),O(b.x,b.y,b.z)):O(i.x,i.y,h/o*e)}for(let e=p-1;e>=0;e--){const t=e/p,i=l*Math.cos(t*Math.PI/2),n=u*Math.sin(t*Math.PI/2)+d;for(let e=0,t=C.length;e<t;e++){const t=E(C[e],P[e],n);O(t.x,t.y,h+i)}for(let e=0,t=S.length;e<t;e++){const t=S[e];D=L[e];for(let e=0,r=t.length;e<r;e++){const r=E(t[e],D[e],n);x?O(r.x,r.y+g[o-1].y,g[o-1].x+i):O(r.x,r.y,h+i)}}}function k(e,t){let i=e.length;for(;--i>=0;){const n=i;let r=i-1;r<0&&(r=e.length-1);for(let e=0,i=o+2*p;e<i;e++){const i=A*e,s=A*(e+1);F(t+n+i,t+r+i,t+r+s,t+n+s)}}}function O(e,t,i){s.push(e),s.push(t),s.push(i)}function z(e,t,r){B(e),B(t),B(r);const s=n.length/3,a=f.generateTopUV(i,n,s-3,s-2,s-1);U(a[0]),U(a[1]),U(a[2])}function F(e,t,r,s){B(e),B(t),B(s),B(t),B(r),B(s);const a=n.length/3,o=f.generateSideWallUV(i,n,a-6,a-3,a-2,a-1);U(o[0]),U(o[1]),U(o[3]),U(o[1]),U(o[2]),U(o[3])}function B(e){n.push(s[3*e+0]),n.push(s[3*e+1]),n.push(s[3*e+2])}function U(e){r.push(e.x),r.push(e.y)}!function(){const e=n.length/3;if(c){let e=0,t=A*e;for(let e=0;e<I;e++){const i=T[e];z(i[2]+t,i[1]+t,i[0]+t)}e=o+2*p,t=A*e;for(let e=0;e<I;e++){const i=T[e];z(i[0]+t,i[1]+t,i[2]+t)}}else{for(let e=0;e<I;e++){const t=T[e];z(t[2],t[1],t[0])}for(let e=0;e<I;e++){const t=T[e];z(t[0]+A*o,t[1]+A*o,t[2]+A*o)}}i.addGroup(e,n.length/3-e,0)}(),function(){const e=n.length/3;let t=0;k(C,t),t+=C.length;for(let e=0,i=S.length;e<i;e++){const i=S[e];k(i,t),t+=i.length}i.addGroup(e,n.length/3-e,1)}()}this.setAttribute("position",new Ar(n,3)),this.setAttribute("uv",new Ar(r,2)),this.computeVertexNormals()}toJSON(){const e=super.toJSON();return function(e,t,i){if(i.shapes=[],Array.isArray(e))for(let t=0,n=e.length;t<n;t++){const n=e[t];i.shapes.push(n.uuid)}else i.shapes.push(e.uuid);void 0!==t.extrudePath&&(i.options.extrudePath=t.extrudePath.toJSON());return i}(this.parameters.shapes,this.parameters.options,e)}static fromJSON(e,t){const i=[];for(let n=0,r=e.shapes.length;n<r;n++){const r=t[e.shapes[n]];i.push(r)}const n=e.options.extrudePath;return void 0!==n&&(e.options.extrudePath=(new wc[n.type]).fromJSON(n)),new el(i,e.options)}}const tl={generateTopUV:function(e,t,i,n,r){const s=t[3*i],a=t[3*i+1],o=t[3*n],h=t[3*n+1],c=t[3*r],l=t[3*r+1];return[new zi(s,a),new zi(o,h),new zi(c,l)]},generateSideWallUV:function(e,t,i,n,r,s){const a=t[3*i],o=t[3*i+1],h=t[3*i+2],c=t[3*n],l=t[3*n+1],u=t[3*n+2],d=t[3*r],p=t[3*r+1],m=t[3*r+2],f=t[3*s],g=t[3*s+1],_=t[3*s+2];return Math.abs(o-l)<Math.abs(a-c)?[new zi(a,1-h),new zi(c,1-u),new zi(d,1-m),new zi(f,1-_)]:[new zi(o,1-h),new zi(l,1-u),new zi(p,1-m),new zi(g,1-_)]}};class il extends kr{constructor(e=new Tc([new zi(0,.5),new zi(-.5,-.5),new zi(.5,-.5)]),t=12){super(),this.type="ShapeGeometry",this.parameters={shapes:e,curveSegments:t};const i=[],n=[],r=[],s=[];let a=0,o=0;if(!1===Array.isArray(e))h(e);else for(let t=0;t<e.length;t++)h(e[t]),this.addGroup(a,o,t),a+=o,o=0;function h(e){const a=n.length/3,h=e.extractPoints(t);let c=h.shape;const l=h.holes;!1===Jc.isClockWise(c)&&(c=c.reverse());for(let e=0,t=l.length;e<t;e++){const t=l[e];!0===Jc.isClockWise(t)&&(l[e]=t.reverse())}const u=Jc.triangulateShape(c,l);for(let e=0,t=l.length;e<t;e++){const t=l[e];c=c.concat(t)}for(let e=0,t=c.length;e<t;e++){const t=c[e];n.push(t.x,t.y,0),r.push(0,0,1),s.push(t.x,t.y)}for(let e=0,t=u.length;e<t;e++){const t=u[e],n=t[0]+a,r=t[1]+a,s=t[2]+a;i.push(n,r,s),o+=3}}this.setIndex(i),this.setAttribute("position",new Ar(n,3)),this.setAttribute("normal",new Ar(r,3)),this.setAttribute("uv",new Ar(s,2))}toJSON(){const e=super.toJSON();return function(e,t){if(t.shapes=[],Array.isArray(e))for(let i=0,n=e.length;i<n;i++){const n=e[i];t.shapes.push(n.uuid)}else t.shapes.push(e.uuid);return t}(this.parameters.shapes,e)}static fromJSON(e,t){const i=[];for(let n=0,r=e.shapes.length;n<r;n++){const r=t[e.shapes[n]];i.push(r)}return new il(i,e.curveSegments)}}class nl extends kr{constructor(e=1,t=32,i=16,n=0,r=2*Math.PI,s=0,a=Math.PI){super(),this.type="SphereGeometry",this.parameters={radius:e,widthSegments:t,heightSegments:i,phiStart:n,phiLength:r,thetaStart:s,thetaLength:a},t=Math.max(3,Math.floor(t)),i=Math.max(2,Math.floor(i));const o=Math.min(s+a,Math.PI);let h=0;const c=[],l=new Ki,u=new Ki,d=[],p=[],m=[],f=[];for(let d=0;d<=i;d++){const g=[],_=d/i;let v=0;0==d&&0==s?v=.5/t:d==i&&o==Math.PI&&(v=-.5/t);for(let i=0;i<=t;i++){const o=i/t;l.x=-e*Math.cos(n+o*r)*Math.sin(s+_*a),l.y=e*Math.cos(s+_*a),l.z=e*Math.sin(n+o*r)*Math.sin(s+_*a),p.push(l.x,l.y,l.z),u.copy(l).normalize(),m.push(u.x,u.y,u.z),f.push(o+v,1-_),g.push(h++)}c.push(g)}for(let e=0;e<i;e++)for(let n=0;n<t;n++){const t=c[e][n+1],r=c[e][n],a=c[e+1][n],h=c[e+1][n+1];(0!==e||s>0)&&d.push(t,r,h),(e!==i-1||o<Math.PI)&&d.push(r,a,h)}this.setIndex(d),this.setAttribute("position",new Ar(p,3)),this.setAttribute("normal",new Ar(m,3)),this.setAttribute("uv",new Ar(f,2))}static fromJSON(e){return new nl(e.radius,e.widthSegments,e.heightSegments,e.phiStart,e.phiLength,e.thetaStart,e.thetaLength)}}(class extends mr{constructor(e){super(),this.type="ShadowMaterial",this.color=new xr(0),this.transparent=!0,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this}}).prototype.isShadowMaterial=!0;class rl extends mr{constructor(e){super(),this.defines={STANDARD:""},this.type="MeshStandardMaterial",this.color=new xr(16777215),this.roughness=1,this.metalness=0,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new xr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.roughnessMap=null,this.metalnessMap=null,this.alphaMap=null,this.envMap=null,this.envMapIntensity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.defines={STANDARD:""},this.color.copy(e.color),this.roughness=e.roughness,this.metalness=e.metalness,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.roughnessMap=e.roughnessMap,this.metalnessMap=e.metalnessMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.envMapIntensity=e.envMapIntensity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this}}rl.prototype.isMeshStandardMaterial=!0;(class extends rl{constructor(e){super(),this.defines={STANDARD:"",PHYSICAL:""},this.type="MeshPhysicalMaterial",this.clearcoatMap=null,this.clearcoatRoughness=0,this.clearcoatRoughnessMap=null,this.clearcoatNormalScale=new zi(1,1),this.clearcoatNormalMap=null,this.ior=1.5,Object.defineProperty(this,"reflectivity",{get:function(){return Li(2.5*(this.ior-1)/(this.ior+1),0,1)},set:function(e){this.ior=(1+.4*e)/(1-.4*e)}}),this.sheenColor=new xr(0),this.sheenColorMap=null,this.sheenRoughness=1,this.sheenRoughnessMap=null,this.transmissionMap=null,this.thickness=.01,this.thicknessMap=null,this.attenuationDistance=0,this.attenuationColor=new xr(1,1,1),this.specularIntensity=1,this.specularIntensityMap=null,this.specularColor=new xr(1,1,1),this.specularColorMap=null,this._sheen=0,this._clearcoat=0,this._transmission=0,this.setValues(e)}get sheen(){return this._sheen}set sheen(e){this._sheen>0!=e>0&&this.version++,this._sheen=e}get clearcoat(){return this._clearcoat}set clearcoat(e){this._clearcoat>0!=e>0&&this.version++,this._clearcoat=e}get transmission(){return this._transmission}set transmission(e){this._transmission>0!=e>0&&this.version++,this._transmission=e}copy(e){return super.copy(e),this.defines={STANDARD:"",PHYSICAL:""},this.clearcoat=e.clearcoat,this.clearcoatMap=e.clearcoatMap,this.clearcoatRoughness=e.clearcoatRoughness,this.clearcoatRoughnessMap=e.clearcoatRoughnessMap,this.clearcoatNormalMap=e.clearcoatNormalMap,this.clearcoatNormalScale.copy(e.clearcoatNormalScale),this.ior=e.ior,this.sheen=e.sheen,this.sheenColor.copy(e.sheenColor),this.sheenColorMap=e.sheenColorMap,this.sheenRoughness=e.sheenRoughness,this.sheenRoughnessMap=e.sheenRoughnessMap,this.transmission=e.transmission,this.transmissionMap=e.transmissionMap,this.thickness=e.thickness,this.thicknessMap=e.thicknessMap,this.attenuationDistance=e.attenuationDistance,this.attenuationColor.copy(e.attenuationColor),this.specularIntensity=e.specularIntensity,this.specularIntensityMap=e.specularIntensityMap,this.specularColor.copy(e.specularColor),this.specularColorMap=e.specularColorMap,this}}).prototype.isMeshPhysicalMaterial=!0;(class extends mr{constructor(e){super(),this.type="MeshPhongMaterial",this.color=new xr(16777215),this.specular=new xr(1118481),this.shininess=30,this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new xr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.specular.copy(e.specular),this.shininess=e.shininess,this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this.flatShading=e.flatShading,this}}).prototype.isMeshPhongMaterial=!0;(class extends mr{constructor(e){super(),this.defines={TOON:""},this.type="MeshToonMaterial",this.color=new xr(16777215),this.map=null,this.gradientMap=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new xr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.gradientMap=e.gradientMap,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this}}).prototype.isMeshToonMaterial=!0;(class extends mr{constructor(e){super(),this.type="MeshNormalMaterial",this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.wireframe=!1,this.wireframeLinewidth=1,this.fog=!1,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.flatShading=e.flatShading,this}}).prototype.isMeshNormalMaterial=!0;(class extends mr{constructor(e){super(),this.type="MeshLambertMaterial",this.color=new xr(16777215),this.map=null,this.lightMap=null,this.lightMapIntensity=1,this.aoMap=null,this.aoMapIntensity=1,this.emissive=new xr(0),this.emissiveIntensity=1,this.emissiveMap=null,this.specularMap=null,this.alphaMap=null,this.envMap=null,this.combine=0,this.reflectivity=1,this.refractionRatio=.98,this.wireframe=!1,this.wireframeLinewidth=1,this.wireframeLinecap="round",this.wireframeLinejoin="round",this.setValues(e)}copy(e){return super.copy(e),this.color.copy(e.color),this.map=e.map,this.lightMap=e.lightMap,this.lightMapIntensity=e.lightMapIntensity,this.aoMap=e.aoMap,this.aoMapIntensity=e.aoMapIntensity,this.emissive.copy(e.emissive),this.emissiveMap=e.emissiveMap,this.emissiveIntensity=e.emissiveIntensity,this.specularMap=e.specularMap,this.alphaMap=e.alphaMap,this.envMap=e.envMap,this.combine=e.combine,this.reflectivity=e.reflectivity,this.refractionRatio=e.refractionRatio,this.wireframe=e.wireframe,this.wireframeLinewidth=e.wireframeLinewidth,this.wireframeLinecap=e.wireframeLinecap,this.wireframeLinejoin=e.wireframeLinejoin,this}}).prototype.isMeshLambertMaterial=!0;(class extends mr{constructor(e){super(),this.defines={MATCAP:""},this.type="MeshMatcapMaterial",this.color=new xr(16777215),this.matcap=null,this.map=null,this.bumpMap=null,this.bumpScale=1,this.normalMap=null,this.normalMapType=0,this.normalScale=new zi(1,1),this.displacementMap=null,this.displacementScale=1,this.displacementBias=0,this.alphaMap=null,this.flatShading=!1,this.setValues(e)}copy(e){return super.copy(e),this.defines={MATCAP:""},this.color.copy(e.color),this.matcap=e.matcap,this.map=e.map,this.bumpMap=e.bumpMap,this.bumpScale=e.bumpScale,this.normalMap=e.normalMap,this.normalMapType=e.normalMapType,this.normalScale.copy(e.normalScale),this.displacementMap=e.displacementMap,this.displacementScale=e.displacementScale,this.displacementBias=e.displacementBias,this.alphaMap=e.alphaMap,this.flatShading=e.flatShading,this}}).prototype.isMeshMatcapMaterial=!0;(class extends Bh{constructor(e){super(),this.type="LineDashedMaterial",this.scale=1,this.dashSize=3,this.gapSize=1,this.setValues(e)}copy(e){return super.copy(e),this.scale=e.scale,this.dashSize=e.dashSize,this.gapSize=e.gapSize,this}}).prototype.isLineDashedMaterial=!0;const sl={arraySlice:function(e,t,i){return sl.isTypedArray(e)?new e.constructor(e.subarray(t,void 0!==i?i:e.length)):e.slice(t,i)},convertArray:function(e,t,i){return!e||!i&&e.constructor===t?e:"number"==typeof t.BYTES_PER_ELEMENT?new t(e):Array.prototype.slice.call(e)},isTypedArray:function(e){return ArrayBuffer.isView(e)&&!(e instanceof DataView)},getKeyframeOrder:function(e){const t=e.length,i=new Array(t);for(let e=0;e!==t;++e)i[e]=e;return i.sort((function(t,i){return e[t]-e[i]})),i},sortedArray:function(e,t,i){const n=e.length,r=new e.constructor(n);for(let s=0,a=0;a!==n;++s){const n=i[s]*t;for(let i=0;i!==t;++i)r[a++]=e[n+i]}return r},flattenJSON:function(e,t,i,n){let r=1,s=e[0];for(;void 0!==s&&void 0===s[n];)s=e[r++];if(void 0===s)return;let a=s[n];if(void 0!==a)if(Array.isArray(a))do{a=s[n],void 0!==a&&(t.push(s.time),i.push.apply(i,a)),s=e[r++]}while(void 0!==s);else if(void 0!==a.toArray)do{a=s[n],void 0!==a&&(t.push(s.time),a.toArray(i,i.length)),s=e[r++]}while(void 0!==s);else do{a=s[n],void 0!==a&&(t.push(s.time),i.push(a)),s=e[r++]}while(void 0!==s)},subclip:function(e,t,i,n,r=30){const s=e.clone();s.name=t;const a=[];for(let e=0;e<s.tracks.length;++e){const t=s.tracks[e],o=t.getValueSize(),h=[],c=[];for(let e=0;e<t.times.length;++e){const s=t.times[e]*r;if(!(s<i||s>=n)){h.push(t.times[e]);for(let i=0;i<o;++i)c.push(t.values[e*o+i])}}0!==h.length&&(t.times=sl.convertArray(h,t.times.constructor),t.values=sl.convertArray(c,t.values.constructor),a.push(t))}s.tracks=a;let o=1/0;for(let e=0;e<s.tracks.length;++e)o>s.tracks[e].times[0]&&(o=s.tracks[e].times[0]);for(let e=0;e<s.tracks.length;++e)s.tracks[e].shift(-1*o);return s.resetDuration(),s},makeClipAdditive:function(e,t=0,i=e,n=30){n<=0&&(n=30);const r=i.tracks.length,s=t/n;for(let t=0;t<r;++t){const n=i.tracks[t],r=n.ValueTypeName;if("bool"===r||"string"===r)continue;const a=e.tracks.find((function(e){return e.name===n.name&&e.ValueTypeName===r}));if(void 0===a)continue;let o=0;const h=n.getValueSize();n.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(o=h/3);let c=0;const l=a.getValueSize();a.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline&&(c=l/3);const u=n.times.length-1;let d;if(s<=n.times[0]){const e=o,t=h-o;d=sl.arraySlice(n.values,e,t)}else if(s>=n.times[u]){const e=u*h+o,t=e+h-o;d=sl.arraySlice(n.values,e,t)}else{const e=n.createInterpolant(),t=o,i=h-o;e.evaluate(s),d=sl.arraySlice(e.resultBuffer,t,i)}if("quaternion"===r){(new Ji).fromArray(d).normalize().conjugate().toArray(d)}const p=a.times.length;for(let e=0;e<p;++e){const t=e*l+c;if("quaternion"===r)Ji.multiplyQuaternionsFlat(a.values,t,d,0,a.values,t);else{const e=l-2*c;for(let i=0;i<e;++i)a.values[t+i]-=d[i]}}}return e.blendMode=2501,e}};class al{constructor(e,t,i,n){this.parameterPositions=e,this._cachedIndex=0,this.resultBuffer=void 0!==n?n:new t.constructor(i),this.sampleValues=t,this.valueSize=i,this.settings=null,this.DefaultSettings_={}}evaluate(e){const t=this.parameterPositions;let i=this._cachedIndex,n=t[i],r=t[i-1];e:{t:{let s;i:{n:if(!(e<n)){for(let s=i+2;;){if(void 0===n){if(e<r)break n;return i=t.length,this._cachedIndex=i,this.afterEnd_(i-1,e,r)}if(i===s)break;if(r=n,n=t[++i],e<n)break t}s=t.length;break i}if(e>=r)break e;{const a=t[1];e<a&&(i=2,r=a);for(let s=i-2;;){if(void 0===r)return this._cachedIndex=0,this.beforeStart_(0,e,n);if(i===s)break;if(n=r,r=t[--i-1],e>=r)break t}s=i,i=0}}for(;i<s;){const n=i+s>>>1;e<t[n]?s=n:i=n+1}if(n=t[i],r=t[i-1],void 0===r)return this._cachedIndex=0,this.beforeStart_(0,e,n);if(void 0===n)return i=t.length,this._cachedIndex=i,this.afterEnd_(i-1,r,e)}this._cachedIndex=i,this.intervalChanged_(i,r,n)}return this.interpolate_(i,r,e,n)}getSettings_(){return this.settings||this.DefaultSettings_}copySampleValue_(e){const t=this.resultBuffer,i=this.sampleValues,n=this.valueSize,r=e*n;for(let e=0;e!==n;++e)t[e]=i[r+e];return t}interpolate_(){throw new Error("call to abstract method")}intervalChanged_(){}}al.prototype.beforeStart_=al.prototype.copySampleValue_,al.prototype.afterEnd_=al.prototype.copySampleValue_;class ol extends al{constructor(e,t,i,n){super(e,t,i,n),this._weightPrev=-0,this._offsetPrev=-0,this._weightNext=-0,this._offsetNext=-0,this.DefaultSettings_={endingStart:pi,endingEnd:pi}}intervalChanged_(e,t,i){const n=this.parameterPositions;let r=e-2,s=e+1,a=n[r],o=n[s];if(void 0===a)switch(this.getSettings_().endingStart){case mi:r=e,a=2*t-i;break;case fi:r=n.length-2,a=t+n[r]-n[r+1];break;default:r=e,a=i}if(void 0===o)switch(this.getSettings_().endingEnd){case mi:s=e,o=2*i-t;break;case fi:s=1,o=i+n[1]-n[0];break;default:s=e-1,o=t}const h=.5*(i-t),c=this.valueSize;this._weightPrev=h/(t-a),this._weightNext=h/(o-i),this._offsetPrev=r*c,this._offsetNext=s*c}interpolate_(e,t,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=e*a,h=o-a,c=this._offsetPrev,l=this._offsetNext,u=this._weightPrev,d=this._weightNext,p=(i-t)/(n-t),m=p*p,f=m*p,g=-u*f+2*u*m-u*p,_=(1+u)*f+(-1.5-2*u)*m+(-.5+u)*p+1,v=(-1-d)*f+(1.5+d)*m+.5*p,y=d*f-d*m;for(let e=0;e!==a;++e)r[e]=g*s[c+e]+_*s[h+e]+v*s[o+e]+y*s[l+e];return r}}class hl extends al{constructor(e,t,i,n){super(e,t,i,n)}interpolate_(e,t,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=e*a,h=o-a,c=(i-t)/(n-t),l=1-c;for(let e=0;e!==a;++e)r[e]=s[h+e]*l+s[o+e]*c;return r}}class cl extends al{constructor(e,t,i,n){super(e,t,i,n)}interpolate_(e){return this.copySampleValue_(e-1)}}class ll{constructor(e,t,i,n){if(void 0===e)throw new Error("THREE.KeyframeTrack: track name is undefined");if(void 0===t||0===t.length)throw new Error("THREE.KeyframeTrack: no keyframes in track named "+e);this.name=e,this.times=sl.convertArray(t,this.TimeBufferType),this.values=sl.convertArray(i,this.ValueBufferType),this.setInterpolation(n||this.DefaultInterpolation)}static toJSON(e){const t=e.constructor;let i;if(t.toJSON!==this.toJSON)i=t.toJSON(e);else{i={name:e.name,times:sl.convertArray(e.times,Array),values:sl.convertArray(e.values,Array)};const t=e.getInterpolation();t!==e.DefaultInterpolation&&(i.interpolation=t)}return i.type=e.ValueTypeName,i}InterpolantFactoryMethodDiscrete(e){return new cl(this.times,this.values,this.getValueSize(),e)}InterpolantFactoryMethodLinear(e){return new hl(this.times,this.values,this.getValueSize(),e)}InterpolantFactoryMethodSmooth(e){return new ol(this.times,this.values,this.getValueSize(),e)}setInterpolation(e){let t;switch(e){case li:t=this.InterpolantFactoryMethodDiscrete;break;case ui:t=this.InterpolantFactoryMethodLinear;break;case di:t=this.InterpolantFactoryMethodSmooth}if(void 0===t){const t="unsupported interpolation for "+this.ValueTypeName+" keyframe track named "+this.name;if(void 0===this.createInterpolant){if(e===this.DefaultInterpolation)throw new Error(t);this.setInterpolation(this.DefaultInterpolation)}return console.warn("THREE.KeyframeTrack:",t),this}return this.createInterpolant=t,this}getInterpolation(){switch(this.createInterpolant){case this.InterpolantFactoryMethodDiscrete:return li;case this.InterpolantFactoryMethodLinear:return ui;case this.InterpolantFactoryMethodSmooth:return di}}getValueSize(){return this.values.length/this.times.length}shift(e){if(0!==e){const t=this.times;for(let i=0,n=t.length;i!==n;++i)t[i]+=e}return this}scale(e){if(1!==e){const t=this.times;for(let i=0,n=t.length;i!==n;++i)t[i]*=e}return this}trim(e,t){const i=this.times,n=i.length;let r=0,s=n-1;for(;r!==n&&i[r]<e;)++r;for(;-1!==s&&i[s]>t;)--s;if(++s,0!==r||s!==n){r>=s&&(s=Math.max(s,1),r=s-1);const e=this.getValueSize();this.times=sl.arraySlice(i,r,s),this.values=sl.arraySlice(this.values,r*e,s*e)}return this}validate(){let e=!0;const t=this.getValueSize();t-Math.floor(t)!=0&&(console.error("THREE.KeyframeTrack: Invalid value size in track.",this),e=!1);const i=this.times,n=this.values,r=i.length;0===r&&(console.error("THREE.KeyframeTrack: Track is empty.",this),e=!1);let s=null;for(let t=0;t!==r;t++){const n=i[t];if("number"==typeof n&&isNaN(n)){console.error("THREE.KeyframeTrack: Time is not a valid number.",this,t,n),e=!1;break}if(null!==s&&s>n){console.error("THREE.KeyframeTrack: Out of order keys.",this,t,n,s),e=!1;break}s=n}if(void 0!==n&&sl.isTypedArray(n))for(let t=0,i=n.length;t!==i;++t){const i=n[t];if(isNaN(i)){console.error("THREE.KeyframeTrack: Value is not a valid number.",this,t,i),e=!1;break}}return e}optimize(){const e=sl.arraySlice(this.times),t=sl.arraySlice(this.values),i=this.getValueSize(),n=this.getInterpolation()===di,r=e.length-1;let s=1;for(let a=1;a<r;++a){let r=!1;const o=e[a];if(o!==e[a+1]&&(1!==a||o!==e[0]))if(n)r=!0;else{const e=a*i,n=e-i,s=e+i;for(let a=0;a!==i;++a){const i=t[e+a];if(i!==t[n+a]||i!==t[s+a]){r=!0;break}}}if(r){if(a!==s){e[s]=e[a];const n=a*i,r=s*i;for(let e=0;e!==i;++e)t[r+e]=t[n+e]}++s}}if(r>0){e[s]=e[r];for(let e=r*i,n=s*i,a=0;a!==i;++a)t[n+a]=t[e+a];++s}return s!==e.length?(this.times=sl.arraySlice(e,0,s),this.values=sl.arraySlice(t,0,s*i)):(this.times=e,this.values=t),this}clone(){const e=sl.arraySlice(this.times,0),t=sl.arraySlice(this.values,0),i=new(0,this.constructor)(this.name,e,t);return i.createInterpolant=this.createInterpolant,i}}ll.prototype.TimeBufferType=Float32Array,ll.prototype.ValueBufferType=Float32Array,ll.prototype.DefaultInterpolation=ui;class ul extends ll{}ul.prototype.ValueTypeName="bool",ul.prototype.ValueBufferType=Array,ul.prototype.DefaultInterpolation=li,ul.prototype.InterpolantFactoryMethodLinear=void 0,ul.prototype.InterpolantFactoryMethodSmooth=void 0;class dl extends ll{}dl.prototype.ValueTypeName="color";class pl extends ll{}pl.prototype.ValueTypeName="number";class ml extends al{constructor(e,t,i,n){super(e,t,i,n)}interpolate_(e,t,i,n){const r=this.resultBuffer,s=this.sampleValues,a=this.valueSize,o=(i-t)/(n-t);let h=e*a;for(let e=h+a;h!==e;h+=4)Ji.slerpFlat(r,0,s,h-a,s,h,o);return r}}class fl extends ll{InterpolantFactoryMethodLinear(e){return new ml(this.times,this.values,this.getValueSize(),e)}}fl.prototype.ValueTypeName="quaternion",fl.prototype.DefaultInterpolation=ui,fl.prototype.InterpolantFactoryMethodSmooth=void 0;class gl extends ll{}gl.prototype.ValueTypeName="string",gl.prototype.ValueBufferType=Array,gl.prototype.DefaultInterpolation=li,gl.prototype.InterpolantFactoryMethodLinear=void 0,gl.prototype.InterpolantFactoryMethodSmooth=void 0;class _l extends ll{}_l.prototype.ValueTypeName="vector";class vl{constructor(e,t=-1,i,n=2500){this.name=e,this.tracks=i,this.duration=t,this.blendMode=n,this.uuid=Pi(),this.duration<0&&this.resetDuration()}static parse(e){const t=[],i=e.tracks,n=1/(e.fps||1);for(let e=0,r=i.length;e!==r;++e)t.push(yl(i[e]).scale(n));const r=new this(e.name,e.duration,t,e.blendMode);return r.uuid=e.uuid,r}static toJSON(e){const t=[],i=e.tracks,n={name:e.name,duration:e.duration,tracks:t,uuid:e.uuid,blendMode:e.blendMode};for(let e=0,n=i.length;e!==n;++e)t.push(ll.toJSON(i[e]));return n}static CreateFromMorphTargetSequence(e,t,i,n){const r=t.length,s=[];for(let e=0;e<r;e++){let a=[],o=[];a.push((e+r-1)%r,e,(e+1)%r),o.push(0,1,0);const h=sl.getKeyframeOrder(a);a=sl.sortedArray(a,1,h),o=sl.sortedArray(o,1,h),n||0!==a[0]||(a.push(r),o.push(o[0])),s.push(new pl(".morphTargetInfluences["+t[e].name+"]",a,o).scale(1/i))}return new this(e,-1,s)}static findByName(e,t){let i=e;if(!Array.isArray(e)){const t=e;i=t.geometry&&t.geometry.animations||t.animations}for(let e=0;e<i.length;e++)if(i[e].name===t)return i[e];return null}static CreateClipsFromMorphTargetSequences(e,t,i){const n={},r=/^([\w-]*?)([\d]+)$/;for(let t=0,i=e.length;t<i;t++){const i=e[t],s=i.name.match(r);if(s&&s.length>1){const e=s[1];let t=n[e];t||(n[e]=t=[]),t.push(i)}}const s=[];for(const e in n)s.push(this.CreateFromMorphTargetSequence(e,n[e],t,i));return s}static parseAnimation(e,t){if(!e)return console.error("THREE.AnimationClip: No animation in JSONLoader data."),null;const i=function(e,t,i,n,r){if(0!==i.length){const s=[],a=[];sl.flattenJSON(i,s,a,n),0!==s.length&&r.push(new e(t,s,a))}},n=[],r=e.name||"default",s=e.fps||30,a=e.blendMode;let o=e.length||-1;const h=e.hierarchy||[];for(let e=0;e<h.length;e++){const r=h[e].keys;if(r&&0!==r.length)if(r[0].morphTargets){const e={};let t;for(t=0;t<r.length;t++)if(r[t].morphTargets)for(let i=0;i<r[t].morphTargets.length;i++)e[r[t].morphTargets[i]]=-1;for(const i in e){const e=[],s=[];for(let n=0;n!==r[t].morphTargets.length;++n){const n=r[t];e.push(n.time),s.push(n.morphTarget===i?1:0)}n.push(new pl(".morphTargetInfluence["+i+"]",e,s))}o=e.length*(s||1)}else{const s=".bones["+t[e].name+"]";i(_l,s+".position",r,"pos",n),i(fl,s+".quaternion",r,"rot",n),i(_l,s+".scale",r,"scl",n)}}if(0===n.length)return null;return new this(r,o,n,a)}resetDuration(){let e=0;for(let t=0,i=this.tracks.length;t!==i;++t){const i=this.tracks[t];e=Math.max(e,i.times[i.times.length-1])}return this.duration=e,this}trim(){for(let e=0;e<this.tracks.length;e++)this.tracks[e].trim(0,this.duration);return this}validate(){let e=!0;for(let t=0;t<this.tracks.length;t++)e=e&&this.tracks[t].validate();return e}optimize(){for(let e=0;e<this.tracks.length;e++)this.tracks[e].optimize();return this}clone(){const e=[];for(let t=0;t<this.tracks.length;t++)e.push(this.tracks[t].clone());return new this.constructor(this.name,this.duration,e,this.blendMode)}toJSON(){return this.constructor.toJSON(this)}}function yl(e){if(void 0===e.type)throw new Error("THREE.KeyframeTrack: track type undefined, can not parse");const t=function(e){switch(e.toLowerCase()){case"scalar":case"double":case"float":case"number":case"integer":return pl;case"vector":case"vector2":case"vector3":case"vector4":return _l;case"color":return dl;case"quaternion":return fl;case"bool":case"boolean":return ul;case"string":return gl}throw new Error("THREE.KeyframeTrack: Unsupported typeName: "+e)}(e.type);if(void 0===e.times){const t=[],i=[];sl.flattenJSON(e.keys,t,i,"value"),e.times=t,e.values=i}return void 0!==t.parse?t.parse(e):new t(e.name,e.times,e.values,e.interpolation)}const bl={enabled:!1,files:{},add:function(e,t){!1!==this.enabled&&(this.files[e]=t)},get:function(e){if(!1!==this.enabled)return this.files[e]},remove:function(e){delete this.files[e]},clear:function(){this.files={}}};const xl=new class{constructor(e,t,i){const n=this;let r,s=!1,a=0,o=0;const h=[];this.onStart=void 0,this.onLoad=e,this.onProgress=t,this.onError=i,this.itemStart=function(e){o++,!1===s&&void 0!==n.onStart&&n.onStart(e,a,o),s=!0},this.itemEnd=function(e){a++,void 0!==n.onProgress&&n.onProgress(e,a,o),a===o&&(s=!1,void 0!==n.onLoad&&n.onLoad())},this.itemError=function(e){void 0!==n.onError&&n.onError(e)},this.resolveURL=function(e){return r?r(e):e},this.setURLModifier=function(e){return r=e,this},this.addHandler=function(e,t){return h.push(e,t),this},this.removeHandler=function(e){const t=h.indexOf(e);return-1!==t&&h.splice(t,2),this},this.getHandler=function(e){for(let t=0,i=h.length;t<i;t+=2){const i=h[t],n=h[t+1];if(i.global&&(i.lastIndex=0),i.test(e))return n}return null}}};class wl{constructor(e){this.manager=void 0!==e?e:xl,this.crossOrigin="anonymous",this.withCredentials=!1,this.path="",this.resourcePath="",this.requestHeader={}}load(){}loadAsync(e,t){const i=this;return new Promise((function(n,r){i.load(e,n,t,r)}))}parse(){}setCrossOrigin(e){return this.crossOrigin=e,this}setWithCredentials(e){return this.withCredentials=e,this}setPath(e){return this.path=e,this}setResourcePath(e){return this.resourcePath=e,this}setRequestHeader(e){return this.requestHeader=e,this}}const Ml={};class Sl extends wl{constructor(e){super(e)}load(e,t,i,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=bl.get(e);if(void 0!==r)return this.manager.itemStart(e),setTimeout((()=>{t&&t(r),this.manager.itemEnd(e)}),0),r;if(void 0!==Ml[e])return void Ml[e].push({onLoad:t,onProgress:i,onError:n});Ml[e]=[],Ml[e].push({onLoad:t,onProgress:i,onError:n});const s=new Request(e,{headers:new Headers(this.requestHeader),credentials:this.withCredentials?"include":"same-origin"});fetch(s).then((t=>{if(200===t.status||0===t.status){0===t.status&&console.warn("THREE.FileLoader: HTTP Status 0 received.");const i=Ml[e],n=t.body.getReader(),r=t.headers.get("Content-Length"),s=r?parseInt(r):0,a=0!==s;let o=0;return new ReadableStream({start(e){!function t(){n.read().then((({done:n,value:r})=>{if(n)e.close();else{o+=r.byteLength;const n=new ProgressEvent("progress",{lengthComputable:a,loaded:o,total:s});for(let e=0,t=i.length;e<t;e++){const t=i[e];t.onProgress&&t.onProgress(n)}e.enqueue(r),t()}}))}()}})}throw Error(`fetch for "${t.url}" responded with ${t.status}: ${t.statusText}`)})).then((e=>{const t=new Response(e);switch(this.responseType){case"arraybuffer":return t.arrayBuffer();case"blob":return t.blob();case"document":return t.text().then((e=>(new DOMParser).parseFromString(e,this.mimeType)));case"json":return t.json();default:return t.text()}})).then((t=>{bl.add(e,t);const i=Ml[e];delete Ml[e];for(let e=0,n=i.length;e<n;e++){const n=i[e];n.onLoad&&n.onLoad(t)}this.manager.itemEnd(e)})).catch((t=>{const i=Ml[e];delete Ml[e];for(let e=0,n=i.length;e<n;e++){const n=i[e];n.onError&&n.onError(t)}this.manager.itemError(e),this.manager.itemEnd(e)})),this.manager.itemStart(e)}setResponseType(e){return this.responseType=e,this}setMimeType(e){return this.mimeType=e,this}}class Tl extends wl{constructor(e){super(e)}load(e,t,i,n){void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,s=bl.get(e);if(void 0!==s)return r.manager.itemStart(e),setTimeout((function(){t&&t(s),r.manager.itemEnd(e)}),0),s;const a=Ui("img");function o(){c(),bl.add(e,this),t&&t(this),r.manager.itemEnd(e)}function h(t){c(),n&&n(t),r.manager.itemError(e),r.manager.itemEnd(e)}function c(){a.removeEventListener("load",o,!1),a.removeEventListener("error",h,!1)}return a.addEventListener("load",o,!1),a.addEventListener("error",h,!1),"data:"!==e.substr(0,5)&&void 0!==this.crossOrigin&&(a.crossOrigin=this.crossOrigin),r.manager.itemStart(e),a.src=e,a}}class Cl extends wl{constructor(e){super(e)}load(e,t,i,n){const r=new us,s=new Tl(this.manager);s.setCrossOrigin(this.crossOrigin),s.setPath(this.path);let a=0;function o(i){s.load(e[i],(function(e){r.images[i]=e,a++,6===a&&(r.needsUpdate=!0,t&&t(r))}),void 0,n)}for(let t=0;t<e.length;++t)o(t);return r}}class El extends wl{constructor(e){super(e)}load(e,t,i,n){const r=new Wi,s=new Tl(this.manager);return s.setCrossOrigin(this.crossOrigin),s.setPath(this.path),s.load(e,(function(e){r.image=e,r.needsUpdate=!0,void 0!==t&&t(r)}),i,n),r}}class Al extends tr{constructor(e,t=1){super(),this.type="Light",this.color=new xr(e),this.intensity=t}dispose(){}copy(e){return super.copy(e),this.color.copy(e.color),this.intensity=e.intensity,this}toJSON(e){const t=super.toJSON(e);return t.object.color=this.color.getHex(),t.object.intensity=this.intensity,void 0!==this.groundColor&&(t.object.groundColor=this.groundColor.getHex()),void 0!==this.distance&&(t.object.distance=this.distance),void 0!==this.angle&&(t.object.angle=this.angle),void 0!==this.decay&&(t.object.decay=this.decay),void 0!==this.penumbra&&(t.object.penumbra=this.penumbra),void 0!==this.shadow&&(t.object.shadow=this.shadow.toJSON()),t}}Al.prototype.isLight=!0;(class extends Al{constructor(e,t,i){super(e,i),this.type="HemisphereLight",this.position.copy(tr.DefaultUp),this.updateMatrix(),this.groundColor=new xr(t)}copy(e){return Al.prototype.copy.call(this,e),this.groundColor.copy(e.groundColor),this}}).prototype.isHemisphereLight=!0;const Il=new Rn,Rl=new Ki,Pl=new Ki;class Ll{constructor(e){this.camera=e,this.bias=0,this.normalBias=0,this.radius=1,this.blurSamples=8,this.mapSize=new zi(512,512),this.map=null,this.mapPass=null,this.matrix=new Rn,this.autoUpdate=!0,this.needsUpdate=!1,this._frustum=new ys,this._frameExtents=new zi(1,1),this._viewportCount=1,this._viewports=[new Xi(0,0,1,1)]}getViewportCount(){return this._viewportCount}getFrustum(){return this._frustum}updateMatrices(e){const t=this.camera,i=this.matrix;Rl.setFromMatrixPosition(e.matrixWorld),t.position.copy(Rl),Pl.setFromMatrixPosition(e.target.matrixWorld),t.lookAt(Pl),t.updateMatrixWorld(),Il.multiplyMatrices(t.projectionMatrix,t.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Il),i.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),i.multiply(t.projectionMatrix),i.multiply(t.matrixWorldInverse)}getViewport(e){return this._viewports[e]}getFrameExtents(){return this._frameExtents}dispose(){this.map&&this.map.dispose(),this.mapPass&&this.mapPass.dispose()}copy(e){return this.camera=e.camera.clone(),this.bias=e.bias,this.radius=e.radius,this.mapSize.copy(e.mapSize),this}clone(){return(new this.constructor).copy(this)}toJSON(){const e={};return 0!==this.bias&&(e.bias=this.bias),0!==this.normalBias&&(e.normalBias=this.normalBias),1!==this.radius&&(e.radius=this.radius),512===this.mapSize.x&&512===this.mapSize.y||(e.mapSize=this.mapSize.toArray()),e.camera=this.camera.toJSON(!1).object,delete e.camera.matrix,e}}class Dl extends Ll{constructor(){super(new hs(50,1,.5,500)),this.focus=1}updateMatrices(e){const t=this.camera,i=2*Ai*e.angle*this.focus,n=this.mapSize.width/this.mapSize.height,r=e.distance||t.far;i===t.fov&&n===t.aspect&&r===t.far||(t.fov=i,t.aspect=n,t.far=r,t.updateProjectionMatrix()),super.updateMatrices(e)}copy(e){return super.copy(e),this.focus=e.focus,this}}Dl.prototype.isSpotLightShadow=!0;(class extends Al{constructor(e,t,i=0,n=Math.PI/3,r=0,s=1){super(e,t),this.type="SpotLight",this.position.copy(tr.DefaultUp),this.updateMatrix(),this.target=new tr,this.distance=i,this.angle=n,this.penumbra=r,this.decay=s,this.shadow=new Dl}get power(){return this.intensity*Math.PI}set power(e){this.intensity=e/Math.PI}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.distance=e.distance,this.angle=e.angle,this.penumbra=e.penumbra,this.decay=e.decay,this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}).prototype.isSpotLight=!0;const Nl=new Rn,$l=new Ki,kl=new Ki;class Ol extends Ll{constructor(){super(new hs(90,1,.5,500)),this._frameExtents=new zi(4,2),this._viewportCount=6,this._viewports=[new Xi(2,1,1,1),new Xi(0,1,1,1),new Xi(3,1,1,1),new Xi(1,1,1,1),new Xi(3,0,1,1),new Xi(1,0,1,1)],this._cubeDirections=[new Ki(1,0,0),new Ki(-1,0,0),new Ki(0,0,1),new Ki(0,0,-1),new Ki(0,1,0),new Ki(0,-1,0)],this._cubeUps=[new Ki(0,1,0),new Ki(0,1,0),new Ki(0,1,0),new Ki(0,1,0),new Ki(0,0,1),new Ki(0,0,-1)]}updateMatrices(e,t=0){const i=this.camera,n=this.matrix,r=e.distance||i.far;r!==i.far&&(i.far=r,i.updateProjectionMatrix()),$l.setFromMatrixPosition(e.matrixWorld),i.position.copy($l),kl.copy(i.position),kl.add(this._cubeDirections[t]),i.up.copy(this._cubeUps[t]),i.lookAt(kl),i.updateMatrixWorld(),n.makeTranslation(-$l.x,-$l.y,-$l.z),Nl.multiplyMatrices(i.projectionMatrix,i.matrixWorldInverse),this._frustum.setFromProjectionMatrix(Nl)}}Ol.prototype.isPointLightShadow=!0;(class extends Al{constructor(e,t,i=0,n=1){super(e,t),this.type="PointLight",this.distance=i,this.decay=n,this.shadow=new Ol}get power(){return 4*this.intensity*Math.PI}set power(e){this.intensity=e/(4*Math.PI)}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.distance=e.distance,this.decay=e.decay,this.shadow=e.shadow.clone(),this}}).prototype.isPointLight=!0;class zl extends Ll{constructor(){super(new Ls(-5,5,5,-5,.5,500))}}zl.prototype.isDirectionalLightShadow=!0;(class extends Al{constructor(e,t){super(e,t),this.type="DirectionalLight",this.position.copy(tr.DefaultUp),this.updateMatrix(),this.target=new tr,this.shadow=new zl}dispose(){this.shadow.dispose()}copy(e){return super.copy(e),this.target=e.target.clone(),this.shadow=e.shadow.clone(),this}}).prototype.isDirectionalLight=!0;(class extends Al{constructor(e,t){super(e,t),this.type="AmbientLight"}}).prototype.isAmbientLight=!0;(class extends Al{constructor(e,t,i=10,n=10){super(e,t),this.type="RectAreaLight",this.width=i,this.height=n}get power(){return this.intensity*this.width*this.height*Math.PI}set power(e){this.intensity=e/(this.width*this.height*Math.PI)}copy(e){return super.copy(e),this.width=e.width,this.height=e.height,this}toJSON(e){const t=super.toJSON(e);return t.object.width=this.width,t.object.height=this.height,t}}).prototype.isRectAreaLight=!0;class Fl{constructor(){this.coefficients=[];for(let e=0;e<9;e++)this.coefficients.push(new Ki)}set(e){for(let t=0;t<9;t++)this.coefficients[t].copy(e[t]);return this}zero(){for(let e=0;e<9;e++)this.coefficients[e].set(0,0,0);return this}getAt(e,t){const i=e.x,n=e.y,r=e.z,s=this.coefficients;return t.copy(s[0]).multiplyScalar(.282095),t.addScaledVector(s[1],.488603*n),t.addScaledVector(s[2],.488603*r),t.addScaledVector(s[3],.488603*i),t.addScaledVector(s[4],i*n*1.092548),t.addScaledVector(s[5],n*r*1.092548),t.addScaledVector(s[6],.315392*(3*r*r-1)),t.addScaledVector(s[7],i*r*1.092548),t.addScaledVector(s[8],.546274*(i*i-n*n)),t}getIrradianceAt(e,t){const i=e.x,n=e.y,r=e.z,s=this.coefficients;return t.copy(s[0]).multiplyScalar(.886227),t.addScaledVector(s[1],1.023328*n),t.addScaledVector(s[2],1.023328*r),t.addScaledVector(s[3],1.023328*i),t.addScaledVector(s[4],.858086*i*n),t.addScaledVector(s[5],.858086*n*r),t.addScaledVector(s[6],.743125*r*r-.247708),t.addScaledVector(s[7],.858086*i*r),t.addScaledVector(s[8],.429043*(i*i-n*n)),t}add(e){for(let t=0;t<9;t++)this.coefficients[t].add(e.coefficients[t]);return this}addScaledSH(e,t){for(let i=0;i<9;i++)this.coefficients[i].addScaledVector(e.coefficients[i],t);return this}scale(e){for(let t=0;t<9;t++)this.coefficients[t].multiplyScalar(e);return this}lerp(e,t){for(let i=0;i<9;i++)this.coefficients[i].lerp(e.coefficients[i],t);return this}equals(e){for(let t=0;t<9;t++)if(!this.coefficients[t].equals(e.coefficients[t]))return!1;return!0}copy(e){return this.set(e.coefficients)}clone(){return(new this.constructor).copy(this)}fromArray(e,t=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].fromArray(e,t+3*n);return this}toArray(e=[],t=0){const i=this.coefficients;for(let n=0;n<9;n++)i[n].toArray(e,t+3*n);return e}static getBasisAt(e,t){const i=e.x,n=e.y,r=e.z;t[0]=.282095,t[1]=.488603*n,t[2]=.488603*r,t[3]=.488603*i,t[4]=1.092548*i*n,t[5]=1.092548*n*r,t[6]=.315392*(3*r*r-1),t[7]=1.092548*i*r,t[8]=.546274*(i*i-n*n)}}Fl.prototype.isSphericalHarmonics3=!0;class Bl extends Al{constructor(e=new Fl,t=1){super(void 0,t),this.sh=e}copy(e){return super.copy(e),this.sh.copy(e.sh),this}fromJSON(e){return this.intensity=e.intensity,this.sh.fromArray(e.sh),this}toJSON(e){const t=super.toJSON(e);return t.object.sh=this.sh.toArray(),t}}Bl.prototype.isLightProbe=!0;(class extends kr{constructor(){super(),this.type="InstancedBufferGeometry",this.instanceCount=1/0}copy(e){return super.copy(e),this.instanceCount=e.instanceCount,this}clone(){return(new this.constructor).copy(this)}toJSON(){const e=super.toJSON(this);return e.instanceCount=this.instanceCount,e.isInstancedBufferGeometry=!0,e}}).prototype.isInstancedBufferGeometry=!0;let Ul;(class extends wl{constructor(e){super(e),"undefined"==typeof createImageBitmap&&console.warn("THREE.ImageBitmapLoader: createImageBitmap() not supported."),"undefined"==typeof fetch&&console.warn("THREE.ImageBitmapLoader: fetch() not supported."),this.options={premultiplyAlpha:"none"}}setOptions(e){return this.options=e,this}load(e,t,i,n){void 0===e&&(e=""),void 0!==this.path&&(e=this.path+e),e=this.manager.resolveURL(e);const r=this,s=bl.get(e);if(void 0!==s)return r.manager.itemStart(e),setTimeout((function(){t&&t(s),r.manager.itemEnd(e)}),0),s;const a={};a.credentials="anonymous"===this.crossOrigin?"same-origin":"include",a.headers=this.requestHeader,fetch(e,a).then((function(e){return e.blob()})).then((function(e){return createImageBitmap(e,Object.assign(r.options,{colorSpaceConversion:"none"}))})).then((function(i){bl.add(e,i),t&&t(i),r.manager.itemEnd(e)})).catch((function(t){n&&n(t),r.manager.itemError(e),r.manager.itemEnd(e)})),r.manager.itemStart(e)}}).prototype.isImageBitmapLoader=!0;const Vl=function(){return void 0===Ul&&(Ul=new(window.AudioContext||window.webkitAudioContext)),Ul};class Hl extends wl{constructor(e){super(e)}load(e,t,i,n){const r=this,s=new Sl(this.manager);s.setResponseType("arraybuffer"),s.setPath(this.path),s.setRequestHeader(this.requestHeader),s.setWithCredentials(this.withCredentials),s.load(e,(function(i){try{const e=i.slice(0);Vl().decodeAudioData(e,(function(e){t(e)}))}catch(t){n?n(t):console.error(t),r.manager.itemError(e)}}),i,n)}}(class extends Bl{constructor(e,t,i=1){super(void 0,i);const n=(new xr).set(e),r=(new xr).set(t),s=new Ki(n.r,n.g,n.b),a=new Ki(r.r,r.g,r.b),o=Math.sqrt(Math.PI),h=o*Math.sqrt(.75);this.sh.coefficients[0].copy(s).add(a).multiplyScalar(o),this.sh.coefficients[1].copy(s).sub(a).multiplyScalar(h)}}).prototype.isHemisphereLightProbe=!0;(class extends Bl{constructor(e,t=1){super(void 0,t);const i=(new xr).set(e);this.sh.coefficients[0].set(i.r,i.g,i.b).multiplyScalar(2*Math.sqrt(Math.PI))}}).prototype.isAmbientLightProbe=!0;class jl{constructor(e=!0){this.autoStart=e,this.startTime=0,this.oldTime=0,this.elapsedTime=0,this.running=!1}start(){this.startTime=Gl(),this.oldTime=this.startTime,this.elapsedTime=0,this.running=!0}stop(){this.getElapsedTime(),this.running=!1,this.autoStart=!1}getElapsedTime(){return this.getDelta(),this.elapsedTime}getDelta(){let e=0;if(this.autoStart&&!this.running)return this.start(),0;if(this.running){const t=Gl();e=(t-this.oldTime)/1e3,this.oldTime=t,this.elapsedTime+=e}return e}}function Gl(){return("undefined"==typeof performance?Date:performance).now()}class Wl{constructor(e,t,i){let n,r,s;switch(this.binding=e,this.valueSize=i,t){case"quaternion":n=this._slerp,r=this._slerpAdditive,s=this._setAdditiveIdentityQuaternion,this.buffer=new Float64Array(6*i),this._workIndex=5;break;case"string":case"bool":n=this._select,r=this._select,s=this._setAdditiveIdentityOther,this.buffer=new Array(5*i);break;default:n=this._lerp,r=this._lerpAdditive,s=this._setAdditiveIdentityNumeric,this.buffer=new Float64Array(5*i)}this._mixBufferRegion=n,this._mixBufferRegionAdditive=r,this._setIdentity=s,this._origIndex=3,this._addIndex=4,this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,this.useCount=0,this.referenceCount=0}accumulate(e,t){const i=this.buffer,n=this.valueSize,r=e*n+n;let s=this.cumulativeWeight;if(0===s){for(let e=0;e!==n;++e)i[r+e]=i[e];s=t}else{s+=t;const e=t/s;this._mixBufferRegion(i,r,0,e,n)}this.cumulativeWeight=s}accumulateAdditive(e){const t=this.buffer,i=this.valueSize,n=i*this._addIndex;0===this.cumulativeWeightAdditive&&this._setIdentity(),this._mixBufferRegionAdditive(t,n,0,e,i),this.cumulativeWeightAdditive+=e}apply(e){const t=this.valueSize,i=this.buffer,n=e*t+t,r=this.cumulativeWeight,s=this.cumulativeWeightAdditive,a=this.binding;if(this.cumulativeWeight=0,this.cumulativeWeightAdditive=0,r<1){const e=t*this._origIndex;this._mixBufferRegion(i,n,e,1-r,t)}s>0&&this._mixBufferRegionAdditive(i,n,this._addIndex*t,1,t);for(let e=t,r=t+t;e!==r;++e)if(i[e]!==i[e+t]){a.setValue(i,n);break}}saveOriginalState(){const e=this.binding,t=this.buffer,i=this.valueSize,n=i*this._origIndex;e.getValue(t,n);for(let e=i,r=n;e!==r;++e)t[e]=t[n+e%i];this._setIdentity(),this.cumulativeWeight=0,this.cumulativeWeightAdditive=0}restoreOriginalState(){const e=3*this.valueSize;this.binding.setValue(this.buffer,e)}_setAdditiveIdentityNumeric(){const e=this._addIndex*this.valueSize,t=e+this.valueSize;for(let i=e;i<t;i++)this.buffer[i]=0}_setAdditiveIdentityQuaternion(){this._setAdditiveIdentityNumeric(),this.buffer[this._addIndex*this.valueSize+3]=1}_setAdditiveIdentityOther(){const e=this._origIndex*this.valueSize,t=this._addIndex*this.valueSize;for(let i=0;i<this.valueSize;i++)this.buffer[t+i]=this.buffer[e+i]}_select(e,t,i,n,r){if(n>=.5)for(let n=0;n!==r;++n)e[t+n]=e[i+n]}_slerp(e,t,i,n){Ji.slerpFlat(e,t,e,t,e,i,n)}_slerpAdditive(e,t,i,n,r){const s=this._workIndex*r;Ji.multiplyQuaternionsFlat(e,s,e,t,e,i),Ji.slerpFlat(e,t,e,t,e,s,n)}_lerp(e,t,i,n,r){const s=1-n;for(let a=0;a!==r;++a){const r=t+a;e[r]=e[r]*s+e[i+a]*n}}_lerpAdditive(e,t,i,n,r){for(let s=0;s!==r;++s){const r=t+s;e[r]=e[r]+e[i+s]*n}}}const ql="\\[\\]\\.:\\/",Xl=new RegExp("[\\[\\]\\.:\\/]","g"),Zl="[^\\[\\]\\.:\\/]",Yl="[^"+ql.replace("\\.","")+"]",Jl=/((?:WC+[\/:])*)/.source.replace("WC",Zl),Kl=/(WCOD+)?/.source.replace("WCOD",Yl),Ql=/(?:\.(WC+)(?:\[(.+)\])?)?/.source.replace("WC",Zl),eu=/\.(WC+)(?:\[(.+)\])?/.source.replace("WC",Zl),tu=new RegExp("^"+Jl+Kl+Ql+eu+"$"),iu=["material","materials","bones"];class nu{constructor(e,t,i){this.path=t,this.parsedPath=i||nu.parseTrackName(t),this.node=nu.findNode(e,this.parsedPath.nodeName)||e,this.rootNode=e,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}static create(e,t,i){return e&&e.isAnimationObjectGroup?new nu.Composite(e,t,i):new nu(e,t,i)}static sanitizeNodeName(e){return e.replace(/\s/g,"_").replace(Xl,"")}static parseTrackName(e){const t=tu.exec(e);if(!t)throw new Error("PropertyBinding: Cannot parse trackName: "+e);const i={nodeName:t[2],objectName:t[3],objectIndex:t[4],propertyName:t[5],propertyIndex:t[6]},n=i.nodeName&&i.nodeName.lastIndexOf(".");if(void 0!==n&&-1!==n){const e=i.nodeName.substring(n+1);-1!==iu.indexOf(e)&&(i.nodeName=i.nodeName.substring(0,n),i.objectName=e)}if(null===i.propertyName||0===i.propertyName.length)throw new Error("PropertyBinding: can not parse propertyName from trackName: "+e);return i}static findNode(e,t){if(!t||""===t||"."===t||-1===t||t===e.name||t===e.uuid)return e;if(e.skeleton){const i=e.skeleton.getBoneByName(t);if(void 0!==i)return i}if(e.children){const i=function(e){for(let n=0;n<e.length;n++){const r=e[n];if(r.name===t||r.uuid===t)return r;const s=i(r.children);if(s)return s}return null},n=i(e.children);if(n)return n}return null}_getValue_unavailable(){}_setValue_unavailable(){}_getValue_direct(e,t){e[t]=this.targetObject[this.propertyName]}_getValue_array(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)e[t++]=i[n]}_getValue_arrayElement(e,t){e[t]=this.resolvedProperty[this.propertyIndex]}_getValue_toArray(e,t){this.resolvedProperty.toArray(e,t)}_setValue_direct(e,t){this.targetObject[this.propertyName]=e[t]}_setValue_direct_setNeedsUpdate(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.needsUpdate=!0}_setValue_direct_setMatrixWorldNeedsUpdate(e,t){this.targetObject[this.propertyName]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_array(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=e[t++]}_setValue_array_setNeedsUpdate(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=e[t++];this.targetObject.needsUpdate=!0}_setValue_array_setMatrixWorldNeedsUpdate(e,t){const i=this.resolvedProperty;for(let n=0,r=i.length;n!==r;++n)i[n]=e[t++];this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_arrayElement(e,t){this.resolvedProperty[this.propertyIndex]=e[t]}_setValue_arrayElement_setNeedsUpdate(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.needsUpdate=!0}_setValue_arrayElement_setMatrixWorldNeedsUpdate(e,t){this.resolvedProperty[this.propertyIndex]=e[t],this.targetObject.matrixWorldNeedsUpdate=!0}_setValue_fromArray(e,t){this.resolvedProperty.fromArray(e,t)}_setValue_fromArray_setNeedsUpdate(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.needsUpdate=!0}_setValue_fromArray_setMatrixWorldNeedsUpdate(e,t){this.resolvedProperty.fromArray(e,t),this.targetObject.matrixWorldNeedsUpdate=!0}_getValue_unbound(e,t){this.bind(),this.getValue(e,t)}_setValue_unbound(e,t){this.bind(),this.setValue(e,t)}bind(){let e=this.node;const t=this.parsedPath,i=t.objectName,n=t.propertyName;let r=t.propertyIndex;if(e||(e=nu.findNode(this.rootNode,t.nodeName)||this.rootNode,this.node=e),this.getValue=this._getValue_unavailable,this.setValue=this._setValue_unavailable,!e)return void console.error("THREE.PropertyBinding: Trying to update node for track: "+this.path+" but it wasn't found.");if(i){let n=t.objectIndex;switch(i){case"materials":if(!e.material)return void console.error("THREE.PropertyBinding: Can not bind to material as node does not have a material.",this);if(!e.material.materials)return void console.error("THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.",this);e=e.material.materials;break;case"bones":if(!e.skeleton)return void console.error("THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.",this);e=e.skeleton.bones;for(let t=0;t<e.length;t++)if(e[t].name===n){n=t;break}break;default:if(void 0===e[i])return void console.error("THREE.PropertyBinding: Can not bind to objectName of node undefined.",this);e=e[i]}if(void 0!==n){if(void 0===e[n])return void console.error("THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.",this,e);e=e[n]}}const s=e[n];if(void 0===s){const i=t.nodeName;return void console.error("THREE.PropertyBinding: Trying to update property for track: "+i+"."+n+" but it wasn't found.",e)}let a=this.Versioning.None;this.targetObject=e,void 0!==e.needsUpdate?a=this.Versioning.NeedsUpdate:void 0!==e.matrixWorldNeedsUpdate&&(a=this.Versioning.MatrixWorldNeedsUpdate);let o=this.BindingType.Direct;if(void 0!==r){if("morphTargetInfluences"===n){if(!e.geometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.",this);if(!e.geometry.isBufferGeometry)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences on THREE.Geometry. Use THREE.BufferGeometry instead.",this);if(!e.geometry.morphAttributes)return void console.error("THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.",this);void 0!==e.morphTargetDictionary[r]&&(r=e.morphTargetDictionary[r])}o=this.BindingType.ArrayElement,this.resolvedProperty=s,this.propertyIndex=r}else void 0!==s.fromArray&&void 0!==s.toArray?(o=this.BindingType.HasFromToArray,this.resolvedProperty=s):Array.isArray(s)?(o=this.BindingType.EntireArray,this.resolvedProperty=s):this.propertyName=n;this.getValue=this.GetterByBindingType[o],this.setValue=this.SetterByBindingTypeAndVersioning[o][a]}unbind(){this.node=null,this.getValue=this._getValue_unbound,this.setValue=this._setValue_unbound}}nu.Composite=class{constructor(e,t,i){const n=i||nu.parseTrackName(t);this._targetGroup=e,this._bindings=e.subscribe_(t,n)}getValue(e,t){this.bind();const i=this._targetGroup.nCachedObjects_,n=this._bindings[i];void 0!==n&&n.getValue(e,t)}setValue(e,t){const i=this._bindings;for(let n=this._targetGroup.nCachedObjects_,r=i.length;n!==r;++n)i[n].setValue(e,t)}bind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,i=e.length;t!==i;++t)e[t].bind()}unbind(){const e=this._bindings;for(let t=this._targetGroup.nCachedObjects_,i=e.length;t!==i;++t)e[t].unbind()}},nu.prototype.BindingType={Direct:0,EntireArray:1,ArrayElement:2,HasFromToArray:3},nu.prototype.Versioning={None:0,NeedsUpdate:1,MatrixWorldNeedsUpdate:2},nu.prototype.GetterByBindingType=[nu.prototype._getValue_direct,nu.prototype._getValue_array,nu.prototype._getValue_arrayElement,nu.prototype._getValue_toArray],nu.prototype.SetterByBindingTypeAndVersioning=[[nu.prototype._setValue_direct,nu.prototype._setValue_direct_setNeedsUpdate,nu.prototype._setValue_direct_setMatrixWorldNeedsUpdate],[nu.prototype._setValue_array,nu.prototype._setValue_array_setNeedsUpdate,nu.prototype._setValue_array_setMatrixWorldNeedsUpdate],[nu.prototype._setValue_arrayElement,nu.prototype._setValue_arrayElement_setNeedsUpdate,nu.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate],[nu.prototype._setValue_fromArray,nu.prototype._setValue_fromArray_setNeedsUpdate,nu.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate]];class ru{constructor(e,t,i=null,n=t.blendMode){this._mixer=e,this._clip=t,this._localRoot=i,this.blendMode=n;const r=t.tracks,s=r.length,a=new Array(s),o={endingStart:pi,endingEnd:pi};for(let e=0;e!==s;++e){const t=r[e].createInterpolant(null);a[e]=t,t.settings=o}this._interpolantSettings=o,this._interpolants=a,this._propertyBindings=new Array(s),this._cacheIndex=null,this._byClipCacheIndex=null,this._timeScaleInterpolant=null,this._weightInterpolant=null,this.loop=2201,this._loopCount=-1,this._startTime=null,this.time=0,this.timeScale=1,this._effectiveTimeScale=1,this.weight=1,this._effectiveWeight=1,this.repetitions=1/0,this.paused=!1,this.enabled=!0,this.clampWhenFinished=!1,this.zeroSlopeAtStart=!0,this.zeroSlopeAtEnd=!0}play(){return this._mixer._activateAction(this),this}stop(){return this._mixer._deactivateAction(this),this.reset()}reset(){return this.paused=!1,this.enabled=!0,this.time=0,this._loopCount=-1,this._startTime=null,this.stopFading().stopWarping()}isRunning(){return this.enabled&&!this.paused&&0!==this.timeScale&&null===this._startTime&&this._mixer._isActiveAction(this)}isScheduled(){return this._mixer._isActiveAction(this)}startAt(e){return this._startTime=e,this}setLoop(e,t){return this.loop=e,this.repetitions=t,this}setEffectiveWeight(e){return this.weight=e,this._effectiveWeight=this.enabled?e:0,this.stopFading()}getEffectiveWeight(){return this._effectiveWeight}fadeIn(e){return this._scheduleFading(e,0,1)}fadeOut(e){return this._scheduleFading(e,1,0)}crossFadeFrom(e,t,i){if(e.fadeOut(t),this.fadeIn(t),i){const i=this._clip.duration,n=e._clip.duration,r=n/i,s=i/n;e.warp(1,r,t),this.warp(s,1,t)}return this}crossFadeTo(e,t,i){return e.crossFadeFrom(this,t,i)}stopFading(){const e=this._weightInterpolant;return null!==e&&(this._weightInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}setEffectiveTimeScale(e){return this.timeScale=e,this._effectiveTimeScale=this.paused?0:e,this.stopWarping()}getEffectiveTimeScale(){return this._effectiveTimeScale}setDuration(e){return this.timeScale=this._clip.duration/e,this.stopWarping()}syncWith(e){return this.time=e.time,this.timeScale=e.timeScale,this.stopWarping()}halt(e){return this.warp(this._effectiveTimeScale,0,e)}warp(e,t,i){const n=this._mixer,r=n.time,s=this.timeScale;let a=this._timeScaleInterpolant;null===a&&(a=n._lendControlInterpolant(),this._timeScaleInterpolant=a);const o=a.parameterPositions,h=a.sampleValues;return o[0]=r,o[1]=r+i,h[0]=e/s,h[1]=t/s,this}stopWarping(){const e=this._timeScaleInterpolant;return null!==e&&(this._timeScaleInterpolant=null,this._mixer._takeBackControlInterpolant(e)),this}getMixer(){return this._mixer}getClip(){return this._clip}getRoot(){return this._localRoot||this._mixer._root}_update(e,t,i,n){if(!this.enabled)return void this._updateWeight(e);const r=this._startTime;if(null!==r){const n=(e-r)*i;if(n<0||0===i)return;this._startTime=null,t=i*n}t*=this._updateTimeScale(e);const s=this._updateTime(t),a=this._updateWeight(e);if(a>0){const e=this._interpolants,t=this._propertyBindings;switch(this.blendMode){case 2501:for(let i=0,n=e.length;i!==n;++i)e[i].evaluate(s),t[i].accumulateAdditive(a);break;case gi:default:for(let i=0,r=e.length;i!==r;++i)e[i].evaluate(s),t[i].accumulate(n,a)}}}_updateWeight(e){let t=0;if(this.enabled){t=this.weight;const i=this._weightInterpolant;if(null!==i){const n=i.evaluate(e)[0];t*=n,e>i.parameterPositions[1]&&(this.stopFading(),0===n&&(this.enabled=!1))}}return this._effectiveWeight=t,t}_updateTimeScale(e){let t=0;if(!this.paused){t=this.timeScale;const i=this._timeScaleInterpolant;if(null!==i){t*=i.evaluate(e)[0],e>i.parameterPositions[1]&&(this.stopWarping(),0===t?this.paused=!0:this.timeScale=t)}}return this._effectiveTimeScale=t,t}_updateTime(e){const t=this._clip.duration,i=this.loop;let n=this.time+e,r=this._loopCount;const s=2202===i;if(0===e)return-1===r?n:s&&1==(1&r)?t-n:n;if(2200===i){-1===r&&(this._loopCount=0,this._setEndings(!0,!0,!1));e:{if(n>=t)n=t;else{if(!(n<0)){this.time=n;break e}n=0}this.clampWhenFinished?this.paused=!0:this.enabled=!1,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:e<0?-1:1})}}else{if(-1===r&&(e>=0?(r=0,this._setEndings(!0,0===this.repetitions,s)):this._setEndings(0===this.repetitions,!0,s)),n>=t||n<0){const i=Math.floor(n/t);n-=t*i,r+=Math.abs(i);const a=this.repetitions-r;if(a<=0)this.clampWhenFinished?this.paused=!0:this.enabled=!1,n=e>0?t:0,this.time=n,this._mixer.dispatchEvent({type:"finished",action:this,direction:e>0?1:-1});else{if(1===a){const t=e<0;this._setEndings(t,!t,s)}else this._setEndings(!1,!1,s);this._loopCount=r,this.time=n,this._mixer.dispatchEvent({type:"loop",action:this,loopDelta:i})}}else this.time=n;if(s&&1==(1&r))return t-n}return n}_setEndings(e,t,i){const n=this._interpolantSettings;i?(n.endingStart=mi,n.endingEnd=mi):(n.endingStart=e?this.zeroSlopeAtStart?mi:pi:fi,n.endingEnd=t?this.zeroSlopeAtEnd?mi:pi:fi)}_scheduleFading(e,t,i){const n=this._mixer,r=n.time;let s=this._weightInterpolant;null===s&&(s=n._lendControlInterpolant(),this._weightInterpolant=s);const a=s.parameterPositions,o=s.sampleValues;return a[0]=r,o[0]=t,a[1]=r+e,o[1]=i,this}}(class extends Ti{constructor(e){super(),this._root=e,this._initMemoryManager(),this._accuIndex=0,this.time=0,this.timeScale=1}_bindAction(e,t){const i=e._localRoot||this._root,n=e._clip.tracks,r=n.length,s=e._propertyBindings,a=e._interpolants,o=i.uuid,h=this._bindingsByRootAndName;let c=h[o];void 0===c&&(c={},h[o]=c);for(let e=0;e!==r;++e){const r=n[e],h=r.name;let l=c[h];if(void 0!==l)s[e]=l;else{if(l=s[e],void 0!==l){null===l._cacheIndex&&(++l.referenceCount,this._addInactiveBinding(l,o,h));continue}const n=t&&t._propertyBindings[e].binding.parsedPath;l=new Wl(nu.create(i,h,n),r.ValueTypeName,r.getValueSize()),++l.referenceCount,this._addInactiveBinding(l,o,h),s[e]=l}a[e].resultBuffer=l.buffer}}_activateAction(e){if(!this._isActiveAction(e)){if(null===e._cacheIndex){const t=(e._localRoot||this._root).uuid,i=e._clip.uuid,n=this._actionsByClip[i];this._bindAction(e,n&&n.knownActions[0]),this._addInactiveAction(e,i,t)}const t=e._propertyBindings;for(let e=0,i=t.length;e!==i;++e){const i=t[e];0==i.useCount++&&(this._lendBinding(i),i.saveOriginalState())}this._lendAction(e)}}_deactivateAction(e){if(this._isActiveAction(e)){const t=e._propertyBindings;for(let e=0,i=t.length;e!==i;++e){const i=t[e];0==--i.useCount&&(i.restoreOriginalState(),this._takeBackBinding(i))}this._takeBackAction(e)}}_initMemoryManager(){this._actions=[],this._nActiveActions=0,this._actionsByClip={},this._bindings=[],this._nActiveBindings=0,this._bindingsByRootAndName={},this._controlInterpolants=[],this._nActiveControlInterpolants=0;const e=this;this.stats={actions:{get total(){return e._actions.length},get inUse(){return e._nActiveActions}},bindings:{get total(){return e._bindings.length},get inUse(){return e._nActiveBindings}},controlInterpolants:{get total(){return e._controlInterpolants.length},get inUse(){return e._nActiveControlInterpolants}}}}_isActiveAction(e){const t=e._cacheIndex;return null!==t&&t<this._nActiveActions}_addInactiveAction(e,t,i){const n=this._actions,r=this._actionsByClip;let s=r[t];if(void 0===s)s={knownActions:[e],actionByRoot:{}},e._byClipCacheIndex=0,r[t]=s;else{const t=s.knownActions;e._byClipCacheIndex=t.length,t.push(e)}e._cacheIndex=n.length,n.push(e),s.actionByRoot[i]=e}_removeInactiveAction(e){const t=this._actions,i=t[t.length-1],n=e._cacheIndex;i._cacheIndex=n,t[n]=i,t.pop(),e._cacheIndex=null;const r=e._clip.uuid,s=this._actionsByClip,a=s[r],o=a.knownActions,h=o[o.length-1],c=e._byClipCacheIndex;h._byClipCacheIndex=c,o[c]=h,o.pop(),e._byClipCacheIndex=null;delete a.actionByRoot[(e._localRoot||this._root).uuid],0===o.length&&delete s[r],this._removeInactiveBindingsForAction(e)}_removeInactiveBindingsForAction(e){const t=e._propertyBindings;for(let e=0,i=t.length;e!==i;++e){const i=t[e];0==--i.referenceCount&&this._removeInactiveBinding(i)}}_lendAction(e){const t=this._actions,i=e._cacheIndex,n=this._nActiveActions++,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_takeBackAction(e){const t=this._actions,i=e._cacheIndex,n=--this._nActiveActions,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_addInactiveBinding(e,t,i){const n=this._bindingsByRootAndName,r=this._bindings;let s=n[t];void 0===s&&(s={},n[t]=s),s[i]=e,e._cacheIndex=r.length,r.push(e)}_removeInactiveBinding(e){const t=this._bindings,i=e.binding,n=i.rootNode.uuid,r=i.path,s=this._bindingsByRootAndName,a=s[n],o=t[t.length-1],h=e._cacheIndex;o._cacheIndex=h,t[h]=o,t.pop(),delete a[r],0===Object.keys(a).length&&delete s[n]}_lendBinding(e){const t=this._bindings,i=e._cacheIndex,n=this._nActiveBindings++,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_takeBackBinding(e){const t=this._bindings,i=e._cacheIndex,n=--this._nActiveBindings,r=t[n];e._cacheIndex=n,t[n]=e,r._cacheIndex=i,t[i]=r}_lendControlInterpolant(){const e=this._controlInterpolants,t=this._nActiveControlInterpolants++;let i=e[t];return void 0===i&&(i=new hl(new Float32Array(2),new Float32Array(2),1,this._controlInterpolantsResultBuffer),i.__cacheIndex=t,e[t]=i),i}_takeBackControlInterpolant(e){const t=this._controlInterpolants,i=e.__cacheIndex,n=--this._nActiveControlInterpolants,r=t[n];e.__cacheIndex=n,t[n]=e,r.__cacheIndex=i,t[i]=r}clipAction(e,t,i){const n=t||this._root,r=n.uuid;let s="string"==typeof e?vl.findByName(n,e):e;const a=null!==s?s.uuid:e,o=this._actionsByClip[a];let h=null;if(void 0===i&&(i=null!==s?s.blendMode:gi),void 0!==o){const e=o.actionByRoot[r];if(void 0!==e&&e.blendMode===i)return e;h=o.knownActions[0],null===s&&(s=h._clip)}if(null===s)return null;const c=new ru(this,s,t,i);return this._bindAction(c,h),this._addInactiveAction(c,a,r),c}existingAction(e,t){const i=t||this._root,n=i.uuid,r="string"==typeof e?vl.findByName(i,e):e,s=r?r.uuid:e,a=this._actionsByClip[s];return void 0!==a&&a.actionByRoot[n]||null}stopAllAction(){const e=this._actions;for(let t=this._nActiveActions-1;t>=0;--t)e[t].stop();return this}update(e){e*=this.timeScale;const t=this._actions,i=this._nActiveActions,n=this.time+=e,r=Math.sign(e),s=this._accuIndex^=1;for(let a=0;a!==i;++a){t[a]._update(n,e,r,s)}const a=this._bindings,o=this._nActiveBindings;for(let e=0;e!==o;++e)a[e].apply(s);return this}setTime(e){this.time=0;for(let e=0;e<this._actions.length;e++)this._actions[e].time=0;return this.update(e)}getRoot(){return this._root}uncacheClip(e){const t=this._actions,i=e.uuid,n=this._actionsByClip,r=n[i];if(void 0!==r){const e=r.knownActions;for(let i=0,n=e.length;i!==n;++i){const n=e[i];this._deactivateAction(n);const r=n._cacheIndex,s=t[t.length-1];n._cacheIndex=null,n._byClipCacheIndex=null,s._cacheIndex=r,t[r]=s,t.pop(),this._removeInactiveBindingsForAction(n)}delete n[i]}}uncacheRoot(e){const t=e.uuid,i=this._actionsByClip;for(const e in i){const n=i[e].actionByRoot[t];void 0!==n&&(this._deactivateAction(n),this._removeInactiveAction(n))}const n=this._bindingsByRootAndName[t];if(void 0!==n)for(const e in n){const t=n[e];t.restoreOriginalState(),this._removeInactiveBinding(t)}}uncacheAction(e,t){const i=this.existingAction(e,t);null!==i&&(this._deactivateAction(i),this._removeInactiveAction(i))}}).prototype._controlInterpolantsResultBuffer=new Float32Array(1);(class extends lh{constructor(e,t,i=1){super(e,t),this.meshPerAttribute=i}copy(e){return super.copy(e),this.meshPerAttribute=e.meshPerAttribute,this}clone(e){const t=super.clone(e);return t.meshPerAttribute=this.meshPerAttribute,t}toJSON(e){const t=super.toJSON(e);return t.isInstancedInterleavedBuffer=!0,t.meshPerAttribute=this.meshPerAttribute,t}}).prototype.isInstancedInterleavedBuffer=!0;class su{constructor(e,t,i=0,n=1/0){this.ray=new In(e,t),this.near=i,this.far=n,this.camera=null,this.layers=new Un,this.params={Mesh:{},Line:{threshold:1},LOD:{},Points:{threshold:1},Sprite:{}}}set(e,t){this.ray.set(e,t)}setFromCamera(e,t){t&&t.isPerspectiveCamera?(this.ray.origin.setFromMatrixPosition(t.matrixWorld),this.ray.direction.set(e.x,e.y,.5).unproject(t).sub(this.ray.origin).normalize(),this.camera=t):t&&t.isOrthographicCamera?(this.ray.origin.set(e.x,e.y,(t.near+t.far)/(t.near-t.far)).unproject(t),this.ray.direction.set(0,0,-1).transformDirection(t.matrixWorld),this.camera=t):console.error("THREE.Raycaster: Unsupported camera type: "+t.type)}intersectObject(e,t=!0,i=[]){return ou(e,this,i,t),i.sort(au),i}intersectObjects(e,t=!0,i=[]){for(let n=0,r=e.length;n<r;n++)ou(e[n],this,i,t);return i.sort(au),i}}function au(e,t){return e.distance-t.distance}function ou(e,t,i,n){if(e.layers.test(t.layers)&&e.raycast(t,i),!0===n){const n=e.children;for(let e=0,r=n.length;e<r;e++)ou(n[e],t,i,!0)}}const hu=new Ki,cu=new Rn,lu=new Rn;function uu(e){const t=[];e&&e.isBone&&t.push(e);for(let i=0;i<e.children.length;i++)t.push.apply(t,uu(e.children[i]));return t}const du=new Float32Array(1);new Int32Array(du.buffer),rc.create=function(e,t){return console.log("THREE.Curve.create() has been deprecated"),e.prototype=Object.create(rc.prototype),e.prototype.constructor=e,e.prototype.getPoint=t,e},Sc.prototype.fromPoints=function(e){return console.warn("THREE.Path: .fromPoints() has been renamed to .setFromPoints()."),this.setFromPoints(e)},class extends Zh{constructor(e=10,t=10,i=4473924,n=8947848){i=new xr(i),n=new xr(n);const r=t/2,s=e/t,a=e/2,o=[],h=[];for(let e=0,c=0,l=-a;e<=t;e++,l+=s){o.push(-a,0,l,a,0,l),o.push(l,0,-a,l,0,a);const t=e===r?i:n;t.toArray(h,c),c+=3,t.toArray(h,c),c+=3,t.toArray(h,c),c+=3,t.toArray(h,c),c+=3}const c=new kr;c.setAttribute("position",new Ar(o,3)),c.setAttribute("color",new Ar(h,3));super(c,new Bh({vertexColors:!0,toneMapped:!1})),this.type="GridHelper"}}.prototype.setColors=function(){console.error("THREE.GridHelper: setColors() has been deprecated, pass them in the constructor instead.")},class extends Zh{constructor(e){const t=uu(e),i=new kr,n=[],r=[],s=new xr(0,0,1),a=new xr(0,1,0);for(let e=0;e<t.length;e++){const i=t[e];i.parent&&i.parent.isBone&&(n.push(0,0,0),n.push(0,0,0),r.push(s.r,s.g,s.b),r.push(a.r,a.g,a.b))}i.setAttribute("position",new Ar(n,3)),i.setAttribute("color",new Ar(r,3));super(i,new Bh({vertexColors:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,transparent:!0})),this.type="SkeletonHelper",this.isSkeletonHelper=!0,this.root=e,this.bones=t,this.matrix=e.matrixWorld,this.matrixAutoUpdate=!1}updateMatrixWorld(e){const t=this.bones,i=this.geometry,n=i.getAttribute("position");lu.copy(this.root.matrixWorld).invert();for(let e=0,i=0;e<t.length;e++){const r=t[e];r.parent&&r.parent.isBone&&(cu.multiplyMatrices(lu,r.matrixWorld),hu.setFromMatrixPosition(cu),n.setXYZ(i,hu.x,hu.y,hu.z),cu.multiplyMatrices(lu,r.parent.matrixWorld),hu.setFromMatrixPosition(cu),n.setXYZ(i+1,hu.x,hu.y,hu.z),i+=2)}i.getAttribute("position").needsUpdate=!0,super.updateMatrixWorld(e)}}.prototype.update=function(){console.error("THREE.SkeletonHelper: update() no longer needs to be called.")},wl.prototype.extractUrlBase=function(e){return console.warn("THREE.Loader: .extractUrlBase() has been deprecated. Use THREE.LoaderUtils.extractUrlBase() instead."),class{static decodeText(e){if("undefined"!=typeof TextDecoder)return(new TextDecoder).decode(e);let t="";for(let i=0,n=e.length;i<n;i++)t+=String.fromCharCode(e[i]);try{return decodeURIComponent(escape(t))}catch(e){return t}}static extractUrlBase(e){const t=e.lastIndexOf("/");return-1===t?"./":e.substr(0,t+1)}static resolveURL(e,t){return"string"!=typeof e||""===e?"":(/^https?:\/\//i.test(t)&&/^\//.test(e)&&(t=t.replace(/(^https?:\/\/[^\/]+).*/i,"$1")),/^(https?:)?\/\//i.test(e)||/^data:.*,.*$/i.test(e)||/^blob:.*$/i.test(e)?e:t+e)}}.extractUrlBase(e)},wl.Handlers={add:function(){console.error("THREE.Loader: Handlers.add() has been removed. Use LoadingManager.addHandler() instead.")},get:function(){console.error("THREE.Loader: Handlers.get() has been removed. Use LoadingManager.getHandler() instead.")}},tn.prototype.center=function(e){return console.warn("THREE.Box3: .center() has been renamed to .getCenter()."),this.getCenter(e)},tn.prototype.empty=function(){return console.warn("THREE.Box3: .empty() has been renamed to .isEmpty()."),this.isEmpty()},tn.prototype.isIntersectionBox=function(e){return console.warn("THREE.Box3: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},tn.prototype.isIntersectionSphere=function(e){return console.warn("THREE.Box3: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)},tn.prototype.size=function(e){return console.warn("THREE.Box3: .size() has been renamed to .getSize()."),this.getSize(e)},xn.prototype.empty=function(){return console.warn("THREE.Sphere: .empty() has been renamed to .isEmpty()."),this.isEmpty()},ys.prototype.setFromMatrix=function(e){return console.warn("THREE.Frustum: .setFromMatrix() has been renamed to .setFromProjectionMatrix()."),this.setFromProjectionMatrix(e)},Fi.prototype.flattenToArrayOffset=function(e,t){return console.warn("THREE.Matrix3: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},Fi.prototype.multiplyVector3=function(e){return console.warn("THREE.Matrix3: .multiplyVector3() has been removed. Use vector.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},Fi.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix3: .multiplyVector3Array() has been removed.")},Fi.prototype.applyToBufferAttribute=function(e){return console.warn("THREE.Matrix3: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix3( matrix ) instead."),e.applyMatrix3(this)},Fi.prototype.applyToVector3Array=function(){console.error("THREE.Matrix3: .applyToVector3Array() has been removed.")},Fi.prototype.getInverse=function(e){return console.warn("THREE.Matrix3: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(e).invert()},Rn.prototype.extractPosition=function(e){return console.warn("THREE.Matrix4: .extractPosition() has been renamed to .copyPosition()."),this.copyPosition(e)},Rn.prototype.flattenToArrayOffset=function(e,t){return console.warn("THREE.Matrix4: .flattenToArrayOffset() has been deprecated. Use .toArray() instead."),this.toArray(e,t)},Rn.prototype.getPosition=function(){return console.warn("THREE.Matrix4: .getPosition() has been removed. Use Vector3.setFromMatrixPosition( matrix ) instead."),(new Ki).setFromMatrixColumn(this,3)},Rn.prototype.setRotationFromQuaternion=function(e){return console.warn("THREE.Matrix4: .setRotationFromQuaternion() has been renamed to .makeRotationFromQuaternion()."),this.makeRotationFromQuaternion(e)},Rn.prototype.multiplyToArray=function(){console.warn("THREE.Matrix4: .multiplyToArray() has been removed.")},Rn.prototype.multiplyVector3=function(e){return console.warn("THREE.Matrix4: .multiplyVector3() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.multiplyVector4=function(e){return console.warn("THREE.Matrix4: .multiplyVector4() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.multiplyVector3Array=function(){console.error("THREE.Matrix4: .multiplyVector3Array() has been removed.")},Rn.prototype.rotateAxis=function(e){console.warn("THREE.Matrix4: .rotateAxis() has been removed. Use Vector3.transformDirection( matrix ) instead."),e.transformDirection(this)},Rn.prototype.crossVector=function(e){return console.warn("THREE.Matrix4: .crossVector() has been removed. Use vector.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.translate=function(){console.error("THREE.Matrix4: .translate() has been removed.")},Rn.prototype.rotateX=function(){console.error("THREE.Matrix4: .rotateX() has been removed.")},Rn.prototype.rotateY=function(){console.error("THREE.Matrix4: .rotateY() has been removed.")},Rn.prototype.rotateZ=function(){console.error("THREE.Matrix4: .rotateZ() has been removed.")},Rn.prototype.rotateByAxis=function(){console.error("THREE.Matrix4: .rotateByAxis() has been removed.")},Rn.prototype.applyToBufferAttribute=function(e){return console.warn("THREE.Matrix4: .applyToBufferAttribute() has been removed. Use attribute.applyMatrix4( matrix ) instead."),e.applyMatrix4(this)},Rn.prototype.applyToVector3Array=function(){console.error("THREE.Matrix4: .applyToVector3Array() has been removed.")},Rn.prototype.makeFrustum=function(e,t,i,n,r,s){return console.warn("THREE.Matrix4: .makeFrustum() has been removed. Use .makePerspective( left, right, top, bottom, near, far ) instead."),this.makePerspective(e,t,n,i,r,s)},Rn.prototype.getInverse=function(e){return console.warn("THREE.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead."),this.copy(e).invert()},gs.prototype.isIntersectionLine=function(e){return console.warn("THREE.Plane: .isIntersectionLine() has been renamed to .intersectsLine()."),this.intersectsLine(e)},Ji.prototype.multiplyVector3=function(e){return console.warn("THREE.Quaternion: .multiplyVector3() has been removed. Use is now vector.applyQuaternion( quaternion ) instead."),e.applyQuaternion(this)},Ji.prototype.inverse=function(){return console.warn("THREE.Quaternion: .inverse() has been renamed to invert()."),this.invert()},In.prototype.isIntersectionBox=function(e){return console.warn("THREE.Ray: .isIntersectionBox() has been renamed to .intersectsBox()."),this.intersectsBox(e)},In.prototype.isIntersectionPlane=function(e){return console.warn("THREE.Ray: .isIntersectionPlane() has been renamed to .intersectsPlane()."),this.intersectsPlane(e)},In.prototype.isIntersectionSphere=function(e){return console.warn("THREE.Ray: .isIntersectionSphere() has been renamed to .intersectsSphere()."),this.intersectsSphere(e)},dr.prototype.area=function(){return console.warn("THREE.Triangle: .area() has been renamed to .getArea()."),this.getArea()},dr.prototype.barycoordFromPoint=function(e,t){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),this.getBarycoord(e,t)},dr.prototype.midpoint=function(e){return console.warn("THREE.Triangle: .midpoint() has been renamed to .getMidpoint()."),this.getMidpoint(e)},dr.prototypenormal=function(e){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),this.getNormal(e)},dr.prototype.plane=function(e){return console.warn("THREE.Triangle: .plane() has been renamed to .getPlane()."),this.getPlane(e)},dr.barycoordFromPoint=function(e,t,i,n,r){return console.warn("THREE.Triangle: .barycoordFromPoint() has been renamed to .getBarycoord()."),dr.getBarycoord(e,t,i,n,r)},dr.normal=function(e,t,i,n){return console.warn("THREE.Triangle: .normal() has been renamed to .getNormal()."),dr.getNormal(e,t,i,n)},Tc.prototype.extractAllPoints=function(e){return console.warn("THREE.Shape: .extractAllPoints() has been removed. Use .extractPoints() instead."),this.extractPoints(e)},Tc.prototype.extrude=function(e){return console.warn("THREE.Shape: .extrude() has been removed. Use ExtrudeGeometry() instead."),new el(this,e)},Tc.prototype.makeGeometry=function(e){return console.warn("THREE.Shape: .makeGeometry() has been removed. Use ShapeGeometry() instead."),new il(this,e)},zi.prototype.fromAttribute=function(e,t,i){return console.warn("THREE.Vector2: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,i)},zi.prototype.distanceToManhattan=function(e){return console.warn("THREE.Vector2: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},zi.prototype.lengthManhattan=function(){return console.warn("THREE.Vector2: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Ki.prototype.setEulerFromRotationMatrix=function(){console.error("THREE.Vector3: .setEulerFromRotationMatrix() has been removed. Use Euler.setFromRotationMatrix() instead.")},Ki.prototype.setEulerFromQuaternion=function(){console.error("THREE.Vector3: .setEulerFromQuaternion() has been removed. Use Euler.setFromQuaternion() instead.")},Ki.prototype.getPositionFromMatrix=function(e){return console.warn("THREE.Vector3: .getPositionFromMatrix() has been renamed to .setFromMatrixPosition()."),this.setFromMatrixPosition(e)},Ki.prototype.getScaleFromMatrix=function(e){return console.warn("THREE.Vector3: .getScaleFromMatrix() has been renamed to .setFromMatrixScale()."),this.setFromMatrixScale(e)},Ki.prototype.getColumnFromMatrix=function(e,t){return console.warn("THREE.Vector3: .getColumnFromMatrix() has been renamed to .setFromMatrixColumn()."),this.setFromMatrixColumn(t,e)},Ki.prototype.applyProjection=function(e){return console.warn("THREE.Vector3: .applyProjection() has been removed. Use .applyMatrix4( m ) instead."),this.applyMatrix4(e)},Ki.prototype.fromAttribute=function(e,t,i){return console.warn("THREE.Vector3: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,i)},Ki.prototype.distanceToManhattan=function(e){return console.warn("THREE.Vector3: .distanceToManhattan() has been renamed to .manhattanDistanceTo()."),this.manhattanDistanceTo(e)},Ki.prototype.lengthManhattan=function(){return console.warn("THREE.Vector3: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},Xi.prototype.fromAttribute=function(e,t,i){return console.warn("THREE.Vector4: .fromAttribute() has been renamed to .fromBufferAttribute()."),this.fromBufferAttribute(e,t,i)},Xi.prototype.lengthManhattan=function(){return console.warn("THREE.Vector4: .lengthManhattan() has been renamed to .manhattanLength()."),this.manhattanLength()},tr.prototype.getChildByName=function(e){return console.warn("THREE.Object3D: .getChildByName() has been renamed to .getObjectByName()."),this.getObjectByName(e)},tr.prototype.renderDepth=function(){console.warn("THREE.Object3D: .renderDepth has been removed. Use .renderOrder, instead.")},tr.prototype.translate=function(e,t){return console.warn("THREE.Object3D: .translate() has been removed. Use .translateOnAxis( axis, distance ) instead."),this.translateOnAxis(t,e)},tr.prototype.getWorldRotation=function(){console.error("THREE.Object3D: .getWorldRotation() has been removed. Use THREE.Object3D.getWorldQuaternion( target ) instead.")},tr.prototype.applyMatrix=function(e){return console.warn("THREE.Object3D: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(e)},Object.defineProperties(tr.prototype,{eulerOrder:{get:function(){return console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order},set:function(e){console.warn("THREE.Object3D: .eulerOrder is now .rotation.order."),this.rotation.order=e}},useQuaternion:{get:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")},set:function(){console.warn("THREE.Object3D: .useQuaternion has been removed. The library now uses quaternions by default.")}}}),es.prototype.setDrawMode=function(){console.error("THREE.Mesh: .setDrawMode() has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")},Object.defineProperties(es.prototype,{drawMode:{get:function(){return console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode."),0},set:function(){console.error("THREE.Mesh: .drawMode has been removed. The renderer now always assumes THREE.TrianglesDrawMode. Transform your geometry via BufferGeometryUtils.toTrianglesDrawMode() if necessary.")}}}),Nh.prototype.initBones=function(){console.error("THREE.SkinnedMesh: initBones() has been removed.")},hs.prototype.setLens=function(e,t){console.warn("THREE.PerspectiveCamera.setLens is deprecated. Use .setFocalLength and .filmGauge for a photographic setup."),void 0!==t&&(this.filmGauge=t),this.setFocalLength(e)},Object.defineProperties(Al.prototype,{onlyShadow:{set:function(){console.warn("THREE.Light: .onlyShadow has been removed.")}},shadowCameraFov:{set:function(e){console.warn("THREE.Light: .shadowCameraFov is now .shadow.camera.fov."),this.shadow.camera.fov=e}},shadowCameraLeft:{set:function(e){console.warn("THREE.Light: .shadowCameraLeft is now .shadow.camera.left."),this.shadow.camera.left=e}},shadowCameraRight:{set:function(e){console.warn("THREE.Light: .shadowCameraRight is now .shadow.camera.right."),this.shadow.camera.right=e}},shadowCameraTop:{set:function(e){console.warn("THREE.Light: .shadowCameraTop is now .shadow.camera.top."),this.shadow.camera.top=e}},shadowCameraBottom:{set:function(e){console.warn("THREE.Light: .shadowCameraBottom is now .shadow.camera.bottom."),this.shadow.camera.bottom=e}},shadowCameraNear:{set:function(e){console.warn("THREE.Light: .shadowCameraNear is now .shadow.camera.near."),this.shadow.camera.near=e}},shadowCameraFar:{set:function(e){console.warn("THREE.Light: .shadowCameraFar is now .shadow.camera.far."),this.shadow.camera.far=e}},shadowCameraVisible:{set:function(){console.warn("THREE.Light: .shadowCameraVisible has been removed. Use new THREE.CameraHelper( light.shadow.camera ) instead.")}},shadowBias:{set:function(e){console.warn("THREE.Light: .shadowBias is now .shadow.bias."),this.shadow.bias=e}},shadowDarkness:{set:function(){console.warn("THREE.Light: .shadowDarkness has been removed.")}},shadowMapWidth:{set:function(e){console.warn("THREE.Light: .shadowMapWidth is now .shadow.mapSize.width."),this.shadow.mapSize.width=e}},shadowMapHeight:{set:function(e){console.warn("THREE.Light: .shadowMapHeight is now .shadow.mapSize.height."),this.shadow.mapSize.height=e}}}),Object.defineProperties(Tr.prototype,{length:{get:function(){return console.warn("THREE.BufferAttribute: .length has been deprecated. Use .count instead."),this.array.length}},dynamic:{get:function(){return console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.usage===Mi},set:function(){console.warn("THREE.BufferAttribute: .dynamic has been deprecated. Use .usage instead."),this.setUsage(Mi)}}}),Tr.prototype.setDynamic=function(e){return console.warn("THREE.BufferAttribute: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===e?Mi:wi),this},Tr.prototype.copyIndicesArray=function(){console.error("THREE.BufferAttribute: .copyIndicesArray() has been removed.")},Tr.prototype.setArray=function(){console.error("THREE.BufferAttribute: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},kr.prototype.addIndex=function(e){console.warn("THREE.BufferGeometry: .addIndex() has been renamed to .setIndex()."),this.setIndex(e)},kr.prototype.addAttribute=function(e,t){return console.warn("THREE.BufferGeometry: .addAttribute() has been renamed to .setAttribute()."),t&&t.isBufferAttribute||t&&t.isInterleavedBufferAttribute?"index"===e?(console.warn("THREE.BufferGeometry.addAttribute: Use .setIndex() for index attribute."),this.setIndex(t),this):this.setAttribute(e,t):(console.warn("THREE.BufferGeometry: .addAttribute() now expects ( name, attribute )."),this.setAttribute(e,new Tr(arguments[1],arguments[2])))},kr.prototype.addDrawCall=function(e,t,i){void 0!==i&&console.warn("THREE.BufferGeometry: .addDrawCall() no longer supports indexOffset."),console.warn("THREE.BufferGeometry: .addDrawCall() is now .addGroup()."),this.addGroup(e,t)},kr.prototype.clearDrawCalls=function(){console.warn("THREE.BufferGeometry: .clearDrawCalls() is now .clearGroups()."),this.clearGroups()},kr.prototype.computeOffsets=function(){console.warn("THREE.BufferGeometry: .computeOffsets() has been removed.")},kr.prototype.removeAttribute=function(e){return console.warn("THREE.BufferGeometry: .removeAttribute() has been renamed to .deleteAttribute()."),this.deleteAttribute(e)},kr.prototype.applyMatrix=function(e){return console.warn("THREE.BufferGeometry: .applyMatrix() has been renamed to .applyMatrix4()."),this.applyMatrix4(e)},Object.defineProperties(kr.prototype,{drawcalls:{get:function(){return console.error("THREE.BufferGeometry: .drawcalls has been renamed to .groups."),this.groups}},offsets:{get:function(){return console.warn("THREE.BufferGeometry: .offsets has been renamed to .groups."),this.groups}}}),lh.prototype.setDynamic=function(e){return console.warn("THREE.InterleavedBuffer: .setDynamic() has been deprecated. Use .setUsage() instead."),this.setUsage(!0===e?Mi:wi),this},lh.prototype.setArray=function(){console.error("THREE.InterleavedBuffer: .setArray has been removed. Use BufferGeometry .setAttribute to replace/resize attribute buffers")},el.prototype.getArrays=function(){console.error("THREE.ExtrudeGeometry: .getArrays() has been removed.")},el.prototype.addShapeList=function(){console.error("THREE.ExtrudeGeometry: .addShapeList() has been removed.")},el.prototype.addShape=function(){console.error("THREE.ExtrudeGeometry: .addShape() has been removed.")},ch.prototype.dispose=function(){console.error("THREE.Scene: .dispose() has been removed.")},Object.defineProperties(mr.prototype,{wrapAround:{get:function(){console.warn("THREE.Material: .wrapAround has been removed.")},set:function(){console.warn("THREE.Material: .wrapAround has been removed.")}},overdraw:{get:function(){console.warn("THREE.Material: .overdraw has been removed.")},set:function(){console.warn("THREE.Material: .overdraw has been removed.")}},wrapRGB:{get:function(){return console.warn("THREE.Material: .wrapRGB has been removed."),new xr}},shading:{get:function(){console.error("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead.")},set:function(e){console.warn("THREE."+this.type+": .shading has been removed. Use the boolean .flatShading instead."),this.flatShading=1===e}},stencilMask:{get:function(){return console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask},set:function(e){console.warn("THREE."+this.type+": .stencilMask has been removed. Use .stencilFuncMask instead."),this.stencilFuncMask=e}},vertexTangents:{get:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")},set:function(){console.warn("THREE."+this.type+": .vertexTangents has been removed.")}}}),Object.defineProperties(as.prototype,{derivatives:{get:function(){return console.warn("THREE.ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives},set:function(e){console.warn("THREE. ShaderMaterial: .derivatives has been moved to .extensions.derivatives."),this.extensions.derivatives=e}}}),hh.prototype.clearTarget=function(e,t,i,n){console.warn("THREE.WebGLRenderer: .clearTarget() has been deprecated. Use .setRenderTarget() and .clear() instead."),this.setRenderTarget(e),this.clear(t,i,n)},hh.prototype.animate=function(e){console.warn("THREE.WebGLRenderer: .animate() is now .setAnimationLoop()."),this.setAnimationLoop(e)},hh.prototype.getCurrentRenderTarget=function(){return console.warn("THREE.WebGLRenderer: .getCurrentRenderTarget() is now .getRenderTarget()."),this.getRenderTarget()},hh.prototype.getMaxAnisotropy=function(){return console.warn("THREE.WebGLRenderer: .getMaxAnisotropy() is now .capabilities.getMaxAnisotropy()."),this.capabilities.getMaxAnisotropy()},hh.prototype.getPrecision=function(){return console.warn("THREE.WebGLRenderer: .getPrecision() is now .capabilities.precision."),this.capabilities.precision},hh.prototype.resetGLState=function(){return console.warn("THREE.WebGLRenderer: .resetGLState() is now .state.reset()."),this.state.reset()},hh.prototype.supportsFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsFloatTextures() is now .extensions.get( 'OES_texture_float' )."),this.extensions.get("OES_texture_float")},hh.prototype.supportsHalfFloatTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsHalfFloatTextures() is now .extensions.get( 'OES_texture_half_float' )."),this.extensions.get("OES_texture_half_float")},hh.prototype.supportsStandardDerivatives=function(){return console.warn("THREE.WebGLRenderer: .supportsStandardDerivatives() is now .extensions.get( 'OES_standard_derivatives' )."),this.extensions.get("OES_standard_derivatives")},hh.prototype.supportsCompressedTextureS3TC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTextureS3TC() is now .extensions.get( 'WEBGL_compressed_texture_s3tc' )."),this.extensions.get("WEBGL_compressed_texture_s3tc")},hh.prototype.supportsCompressedTexturePVRTC=function(){return console.warn("THREE.WebGLRenderer: .supportsCompressedTexturePVRTC() is now .extensions.get( 'WEBGL_compressed_texture_pvrtc' )."),this.extensions.get("WEBGL_compressed_texture_pvrtc")},hh.prototype.supportsBlendMinMax=function(){return console.warn("THREE.WebGLRenderer: .supportsBlendMinMax() is now .extensions.get( 'EXT_blend_minmax' )."),this.extensions.get("EXT_blend_minmax")},hh.prototype.supportsVertexTextures=function(){return console.warn("THREE.WebGLRenderer: .supportsVertexTextures() is now .capabilities.vertexTextures."),this.capabilities.vertexTextures},hh.prototype.supportsInstancedArrays=function(){return console.warn("THREE.WebGLRenderer: .supportsInstancedArrays() is now .extensions.get( 'ANGLE_instanced_arrays' )."),this.extensions.get("ANGLE_instanced_arrays")},hh.prototype.enableScissorTest=function(e){console.warn("THREE.WebGLRenderer: .enableScissorTest() is now .setScissorTest()."),this.setScissorTest(e)},hh.prototype.initMaterial=function(){console.warn("THREE.WebGLRenderer: .initMaterial() has been removed.")},hh.prototype.addPrePlugin=function(){console.warn("THREE.WebGLRenderer: .addPrePlugin() has been removed.")},hh.prototype.addPostPlugin=function(){console.warn("THREE.WebGLRenderer: .addPostPlugin() has been removed.")},hh.prototype.updateShadowMap=function(){console.warn("THREE.WebGLRenderer: .updateShadowMap() has been removed.")},hh.prototype.setFaceCulling=function(){console.warn("THREE.WebGLRenderer: .setFaceCulling() has been removed.")},hh.prototype.allocTextureUnit=function(){console.warn("THREE.WebGLRenderer: .allocTextureUnit() has been removed.")},hh.prototype.setTexture=function(){console.warn("THREE.WebGLRenderer: .setTexture() has been removed.")},hh.prototype.setTexture2D=function(){console.warn("THREE.WebGLRenderer: .setTexture2D() has been removed.")},hh.prototype.setTextureCube=function(){console.warn("THREE.WebGLRenderer: .setTextureCube() has been removed.")},hh.prototype.getActiveMipMapLevel=function(){return console.warn("THREE.WebGLRenderer: .getActiveMipMapLevel() is now .getActiveMipmapLevel()."),this.getActiveMipmapLevel()},Object.defineProperties(hh.prototype,{shadowMapEnabled:{get:function(){return this.shadowMap.enabled},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapEnabled is now .shadowMap.enabled."),this.shadowMap.enabled=e}},shadowMapType:{get:function(){return this.shadowMap.type},set:function(e){console.warn("THREE.WebGLRenderer: .shadowMapType is now .shadowMap.type."),this.shadowMap.type=e}},shadowMapCullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMapCullFace has been removed. Set Material.shadowSide instead.")}},context:{get:function(){return console.warn("THREE.WebGLRenderer: .context has been removed. Use .getContext() instead."),this.getContext()}},vr:{get:function(){return console.warn("THREE.WebGLRenderer: .vr has been renamed to .xr"),this.xr}},gammaInput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead."),!1},set:function(){console.warn("THREE.WebGLRenderer: .gammaInput has been removed. Set the encoding for textures via Texture.encoding instead.")}},gammaOutput:{get:function(){return console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),!1},set:function(e){console.warn("THREE.WebGLRenderer: .gammaOutput has been removed. Set WebGLRenderer.outputEncoding instead."),this.outputEncoding=!0===e?vi:_i}},toneMappingWhitePoint:{get:function(){return console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed."),1},set:function(){console.warn("THREE.WebGLRenderer: .toneMappingWhitePoint has been removed.")}}}),Object.defineProperties(Ko.prototype,{cullFace:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.cullFace has been removed. Set Material.shadowSide instead.")}},renderReverseSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderReverseSided has been removed. Set Material.shadowSide instead.")}},renderSingleSided:{get:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")},set:function(){console.warn("THREE.WebGLRenderer: .shadowMap.renderSingleSided has been removed. Set Material.shadowSide instead.")}}}),Object.defineProperties(Zi.prototype,{wrapS:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapS is now .texture.wrapS."),this.texture.wrapS=e}},wrapT:{get:function(){return console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT},set:function(e){console.warn("THREE.WebGLRenderTarget: .wrapT is now .texture.wrapT."),this.texture.wrapT=e}},magFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .magFilter is now .texture.magFilter."),this.texture.magFilter=e}},minFilter:{get:function(){return console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter},set:function(e){console.warn("THREE.WebGLRenderTarget: .minFilter is now .texture.minFilter."),this.texture.minFilter=e}},anisotropy:{get:function(){return console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy},set:function(e){console.warn("THREE.WebGLRenderTarget: .anisotropy is now .texture.anisotropy."),this.texture.anisotropy=e}},offset:{get:function(){return console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset},set:function(e){console.warn("THREE.WebGLRenderTarget: .offset is now .texture.offset."),this.texture.offset=e}},repeat:{get:function(){return console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat},set:function(e){console.warn("THREE.WebGLRenderTarget: .repeat is now .texture.repeat."),this.texture.repeat=e}},format:{get:function(){return console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format},set:function(e){console.warn("THREE.WebGLRenderTarget: .format is now .texture.format."),this.texture.format=e}},type:{get:function(){return console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type},set:function(e){console.warn("THREE.WebGLRenderTarget: .type is now .texture.type."),this.texture.type=e}},generateMipmaps:{get:function(){return console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps},set:function(e){console.warn("THREE.WebGLRenderTarget: .generateMipmaps is now .texture.generateMipmaps."),this.texture.generateMipmaps=e}}}),class extends tr{constructor(e){super(),this.type="Audio",this.listener=e,this.context=e.context,this.gain=this.context.createGain(),this.gain.connect(e.getInput()),this.autoplay=!1,this.buffer=null,this.detune=0,this.loop=!1,this.loopStart=0,this.loopEnd=0,this.offset=0,this.duration=void 0,this.playbackRate=1,this.isPlaying=!1,this.hasPlaybackControl=!0,this.source=null,this.sourceType="empty",this._startedAt=0,this._progress=0,this._connected=!1,this.filters=[]}getOutput(){return this.gain}setNodeSource(e){return this.hasPlaybackControl=!1,this.sourceType="audioNode",this.source=e,this.connect(),this}setMediaElementSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaNode",this.source=this.context.createMediaElementSource(e),this.connect(),this}setMediaStreamSource(e){return this.hasPlaybackControl=!1,this.sourceType="mediaStreamNode",this.source=this.context.createMediaStreamSource(e),this.connect(),this}setBuffer(e){return this.buffer=e,this.sourceType="buffer",this.autoplay&&this.play(),this}play(e=0){if(!0===this.isPlaying)return void console.warn("THREE.Audio: Audio is already playing.");if(!1===this.hasPlaybackControl)return void console.warn("THREE.Audio: this Audio has no playback control.");this._startedAt=this.context.currentTime+e;const t=this.context.createBufferSource();return t.buffer=this.buffer,t.loop=this.loop,t.loopStart=this.loopStart,t.loopEnd=this.loopEnd,t.onended=this.onEnded.bind(this),t.start(this._startedAt,this._progress+this.offset,this.duration),this.isPlaying=!0,this.source=t,this.setDetune(this.detune),this.setPlaybackRate(this.playbackRate),this.connect()}pause(){if(!1!==this.hasPlaybackControl)return!0===this.isPlaying&&(this._progress+=Math.max(this.context.currentTime-this._startedAt,0)*this.playbackRate,!0===this.loop&&(this._progress=this._progress%(this.duration||this.buffer.duration)),this.source.stop(),this.source.onended=null,this.isPlaying=!1),this;console.warn("THREE.Audio: this Audio has no playback control.")}stop(){if(!1!==this.hasPlaybackControl)return this._progress=0,this.source.stop(),this.source.onended=null,this.isPlaying=!1,this;console.warn("THREE.Audio: this Audio has no playback control.")}connect(){if(this.filters.length>0){this.source.connect(this.filters[0]);for(let e=1,t=this.filters.length;e<t;e++)this.filters[e-1].connect(this.filters[e]);this.filters[this.filters.length-1].connect(this.getOutput())}else this.source.connect(this.getOutput());return this._connected=!0,this}disconnect(){if(this.filters.length>0){this.source.disconnect(this.filters[0]);for(let e=1,t=this.filters.length;e<t;e++)this.filters[e-1].disconnect(this.filters[e]);this.filters[this.filters.length-1].disconnect(this.getOutput())}else this.source.disconnect(this.getOutput());return this._connected=!1,this}getFilters(){return this.filters}setFilters(e){return e||(e=[]),!0===this._connected?(this.disconnect(),this.filters=e.slice(),this.connect()):this.filters=e.slice(),this}setDetune(e){if(this.detune=e,void 0!==this.source.detune)return!0===this.isPlaying&&this.source.detune.setTargetAtTime(this.detune,this.context.currentTime,.01),this}getDetune(){return this.detune}getFilter(){return this.getFilters()[0]}setFilter(e){return this.setFilters(e?[e]:[])}setPlaybackRate(e){if(!1!==this.hasPlaybackControl)return this.playbackRate=e,!0===this.isPlaying&&this.source.playbackRate.setTargetAtTime(this.playbackRate,this.context.currentTime,.01),this;console.warn("THREE.Audio: this Audio has no playback control.")}getPlaybackRate(){return this.playbackRate}onEnded(){this.isPlaying=!1}getLoop(){return!1===this.hasPlaybackControl?(console.warn("THREE.Audio: this Audio has no playback control."),!1):this.loop}setLoop(e){if(!1!==this.hasPlaybackControl)return this.loop=e,!0===this.isPlaying&&(this.source.loop=this.loop),this;console.warn("THREE.Audio: this Audio has no playback control.")}setLoopStart(e){return this.loopStart=e,this}setLoopEnd(e){return this.loopEnd=e,this}getVolume(){return this.gain.gain.value}setVolume(e){return this.gain.gain.setTargetAtTime(e,this.context.currentTime,.01),this}}.prototype.load=function(e){console.warn("THREE.Audio: .load has been deprecated. Use THREE.AudioLoader instead.");const t=this;return(new Hl).load(e,(function(e){t.setBuffer(e)})),this},ls.prototype.updateCubeMap=function(e,t){return console.warn("THREE.CubeCamera: .updateCubeMap() is now .update()."),this.update(e,t)},ls.prototype.clear=function(e,t,i,n){return console.warn("THREE.CubeCamera: .clear() is now .renderTarget.clear()."),this.renderTarget.clear(e,t,i,n)},ji.crossOrigin=void 0,ji.loadTexture=function(e,t,i,n){console.warn("THREE.ImageUtils.loadTexture has been deprecated. Use THREE.TextureLoader() instead.");const r=new El;r.setCrossOrigin(this.crossOrigin);const s=r.load(e,i,void 0,n);return t&&(s.mapping=t),s},ji.loadTextureCube=function(e,t,i,n){console.warn("THREE.ImageUtils.loadTextureCube has been deprecated. Use THREE.CubeTextureLoader() instead.");const r=new Cl;r.setCrossOrigin(this.crossOrigin);const s=r.load(e,i,void 0,n);return t&&(s.mapping=t),s},ji.loadCompressedTexture=function(){console.error("THREE.ImageUtils.loadCompressedTexture has been removed. Use THREE.DDSLoader instead.")},ji.loadCompressedTextureCube=function(){console.error("THREE.ImageUtils.loadCompressedTextureCube has been removed. Use THREE.DDSLoader instead.")},"undefined"!=typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("register",{detail:{revision:"134"}})),"undefined"!=typeof window&&(window.__THREE__?console.warn("WARNING: Multiple instances of Three.js being imported."):window.__THREE__="134");const pu=Math.PI/180,mu=180/Math.PI,fu=6378137,gu=6356752.31424518;function _u(e,t,i,n,r,s){const a=xu(e,t,i);return yu(a[0],a[1],a[2],n,r,s)}function vu(e,t,i,n,r,s){const a=bu(e,t,i,n,r,s);return wu(a[0],a[1],a[2])}function yu(e,t,i,n,r,s){const a=xu(n,r,s),o=[e-a[0],t-a[1],i-a[2]];n*=pu,r*=pu;const h=Math.cos(n),c=Math.sin(n),l=Math.cos(r),u=Math.sin(r);return[-c*o[0]+h*o[1],-u*h*o[0]-u*c*o[1]+l*o[2],l*h*o[0]+l*c*o[1]+u*o[2]]}function bu(e,t,i,n,r,s){const a=xu(n,r,s);n*=pu,r*=pu;const o=Math.cos(n),h=Math.sin(n),c=Math.cos(r),l=Math.sin(r);return[-h*e-l*o*t+c*o*i+a[0],o*e-l*h*t+c*h*i+a[1],c*t+l*i+a[2]]}function xu(e,t,i){const n=fu,r=gu;e*=pu,t*=pu;const s=Math.cos(e),a=Math.sin(e),o=Math.cos(t),h=Math.sin(t),c=n*n,l=r*r,u=1/Math.sqrt(c*o*o+l*h*h),d=(c*u+i)*o;return[d*s,d*a,(l*u+i)*h]}function wu(e,t,i){const n=fu,r=gu,s=n*n,a=r*r,o=s-a,h=Math.sqrt(o/s),c=Math.sqrt(o/a),l=Math.sqrt(e*e+t*t),u=Math.atan2(i*n,l*r),d=Math.sin(u),p=Math.cos(u),m=Math.atan2(t,e),f=Math.atan2(i+c*c*r*d*d*d,l-h*h*n*p*p*p),g=Math.sin(f),_=Math.cos(f),v=n/Math.sqrt(1-h*h*g*g);return[m*mu,f*mu,l/_-v]}class Mu{boundingBoxCorners(e,t){const i=vu(-t,-t,0,e.lng,e.lat,0),n=vu(t,t,0,e.lng,e.lat,0);return[{lat:i[1],lng:i[0]},{lat:n[1],lng:n[0]}]}rotationFromCompass(e,t){let i=0,n=0,r=0;switch(t){case 1:i=Math.PI/2;break;case 3:i=-Math.PI/2,r=Math.PI;break;case 6:n=-Math.PI/2,r=-Math.PI/2;break;case 8:n=Math.PI/2,r=Math.PI/2}const s=(new Rn).makeRotationZ(r),a=new Bn(i,n,e*Math.PI/180,"XYZ"),o=(new Rn).makeRotationFromEuler(a),h=(new Xi).setAxisAngleFromRotationMatrix(o.multiply(s));return h.multiplyScalar(h.w).toArray().slice(0,3)}}class Su{constructor(e){if(!e)throw new Error(`Incorrect core image data ${e}`);this._cache=null,this._core=e,this._spatial=null}get assetsCached(){return null!=this._core&&null!=this._spatial&&null!=this._cache&&null!=this._cache.image&&null!=this._cache.mesh}get cameraParameters(){return this._spatial.camera_parameters}get cameraType(){return this._spatial.camera_type}get capturedAt(){return this._spatial.captured_at}get clusterId(){return this._spatial.cluster?this._spatial.cluster.id:null}get clusterUrl(){return this._spatial.cluster?this._spatial.cluster.url:null}get compassAngle(){return null!=this._spatial.computed_compass_angle?this._spatial.computed_compass_angle:this._spatial.compass_angle}get complete(){return null!=this._spatial}get computedAltitude(){return this._spatial.computed_altitude}get computedCompassAngle(){return this._spatial.computed_compass_angle}get computedLngLat(){return this._core.computed_geometry}get creatorId(){return this._spatial.creator.id}get creatorUsername(){return this._spatial.creator.username}get exifOrientation(){return this._spatial.exif_orientation}get height(){return this._spatial.height}get image(){return this._cache.image}get image$(){return this._cache.image$}get id(){return this._core.id}get lngLat(){return null!=this._core.computed_geometry?this._core.computed_geometry:this._core.geometry}get merged(){return null!=this._spatial&&null!=this._spatial.merge_id}get mergeId(){return this._spatial.merge_id}get mesh(){return this._cache.mesh}get originalAltitude(){return this._spatial.altitude}get originalCompassAngle(){return this._spatial.compass_angle}get originalLngLat(){return this._core.geometry}get ownerId(){return this._spatial.owner?this._spatial.owner.id:null}get private(){return this._spatial.private}get qualityScore(){return this._spatial.quality_score}get rotation(){return this._spatial.computed_rotation}get scale(){return this._spatial.atomic_scale}get sequenceId(){return this._core.sequence?this._core.sequence.id:null}get sequenceEdges(){return this._cache.sequenceEdges}get sequenceEdges$(){return this._cache.sequenceEdges$}get spatialEdges(){return this._cache.spatialEdges}get spatialEdges$(){return this._cache.spatialEdges$}get width(){return this._spatial.width}cacheAssets$(){return this._cache.cacheAssets$(this._spatial,this.merged).pipe(De((()=>this)))}cacheImage$(){return this._cache.cacheImage$(this._spatial).pipe(De((()=>this)))}cacheSequenceEdges(e){this._cache.cacheSequenceEdges(e)}cacheSpatialEdges(e){this._cache.cacheSpatialEdges(e)}dispose(){null!=this._cache&&(this._cache.dispose(),this._cache=null),this._core=null,this._spatial=null}initializeCache(e){if(null!=this._cache)throw new Error(`Image cache already initialized (${this.id}).`);this._cache=e}makeComplete(e){if(null==e)throw new Error("Fill can not be null.");this._spatial=e}resetSequenceEdges(){this._cache.resetSequenceEdges()}resetSpatialEdges(){this._cache.resetSpatialEdges()}uncache(){null!=this._cache&&(this._cache.dispose(),this._cache=null)}}class Tu{constructor(e){this._disposed=!1,this._provider=e,this._image=null,this._mesh=null,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._imageChanged$=new j,this._image$=this._imageChanged$.pipe(Ot(null),Rt(1),U()),this._iamgeSubscription=this._image$.subscribe(),this._sequenceEdgesChanged$=new j,this._sequenceEdges$=this._sequenceEdgesChanged$.pipe(Ot(this._sequenceEdges),Rt(1),U()),this._sequenceEdgesSubscription=this._sequenceEdges$.subscribe((()=>{})),this._spatialEdgesChanged$=new j,this._spatialEdges$=this._spatialEdgesChanged$.pipe(Ot(this._spatialEdges),Rt(1),U()),this._spatialEdgesSubscription=this._spatialEdges$.subscribe((()=>{})),this._cachingAssets$=null}get image(){return this._image}get image$(){return this._image$}get mesh(){return this._mesh}get sequenceEdges(){return this._sequenceEdges}get sequenceEdges$(){return this._sequenceEdges$}get spatialEdges(){return this._spatialEdges}get spatialEdges$(){return this._spatialEdges$}cacheAssets$(e,t){return null!=this._cachingAssets$||(this._cachingAssets$=Ve(this._cacheImage$(e),this._cacheMesh$(e,t)).pipe(De((([e,t])=>(this._image=e,this._mesh=t,this))),Mt((()=>{this._cachingAssets$=null})),Rt(1),U()),this._cachingAssets$.pipe(St((e=>!!e._image))).subscribe((()=>{this._imageChanged$.next(this._image)}),(()=>{}))),this._cachingAssets$}cacheImage$(e){if(null!=this._image)return Ce(this);const t=this._cacheImage$(e).pipe(St((e=>!!e)),Ut((e=>{this._disposeImage(),this._image=e})),De((()=>this)),Rt(1),U());return t.subscribe((()=>{this._imageChanged$.next(this._image)}),(()=>{})),t}cacheSequenceEdges(e){this._sequenceEdges={cached:!0,edges:e},this._sequenceEdgesChanged$.next(this._sequenceEdges)}cacheSpatialEdges(e){this._spatialEdges={cached:!0,edges:e},this._spatialEdgesChanged$.next(this._spatialEdges)}dispose(){this._iamgeSubscription.unsubscribe(),this._sequenceEdgesSubscription.unsubscribe(),this._spatialEdgesSubscription.unsubscribe(),this._disposeImage(),this._mesh=null,this._sequenceEdges={cached:!1,edges:[]},this._spatialEdges={cached:!1,edges:[]},this._imageChanged$.next(null),this._sequenceEdgesChanged$.next(this._sequenceEdges),this._spatialEdgesChanged$.next(this._spatialEdges),this._disposed=!0,null!=this._imageAborter&&(this._imageAborter(),this._imageAborter=null),null!=this._meshAborter&&(this._meshAborter(),this._meshAborter=null)}resetSequenceEdges(){this._sequenceEdges={cached:!1,edges:[]},this._sequenceEdgesChanged$.next(this._sequenceEdges)}resetSpatialEdges(){this._spatialEdges={cached:!1,edges:[]},this._spatialEdgesChanged$.next(this._spatialEdges)}_cacheImage$(e){return k.create((t=>{const i=new Promise(((e,t)=>{this._imageAborter=t})),n=e.thumb.url;if(n)this._provider.getImageBuffer(n,i).then((e=>{this._imageAborter=null;const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>{if(this._disposed){window.URL.revokeObjectURL(i.src);const e=`Image load was aborted (${n})`;t.error(new Error(e))}else t.next(i),t.complete()},i.onerror=()=>{this._imageAborter=null,t.error(new Error(`Failed to load image (${n})`))};const r=new Blob([e]);i.src=window.URL.createObjectURL(r)}),(e=>{this._imageAborter=null,t.error(e)}));else{const i=e.thumb.id,r=`Incorrect thumb URL for ${e.id} (${i}, ${n})`;t.error(new Error(r))}}))}_cacheMesh$(e,t){return k.create((i=>{if(!t)return i.next(this._createEmptyMesh()),void i.complete();const n=e.mesh.url;if(!n){const t=e.mesh.id,r=`Incorrect mesh URL for ${e.id} (${t}, ${n})`;return console.warn(r),i.next(this._createEmptyMesh()),void i.complete()}const r=new Promise(((e,t)=>{this._meshAborter=t}));this._provider.getMesh(n,r).then((e=>{this._meshAborter=null,this._disposed||(i.next(e),i.complete())}),(e=>{this._meshAborter=null,console.error(e),i.next(this._createEmptyMesh()),i.complete()}))}))}_createEmptyMesh(){return{faces:[],vertices:[]}}_disposeImage(){null!=this._image&&window.URL.revokeObjectURL(this._image.src),this._image=null}}class Cu{constructor(e){this._id=e.id,this._imageIds=e.image_ids}get id(){return this._id}get imageIds(){return this._imageIds}dispose(){this._id=null,this._imageIds=null}findNext(e){let t=this._imageIds.indexOf(e);return t+1>=this._imageIds.length||-1===t?null:this._imageIds[t+1]}findPrev(e){let t=this._imageIds.indexOf(e);return 0===t||-1===t?null:this._imageIds[t-1]}}class Eu{constructor(){this.sphericalPreferredDistance=2,this.sphericalMotion=2,this.sphericalSequencePenalty=1,this.sphericalMergeCCPenalty=4,this.stepPreferredDistance=4,this.stepMotion=3,this.stepRotation=4,this.stepSequencePenalty=2,this.stepMergeCCPenalty=6,this.similarDistance=2,this.similarRotation=3,this.turnDistance=4,this.turnMotion=2,this.turnSequencePenalty=1,this.turnMergeCCPenalty=4}}var Au;e.NavigationDirection=void 0,(Au=e.NavigationDirection||(e.NavigationDirection={}))[Au.Next=0]="Next",Au[Au.Prev=1]="Prev",Au[Au.StepLeft=2]="StepLeft",Au[Au.StepRight=3]="StepRight",Au[Au.StepForward=4]="StepForward",Au[Au.StepBackward=5]="StepBackward",Au[Au.TurnLeft=6]="TurnLeft",Au[Au.TurnRight=7]="TurnRight",Au[Au.TurnU=8]="TurnU",Au[Au.Spherical=9]="Spherical",Au[Au.Similar=10]="Similar";class Iu{constructor(){this.steps={},this.turns={},this.spherical={},this.steps[e.NavigationDirection.StepForward]={direction:e.NavigationDirection.StepForward,motionChange:0,useFallback:!0},this.steps[e.NavigationDirection.StepBackward]={direction:e.NavigationDirection.StepBackward,motionChange:Math.PI,useFallback:!0},this.steps[e.NavigationDirection.StepLeft]={direction:e.NavigationDirection.StepLeft,motionChange:Math.PI/2,useFallback:!1},this.steps[e.NavigationDirection.StepRight]={direction:e.NavigationDirection.StepRight,motionChange:-Math.PI/2,useFallback:!1},this.turns[e.NavigationDirection.TurnLeft]={direction:e.NavigationDirection.TurnLeft,directionChange:Math.PI/2,motionChange:Math.PI/4},this.turns[e.NavigationDirection.TurnRight]={direction:e.NavigationDirection.TurnRight,directionChange:-Math.PI/2,motionChange:-Math.PI/4},this.turns[e.NavigationDirection.TurnU]={direction:e.NavigationDirection.TurnU,directionChange:Math.PI,motionChange:null},this.spherical[e.NavigationDirection.StepForward]={direction:e.NavigationDirection.StepForward,directionChange:0,next:e.NavigationDirection.StepLeft,prev:e.NavigationDirection.StepRight},this.spherical[e.NavigationDirection.StepBackward]={direction:e.NavigationDirection.StepBackward,directionChange:Math.PI,next:e.NavigationDirection.StepRight,prev:e.NavigationDirection.StepLeft},this.spherical[e.NavigationDirection.StepLeft]={direction:e.NavigationDirection.StepLeft,directionChange:Math.PI/2,next:e.NavigationDirection.StepBackward,prev:e.NavigationDirection.StepForward},this.spherical[e.NavigationDirection.StepRight]={direction:e.NavigationDirection.StepRight,directionChange:-Math.PI/2,next:e.NavigationDirection.StepForward,prev:e.NavigationDirection.StepBackward}}}class Ru{constructor(){this.sphericalMinDistance=.1,this.sphericalMaxDistance=20,this.sphericalPreferredDistance=5,this.sphericalMaxItems=4,this.sphericalMaxStepTurnChange=Math.PI/8,this.rotationMaxDistance=this.turnMaxRigDistance,this.rotationMaxDirectionChange=Math.PI/6,this.rotationMaxVerticalDirectionChange=Math.PI/8,this.similarMaxDirectionChange=Math.PI/8,this.similarMaxDistance=12,this.similarMinTimeDifference=432e5,this.stepMaxDistance=20,this.stepMaxDirectionChange=Math.PI/6,this.stepMaxDrift=Math.PI/6,this.stepPreferredDistance=4,this.turnMaxDistance=15,this.turnMaxDirectionChange=2*Math.PI/9,this.turnMaxRigDistance=.65,this.turnMinRigDirectionChange=Math.PI/6}get maxDistance(){return Math.max(this.sphericalMaxDistance,this.similarMaxDistance,this.stepMaxDistance,this.turnMaxDistance)}}class Pu extends Error{constructor(e){super(e),Object.setPrototypeOf(this,Pu.prototype),this.name="MapillaryError"}}class Lu extends Pu{constructor(e){super(null!=e?e:"The argument is not valid."),Object.setPrototypeOf(this,Lu.prototype),this.name="ArgumentMapillaryError"}}class Du{constructor(){this._epsilon=1e-9}azimuthalToBearing(e){return-e+Math.PI/2}degToRad(e){return Math.PI*e/180}radToDeg(e){return 180*e/Math.PI}rotationMatrix(e){let t=new Ki(e[0],e[1],e[2]),i=t.length();return i>0&&t.normalize(),(new Rn).makeRotationAxis(t,i)}rotate(e,t){let i=new Ki(e[0],e[1],e[2]),n=this.rotationMatrix(t);return i.applyMatrix4(n),i}opticalCenter(e,t){let i=[-e[0],-e[1],-e[2]],n=[-t[0],-t[1],-t[2]];return this.rotate(n,i)}viewingDirection(e){let t=[-e[0],-e[1],-e[2]];return this.rotate([0,0,1],t)}wrap(e,t,i){if(i<t)throw new Error("Invalid arguments: max must be larger than min.");let n=i-t;for(;e>i||e<t;)e>i?e-=n:e<t&&(e+=n);return e}wrapAngle(e){return this.wrap(e,-Math.PI,Math.PI)}clamp(e,t,i){return e<t?t:e>i?i:e}angleBetweenVector2(e,t,i,n){let r=Math.atan2(n,i)-Math.atan2(t,e);return this.wrapAngle(r)}angleDifference(e,t){let i=t-e;return this.wrapAngle(i)}relativeRotationAngle(e,t){let i=this.rotationMatrix([-e[0],-e[1],-e[2]]),n=this.rotationMatrix(t),r=i.multiply(n).elements,s=r[0]+r[5]+r[10];return Math.acos(Math.max(Math.min((s-1)/2,1),-1))}angleToPlane(e,t){let i=(new Ki).fromArray(e),n=i.length();if(n<this._epsilon)return 0;let r=i.dot((new Ki).fromArray(t));return Math.asin(r/n)}azimuthal(e,t){const i=(new Ki).fromArray(e),n=(new Ki).fromArray(t),r=i.clone().dot(n),s=i.clone().sub(n.clone().multiplyScalar(r));return Math.atan2(s.y,s.x)}distanceFromLngLat(e,t,i,n){let r=this.degToRad(n-t),s=this.degToRad(i-e),a=Math.sin(r/2)*Math.sin(r/2)+Math.cos(this.degToRad(t))*Math.cos(this.degToRad(n))*Math.sin(s/2)*Math.sin(s/2);return 12742e3*Math.atan2(Math.sqrt(a),Math.sqrt(1-a))}}const Nu=new Du;function $u(e){return"spherical"===e}function ku(e){return"fisheye"===e}function Ou(e,t,i){const n=_u(e.lng,e.lat,e.alt,i.lng,i.lat,i.alt),r=Nu.rotate(n,t);return[-r.x,-r.y,-r.z]}function zu(e,t,i,n,r){const s=[];for(let e=0;e<t.length;++e){const r=t[e],a=i[e];for(let e=0;e<=n;++e)s.push([r[0]+a[0]*e/n,r[1]+a[1]*e/n])}const a=new os;a.up.copy(e.upVector()),a.position.copy((new Ki).fromArray(e.unprojectSfM([0,0],0))),a.lookAt((new Ki).fromArray(e.unprojectSfM([0,0],10))),a.updateMatrix(),a.updateMatrixWorld(!0);return s.map((t=>{const i=e.unprojectBasic(t,1e4),n=r.worldToCamera(i,a);return[Math.abs(n[0]/n[2]),Math.abs(n[1]/n[2])]}))}class Fu{constructor(e,t,i){this._spatial=new Du,this._settings=null!=e?e:new Ru,this._directions=null!=t?t:new Iu,this._coefficients=null!=i?i:new Eu}getPotentialEdges(e,t,i){if(!e.complete)throw new Lu("Image has to be full.");if(!e.merged)return[];let n=this._spatial.viewingDirection(e.rotation),r=this._spatial.angleToPlane(n.toArray(),[0,0,1]),s=[];for(let a of t){if(!a.merged||a.id===e.id)continue;let t=_u(a.lngLat.lng,a.lngLat.lat,a.computedAltitude,e.lngLat.lng,e.lngLat.lat,e.computedAltitude),o=new Ki(t[0],t[1],t[2]),h=o.length();if(h>this._settings.maxDistance&&i.indexOf(a.id)<0)continue;let c=this._spatial.angleBetweenVector2(n.x,n.y,o.x,o.y),l=this._spatial.angleToPlane(o.toArray(),[0,0,1]),u=this._spatial.viewingDirection(a.rotation),d=this._spatial.angleBetweenVector2(n.x,n.y,u.x,u.y),p=this._spatial.angleToPlane(u.toArray(),[0,0,1])-r,m=this._spatial.relativeRotationAngle(e.rotation,a.rotation),f=this._spatial.angleBetweenVector2(1,0,o.x,o.y),g=null!=a.sequenceId&&null!=e.sequenceId&&a.sequenceId===e.sequenceId,_=a.mergeId===e.mergeId,v=a.creatorId===e.creatorId,y={capturedAt:a.capturedAt,directionChange:d,distance:h,spherical:$u(a.cameraType),id:a.id,motionChange:c,rotation:m,sameMergeCC:_,sameSequence:g,sameUser:v,sequenceId:a.sequenceId,verticalDirectionChange:p,verticalMotion:l,worldMotionAzimuth:f};s.push(y)}return s}computeSequenceEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");if(t.sequenceId!==i.id)throw new Lu("Image and sequence does not correspond.");let n=[],r=i.findNext(t.id);null!=r&&n.push({data:{direction:e.NavigationDirection.Next,worldMotionAzimuth:Number.NaN},source:t.id,target:r});let s=i.findPrev(t.id);return null!=s&&n.push({data:{direction:e.NavigationDirection.Prev,worldMotionAzimuth:Number.NaN},source:t.id,target:s}),n}computeSimilarEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");let n=$u(t.cameraType),r={};for(let e of i)if(null!=e.sequenceId&&!e.sameSequence){if(n){if(!e.spherical)continue}else if(!e.spherical&&Math.abs(e.directionChange)>this._settings.similarMaxDirectionChange)continue;e.distance>this._settings.similarMaxDistance||e.sameUser&&Math.abs(e.capturedAt-t.capturedAt)<this._settings.similarMinTimeDifference||(null==r[e.sequenceId]&&(r[e.sequenceId]=[]),r[e.sequenceId].push(e))}let s=[],a=$u(t.cameraType)?e=>e.distance:e=>this._coefficients.similarDistance*e.distance+this._coefficients.similarRotation*e.rotation;for(let e in r){if(!r.hasOwnProperty(e))continue;let t=Number.MAX_VALUE,i=null;for(let n of r[e]){let e=a(n);e<t&&(t=e,i=n)}null!=i&&s.push(i)}return s.map((i=>({data:{direction:e.NavigationDirection.Similar,worldMotionAzimuth:i.worldMotionAzimuth},source:t.id,target:i.id})))}computeStepEdges(e,t,i,n){if(!e.complete)throw new Lu("Image has to be full.");let r=[];if($u(e.cameraType))return r;for(let s in this._directions.steps){if(!this._directions.steps.hasOwnProperty(s))continue;let a=this._directions.steps[s],o=Number.MAX_VALUE,h=null,c=null;for(let e of t){if(e.spherical)continue;if(Math.abs(e.directionChange)>this._settings.stepMaxDirectionChange)continue;let t=this._spatial.angleDifference(a.motionChange,e.motionChange),r=this._spatial.angleDifference(e.directionChange,t),s=Math.max(Math.abs(t),Math.abs(r));if(Math.abs(s)>this._settings.stepMaxDrift)continue;let l=e.id;if(!a.useFallback||l!==i&&l!==n||(c=e),e.distance>this._settings.stepMaxDistance)continue;t=Math.sqrt(t*t+e.verticalMotion*e.verticalMotion);let u=this._coefficients.stepPreferredDistance*Math.abs(e.distance-this._settings.stepPreferredDistance)/this._settings.stepMaxDistance+this._coefficients.stepMotion*t/this._settings.stepMaxDrift+this._coefficients.stepRotation*e.rotation/this._settings.stepMaxDirectionChange+this._coefficients.stepSequencePenalty*(e.sameSequence?0:1)+this._coefficients.stepMergeCCPenalty*(e.sameMergeCC?0:1);u<o&&(o=u,h=e)}h=null==h?c:h,null!=h&&r.push({data:{direction:a.direction,worldMotionAzimuth:h.worldMotionAzimuth},source:e.id,target:h.id})}return r}computeTurnEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");let n=[];if($u(t.cameraType))return n;for(let r in this._directions.turns){if(!this._directions.turns.hasOwnProperty(r))continue;let s=this._directions.turns[r],a=Number.MAX_VALUE,o=null;for(let t of i){if(t.spherical)continue;if(t.distance>this._settings.turnMaxDistance)continue;let i,n=s.direction!==e.NavigationDirection.TurnU&&t.distance<this._settings.turnMaxRigDistance&&Math.abs(t.directionChange)>this._settings.turnMinRigDirectionChange,r=this._spatial.angleDifference(s.directionChange,t.directionChange);if(n&&t.directionChange*s.directionChange>0&&Math.abs(t.directionChange)<Math.abs(s.directionChange))i=-Math.PI/2+Math.abs(t.directionChange);else{if(Math.abs(r)>this._settings.turnMaxDirectionChange)continue;let e=s.motionChange?this._spatial.angleDifference(s.motionChange,t.motionChange):0;e=Math.sqrt(e*e+t.verticalMotion*t.verticalMotion),i=this._coefficients.turnDistance*t.distance/this._settings.turnMaxDistance+this._coefficients.turnMotion*e/Math.PI+this._coefficients.turnSequencePenalty*(t.sameSequence?0:1)+this._coefficients.turnMergeCCPenalty*(t.sameMergeCC?0:1)}i<a&&(a=i,o=t)}null!=o&&n.push({data:{direction:s.direction,worldMotionAzimuth:o.worldMotionAzimuth},source:t.id,target:o.id})}return n}computePerspectiveToSphericalEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");if($u(t.cameraType))return[];let n=Number.MAX_VALUE,r=null;for(let e of i){if(!e.spherical)continue;let t=this._coefficients.sphericalPreferredDistance*Math.abs(e.distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(e.motionChange)/Math.PI+this._coefficients.sphericalMergeCCPenalty*(e.sameMergeCC?0:1);t<n&&(n=t,r=e)}return null==r?[]:[{data:{direction:e.NavigationDirection.Spherical,worldMotionAzimuth:r.worldMotionAzimuth},source:t.id,target:r.id}]}computeSphericalEdges(t,i){if(!t.complete)throw new Lu("Image has to be full.");if(!$u(t.cameraType))return[];let n=[],r=[],s=[];for(let e of i)if(!(e.distance>this._settings.sphericalMaxDistance))if(e.spherical){if(e.distance<this._settings.sphericalMinDistance)continue;r.push(e)}else for(let t in this._directions.spherical){if(!this._directions.spherical.hasOwnProperty(t))continue;let i=this._directions.spherical[t],n=this._spatial.angleDifference(e.directionChange,e.motionChange),r=this._spatial.angleDifference(i.directionChange,n);if(!(Math.abs(r)>this._settings.sphericalMaxStepTurnChange)){s.push([i.direction,e]);break}}let a=Math.PI/this._settings.sphericalMaxItems,o=[],h=[];for(let i=0;i<this._settings.sphericalMaxItems;i++){let s=i/this._settings.sphericalMaxItems*2*Math.PI,c=Number.MAX_VALUE,l=null;for(let e of r){let t=this._spatial.angleDifference(s,e.motionChange);if(Math.abs(t)>a)continue;let i=Number.MAX_VALUE;for(let t of o){let n=Math.abs(this._spatial.angleDifference(t,e.motionChange));n<i&&(i=n)}if(i<=a)continue;let n=this._coefficients.sphericalPreferredDistance*Math.abs(e.distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(t)/a+this._coefficients.sphericalSequencePenalty*(e.sameSequence?0:1)+this._coefficients.sphericalMergeCCPenalty*(e.sameMergeCC?0:1);n<c&&(c=n,l=e)}null!=l?(o.push(l.motionChange),n.push({data:{direction:e.NavigationDirection.Spherical,worldMotionAzimuth:l.worldMotionAzimuth},source:t.id,target:l.id})):h.push(s)}let c={};c[e.NavigationDirection.Spherical]=o,c[e.NavigationDirection.StepForward]=[],c[e.NavigationDirection.StepLeft]=[],c[e.NavigationDirection.StepBackward]=[],c[e.NavigationDirection.StepRight]=[];for(let i of h){let r=[];for(let o in this._directions.spherical){if(!this._directions.spherical.hasOwnProperty(o))continue;let h=this._directions.spherical[o],l=c[e.NavigationDirection.Spherical].concat(c[h.direction]).concat(c[h.prev]).concat(c[h.next]),u=Number.MAX_VALUE,d=null;for(let e of s){if(e[0]!==h.direction)continue;let t=this._spatial.angleDifference(i,e[1].motionChange);if(Math.abs(t)>a)continue;let n=Number.MAX_VALUE;for(let t of l){let i=Math.abs(this._spatial.angleDifference(t,e[1].motionChange));i<n&&(n=i)}if(n<=a)continue;let r=this._coefficients.sphericalPreferredDistance*Math.abs(e[1].distance-this._settings.sphericalPreferredDistance)/this._settings.sphericalMaxDistance+this._coefficients.sphericalMotion*Math.abs(t)/a+this._coefficients.sphericalMergeCCPenalty*(e[1].sameMergeCC?0:1);r<u&&(u=r,d=e)}null!=d&&(r.push(d),n.push({data:{direction:d[0],worldMotionAzimuth:d[1].worldMotionAzimuth},source:t.id,target:d[1].id}))}for(let e of r)c[e[0]].push(e[1].motionChange)}return n}}class Bu extends Pu{constructor(e){super(e),Object.setPrototypeOf(this,Bu.prototype),this.name="GraphMapillaryError"}}class Uu{constructor(e,t,i,n,r,s){this._api=e,this._cachedNodes={},this._cachedNodeTiles={},this._cachedSequenceNodes={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequenceNodes$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._changed$=new j,this._filterCreator=null!=r?r:new Ht,this._filter=this._filterCreator.createFilter(void 0),this._filterSubject$=new j,this._filter$=Ze(Ce(this._filter),this._filterSubject$).pipe(Rt(1),U()),this._filterSubscription=this._filter$.subscribe((()=>{})),this._defaultAlt=2,this._edgeCalculator=null!=n?n:new Fu,this._graphCalculator=null!=i?i:new Mu,this._configuration=null!=s?s:{maxSequences:50,maxUnusedImages:100,maxUnusedPreStoredImages:30,maxUnusedTiles:20},this._nodes={},this._nodeIndex=null!=t?t:new Uu._spatialIndex(16),this._nodeIndexTiles={},this._nodeToTile={},this._preStored={},this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._tileThreshold=20}static register(e){Uu._spatialIndex=e}get api(){return this._api}get changed$(){return this._changed$}get filter$(){return this._filter$}cacheBoundingBox$(e,t){const i=this._api.data.geometry.bboxToCellIds(e,t).filter((e=>!(e in this._cachedTiles))).map((e=>e in this._cachingTiles$?this._cachingTiles$[e]:this._cacheTile$(e)));return 0===i.length&&i.push(Ce(this)),ge(i).pipe(qe(),Ct(),We((()=>{const i=this._nodeIndex.search({maxX:t.lng,maxY:t.lat,minX:e.lng,minY:e.lat}).map((e=>e.node)),n=[],r=[];for(const e of i)e.complete?n.push(e):r.push(e.id);const s=[];for(;r.length>0;)s.push(r.splice(0,200));return it(Ce(n),ge(s.map((e=>this._api.getSpatialImages$(e).pipe(De((e=>{const t=[];for(const i of e){if(!this.hasNode(i.node_id))continue;const e=this.getNode(i.node_id);e.complete||this._makeFull(e,i.node),t.push(e)}return t})))))).pipe(qe()))})),ut(((e,t)=>e.concat(t))))}cacheCell$(e){return(e in this._cachedTiles?Ce(this):e in this._cachingTiles$?this._cachingTiles$[e]:this._cacheTile$(e)).pipe(We((()=>{const t=this._cachedTiles[e];t.accessed=(new Date).getTime();const i=t.nodes,n=[],r=[];for(const e of i)e.complete?n.push(e):r.push(e.id);const s=[];for(;r.length>0;)s.push(r.splice(0,200));return it(Ce(n),ge(s.map((e=>this._api.getSpatialImages$(e).pipe(De((e=>{const t=[];for(const i of e){if(!i.node){console.warn(`Image is empty (${i.node})`);continue}const e=i.node_id;if(!this.hasNode(e))continue;const n=this.getNode(e);n.complete||this._makeFull(n,i.node),t.push(n)}return t})))))).pipe(qe()))})),ut(((e,t)=>e.concat(t))))}cacheFill$(e){if(e in this._cachingFull$)throw new Bu(`Cannot fill node while caching full (${e}).`);if(!this.hasNode(e))throw new Bu(`Cannot fill node that does not exist in graph (${e}).`);if(e in this._cachingFill$)return this._cachingFill$[e];const t=this.getNode(e);if(t.complete)throw new Bu(`Cannot fill node that is already full (${e}).`);return this._cachingFill$[e]=this._api.getSpatialImages$([e]).pipe(Ut((e=>{for(const i of e)i.node||console.warn(`Image is empty ${i.node_id}`),t.complete||this._makeFull(t,i.node),delete this._cachingFill$[i.node_id]})),De((()=>this)),Mt((()=>{e in this._cachingFill$&&delete this._cachingFill$[e],this._changed$.next(this)})),It(),U()),this._cachingFill$[e]}cacheFull$(e){if(e in this._cachingFull$)return this._cachingFull$[e];if(this.hasNode(e))throw new Bu(`Cannot cache full node that already exist in graph (${e}).`);return this._cachingFull$[e]=this._api.getImages$([e]).pipe(Ut((t=>{for(const i of t){if(!i.node)throw new Bu(`Image does not exist (${e}, ${i.node}).`);const t=i.node_id;if(this.hasNode(t)){const t=this.getNode(e);t.complete||this._makeFull(t,i.node)}else{if(null==i.node.sequence.id)throw new Bu(`Image has no sequence key (${e}).`);const n=new Su(i.node);this._makeFull(n,i.node);const r=this._api.data.geometry.lngLatToCellId(n.originalLngLat);this._preStore(r,n),this._setNode(n),delete this._cachingFull$[t]}}})),De((()=>this)),Mt((()=>{e in this._cachingFull$&&delete this._cachingFull$[e],this._changed$.next(this)})),It(),U()),this._cachingFull$[e]}cacheNodeSequence$(e){if(!this.hasNode(e))throw new Bu(`Cannot cache sequence edges of node that does not exist in graph (${e}).`);let t=this.getNode(e);if(t.sequenceId in this._sequences)throw new Bu(`Sequence already cached (${e}), (${t.sequenceId}).`);return this._cacheSequence$(t.sequenceId)}cacheSequence$(e){if(e in this._sequences)throw new Bu(`Sequence already cached (${e})`);return this._cacheSequence$(e)}cacheSequenceEdges(e){let t=this.getNode(e);if(!(t.sequenceId in this._sequences))throw new Bu(`Sequence is not cached (${e}), (${t.sequenceId})`);let i=this._sequences[t.sequenceId].sequence,n=this._edgeCalculator.computeSequenceEdges(t,i);t.cacheSequenceEdges(n)}cacheSequenceNodes$(e,t){if(!this.hasSequence(e))throw new Bu(`Cannot cache sequence nodes of sequence that does not exist in graph (${e}).`);if(this.hasSequenceNodes(e))throw new Bu(`Sequence nodes already cached (${e}).`);const i=this.getSequence(e);if(i.id in this._cachingSequenceNodes$)return this._cachingSequenceNodes$[i.id];const n=[],r=i.imageIds.slice();if(t&&r.length>50){const e=r.indexOf(t),i=Math.max(0,Math.min(e-25,r.length-50));n.push(r.splice(i,50))}for(;r.length>0;)n.push(r.splice(0,200));let s=n.length;const a=ge(n).pipe(We((e=>this._api.getImages$(e).pipe(Ut((e=>{for(const t of e){if(!t.node){console.warn(`Image empty (${t.node_id})`);continue}const e=t.node_id;if(this.hasNode(e)){const i=this.getNode(e);i.complete||this._makeFull(i,t.node)}else{null==t.node.sequence.id&&console.warn(`Sequence missing, discarding node (${t.node_id})`);const e=new Su(t.node);this._makeFull(e,t.node);const i=this._api.data.geometry.lngLatToCellId(e.originalLngLat);this._preStore(i,e),this._setNode(e)}}s--})),De((()=>this)))),6),Ct(),Mt((()=>{delete this._cachingSequenceNodes$[i.id],0===s&&(this._cachedSequenceNodes[i.id]=!0)})),It(),U());return this._cachingSequenceNodes$[i.id]=a,a}cacheSpatialArea$(e){if(!this.hasNode(e))throw new Bu(`Cannot cache spatial area of node that does not exist in graph (${e}).`);if(e in this._cachedSpatialEdges)throw new Bu(`Image already spatially cached (${e}).`);if(!(e in this._requiredSpatialArea))throw new Bu(`Spatial area not determined (${e}).`);let t=this._requiredSpatialArea[e];if(0===Object.keys(t.cacheNodes).length)throw new Bu(`Spatial nodes already cached (${e}).`);if(e in this._cachingSpatialArea$)return this._cachingSpatialArea$[e];let i=[];for(;t.cacheKeys.length>0;)i.push(t.cacheKeys.splice(0,200));let n=i.length,r=[];for(let s of i){let i=this._api.getSpatialImages$(s).pipe(Ut((i=>{for(const e of i){if(!e.node){console.warn(`Image is empty (${e.node_id})`);continue}const i=e.node_id,n=t.cacheNodes[i];n.complete?delete t.cacheNodes[i]:(this._makeFull(n,e.node),delete t.cacheNodes[i])}0==--n&&delete this._cachingSpatialArea$[e]})),De((()=>this)),ct((i=>{for(let e of s)e in t.all&&delete t.all[e],e in t.cacheNodes&&delete t.cacheNodes[e];throw 0==--n&&delete this._cachingSpatialArea$[e],i})),Mt((()=>{0===Object.keys(t.cacheNodes).length&&this._changed$.next(this)})),It(),U());r.push(i)}return this._cachingSpatialArea$[e]=r,r}cacheSpatialEdges(e){if(e in this._cachedSpatialEdges)throw new Bu(`Spatial edges already cached (${e}).`);let t=this.getNode(e),i=this._sequences[t.sequenceId].sequence,n=[],r=i.findPrev(t.id);null!=r&&n.push(r);let s=i.findNext(t.id);null!=s&&n.push(s);let a=this._requiredSpatialArea[e].all,o=[],h=this._filter;for(let e in a){if(!a.hasOwnProperty(e))continue;let t=a[e];h(t)&&o.push(t)}let c=this._edgeCalculator.getPotentialEdges(t,o,n),l=this._edgeCalculator.computeStepEdges(t,c,r,s);l=l.concat(this._edgeCalculator.computeTurnEdges(t,c)),l=l.concat(this._edgeCalculator.computeSphericalEdges(t,c)),l=l.concat(this._edgeCalculator.computePerspectiveToSphericalEdges(t,c)),l=l.concat(this._edgeCalculator.computeSimilarEdges(t,c)),t.cacheSpatialEdges(l),this._cachedSpatialEdges[e]=t,delete this._requiredSpatialArea[e],delete this._cachedNodeTiles[e]}cacheTiles$(e){if(e in this._cachedNodeTiles)throw new Bu(`Tiles already cached (${e}).`);if(e in this._cachedSpatialEdges)throw new Bu(`Spatial edges already cached so tiles considered cached (${e}).`);if(!(e in this._requiredNodeTiles))throw new Bu(`Tiles have not been determined (${e}).`);let t=this._requiredNodeTiles[e];if(0===t.cache.length&&0===t.caching.length)throw new Bu(`Tiles already cached (${e}).`);if(!this.hasNode(e))throw new Bu(`Cannot cache tiles of node that does not exist in graph (${e}).`);let i=t.cache.slice();t.caching=this._requiredNodeTiles[e].caching.concat(i),t.cache=[];let n=[];for(let i of t.caching){const r=i in this._cachingTiles$?this._cachingTiles$[i]:this._cacheTile$(i);n.push(r.pipe(Ut((n=>{let r=t.caching.indexOf(i);r>-1&&t.caching.splice(r,1),0===t.caching.length&&0===t.cache.length&&(delete this._requiredNodeTiles[e],this._cachedNodeTiles[e]=!0)})),ct((n=>{let r=t.caching.indexOf(i);throw r>-1&&t.caching.splice(r,1),0===t.caching.length&&0===t.cache.length&&(delete this._requiredNodeTiles[e],this._cachedNodeTiles[e]=!0),n})),Mt((()=>{this._changed$.next(this)})),It(),U()))}return n}initializeCache(e){if(e in this._cachedNodes)throw new Bu(`Image already in cache (${e}).`);const t=this.getNode(e),i=this._api.data;t.initializeCache(new Tu(i));const n=(new Date).getTime();this._cachedNodes[e]={accessed:n,node:t},this._updateCachedTileAccess(e,n)}isCachingFill(e){return e in this._cachingFill$}isCachingFull(e){return e in this._cachingFull$}isCachingNodeSequence(e){return this.getNode(e).sequenceId in this._cachingSequences$}isCachingSequence(e){return e in this._cachingSequences$}isCachingSequenceNodes(e){return e in this._cachingSequenceNodes$}isCachingTiles(e){return e in this._requiredNodeTiles&&0===this._requiredNodeTiles[e].cache.length&&this._requiredNodeTiles[e].caching.length>0}hasInitializedCache(e){return e in this._cachedNodes}hasNode(e){let t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),e in this._nodes}hasNodeSequence(e){let t=this.getNode(e).sequenceId,i=t in this._sequences;return i&&(this._sequences[t].accessed=(new Date).getTime()),i}hasSequence(e){let t=e in this._sequences;return t&&(this._sequences[e].accessed=(new Date).getTime()),t}hasSequenceNodes(e){return e in this._cachedSequenceNodes}hasSpatialArea(e){if(!this.hasNode(e))throw new Bu(`Spatial area nodes cannot be determined if node not in graph (${e}).`);if(e in this._cachedSpatialEdges)return!0;if(e in this._requiredSpatialArea)return 0===Object.keys(this._requiredSpatialArea[e].cacheNodes).length;let t=this.getNode(e),i=this._graphCalculator.boundingBoxCorners(t.lngLat,this._tileThreshold),n=this._nodeIndex.search({maxX:i[1].lng,maxY:i[1].lat,minX:i[0].lng,minY:i[0].lat}),r={all:{},cacheKeys:[],cacheNodes:{}};for(let e of n)r.all[e.node.id]=e.node,e.node.complete||(r.cacheKeys.push(e.node.id),r.cacheNodes[e.node.id]=e.node);return this._requiredSpatialArea[e]=r,0===r.cacheKeys.length}hasTiles(e){if(e in this._cachedNodeTiles)return!0;if(e in this._cachedSpatialEdges)return!0;if(!this.hasNode(e))throw new Bu(`Image does not exist in graph (${e}).`);let t={cache:[],caching:[]};if(e in this._requiredNodeTiles)t=this._requiredNodeTiles[e];else{const i=this.getNode(e),[n,r]=this._graphCalculator.boundingBoxCorners(i.lngLat,this._tileThreshold);t.cache=this._api.data.geometry.bboxToCellIds(n,r).filter((e=>!(e in this._cachedTiles))),t.cache.length>0&&(this._requiredNodeTiles[e]=t)}return 0===t.cache.length&&0===t.caching.length}getNode(e){let t=(new Date).getTime();return this._updateCachedNodeAccess(e,t),this._updateCachedTileAccess(e,t),this._nodes[e]}getSequence(e){let t=this._sequences[e];return t.accessed=(new Date).getTime(),t.sequence}resetSpatialEdges(){let e=Object.keys(this._cachedSpatialEdges);for(let t of e){this._cachedSpatialEdges[t].resetSpatialEdges(),delete this._cachedSpatialEdges[t]}}reset(e){const t=[];for(const i of e){if(!this.hasNode(i))throw new Error(`Image does not exist ${i}`);const e=this.getNode(i);e.resetSequenceEdges(),e.resetSpatialEdges(),t.push(e)}for(let t of Object.keys(this._cachedNodes))-1===e.indexOf(t)&&(this._cachedNodes[t].node.dispose(),delete this._cachedNodes[t]);this._cachedNodeTiles={},this._cachedSpatialEdges={},this._cachedTiles={},this._cachingFill$={},this._cachingFull$={},this._cachingSequences$={},this._cachingSpatialArea$={},this._cachingTiles$={},this._nodes={},this._nodeToTile={},this._preStored={};for(const e of t){this._nodes[e.id]=e;const t=this._api.data.geometry.lngLatToCellId(e.originalLngLat);this._preStore(t,e)}this._requiredNodeTiles={},this._requiredSpatialArea={},this._sequences={},this._nodeIndexTiles={},this._nodeIndex.clear()}setFilter(e){this._filter=this._filterCreator.createFilter(e),this._filterSubject$.next(this._filter)}uncache(e,t,i){const n={};this._addNewKeys(n,this._cachingFull$),this._addNewKeys(n,this._cachingFill$),this._addNewKeys(n,this._cachingSpatialArea$),this._addNewKeys(n,this._requiredNodeTiles),this._addNewKeys(n,this._requiredSpatialArea);for(const t of e)t in n||(n[t]=!0);const r=this._tileThreshold,s=this._graphCalculator,a=this._api.data.geometry,o=new Set(t);for(let e in n){if(!n.hasOwnProperty(e))continue;const t=this._nodes[e],[i,h]=s.boundingBoxCorners(t.lngLat,r),c=a.bboxToCellIds(i,h);for(const e of c)o.has(e)||o.add(e)}const h=[];for(let e in this._cachedTiles)this._cachedTiles.hasOwnProperty(e)&&!o.has(e)&&h.push([e,this._cachedTiles[e]]);const c=h.sort(((e,t)=>t[1].accessed-e[1].accessed)).slice(this._configuration.maxUnusedTiles).map((e=>e[0]));for(let e of c)this._uncacheTile(e,i);const l=[],u=[];for(let e in this._preStored){if(!this._preStored.hasOwnProperty(e)||e in this._cachingTiles$)continue;const t=this._preStored[e];for(let r in t)t.hasOwnProperty(r)&&!(r in n)&&t[r].sequenceId!==i&&(r in this._cachedNodes?l.push([this._cachedNodes[r],e]):u.push([r,e]))}const d=l.sort((([e],[t])=>t.accessed-e.accessed)).slice(this._configuration.maxUnusedPreStoredImages).map((([e,t])=>[e.node.id,t]));this._uncachePreStored(u),this._uncachePreStored(d);const p=[];for(let e in this._cachedNodes)this._cachedNodes.hasOwnProperty(e)&&!(e in n)&&p.push(this._cachedNodes[e]);const m=p.sort(((e,t)=>t.accessed-e.accessed)).slice(this._configuration.maxUnusedImages);for(const e of m){e.node.uncache();const t=e.node.id;delete this._cachedNodes[t],t in this._cachedNodeTiles&&delete this._cachedNodeTiles[t],t in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[t]}const f=[];for(let e in this._sequences)this._sequences.hasOwnProperty(e)&&!(e in this._cachingSequences$)&&e!==i&&f.push(this._sequences[e]);const g=f.sort(((e,t)=>t.accessed-e.accessed)).slice(this._configuration.maxSequences);for(const e of g){const t=e.sequence.id;delete this._sequences[t],t in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[t],e.sequence.dispose()}}updateCells$(e){const t=this._cachedTiles,i=this._cachingTiles$;return ge(e).pipe(We((e=>e in t?this._updateCell$(e):e in i?i[e].pipe(ct((()=>Ce(this))),We((()=>this._updateCell$(e)))):ie())))}unsubscribe(){this._filterSubscription.unsubscribe()}_addNewKeys(e,t){for(let i in t)t.hasOwnProperty(i)&&this.hasNode(i)&&(i in e||(e[i]=!0))}_cacheSequence$(e){return e in this._cachingSequences$||(this._cachingSequences$[e]=this._api.getSequence$(e).pipe(Ut((t=>{t?(t.id in this._sequences||(this._sequences[t.id]={accessed:(new Date).getTime(),sequence:new Cu(t)}),delete this._cachingSequences$[e]):console.warn(`Sequence does not exist (${e})`)})),De((()=>this)),Mt((()=>{e in this._cachingSequences$&&delete this._cachingSequences$[e],this._changed$.next(this)})),It(),U())),this._cachingSequences$[e]}_cacheTile$(e){return this._cachingTiles$[e]=this._api.getCoreImages$(e).pipe(Ut((t=>{if(e in this._cachedTiles)return;const i=t.images;this._nodeIndexTiles[e]=[],this._cachedTiles[e]={accessed:(new Date).getTime(),nodes:[]};const n=this._cachedTiles[e].nodes,r=this._removeFromPreStore(e);for(const t of i){if(!t)break;if(null==t.sequence.id){console.warn(`Sequence missing, discarding node (${t.id})`);continue}if(null!=r&&t.id in r){const i=r[t.id];delete r[t.id],n.push(i);const s={lat:i.lngLat.lat,lng:i.lngLat.lng,node:i};this._nodeIndex.insert(s),this._nodeIndexTiles[e].push(s),this._nodeToTile[i.id]=e;continue}const i=new Su(t);n.push(i);const s={lat:i.lngLat.lat,lng:i.lngLat.lng,node:i};this._nodeIndex.insert(s),this._nodeIndexTiles[e].push(s),this._nodeToTile[i.id]=e,this._setNode(i)}delete this._cachingTiles$[e]})),De((()=>this)),ct((t=>{throw delete this._cachingTiles$[e],t})),It(),U()),this._cachingTiles$[e]}_makeFull(e,t){null==t.computed_altitude&&(t.computed_altitude=this._defaultAlt),null==t.computed_rotation&&(t.computed_rotation=this._graphCalculator.rotationFromCompass(t.compass_angle,t.exif_orientation)),e.makeComplete(t)}_preStore(e,t){e in this._preStored||(this._preStored[e]={}),this._preStored[e][t.id]=t}_removeFromPreStore(e){let t=null;return e in this._preStored&&(t=this._preStored[e],delete this._preStored[e]),t}_setNode(e){let t=e.id;if(this.hasNode(t))throw new Bu(`Image already exist (${t}).`);this._nodes[t]=e}_uncacheTile(e,t){for(let i of this._cachedTiles[e].nodes){let n=i.id;delete this._nodeToTile[n],n in this._cachedNodes&&delete this._cachedNodes[n],n in this._cachedNodeTiles&&delete this._cachedNodeTiles[n],n in this._cachedSpatialEdges&&delete this._cachedSpatialEdges[n],i.sequenceId===t?(this._preStore(e,i),i.uncache()):(delete this._nodes[n],i.sequenceId in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[i.sequenceId],i.dispose())}for(let t of this._nodeIndexTiles[e])this._nodeIndex.remove(t);delete this._nodeIndexTiles[e],delete this._cachedTiles[e]}_uncachePreStored(e){let t={};for(let[i,n]of e){i in this._nodes&&delete this._nodes[i],i in this._cachedNodes&&delete this._cachedNodes[i];let e=this._preStored[n][i];e.sequenceId in this._cachedSequenceNodes&&delete this._cachedSequenceNodes[e.sequenceId],delete this._preStored[n][i],e.dispose(),t[n]=!0}for(let e in t)t.hasOwnProperty(e)&&0===Object.keys(this._preStored[e]).length&&delete this._preStored[e]}_updateCachedTileAccess(e,t){e in this._nodeToTile&&(this._cachedTiles[this._nodeToTile[e]].accessed=t)}_updateCachedNodeAccess(e,t){e in this._cachedNodes&&(this._cachedNodes[e].accessed=t)}_updateCell$(e){return this._api.getCoreImages$(e).pipe(We((t=>{if(!(e in this._cachedTiles))return ie();const i=this._nodeIndex,n=this._nodeIndexTiles[e],r=this._nodeToTile,s=this._cachedTiles[e];s.accessed=(new Date).getTime();const a=s.nodes,o=t.images;for(const t of o){if(null==t)break;if(this.hasNode(t.id))continue;if(null==t.sequence.id){console.warn(`Sequence missing, discarding node (${t.id})`);continue}const s=new Su(t);a.push(s);const o={lat:s.lngLat.lat,lng:s.lngLat.lng,node:s};i.insert(o),n.push(o),r[s.id]=e,this._setNode(s)}return Ce(e)})),ct((e=>(console.error(e),ie()))))}}class Vu{constructor(){this._hash={},this._index=new Vu._spatialIndex(16),this._indexChanged$=new j,this._updated$=new j}static register(e){Vu._spatialIndex=e}get changed$(){return this._indexChanged$}get updated$(){return this._updated$}add(e){const t=[],i=this._hash,n=this._index;for(const r of e){const e=r.id;e in i&&(n.remove(i[e]),t.push(r));const s={lat:r.lngLat.lat,lng:r.lngLat.lng,marker:r};i[e]=s,n.insert(s)}t.length>0&&this._updated$.next(t),e.length>t.length&&this._indexChanged$.next(this)}has(e){return e in this._hash}get(e){return this.has(e)?this._hash[e].marker:void 0}getAll(){return this._index.all().map((e=>e.marker))}remove(e){const t=this._hash,i=this._index;let n=!1;for(const r of e){if(!(r in t))continue;const e=t[r];i.remove(e),delete t[r],n=!0}n&&this._indexChanged$.next(this)}removeAll(){this._hash={},this._index.clear(),this._indexChanged$.next(this)}search([e,t]){return this._index.search({maxX:t.lng,maxY:t.lat,minX:e.lng,minY:e.lat}).map((e=>e.marker))}update(e){const t=this._hash,i=this._index,n=e.id;if(!(n in t))return;i.remove(t[n]);const r={lat:e.lngLat.lat,lng:e.lngLat.lng,marker:e};t[n]=r,i.insert(r)}}function Hu(e,t,i,n,r){ju(e,t,i||0,n||e.length-1,r||Wu)}function ju(e,t,i,n,r){for(;n>i;){if(n-i>600){var s=n-i+1,a=t-i+1,o=Math.log(s),h=.5*Math.exp(2*o/3),c=.5*Math.sqrt(o*h*(s-h)/s)*(a-s/2<0?-1:1);ju(e,t,Math.max(i,Math.floor(t-a*h/s+c)),Math.min(n,Math.floor(t+(s-a)*h/s+c)),r)}var l=e[t],u=i,d=n;for(Gu(e,i,t),r(e[n],l)>0&&Gu(e,i,n);u<d;){for(Gu(e,u,d),u++,d--;r(e[u],l)<0;)u++;for(;r(e[d],l)>0;)d--}0===r(e[i],l)?Gu(e,i,d):Gu(e,++d,n),d<=t&&(i=d+1),t<=d&&(n=d-1)}}function Gu(e,t,i){var n=e[t];e[t]=e[i],e[i]=n}function Wu(e,t){return e<t?-1:e>t?1:0}function qu(e,t,i){if(!i)return t.indexOf(e);for(let n=0;n<t.length;n++)if(i(e,t[n]))return n;return-1}function Xu(e,t){Zu(e,0,e.children.length,t,e)}function Zu(e,t,i,n,r){r||(r=rd(null)),r.minX=1/0,r.minY=1/0,r.maxX=-1/0,r.maxY=-1/0;for(let s=t;s<i;s++){const t=e.children[s];Yu(r,e.leaf?n(t):t)}return r}function Yu(e,t){return e.minX=Math.min(e.minX,t.minX),e.minY=Math.min(e.minY,t.minY),e.maxX=Math.max(e.maxX,t.maxX),e.maxY=Math.max(e.maxY,t.maxY),e}function Ju(e,t){return e.minX-t.minX}function Ku(e,t){return e.minY-t.minY}function Qu(e){return(e.maxX-e.minX)*(e.maxY-e.minY)}function ed(e){return e.maxX-e.minX+(e.maxY-e.minY)}function td(e,t){const i=Math.max(e.minX,t.minX),n=Math.max(e.minY,t.minY),r=Math.min(e.maxX,t.maxX),s=Math.min(e.maxY,t.maxY);return Math.max(0,r-i)*Math.max(0,s-n)}function id(e,t){return e.minX<=t.minX&&e.minY<=t.minY&&t.maxX<=e.maxX&&t.maxY<=e.maxY}function nd(e,t){return t.minX<=e.maxX&&t.minY<=e.maxY&&t.maxX>=e.minX&&t.maxY>=e.minY}function rd(e){return{children:e,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function sd(e,t,i,n,r){const s=[t,i];for(;s.length;){if((i=s.pop())-(t=s.pop())<=n)continue;const a=t+Math.ceil((i-t)/n/2)*n;Hu(e,a,t,i,r),s.push(t,a,a,i)}}class ad extends class{constructor(e=9){this._maxEntries=Math.max(4,e),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()}all(){return this._all(this.data,[])}search(e){let t=this.data;const i=[];if(!nd(e,t))return i;const n=this.toBBox,r=[];for(;t;){for(let s=0;s<t.children.length;s++){const a=t.children[s],o=t.leaf?n(a):a;nd(e,o)&&(t.leaf?i.push(a):id(e,o)?this._all(a,i):r.push(a))}t=r.pop()}return i}collides(e){let t=this.data;if(!nd(e,t))return!1;const i=[];for(;t;){for(let n=0;n<t.children.length;n++){const r=t.children[n],s=t.leaf?this.toBBox(r):r;if(nd(e,s)){if(t.leaf||id(e,s))return!0;i.push(r)}}t=i.pop()}return!1}load(e){if(!e||!e.length)return this;if(e.length<this._minEntries){for(let t=0;t<e.length;t++)this.insert(e[t]);return this}let t=this._build(e.slice(),0,e.length-1,0);if(this.data.children.length)if(this.data.height===t.height)this._splitRoot(this.data,t);else{if(this.data.height<t.height){const e=this.data;this.data=t,t=e}this._insert(t,this.data.height-t.height-1,!0)}else this.data=t;return this}insert(e){return e&&this._insert(e,this.data.height-1),this}clear(){return this.data=rd([]),this}remove(e,t){if(!e)return this;let i=this.data;const n=this.toBBox(e),r=[],s=[];let a,o,h;for(;i||r.length;){if(i||(i=r.pop(),o=r[r.length-1],a=s.pop(),h=!0),i.leaf){const n=qu(e,i.children,t);if(-1!==n)return i.children.splice(n,1),r.push(i),this._condense(r),this}h||i.leaf||!id(i,n)?o?(a++,i=o.children[a],h=!1):i=null:(r.push(i),s.push(a),a=0,o=i,i=i.children[0])}return this}toBBox(e){return e}compareMinX(e,t){return e.minX-t.minX}compareMinY(e,t){return e.minY-t.minY}toJSON(){return this.data}fromJSON(e){return this.data=e,this}_all(e,t){const i=[];for(;e;)e.leaf?t.push(...e.children):i.push(...e.children),e=i.pop();return t}_build(e,t,i,n){const r=i-t+1;let s,a=this._maxEntries;if(r<=a)return s=rd(e.slice(t,i+1)),Xu(s,this.toBBox),s;n||(n=Math.ceil(Math.log(r)/Math.log(a)),a=Math.ceil(r/Math.pow(a,n-1))),s=rd([]),s.leaf=!1,s.height=n;const o=Math.ceil(r/a),h=o*Math.ceil(Math.sqrt(a));sd(e,t,i,h,this.compareMinX);for(let r=t;r<=i;r+=h){const t=Math.min(r+h-1,i);sd(e,r,t,o,this.compareMinY);for(let i=r;i<=t;i+=o){const r=Math.min(i+o-1,t);s.children.push(this._build(e,i,r,n-1))}}return Xu(s,this.toBBox),s}_chooseSubtree(e,t,i,n){for(;n.push(t),!t.leaf&&n.length-1!==i;){let i,n=1/0,a=1/0;for(let o=0;o<t.children.length;o++){const h=t.children[o],c=Qu(h),l=(r=e,s=h,(Math.max(s.maxX,r.maxX)-Math.min(s.minX,r.minX))*(Math.max(s.maxY,r.maxY)-Math.min(s.minY,r.minY))-c);l<a?(a=l,n=c<n?c:n,i=h):l===a&&c<n&&(n=c,i=h)}t=i||t.children[0]}var r,s;return t}_insert(e,t,i){const n=i?e:this.toBBox(e),r=[],s=this._chooseSubtree(n,this.data,t,r);for(s.children.push(e),Yu(s,n);t>=0&&r[t].children.length>this._maxEntries;)this._split(r,t),t--;this._adjustParentBBoxes(n,r,t)}_split(e,t){const i=e[t],n=i.children.length,r=this._minEntries;this._chooseSplitAxis(i,r,n);const s=this._chooseSplitIndex(i,r,n),a=rd(i.children.splice(s,i.children.length-s));a.height=i.height,a.leaf=i.leaf,Xu(i,this.toBBox),Xu(a,this.toBBox),t?e[t-1].children.push(a):this._splitRoot(i,a)}_splitRoot(e,t){this.data=rd([e,t]),this.data.height=e.height+1,this.data.leaf=!1,Xu(this.data,this.toBBox)}_chooseSplitIndex(e,t,i){let n,r=1/0,s=1/0;for(let a=t;a<=i-t;a++){const t=Zu(e,0,a,this.toBBox),o=Zu(e,a,i,this.toBBox),h=td(t,o),c=Qu(t)+Qu(o);h<r?(r=h,n=a,s=c<s?c:s):h===r&&c<s&&(s=c,n=a)}return n||i-t}_chooseSplitAxis(e,t,i){const n=e.leaf?this.compareMinX:Ju,r=e.leaf?this.compareMinY:Ku;this._allDistMargin(e,t,i,n)<this._allDistMargin(e,t,i,r)&&e.children.sort(n)}_allDistMargin(e,t,i,n){e.children.sort(n);const r=this.toBBox,s=Zu(e,0,t,r),a=Zu(e,i-t,i,r);let o=ed(s)+ed(a);for(let n=t;n<i-t;n++){const t=e.children[n];Yu(s,e.leaf?r(t):t),o+=ed(s)}for(let n=i-t-1;n>=t;n--){const t=e.children[n];Yu(a,e.leaf?r(t):t),o+=ed(a)}return o}_adjustParentBBoxes(e,t,i){for(let n=i;n>=0;n--)Yu(t[n],e)}_condense(e){for(let t,i=e.length-1;i>=0;i--)0===e[i].children.length?i>0?(t=e[i-1].children,t.splice(t.indexOf(e[i]),1)):this.clear():Xu(e[i],this.toBBox)}}{compareMinX(e,t){return e.lng-t.lng}compareMinY(e,t){return e.lat-t.lat}toBBox(e){return{minX:e.lng,minY:e.lat,maxX:e.lng,maxY:e.lat}}}class od{constructor(e,t){this._components={};for(const i in od.registeredComponents){if(!od.registeredComponents.hasOwnProperty(i))continue;const n=od.registeredComponents[i];this._components[i]={active:!1,component:new n(i,e,t)}}this._coverComponent=new od.registeredCoverComponent("cover",e,t),this._coverComponent.activate(),this._coverActivated=!0}static register(e){void 0===od.registeredComponents[e.componentName]&&(od.registeredComponents[e.componentName]=e)}static registerCover(e){od.registeredCoverComponent=e}get coverActivated(){return this._coverActivated}activateCover(){if(!this._coverActivated){this._coverActivated=!0;for(const e in this._components){if(!this._components.hasOwnProperty(e))continue;const t=this._components[e];t.active&&t.component.deactivate()}}}deactivateCover(){if(this._coverActivated){this._coverActivated=!1;for(const e in this._components){if(!this._components.hasOwnProperty(e))continue;const t=this._components[e];t.active&&t.component.activate()}}}activate(e){this._checkName(e),this._components[e].active=!0,this._coverActivated||this.get(e).activate()}configure(e,t){this._checkName(e),this.get(e).configure(t)}deactivate(e){this._checkName(e),this._components[e].active=!1,this._coverActivated||this.get(e).deactivate()}get(e){return this._components[e].component}getCover(){return this._coverComponent}remove(){this._coverComponent.deactivate();for(const e in this._components)this._components.hasOwnProperty(e)&&this._components[e].component.deactivate()}_checkName(e){if(!(e in this._components))throw new Lu(`Component does not exist: ${e}`)}}od.registeredComponents={};var hd="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function cd(e){if(e.__esModule)return e;var t=Object.defineProperty({},"__esModule",{value:!0});return Object.keys(e).forEach((function(i){var n=Object.getOwnPropertyDescriptor(e,i);Object.defineProperty(t,i,n.get?n:{enumerable:!0,get:function(){return e[i]}})})),t}var ld=Array.isArray,ud=Object.prototype.toString,dd=ld||function(e){return"[object Array]"===ud.call(e)};md.NONE=0,md.VTEXT=1,md.VNODE=2,md.WIDGET=3,md.PROPS=4,md.ORDER=5,md.INSERT=6,md.REMOVE=7,md.THUNK=8;var pd=md;function md(e,t,i){this.type=Number(e),this.vNode=t,this.patch=i}md.prototype.version="2",md.prototype.type="VirtualPatch";var fd=function(e){return e&&"VirtualNode"===e.type&&"2"===e.version};var gd=function(e){return e&&"VirtualText"===e.type&&"2"===e.version};var _d=function(e){return e&&"Widget"===e.type};var vd=function(e){return e&&"Thunk"===e.type};var yd=fd,bd=gd,xd=_d,wd=vd,Md=function(e,t){var i=e,n=t;wd(t)&&(n=Sd(t,e));wd(e)&&(i=Sd(e,null));return{a:i,b:n}};function Sd(e,t){var i=e.vnode;if(i||(i=e.vnode=e.render(t)),!(yd(i)||bd(i)||xd(i)))throw new Error("thunk did not return a valid node");return i}var Td=function(e){return"object"==typeof e&&null!==e},Cd=function(e){return e&&("function"==typeof e.hook&&!e.hasOwnProperty("hook")||"function"==typeof e.unhook&&!e.hasOwnProperty("unhook"))};var Ed=Td,Ad=Cd;function Id(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var Rd=dd,Pd=pd,Ld=fd,Dd=gd,Nd=_d,$d=vd,kd=Md,Od=function e(t,i){var n;for(var r in t){r in i||((n=n||{})[r]=void 0);var s=t[r],a=i[r];if(s!==a)if(Ed(s)&&Ed(a))if(Id(a)!==Id(s))(n=n||{})[r]=a;else if(Ad(a))(n=n||{})[r]=a;else{var o=e(s,a);o&&((n=n||{})[r]=o)}else(n=n||{})[r]=a}for(var h in i)h in t||((n=n||{})[h]=i[h]);return n};function zd(e,t){var i={a:e};return Fd(e,t,i,0),i}function Fd(e,t,i,n){if(e!==t){var r=i[n],s=!1;if($d(e)||$d(t))Vd(e,t,i,n);else if(null==t)Nd(e)||(Bd(e,i,n),r=i[n]),r=Wd(r,new Pd(Pd.REMOVE,e,t));else if(Ld(t))if(Ld(e))if(e.tagName===t.tagName&&e.namespace===t.namespace&&e.key===t.key){var a=Od(e.properties,t.properties);a&&(r=Wd(r,new Pd(Pd.PROPS,e,a))),r=function(e,t,i,n,r){for(var s=e.children,a=function(e,t){var i=Gd(t),n=i.keys,r=i.free;if(r.length===t.length)return{children:t,moves:null};var s=Gd(e),a=s.keys;if(s.free.length===e.length)return{children:t,moves:null};for(var o=[],h=0,c=r.length,l=0,u=0;u<e.length;u++){var d,p=e[u];p.key?n.hasOwnProperty(p.key)?(d=n[p.key],o.push(t[d])):(d=u-l++,o.push(null)):h<c?(d=r[h++],o.push(t[d])):(d=u-l++,o.push(null))}for(var m=h>=r.length?t.length:r[h],f=0;f<t.length;f++){var g=t[f];g.key?a.hasOwnProperty(g.key)||o.push(g):f>=m&&o.push(g)}for(var _,v=o.slice(),y=0,b=[],x=[],w=0;w<t.length;){var M=t[w];for(_=v[y];null===_&&v.length;)b.push(jd(v,y,null)),_=v[y];_&&_.key===M.key?(y++,w++):M.key?(_&&_.key&&n[_.key]!==w+1?(b.push(jd(v,y,_.key)),(_=v[y])&&_.key===M.key?y++:x.push({key:M.key,to:w})):x.push({key:M.key,to:w}),w++):_&&_.key&&b.push(jd(v,y,_.key))}for(;y<v.length;)_=v[y],b.push(jd(v,y,_&&_.key));if(b.length===l&&!x.length)return{children:o,moves:null};return{children:o,moves:{removes:b,inserts:x}}}(s,t.children),o=a.children,h=s.length,c=o.length,l=h>c?h:c,u=0;u<l;u++){var d=s[u],p=o[u];r+=1,d?Fd(d,p,i,r):p&&(n=Wd(n,new Pd(Pd.INSERT,null,p))),Ld(d)&&d.count&&(r+=d.count)}a.moves&&(n=Wd(n,new Pd(Pd.ORDER,e,a.moves)));return n}(e,t,i,r,n)}else r=Wd(r,new Pd(Pd.VNODE,e,t)),s=!0;else r=Wd(r,new Pd(Pd.VNODE,e,t)),s=!0;else Dd(t)?Dd(e)?e.text!==t.text&&(r=Wd(r,new Pd(Pd.VTEXT,e,t))):(r=Wd(r,new Pd(Pd.VTEXT,e,t)),s=!0):Nd(t)&&(Nd(e)||(s=!0),r=Wd(r,new Pd(Pd.WIDGET,e,t)));r&&(i[n]=r),s&&Bd(e,i,n)}}function Bd(e,t,i){Hd(e,t,i),Ud(e,t,i)}function Ud(e,t,i){if(Nd(e))"function"==typeof e.destroy&&(t[i]=Wd(t[i],new Pd(Pd.REMOVE,e,null)));else if(Ld(e)&&(e.hasWidgets||e.hasThunks))for(var n=e.children,r=n.length,s=0;s<r;s++){var a=n[s];Ud(a,t,i+=1),Ld(a)&&a.count&&(i+=a.count)}else $d(e)&&Vd(e,null,t,i)}function Vd(e,t,i,n){var r=kd(e,t),s=zd(r.a,r.b);(function(e){for(var t in e)if("a"!==t)return!0;return!1})(s)&&(i[n]=new Pd(Pd.THUNK,null,s))}function Hd(e,t,i){if(Ld(e)){if(e.hooks&&(t[i]=Wd(t[i],new Pd(Pd.PROPS,e,function(e){var t={};for(var i in e)t[i]=void 0;return t}(e.hooks)))),e.descendantHooks||e.hasThunks)for(var n=e.children,r=n.length,s=0;s<r;s++){var a=n[s];Hd(a,t,i+=1),Ld(a)&&a.count&&(i+=a.count)}}else $d(e)&&Vd(e,null,t,i)}function jd(e,t,i){return e.splice(t,1),{from:t,key:i}}function Gd(e){for(var t={},i=[],n=e.length,r=0;r<n;r++){var s=e[r];s.key?t[s.key]=r:i.push(r)}return{keys:t,free:i}}function Wd(e,t){return e?(Rd(e)?e.push(t):e=[e,t],e):t}var qd=zd,Xd=Array.prototype.slice,Zd=function(e,t){"length"in e||(e=[e]);e=Xd.call(e);for(;e.length;){var i=e.shift(),n=t(i);if(n)return n;i.childNodes&&i.childNodes.length&&(e=Xd.call(i.childNodes).concat(e))}};var Yd=Jd;function Jd(e,t){if(!(this instanceof Jd))return new Jd(e,t);this.data=e,this.nodeValue=e,this.length=e.length,this.ownerDocument=t||null}Jd.prototype.nodeType=8,Jd.prototype.nodeName="#comment",Jd.prototype.toString=function(){return"[object Comment]"};var Kd=Qd;function Qd(e,t){if(!(this instanceof Qd))return new Qd(e);this.data=e||"",this.length=this.data.length,this.ownerDocument=t||null}Qd.prototype.type="DOMTextNode",Qd.prototype.nodeType=3,Qd.prototype.nodeName="#text",Qd.prototype.toString=function(){return this.data},Qd.prototype.replaceData=function(e,t,i){var n=this.data,r=n.substring(0,e),s=n.substring(e+t,n.length);this.data=r+i+s,this.length=this.data.length};var ep=function(e){var t=this,i=e.type;e.target||(e.target=t);t.listeners||(t.listeners={});var n=t.listeners[i];if(n)return n.forEach((function(i){e.currentTarget=t,"function"==typeof i?i(e):i.handleEvent(e)}));t.parentNode&&t.parentNode.dispatchEvent(e)};var tp=function(e,t){var i=this;i.listeners||(i.listeners={});i.listeners[e]||(i.listeners[e]=[]);-1===i.listeners[e].indexOf(t)&&i.listeners[e].push(t)};var ip=function(e,t){var i=this;if(!i.listeners)return;if(!i.listeners[e])return;var n=i.listeners[e],r=n.indexOf(t);-1!==r&&n.splice(r,1)};var np=["area","base","br","col","embed","hr","img","input","keygen","link","menuitem","meta","param","source","track","wbr"];function rp(e){switch(e.nodeType){case 3:return op(e.data);case 8:return"\x3c!--"+e.data+"--\x3e";default:return function(e){var t=[],i=e.tagName;"http://www.w3.org/1999/xhtml"===e.namespaceURI&&(i=i.toLowerCase());t.push("<"+i+function(e){var t=[];for(var i in e)sp(e,i)&&t.push({name:i,value:e[i]});for(var n in e._attributes)for(var r in e._attributes[n]){var s=e._attributes[n][r],a=(s.prefix?s.prefix+":":"")+r;t.push({name:a,value:s.value})}e.className&&t.push({name:"class",value:e.className});return t.length?ap(t):""}(e)+function(e){var t=e.dataset,i=[];for(var n in t)i.push({name:"data-"+n,value:t[n]});return i.length?ap(i):""}(e)),np.indexOf(i)>-1?t.push(" />"):(t.push(">"),e.childNodes.length?t.push.apply(t,e.childNodes.map(rp)):e.textContent||e.innerText?t.push(op(e.textContent||e.innerText)):e.innerHTML&&t.push(e.innerHTML),t.push("</"+i+">"));return t.join("")}(e)}}function sp(e,t){var i=typeof e[t];return"style"===t&&Object.keys(e.style).length>0||e.hasOwnProperty(t)&&("string"===i||"boolean"===i||"number"===i)&&"nodeName"!==t&&"className"!==t&&"tagName"!==t&&"textContent"!==t&&"innerText"!==t&&"namespaceURI"!==t&&"innerHTML"!==t}function ap(e){var t=[];return e.forEach((function(e){var i=e.name,n=e.value;"style"===i&&(n=function(e){if("string"==typeof e)return e;var t="";return Object.keys(e).forEach((function(i){var n=e[i];i=i.replace(/[A-Z]/g,(function(e){return"-"+e.toLowerCase()})),t+=i+":"+n+";"})),t}(n)),t.push(i+'="'+(op(n).replace(/"/g,"&quot;")+'"'))})),t.length?" "+t.join(" "):""}function op(e){var t="";return"string"==typeof e?t=e:e&&(t=e.toString()),t.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}var hp=Zd,cp=ep,lp=tp,up=ip,dp=rp,pp="http://www.w3.org/1999/xhtml",mp=fp;function fp(e,t,i){if(!(this instanceof fp))return new fp(e);var n=void 0===i?pp:i||null;this.tagName=n===pp?String(e).toUpperCase():e,this.nodeName=this.tagName,this.className="",this.dataset={},this.childNodes=[],this.parentNode=null,this.style={},this.ownerDocument=t||null,this.namespaceURI=n,this._attributes={},"INPUT"===this.tagName&&(this.type="text")}fp.prototype.type="DOMElement",fp.prototype.nodeType=1,fp.prototype.appendChild=function(e){return e.parentNode&&e.parentNode.removeChild(e),this.childNodes.push(e),e.parentNode=this,e},fp.prototype.replaceChild=function(e,t){e.parentNode&&e.parentNode.removeChild(e);var i=this.childNodes.indexOf(t);return t.parentNode=null,this.childNodes[i]=e,e.parentNode=this,t},fp.prototype.removeChild=function(e){var t=this.childNodes.indexOf(e);return this.childNodes.splice(t,1),e.parentNode=null,e},fp.prototype.insertBefore=function(e,t){e.parentNode&&e.parentNode.removeChild(e);var i=null==t?-1:this.childNodes.indexOf(t);return i>-1?this.childNodes.splice(i,0,e):this.childNodes.push(e),e.parentNode=this,e},fp.prototype.setAttributeNS=function(e,t,i){var n=null,r=t,s=t.indexOf(":");(s>-1&&(n=t.substr(0,s),r=t.substr(s+1)),"INPUT"===this.tagName&&"type"===t)?this.type=i:(this._attributes[e]||(this._attributes[e]={}))[r]={value:i,prefix:n}},fp.prototype.getAttributeNS=function(e,t){var i=this._attributes[e],n=i&&i[t]&&i[t].value;return"INPUT"===this.tagName&&"type"===t?this.type:"string"!=typeof n?null:n},fp.prototype.removeAttributeNS=function(e,t){var i=this._attributes[e];i&&delete i[t]},fp.prototype.hasAttributeNS=function(e,t){var i=this._attributes[e];return!!i&&t in i},fp.prototype.setAttribute=function(e,t){return this.setAttributeNS(null,e,t)},fp.prototype.getAttribute=function(e){return this.getAttributeNS(null,e)},fp.prototype.removeAttribute=function(e){return this.removeAttributeNS(null,e)},fp.prototype.hasAttribute=function(e){return this.hasAttributeNS(null,e)},fp.prototype.removeEventListener=up,fp.prototype.addEventListener=lp,fp.prototype.dispatchEvent=cp,fp.prototype.focus=function(){},fp.prototype.toString=function(){return dp(this)},fp.prototype.getElementsByClassName=function(e){var t=e.split(" "),i=[];return hp(this,(function(e){if(1===e.nodeType){var n=(e.className||"").split(" ");t.every((function(e){return-1!==n.indexOf(e)}))&&i.push(e)}})),i},fp.prototype.getElementsByTagName=function(e){e=e.toLowerCase();var t=[];return hp(this.childNodes,(function(i){1!==i.nodeType||"*"!==e&&i.tagName.toLowerCase()!==e||t.push(i)})),t},fp.prototype.contains=function(e){return hp(this,(function(t){return e===t}))||!1};var gp=mp,_p=vp;function vp(e){if(!(this instanceof vp))return new vp;this.childNodes=[],this.parentNode=null,this.ownerDocument=e||null}vp.prototype.type="DocumentFragment",vp.prototype.nodeType=11,vp.prototype.nodeName="#document-fragment",vp.prototype.appendChild=gp.prototype.appendChild,vp.prototype.replaceChild=gp.prototype.replaceChild,vp.prototype.removeChild=gp.prototype.removeChild,vp.prototype.toString=function(){return this.childNodes.map((function(e){return String(e)})).join("")};var yp=bp;function bp(e){}bp.prototype.initEvent=function(e,t,i){this.type=e,this.bubbles=t,this.cancelable=i},bp.prototype.preventDefault=function(){};var xp=Zd,wp=Yd,Mp=Kd,Sp=mp,Tp=_p,Cp=yp,Ep=ep,Ap=tp,Ip=ip,Rp=Pp;function Pp(){if(!(this instanceof Pp))return new Pp;this.head=this.createElement("head"),this.body=this.createElement("body"),this.documentElement=this.createElement("html"),this.documentElement.appendChild(this.head),this.documentElement.appendChild(this.body),this.childNodes=[this.documentElement],this.nodeType=9}var Lp=Pp.prototype;Lp.createTextNode=function(e){return new Mp(e,this)},Lp.createElementNS=function(e,t){var i=null===e?null:String(e);return new Sp(t,this,i)},Lp.createElement=function(e){return new Sp(e,this)},Lp.createDocumentFragment=function(){return new Tp(this)},Lp.createEvent=function(e){return new Cp(e)},Lp.createComment=function(e){return new wp(e,this)},Lp.getElementById=function(e){return e=String(e),xp(this.childNodes,(function(t){if(String(t.id)===e)return t}))||null},Lp.getElementsByClassName=Sp.prototype.getElementsByClassName,Lp.getElementsByTagName=Sp.prototype.getElementsByTagName,Lp.contains=Sp.prototype.contains,Lp.removeEventListener=Ip,Lp.addEventListener=Ap,Lp.dispatchEvent=Ep;var Dp,Np=new Rp,$p=void 0!==hd?hd:"undefined"!=typeof window?window:{},kp=Np;"undefined"!=typeof document?Dp=document:(Dp=$p["__GLOBAL_DOCUMENT_CACHE@4"])||(Dp=$p["__GLOBAL_DOCUMENT_CACHE@4"]=kp);var Op=Td,zp=Cd,Fp=function(e,t,i){for(var n in t){var r=t[n];void 0===r?Bp(e,n,r,i):zp(r)?(Bp(e,n,r,i),r.hook&&r.hook(e,n,i?i[n]:void 0)):Op(r)?Up(e,t,i,n,r):e[n]=r}};function Bp(e,t,i,n){if(n){var r=n[t];if(zp(r))r.unhook&&r.unhook(e,t,i);else if("attributes"===t)for(var s in r)e.removeAttribute(s);else if("style"===t)for(var a in r)e.style[a]="";else e[t]="string"==typeof r?"":null}}function Up(e,t,i,n,r){var s=i?i[n]:void 0;if("attributes"!==n)if(s&&Op(s)&&Vp(s)!==Vp(r))e[n]=r;else{Op(e[n])||(e[n]={});var a="style"===n?"":void 0;for(var o in r){var h=r[o];e[n][o]=void 0===h?a:h}}else for(var c in r){var l=r[c];void 0===l?e.removeAttribute(c):e.setAttribute(c,l)}}function Vp(e){return Object.getPrototypeOf?Object.getPrototypeOf(e):e.__proto__?e.__proto__:e.constructor?e.constructor.prototype:void 0}var Hp=Dp,jp=Fp,Gp=fd,Wp=gd,qp=_d,Xp=Md,Zp=function e(t,i){var n=i&&i.document||Hp,r=i?i.warn:null;if(t=Xp(t).a,qp(t))return t.init();if(Wp(t))return n.createTextNode(t.text);if(!Gp(t))return r&&r("Item is not a valid virtual dom node",t),null;var s=null===t.namespace?n.createElement(t.tagName):n.createElementNS(t.namespace,t.tagName),a=t.properties;jp(s,a);for(var o=t.children,h=0;h<o.length;h++){var c=e(o[h],i);c&&s.appendChild(c)}return s};var Yp={};function Jp(e,t,i,n,r){if(n=n||{},e){Kp(i,r,r)&&(n[r]=e);var s=t.children;if(s)for(var a=e.childNodes,o=0;o<t.children.length;o++){r+=1;var h=s[o]||Yp,c=r+(h.count||0);Kp(i,r,c)&&Jp(a[o],h,i,n,r),r=c}}return n}function Kp(e,t,i){if(0===e.length)return!1;for(var n,r,s=0,a=e.length-1;s<=a;){if(r=e[n=(a+s)/2>>0],s===a)return r>=t&&r<=i;if(r<t)s=n+1;else{if(!(r>i))return!0;a=n-1}}return!1}function Qp(e,t){return e>t?1:-1}var em=_d;var tm=Fp,im=_d,nm=pd,rm=function(e,t){if(em(e)&&em(t))return"name"in e&&"name"in t?e.id===t.id:e.init===t.init;return!1};function sm(e,t){"function"==typeof t.destroy&&im(t)&&t.destroy(e)}var am=Dp,om=dd,hm=Zp,cm=function(e,t,i,n){return i&&0!==i.length?(i.sort(Qp),Jp(e,t,i,n,0)):{}},lm=function(e,t,i){var n=e.type,r=e.vNode,s=e.patch;switch(n){case nm.REMOVE:return function(e,t){var i=e.parentNode;i&&i.removeChild(e);return sm(e,t),null}(t,r);case nm.INSERT:return function(e,t,i){var n=i.render(t,i);e&&e.appendChild(n);return e}(t,s,i);case nm.VTEXT:return function(e,t,i,n){var r;if(3===e.nodeType)e.replaceData(0,e.length,i.text),r=e;else{var s=e.parentNode;r=n.render(i,n),s&&r!==e&&s.replaceChild(r,e)}return r}(t,0,s,i);case nm.WIDGET:return function(e,t,i,n){var r,s=rm(t,i);r=s?i.update(t,e)||e:n.render(i,n);var a=e.parentNode;a&&r!==e&&a.replaceChild(r,e);s||sm(e,t);return r}(t,r,s,i);case nm.VNODE:return function(e,t,i,n){var r=e.parentNode,s=n.render(i,n);r&&s!==e&&r.replaceChild(s,e);return s}(t,0,s,i);case nm.ORDER:return function(e,t){for(var i,n,r,s=e.childNodes,a={},o=0;o<t.removes.length;o++)i=s[(n=t.removes[o]).from],n.key&&(a[n.key]=i),e.removeChild(i);for(var h=s.length,c=0;c<t.inserts.length;c++)i=a[(r=t.inserts[c]).key],e.insertBefore(i,r.to>=h++?null:s[r.to])}(t,s),t;case nm.PROPS:return tm(t,s,r.properties),t;case nm.THUNK:return function(e,t){e&&t&&e!==t&&e.parentNode&&e.parentNode.replaceChild(t,e);return t}(t,i.patch(t,s,i));default:return t}};function um(e,t,i){var n=function(e){var t=[];for(var i in e)"a"!==i&&t.push(Number(i));return t}(t);if(0===n.length)return e;var r=cm(e,t.a,n),s=e.ownerDocument;i.document||s===am||(i.document=s);for(var a=0;a<n.length;a++){var o=n[a];e=dm(e,r[o],t[o],i)}return e}function dm(e,t,i,n){if(!t)return e;var r;if(om(i))for(var s=0;s<i.length;s++)r=lm(i[s],t,n),t===e&&(e=r);else r=lm(i,t,n),t===e&&(e=r);return e}var pm=function e(t,i,n){return(n=n||{}).patch=n.patch&&n.patch!==e?n.patch:um,n.render=n.render||hm,n.patch(t,i,n)},mm=fd,fm=_d,gm=vd,_m=Cd,vm=xm,ym={},bm=[];function xm(e,t,i,n,r){this.tagName=e,this.properties=t||ym,this.children=i||bm,this.key=null!=n?String(n):void 0,this.namespace="string"==typeof r?r:null;var s,a=i&&i.length||0,o=0,h=!1,c=!1,l=!1;for(var u in t)if(t.hasOwnProperty(u)){var d=t[u];_m(d)&&d.unhook&&(s||(s={}),s[u]=d)}for(var p=0;p<a;p++){var m=i[p];mm(m)?(o+=m.count||0,!h&&m.hasWidgets&&(h=!0),!c&&m.hasThunks&&(c=!0),l||!m.hooks&&!m.descendantHooks||(l=!0)):!h&&fm(m)?"function"==typeof m.destroy&&(h=!0):!c&&gm(m)&&(c=!0)}this.count=a+o,this.hasWidgets=h,this.hasThunks=c,this.hooks=s,this.descendantHooks=l}xm.prototype.version="2",xm.prototype.type="VirtualNode";var wm=Mm;function Mm(e){this.text=String(e)}Mm.prototype.version="2",Mm.prototype.type="VirtualText";
+/*!
+     * Cross-Browser Split 1.1.1
+     * Copyright 2007-2012 Steven Levithan <stevenlevithan.com>
+     * Available under the MIT License
+     * ECMAScript compliant, uniform cross-browser split method
      */
-    ImageSize[ImageSize["Size2048"] = 2048] = "Size2048";
-})(ImageSize = exports.ImageSize || (exports.ImageSize = {}));
-
-},{}],437:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var KeyboardService = /** @class */ (function () {
-    function KeyboardService(canvasContainer) {
-        this._keyDown$ = rxjs_1.fromEvent(canvasContainer, "keydown");
-        this._keyUp$ = rxjs_1.fromEvent(canvasContainer, "keyup");
-    }
-    Object.defineProperty(KeyboardService.prototype, "keyDown$", {
-        get: function () {
-            return this._keyDown$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(KeyboardService.prototype, "keyUp$", {
-        get: function () {
-            return this._keyUp$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return KeyboardService;
-}());
-exports.KeyboardService = KeyboardService;
-exports.default = KeyboardService;
-
-},{"rxjs":27}],438:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var rxjs_1 = require("rxjs");
-var LoadingService = /** @class */ (function () {
-    function LoadingService() {
-        this._loadersSubject$ = new rxjs_1.Subject();
-        this._loaders$ = this._loadersSubject$.pipe(operators_1.scan(function (loaders, loader) {
-            if (loader.task !== undefined) {
-                loaders[loader.task] = loader.loading;
-            }
-            return loaders;
-        }, {}), operators_1.startWith({}), operators_1.publishReplay(1), operators_1.refCount());
-    }
-    Object.defineProperty(LoadingService.prototype, "loading$", {
-        get: function () {
-            return this._loaders$.pipe(operators_1.map(function (loaders) {
-                for (var key in loaders) {
-                    if (!loaders.hasOwnProperty(key)) {
-                        continue;
-                    }
-                    if (loaders[key]) {
-                        return true;
-                    }
-                }
-                return false;
-            }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
-        },
-        enumerable: true,
-        configurable: true
-    });
-    LoadingService.prototype.taskLoading$ = function (task) {
-        return this._loaders$.pipe(operators_1.map(function (loaders) {
-            return !!loaders[task];
-        }), operators_1.debounceTime(100), operators_1.distinctUntilChanged());
-    };
-    LoadingService.prototype.startLoading = function (task) {
-        this._loadersSubject$.next({ loading: true, task: task });
-    };
-    LoadingService.prototype.stopLoading = function (task) {
-        this._loadersSubject$.next({ loading: false, task: task });
-    };
-    return LoadingService;
-}());
-exports.LoadingService = LoadingService;
-exports.default = LoadingService;
-
-},{"rxjs":27,"rxjs/operators":225}],439:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var MouseService = /** @class */ (function () {
-    function MouseService(container, canvasContainer, domContainer, doc) {
-        var _this = this;
-        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        this._claimMouse$ = new rxjs_1.Subject();
-        this._claimWheel$ = new rxjs_1.Subject();
-        this._deferPixelClaims$ = new rxjs_1.Subject();
-        this._deferPixels$ = this._deferPixelClaims$.pipe(operators_1.scan(function (claims, claim) {
-            if (claim.deferPixels == null) {
-                delete claims[claim.name];
-            }
-            else {
-                claims[claim.name] = claim.deferPixels;
-            }
-            return claims;
-        }, {}), operators_1.map(function (claims) {
-            var deferPixelMax = -1;
-            for (var key in claims) {
-                if (!claims.hasOwnProperty(key)) {
-                    continue;
-                }
-                var deferPixels = claims[key];
-                if (deferPixels > deferPixelMax) {
-                    deferPixelMax = deferPixels;
-                }
-            }
-            return deferPixelMax;
-        }), operators_1.startWith(-1), operators_1.publishReplay(1), operators_1.refCount());
-        this._deferPixels$.subscribe(function () { });
-        this._documentMouseMove$ = rxjs_1.fromEvent(doc, "mousemove");
-        this._documentMouseUp$ = rxjs_1.fromEvent(doc, "mouseup");
-        this._mouseDown$ = rxjs_1.fromEvent(canvasContainer, "mousedown");
-        this._mouseLeave$ = rxjs_1.fromEvent(canvasContainer, "mouseleave");
-        this._mouseMove$ = rxjs_1.fromEvent(canvasContainer, "mousemove");
-        this._mouseUp$ = rxjs_1.fromEvent(canvasContainer, "mouseup");
-        this._mouseOut$ = rxjs_1.fromEvent(canvasContainer, "mouseout");
-        this._mouseOver$ = rxjs_1.fromEvent(canvasContainer, "mouseover");
-        this._domMouseDown$ = rxjs_1.fromEvent(domContainer, "mousedown");
-        this._domMouseMove$ = rxjs_1.fromEvent(domContainer, "mousemove");
-        this._click$ = rxjs_1.fromEvent(canvasContainer, "click");
-        this._contextMenu$ = rxjs_1.fromEvent(canvasContainer, "contextmenu");
-        this._dblClick$ = rxjs_1.merge(rxjs_1.fromEvent(container, "click"), rxjs_1.fromEvent(canvasContainer, "dblclick")).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
-            var event1 = events[0];
-            var event2 = events[1];
-            var event3 = events[2];
-            return event1.type === "click" &&
-                event2.type === "click" &&
-                event3.type === "dblclick" &&
-                event1.target.parentNode === canvasContainer &&
-                event2.target.parentNode === canvasContainer;
-        }), operators_1.map(function (events) {
-            return events[2];
-        }), operators_1.share());
-        rxjs_1.merge(this._domMouseDown$, this._domMouseMove$, this._dblClick$, this._contextMenu$)
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._mouseWheel$ = rxjs_1.merge(rxjs_1.fromEvent(canvasContainer, "wheel"), rxjs_1.fromEvent(domContainer, "wheel")).pipe(operators_1.share());
-        this._consistentContextMenu$ = rxjs_1.merge(this._mouseDown$, this._mouseMove$, this._mouseOut$, this._mouseUp$, this._contextMenu$).pipe(operators_1.bufferCount(3, 1), operators_1.filter(function (events) {
-            // fire context menu on mouse up both on mac and windows
-            return events[0].type === "mousedown" &&
-                events[1].type === "contextmenu" &&
-                events[2].type === "mouseup";
-        }), operators_1.map(function (events) {
-            return events[1];
-        }), operators_1.share());
-        var dragStop$ = rxjs_1.merge(rxjs_1.fromEvent(window, "blur"), this._documentMouseUp$.pipe(operators_1.filter(function (e) {
-            return e.button === 0;
-        }))).pipe(operators_1.share());
-        var mouseDragInitiate$ = this._createMouseDragInitiate$(this._mouseDown$, dragStop$, true).pipe(operators_1.share());
-        this._mouseDragStart$ = this._createMouseDragStart$(mouseDragInitiate$).pipe(operators_1.share());
-        this._mouseDrag$ = this._createMouseDrag$(mouseDragInitiate$, dragStop$).pipe(operators_1.share());
-        this._mouseDragEnd$ = this._createMouseDragEnd$(this._mouseDragStart$, dragStop$).pipe(operators_1.share());
-        var domMouseDragInitiate$ = this._createMouseDragInitiate$(this._domMouseDown$, dragStop$, false).pipe(operators_1.share());
-        this._domMouseDragStart$ = this._createMouseDragStart$(domMouseDragInitiate$).pipe(operators_1.share());
-        this._domMouseDrag$ = this._createMouseDrag$(domMouseDragInitiate$, dragStop$).pipe(operators_1.share());
-        this._domMouseDragEnd$ = this._createMouseDragEnd$(this._domMouseDragStart$, dragStop$).pipe(operators_1.share());
-        this._proximateClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (mouseDown) {
-            return _this._click$.pipe(operators_1.takeUntil(_this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$)), operators_1.take(1));
-        }), operators_1.share());
-        this._staticClick$ = this._mouseDown$.pipe(operators_1.switchMap(function (e) {
-            return _this._click$.pipe(operators_1.takeUntil(_this._documentMouseMove$), operators_1.take(1));
-        }), operators_1.share());
-        this._mouseDragStart$.subscribe();
-        this._mouseDrag$.subscribe();
-        this._mouseDragEnd$.subscribe();
-        this._domMouseDragStart$.subscribe();
-        this._domMouseDrag$.subscribe();
-        this._domMouseDragEnd$.subscribe();
-        this._staticClick$.subscribe();
-        this._mouseOwner$ = this._createOwner$(this._claimMouse$).pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._wheelOwner$ = this._createOwner$(this._claimWheel$).pipe(operators_1.publishReplay(1), operators_1.refCount());
-        this._mouseOwner$.subscribe(function () { });
-        this._wheelOwner$.subscribe(function () { });
-    }
-    Object.defineProperty(MouseService.prototype, "active$", {
-        get: function () {
-            return this._active$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "activate$", {
-        get: function () {
-            return this._activeSubject$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "documentMouseMove$", {
-        get: function () {
-            return this._documentMouseMove$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "documentMouseUp$", {
-        get: function () {
-            return this._documentMouseUp$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDragStart$", {
-        get: function () {
-            return this._domMouseDragStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDrag$", {
-        get: function () {
-            return this._domMouseDrag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDragEnd$", {
-        get: function () {
-            return this._domMouseDragEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseDown$", {
-        get: function () {
-            return this._domMouseDown$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "domMouseMove$", {
-        get: function () {
-            return this._domMouseMove$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseOwner$", {
-        get: function () {
-            return this._mouseOwner$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDown$", {
-        get: function () {
-            return this._mouseDown$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseMove$", {
-        get: function () {
-            return this._mouseMove$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseLeave$", {
-        get: function () {
-            return this._mouseLeave$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseOut$", {
-        get: function () {
-            return this._mouseOut$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseOver$", {
-        get: function () {
-            return this._mouseOver$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseUp$", {
-        get: function () {
-            return this._mouseUp$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "click$", {
-        get: function () {
-            return this._click$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "dblClick$", {
-        get: function () {
-            return this._dblClick$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "contextMenu$", {
-        get: function () {
-            return this._consistentContextMenu$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseWheel$", {
-        get: function () {
-            return this._mouseWheel$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDragStart$", {
-        get: function () {
-            return this._mouseDragStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDrag$", {
-        get: function () {
-            return this._mouseDrag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "mouseDragEnd$", {
-        get: function () {
-            return this._mouseDragEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "proximateClick$", {
-        get: function () {
-            return this._proximateClick$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(MouseService.prototype, "staticClick$", {
-        get: function () {
-            return this._staticClick$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    MouseService.prototype.claimMouse = function (name, zindex) {
-        this._claimMouse$.next({ name: name, zindex: zindex });
-    };
-    MouseService.prototype.unclaimMouse = function (name) {
-        this._claimMouse$.next({ name: name, zindex: null });
-    };
-    MouseService.prototype.deferPixels = function (name, deferPixels) {
-        this._deferPixelClaims$.next({ name: name, deferPixels: deferPixels });
-    };
-    MouseService.prototype.undeferPixels = function (name) {
-        this._deferPixelClaims$.next({ name: name, deferPixels: null });
-    };
-    MouseService.prototype.claimWheel = function (name, zindex) {
-        this._claimWheel$.next({ name: name, zindex: zindex });
-    };
-    MouseService.prototype.unclaimWheel = function (name) {
-        this._claimWheel$.next({ name: name, zindex: null });
-    };
-    MouseService.prototype.filtered$ = function (name, observable$) {
-        return this._filtered(name, observable$, this._mouseOwner$);
-    };
-    MouseService.prototype.filteredWheel$ = function (name, observable$) {
-        return this._filtered(name, observable$, this._wheelOwner$);
-    };
-    MouseService.prototype._createDeferredMouseMove$ = function (origin, mouseMove$) {
-        return mouseMove$.pipe(operators_1.map(function (mouseMove) {
-            var deltaX = mouseMove.clientX - origin.clientX;
-            var deltaY = mouseMove.clientY - origin.clientY;
-            return [mouseMove, Math.sqrt(deltaX * deltaX + deltaY * deltaY)];
-        }), operators_1.withLatestFrom(this._deferPixels$), operators_1.filter(function (_a) {
-            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
-            return delta > deferPixels;
-        }), operators_1.map(function (_a) {
-            var _b = _a[0], mouseMove = _b[0], delta = _b[1], deferPixels = _a[1];
-            return mouseMove;
-        }));
-    };
-    MouseService.prototype._createMouseDrag$ = function (mouseDragStartInitiate$, stop$) {
-        var _this = this;
-        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
-            var mouseDown = _a[0], mouseMove = _a[1];
-            return mouseMove;
-        }), operators_1.switchMap(function (mouseMove) {
-            return rxjs_1.concat(rxjs_1.of(mouseMove), _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$));
-        }));
-    };
-    MouseService.prototype._createMouseDragEnd$ = function (mouseDragStart$, stop$) {
-        return mouseDragStart$.pipe(operators_1.switchMap(function (event) {
-            return stop$.pipe(operators_1.first());
-        }));
-    };
-    MouseService.prototype._createMouseDragStart$ = function (mouseDragStartInitiate$) {
-        return mouseDragStartInitiate$.pipe(operators_1.map(function (_a) {
-            var mouseDown = _a[0], mouseMove = _a[1];
-            return mouseDown;
-        }));
-    };
-    MouseService.prototype._createMouseDragInitiate$ = function (mouseDown$, stop$, defer) {
-        var _this = this;
-        return mouseDown$.pipe(operators_1.filter(function (mouseDown) {
-            return mouseDown.button === 0;
-        }), operators_1.switchMap(function (mouseDown) {
-            return rxjs_1.combineLatest(rxjs_1.of(mouseDown), defer ?
-                _this._createDeferredMouseMove$(mouseDown, _this._documentMouseMove$) :
-                _this._documentMouseMove$).pipe(operators_1.takeUntil(stop$), operators_1.take(1));
-        }));
-    };
-    MouseService.prototype._createOwner$ = function (claim$) {
-        return claim$.pipe(operators_1.scan(function (claims, claim) {
-            if (claim.zindex == null) {
-                delete claims[claim.name];
-            }
-            else {
-                claims[claim.name] = claim.zindex;
-            }
-            return claims;
-        }, {}), operators_1.map(function (claims) {
-            var owner = null;
-            var zIndexMax = -1;
-            for (var name_1 in claims) {
-                if (!claims.hasOwnProperty(name_1)) {
-                    continue;
-                }
-                if (claims[name_1] > zIndexMax) {
-                    zIndexMax = claims[name_1];
-                    owner = name_1;
-                }
-            }
-            return owner;
-        }), operators_1.startWith(null));
-    };
-    MouseService.prototype._filtered = function (name, observable$, owner$) {
-        return observable$.pipe(operators_1.withLatestFrom(owner$), operators_1.filter(function (_a) {
-            var item = _a[0], owner = _a[1];
-            return owner === name;
-        }), operators_1.map(function (_a) {
-            var item = _a[0], owner = _a[1];
-            return item;
-        }));
-    };
-    return MouseService;
-}());
-exports.MouseService = MouseService;
-exports.default = MouseService;
-
-},{"rxjs":27,"rxjs/operators":225}],440:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var API_1 = require("../API");
-var Graph_1 = require("../Graph");
-var Edge_1 = require("../Edge");
-var Error_1 = require("../Error");
-var State_1 = require("../State");
-var Viewer_1 = require("../Viewer");
-var PanService_1 = require("./PanService");
-var Navigator = /** @class */ (function () {
-    function Navigator(clientId, options, token, apiV3, graphService, imageLoadingService, loadingService, stateService, cacheService, playService, panService) {
-        this._apiV3 = apiV3 != null ? apiV3 : new API_1.APIv3(clientId, token);
-        this._imageLoadingService = imageLoadingService != null ? imageLoadingService : new Graph_1.ImageLoadingService();
-        this._graphService = graphService != null ?
-            graphService :
-            new Graph_1.GraphService(new Graph_1.Graph(this.apiV3), this._imageLoadingService);
-        this._loadingService = loadingService != null ? loadingService : new Viewer_1.LoadingService();
-        this._loadingName = "navigator";
-        this._stateService = stateService != null ? stateService : new State_1.StateService(options.transitionMode);
-        this._cacheService = cacheService != null ?
-            cacheService :
-            new Viewer_1.CacheService(this._graphService, this._stateService);
-        this._playService = playService != null ?
-            playService :
-            new Viewer_1.PlayService(this._graphService, this._stateService);
-        this._panService = panService != null ?
-            panService :
-            new PanService_1.PanService(this._graphService, this._stateService, options.combinedPanning);
-        this._keyRequested$ = new rxjs_1.BehaviorSubject(null);
-        this._movedToKey$ = new rxjs_1.BehaviorSubject(null);
-        this._request$ = null;
-        this._requestSubscription = null;
-        this._nodeRequestSubscription = null;
-    }
-    Object.defineProperty(Navigator.prototype, "apiV3", {
-        get: function () {
-            return this._apiV3;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "cacheService", {
-        get: function () {
-            return this._cacheService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "graphService", {
-        get: function () {
-            return this._graphService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "imageLoadingService", {
-        get: function () {
-            return this._imageLoadingService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "loadingService", {
-        get: function () {
-            return this._loadingService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "movedToKey$", {
-        get: function () {
-            return this._movedToKey$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "panService", {
-        get: function () {
-            return this._panService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "playService", {
-        get: function () {
-            return this._playService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Navigator.prototype, "stateService", {
-        get: function () {
-            return this._stateService;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Navigator.prototype.moveToKey$ = function (key) {
-        this._abortRequest("to key " + key);
-        this._loadingService.startLoading(this._loadingName);
-        var node$ = this._moveToKey$(key);
-        return this._makeRequest$(node$);
-    };
-    Navigator.prototype.moveDir$ = function (direction) {
-        var _this = this;
-        this._abortRequest("in dir " + Edge_1.EdgeDirection[direction]);
-        this._loadingService.startLoading(this._loadingName);
-        var node$ = this.stateService.currentNode$.pipe(operators_1.first(), operators_1.mergeMap(function (node) {
-            return ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-                node.sequenceEdges$ :
-                node.spatialEdges$).pipe(operators_1.first(), operators_1.map(function (status) {
-                for (var _i = 0, _a = status.edges; _i < _a.length; _i++) {
-                    var edge = _a[_i];
-                    if (edge.data.direction === direction) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            }));
-        }), operators_1.mergeMap(function (directionKey) {
-            if (directionKey == null) {
-                _this._loadingService.stopLoading(_this._loadingName);
-                return rxjs_1.throwError(new Error("Direction (" + direction + ") does not exist for current node."));
-            }
-            return _this._moveToKey$(directionKey);
-        }));
-        return this._makeRequest$(node$);
-    };
-    Navigator.prototype.moveCloseTo$ = function (lat, lon) {
-        var _this = this;
-        this._abortRequest("to lat " + lat + ", lon " + lon);
-        this._loadingService.startLoading(this._loadingName);
-        var node$ = this.apiV3.imageCloseTo$(lat, lon).pipe(operators_1.mergeMap(function (fullNode) {
-            if (fullNode == null) {
-                _this._loadingService.stopLoading(_this._loadingName);
-                return rxjs_1.throwError(new Error("No image found close to lat " + lat + ", lon " + lon + "."));
-            }
-            return _this._moveToKey$(fullNode.key);
-        }));
-        return this._makeRequest$(node$);
-    };
-    Navigator.prototype.setFilter$ = function (filter) {
-        var _this = this;
-        this._stateService.clearNodes();
-        return this._movedToKey$.pipe(operators_1.first(), operators_1.mergeMap(function (key) {
-            if (key != null) {
-                return _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
-                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
-                        return _this._cacheKeys$(keys);
-                    }));
-                }), operators_1.last());
-            }
-            return _this._keyRequested$.pipe(operators_1.first(), operators_1.mergeMap(function (requestedKey) {
-                if (requestedKey != null) {
-                    return _this._graphService.setFilter$(filter).pipe(operators_1.mergeMap(function () {
-                        return _this._graphService.cacheNode$(requestedKey);
-                    }));
-                }
-                return _this._graphService.setFilter$(filter).pipe(operators_1.map(function () {
-                    return undefined;
-                }));
-            }));
-        }), operators_1.map(function (node) {
-            return undefined;
-        }));
-    };
-    Navigator.prototype.setToken$ = function (token) {
-        var _this = this;
-        this._abortRequest("to set token");
-        this._stateService.clearNodes();
-        return this._movedToKey$.pipe(operators_1.first(), operators_1.tap(function (key) {
-            _this._apiV3.setToken(token);
-        }), operators_1.mergeMap(function (key) {
-            return key == null ?
-                _this._graphService.reset$([]) :
-                _this._trajectoryKeys$().pipe(operators_1.mergeMap(function (keys) {
-                    return _this._graphService.reset$(keys).pipe(operators_1.mergeMap(function () {
-                        return _this._cacheKeys$(keys);
-                    }));
-                }), operators_1.last(), operators_1.map(function (node) {
-                    return undefined;
-                }));
-        }));
-    };
-    Navigator.prototype._cacheKeys$ = function (keys) {
-        var _this = this;
-        var cacheNodes$ = keys
-            .map(function (key) {
-            return _this._graphService.cacheNode$(key);
-        });
-        return rxjs_1.from(cacheNodes$).pipe(operators_1.mergeAll());
-    };
-    Navigator.prototype._abortRequest = function (reason) {
-        if (this._requestSubscription != null) {
-            this._requestSubscription.unsubscribe();
-            this._requestSubscription = null;
-        }
-        if (this._nodeRequestSubscription != null) {
-            this._nodeRequestSubscription.unsubscribe();
-            this._nodeRequestSubscription = null;
-        }
-        if (this._request$ != null) {
-            if (!(this._request$.isStopped || this._request$.hasError)) {
-                this._request$.error(new Error_1.AbortMapillaryError("Request aborted by a subsequent request " + reason + "."));
-            }
-            this._request$ = null;
-        }
-    };
-    Navigator.prototype._makeRequest$ = function (node$) {
-        var _this = this;
-        var request$ = new rxjs_1.ReplaySubject(1);
-        this._requestSubscription = request$
-            .subscribe(undefined, function () { });
-        this._request$ = request$;
-        this._nodeRequestSubscription = node$
-            .subscribe(function (node) {
-            _this._request$ = null;
-            request$.next(node);
-            request$.complete();
-        }, function (error) {
-            _this._request$ = null;
-            request$.error(error);
-        });
-        return request$;
-    };
-    Navigator.prototype._moveToKey$ = function (key) {
-        var _this = this;
-        this._keyRequested$.next(key);
-        return this._graphService.cacheNode$(key).pipe(operators_1.tap(function (node) {
-            _this._stateService.setNodes([node]);
-            _this._movedToKey$.next(node.key);
-        }), operators_1.finalize(function () {
-            _this._loadingService.stopLoading(_this._loadingName);
-        }));
-    };
-    Navigator.prototype._trajectoryKeys$ = function () {
-        return this._stateService.currentState$.pipe(operators_1.first(), operators_1.map(function (frame) {
-            return frame.state.trajectory
-                .map(function (node) {
-                return node.key;
-            });
-        }));
-    };
-    return Navigator;
-}());
-exports.Navigator = Navigator;
-exports.default = Navigator;
-
-},{"../API":274,"../Edge":276,"../Error":277,"../Graph":279,"../State":282,"../Viewer":286,"./PanService":442,"rxjs":27,"rxjs/operators":225}],441:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Viewer_1 = require("../Viewer");
-var Observer = /** @class */ (function () {
-    function Observer(eventEmitter, navigator, container) {
-        var _this = this;
-        this._container = container;
-        this._eventEmitter = eventEmitter;
-        this._navigator = navigator;
-        this._projection = new Viewer_1.Projection();
-        this._started = false;
-        this._navigable$ = new rxjs_1.Subject();
-        // navigable and loading should always emit, also when cover is activated.
-        this._navigable$
-            .subscribe(function (navigable) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.navigablechanged, navigable);
-        });
-        this._navigator.loadingService.loading$
-            .subscribe(function (loading) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.loadingchanged, loading);
-        });
-    }
-    Object.defineProperty(Observer.prototype, "started", {
-        get: function () {
-            return this._started;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(Observer.prototype, "navigable$", {
-        get: function () {
-            return this._navigable$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Observer.prototype.projectBasic$ = function (basicPoint) {
-        var _this = this;
-        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
-            var render = _a[0], transform = _a[1];
-            var canvasPoint = _this._projection.basicToCanvas(basicPoint, _this._container.element, render, transform);
-            return [Math.round(canvasPoint[0]), Math.round(canvasPoint[1])];
-        }));
-    };
-    Observer.prototype.startEmit = function () {
-        var _this = this;
-        if (this._started) {
-            return;
-        }
-        this._started = true;
-        this._currentNodeSubscription = this._navigator.stateService.currentNodeExternal$
-            .subscribe(function (node) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.nodechanged, node);
-        });
-        this._sequenceEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
-            return node.sequenceEdges$;
-        }))
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.sequenceedgeschanged, status);
-        });
-        this._spatialEdgesSubscription = this._navigator.stateService.currentNodeExternal$.pipe(operators_1.switchMap(function (node) {
-            return node.spatialEdges$;
-        }))
-            .subscribe(function (status) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.spatialedgeschanged, status);
-        });
-        this._moveSubscription = rxjs_1.combineLatest(this._navigator.stateService.inMotion$, this._container.mouseService.active$, this._container.touchService.active$).pipe(operators_1.map(function (values) {
-            return values[0] || values[1] || values[2];
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (started) {
-            if (started) {
-                _this._eventEmitter.fire(Viewer_1.Viewer.movestart, null);
-            }
-            else {
-                _this._eventEmitter.fire(Viewer_1.Viewer.moveend, null);
-            }
-        });
-        this._bearingSubscription = this._container.renderService.bearing$.pipe(operators_1.auditTime(100), operators_1.distinctUntilChanged(function (b1, b2) {
-            return Math.abs(b2 - b1) < 1;
-        }))
-            .subscribe(function (bearing) {
-            _this._eventEmitter.fire(Viewer_1.Viewer.bearingchanged, bearing);
-        });
-        var mouseMove$ = this._container.mouseService.active$.pipe(operators_1.switchMap(function (active) {
-            return active ?
-                rxjs_1.empty() :
-                _this._container.mouseService.mouseMove$;
-        }));
-        this._viewerMouseEventSubscription = rxjs_1.merge(this._mapMouseEvent$(Viewer_1.Viewer.click, this._container.mouseService.staticClick$), this._mapMouseEvent$(Viewer_1.Viewer.contextmenu, this._container.mouseService.contextMenu$), this._mapMouseEvent$(Viewer_1.Viewer.dblclick, this._container.mouseService.dblClick$), this._mapMouseEvent$(Viewer_1.Viewer.mousedown, this._container.mouseService.mouseDown$), this._mapMouseEvent$(Viewer_1.Viewer.mousemove, mouseMove$), this._mapMouseEvent$(Viewer_1.Viewer.mouseout, this._container.mouseService.mouseOut$), this._mapMouseEvent$(Viewer_1.Viewer.mouseover, this._container.mouseService.mouseOver$), this._mapMouseEvent$(Viewer_1.Viewer.mouseup, this._container.mouseService.mouseUp$)).pipe(operators_1.withLatestFrom(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$), operators_1.map(function (_a) {
-            var _b = _a[0], type = _b[0], event = _b[1], render = _a[1], reference = _a[2], transform = _a[3];
-            var unprojection = _this._projection.eventToUnprojection(event, _this._container.element, render, reference, transform);
-            return {
-                basicPoint: unprojection.basicPoint,
-                latLon: unprojection.latLon,
-                originalEvent: event,
-                pixelPoint: unprojection.pixelPoint,
-                target: _this._eventEmitter,
-                type: type,
-            };
-        }))
-            .subscribe(function (event) {
-            _this._eventEmitter.fire(event.type, event);
-        });
-    };
-    Observer.prototype.stopEmit = function () {
-        if (!this.started) {
-            return;
-        }
-        this._started = false;
-        this._bearingSubscription.unsubscribe();
-        this._currentNodeSubscription.unsubscribe();
-        this._moveSubscription.unsubscribe();
-        this._sequenceEdgesSubscription.unsubscribe();
-        this._spatialEdgesSubscription.unsubscribe();
-        this._viewerMouseEventSubscription.unsubscribe();
-        this._bearingSubscription = null;
-        this._currentNodeSubscription = null;
-        this._moveSubscription = null;
-        this._sequenceEdgesSubscription = null;
-        this._spatialEdgesSubscription = null;
-        this._viewerMouseEventSubscription = null;
-    };
-    Observer.prototype.unproject$ = function (canvasPoint) {
-        var _this = this;
-        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.reference$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
-            var render = _a[0], reference = _a[1], transform = _a[2];
-            var unprojection = _this._projection.canvasToUnprojection(canvasPoint, _this._container.element, render, reference, transform);
-            return unprojection.latLon;
-        }));
-    };
-    Observer.prototype.unprojectBasic$ = function (canvasPoint) {
-        var _this = this;
-        return rxjs_1.combineLatest(this._container.renderService.renderCamera$, this._navigator.stateService.currentTransform$).pipe(operators_1.first(), operators_1.map(function (_a) {
-            var render = _a[0], transform = _a[1];
-            return _this._projection.canvasToBasic(canvasPoint, _this._container.element, render, transform);
-        }));
-    };
-    Observer.prototype._mapMouseEvent$ = function (type, mouseEvent$) {
-        return mouseEvent$.pipe(operators_1.map(function (event) {
-            return [type, event];
-        }));
-    };
-    return Observer;
-}());
-exports.Observer = Observer;
-exports.default = Observer;
-
-},{"../Viewer":286,"rxjs":27,"rxjs/operators":225}],442:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Geo = require("../geo/Geo");
-var GeoCoords_1 = require("../geo/GeoCoords");
-var GraphCalculator_1 = require("../graph/GraphCalculator");
-var Spatial_1 = require("../geo/Spatial");
-var Transform_1 = require("../geo/Transform");
-var ViewportCoords_1 = require("../geo/ViewportCoords");
-var PanMode;
-(function (PanMode) {
-    PanMode[PanMode["Disabled"] = 0] = "Disabled";
-    PanMode[PanMode["Enabled"] = 1] = "Enabled";
-    PanMode[PanMode["Started"] = 2] = "Started";
-})(PanMode || (PanMode = {}));
-var PanService = /** @class */ (function () {
-    function PanService(graphService, stateService, enabled, geoCoords, graphCalculator, spatial, viewportCoords) {
-        this._graphService = graphService;
-        this._stateService = stateService;
-        this._geoCoords = !!geoCoords ? geoCoords : new GeoCoords_1.default();
-        this._graphCalculator = !!graphCalculator ? graphCalculator : new GraphCalculator_1.default(this._geoCoords);
-        this._spatial = !!spatial ? spatial : new Spatial_1.default();
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new ViewportCoords_1.default();
-        this._mode = enabled !== false ? PanMode.Enabled : PanMode.Disabled;
-        this._panNodesSubject$ = new rxjs_1.Subject();
-        this._panNodes$ = this._panNodesSubject$.pipe(operators_1.startWith([]), operators_1.publishReplay(1), operators_1.refCount());
-        this._panNodes$.subscribe();
-    }
-    Object.defineProperty(PanService.prototype, "panNodes$", {
-        get: function () {
-            return this._panNodes$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    PanService.prototype.enable = function () {
-        if (this._mode !== PanMode.Disabled) {
-            return;
-        }
-        this._mode = PanMode.Enabled;
-        this.start();
-    };
-    PanService.prototype.disable = function () {
-        if (this._mode === PanMode.Disabled) {
-            return;
-        }
-        this.stop();
-        this._mode = PanMode.Disabled;
-    };
-    PanService.prototype.start = function () {
-        var _this = this;
-        if (this._mode !== PanMode.Enabled) {
-            return;
-        }
-        var panNodes$ = this._stateService.currentNode$.pipe(operators_1.switchMap(function (current) {
-            var current$ = rxjs_1.of(current);
-            var bounds = _this._graphCalculator.boundingBoxCorners(current.computedLatLon, 20);
-            var adjacent$ = _this._graphService
-                .cacheBoundingBox$(bounds[0], bounds[1]).pipe(operators_1.catchError(function (error) {
-                console.error("Failed to cache periphery bounding box (" + current.key + ")", error);
-                return rxjs_1.empty();
-            }), operators_1.map(function (nodes) {
-                if (current.pano) {
-                    return [];
-                }
-                var potential = [];
-                for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-                    var node = nodes_1[_i];
-                    if (node.key === current.key) {
-                        continue;
-                    }
-                    if (node.mergeCC !== current.mergeCC) {
-                        continue;
-                    }
-                    if (node.pano) {
-                        continue;
-                    }
-                    if (_this._distance(node, current) > 4) {
-                        continue;
-                    }
-                    potential.push(node);
-                }
-                return potential;
-            }));
-            return rxjs_1.combineLatest(current$, adjacent$).pipe(operators_1.withLatestFrom(_this._stateService.reference$), operators_1.map(function (_a) {
-                var _b = _a[0], cn = _b[0], adjacent = _b[1], reference = _a[1];
-                var currentDirection = _this._spatial.viewingDirection(cn.rotation);
-                var currentTranslation = Geo.computeTranslation({ lat: cn.latLon.lat, lon: cn.latLon.lon, alt: cn.alt }, cn.rotation, reference);
-                var currentTransform = _this._createTransform(cn, currentTranslation);
-                var currentAzimuthal = _this._spatial.wrap(_this._spatial.azimuthal(currentDirection.toArray(), currentTransform.upVector().toArray()), 0, 2 * Math.PI);
-                var currentProjectedPoints = _this._computeProjectedPoints(currentTransform);
-                var currentHFov = _this._computeHorizontalFov(currentProjectedPoints) / 180 * Math.PI;
-                var preferredOverlap = Math.PI / 8;
-                var left = undefined;
-                var right = undefined;
-                for (var _i = 0, adjacent_1 = adjacent; _i < adjacent_1.length; _i++) {
-                    var a = adjacent_1[_i];
-                    var translation = Geo.computeTranslation({ lat: a.latLon.lat, lon: a.latLon.lon, alt: a.alt }, a.rotation, reference);
-                    var transform = _this._createTransform(a, translation);
-                    var projectedPoints = _this._computeProjectedPoints(transform);
-                    var hFov = _this._computeHorizontalFov(projectedPoints) / 180 * Math.PI;
-                    var direction = _this._spatial.viewingDirection(a.rotation);
-                    var azimuthal = _this._spatial.wrap(_this._spatial.azimuthal(direction.toArray(), transform.upVector().toArray()), 0, 2 * Math.PI);
-                    var directionChange = _this._spatial.angleBetweenVector2(currentDirection.x, currentDirection.y, direction.x, direction.y);
-                    var overlap = Number.NEGATIVE_INFINITY;
-                    if (directionChange > 0) {
-                        if (currentAzimuthal > azimuthal) {
-                            overlap = currentAzimuthal - 2 * Math.PI + currentHFov / 2 - (azimuthal - hFov / 2);
-                        }
-                        else {
-                            overlap = currentAzimuthal + currentHFov / 2 - (azimuthal - hFov / 2);
-                        }
-                    }
-                    else {
-                        if (currentAzimuthal < azimuthal) {
-                            overlap = azimuthal + hFov / 2 - (currentAzimuthal + 2 * Math.PI - currentHFov / 2);
-                        }
-                        else {
-                            overlap = azimuthal + hFov / 2 - (currentAzimuthal - currentHFov / 2);
-                        }
-                    }
-                    var nonOverlap = Math.abs(hFov - overlap);
-                    var distanceCost = _this._distance(a, cn);
-                    var timeCost = Math.min(_this._timeDifference(a, cn), 4);
-                    var overlapCost = 20 * Math.abs(overlap - preferredOverlap);
-                    var fovCost = Math.min(5, 1 / Math.min(hFov / currentHFov, 1));
-                    var nonOverlapCost = overlap > 0 ? -2 * nonOverlap : 0;
-                    var cost = distanceCost + timeCost + overlapCost + fovCost + nonOverlapCost;
-                    if (overlap > 0 &&
-                        overlap < 0.5 * currentHFov &&
-                        overlap < 0.5 * hFov &&
-                        nonOverlap > 0.5 * currentHFov) {
-                        if (directionChange > 0) {
-                            if (!left) {
-                                left = [cost, a, transform, hFov];
-                            }
-                            else {
-                                if (cost < left[0]) {
-                                    left = [cost, a, transform, hFov];
-                                }
-                            }
-                        }
-                        else {
-                            if (!right) {
-                                right = [cost, a, transform, hFov];
-                            }
-                            else {
-                                if (cost < right[0]) {
-                                    right = [cost, a, transform, hFov];
-                                }
-                            }
-                        }
-                    }
-                }
-                var panNodes = [];
-                if (!!left) {
-                    panNodes.push([left[1], left[2], left[3]]);
-                }
-                if (!!right) {
-                    panNodes.push([right[1], right[2], right[3]]);
-                }
-                return panNodes;
-            }), operators_1.startWith([]));
-        }));
-        this._panNodesSubscription = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state.nodesAhead > 0;
-        }), operators_1.distinctUntilChanged(), operators_1.switchMap(function (traversing) {
-            return traversing ? rxjs_1.of([]) : panNodes$;
-        }))
-            .subscribe(function (panNodes) {
-            _this._panNodesSubject$.next(panNodes);
-        });
-        this._mode = PanMode.Started;
-    };
-    PanService.prototype.stop = function () {
-        if (this._mode !== PanMode.Started) {
-            return;
-        }
-        this._panNodesSubscription.unsubscribe();
-        this._panNodesSubject$.next([]);
-        this._mode = PanMode.Enabled;
-    };
-    PanService.prototype._distance = function (node, reference) {
-        var _a = this._geoCoords.geodeticToEnu(node.latLon.lat, node.latLon.lon, node.alt, reference.latLon.lat, reference.latLon.lon, reference.alt), x = _a[0], y = _a[1], z = _a[2];
-        return Math.sqrt(x * x + y * y + z * z);
-    };
-    PanService.prototype._timeDifference = function (node, reference) {
-        return Math.abs(node.capturedAt - reference.capturedAt) / (1000 * 60 * 60 * 24 * 30);
-    };
-    PanService.prototype._createTransform = function (node, translation) {
-        return new Transform_1.Transform(node.orientation, node.width, node.height, node.focal, node.scale, node.gpano, node.rotation, translation, node.assetsCached ? node.image : undefined, undefined, node.ck1, node.ck2, node.cameraProjection);
-    };
-    PanService.prototype._computeProjectedPoints = function (transform) {
-        var vertices = [[1, 0]];
-        var directions = [[0, 0.5]];
-        var pointsPerLine = 20;
-        return Geo.computeProjectedPoints(transform, vertices, directions, pointsPerLine, this._viewportCoords);
-    };
-    PanService.prototype._computeHorizontalFov = function (projectedPoints) {
-        var _this = this;
-        var fovs = projectedPoints
-            .map(function (projectedPoint) {
-            return _this._coordToFov(projectedPoint[0]);
-        });
-        var fov = Math.min.apply(Math, fovs);
-        return fov;
-    };
-    PanService.prototype._coordToFov = function (x) {
-        return 2 * Math.atan(x) * 180 / Math.PI;
-    };
-    return PanService;
-}());
-exports.PanService = PanService;
-
-},{"../geo/Geo":384,"../geo/GeoCoords":385,"../geo/Spatial":387,"../geo/Transform":388,"../geo/ViewportCoords":389,"../graph/GraphCalculator":392,"rxjs":27,"rxjs/operators":225}],443:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var Edge_1 = require("../Edge");
-var Graph_1 = require("../Graph");
-var PlayService = /** @class */ (function () {
-    function PlayService(graphService, stateService, graphCalculator) {
-        this._graphService = graphService;
-        this._stateService = stateService;
-        this._graphCalculator = !!graphCalculator ? graphCalculator : new Graph_1.GraphCalculator();
-        this._directionSubject$ = new rxjs_1.Subject();
-        this._direction$ = this._directionSubject$.pipe(operators_1.startWith(Edge_1.EdgeDirection.Next), operators_1.publishReplay(1), operators_1.refCount());
-        this._direction$.subscribe();
-        this._playing = false;
-        this._playingSubject$ = new rxjs_1.Subject();
-        this._playing$ = this._playingSubject$.pipe(operators_1.startWith(this._playing), operators_1.publishReplay(1), operators_1.refCount());
-        this._playing$.subscribe();
-        this._speed = 0.5;
-        this._speedSubject$ = new rxjs_1.Subject();
-        this._speed$ = this._speedSubject$.pipe(operators_1.startWith(this._speed), operators_1.publishReplay(1), operators_1.refCount());
-        this._speed$.subscribe();
-        this._nodesAhead = this._mapNodesAhead(this._mapSpeed(this._speed));
-        this._bridging$ = null;
-    }
-    Object.defineProperty(PlayService.prototype, "playing", {
-        get: function () {
-            return this._playing;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(PlayService.prototype, "direction$", {
-        get: function () {
-            return this._direction$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(PlayService.prototype, "playing$", {
-        get: function () {
-            return this._playing$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(PlayService.prototype, "speed$", {
-        get: function () {
-            return this._speed$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    PlayService.prototype.play = function () {
-        var _this = this;
-        if (this._playing) {
-            return;
-        }
-        this._stateService.cutNodes();
-        var stateSpeed = this._setSpeed(this._speed);
-        this._stateService.setSpeed(stateSpeed);
-        this._graphModeSubscription = this._speed$.pipe(operators_1.map(function (speed) {
-            return speed > PlayService.sequenceSpeed ? Graph_1.GraphMode.Sequence : Graph_1.GraphMode.Spatial;
-        }), operators_1.distinctUntilChanged())
-            .subscribe(function (mode) {
-            _this._graphService.setGraphMode(mode);
-        });
-        this._cacheSubscription = rxjs_1.combineLatest(this._stateService.currentNode$.pipe(operators_1.map(function (node) {
-            return [node.sequenceKey, node.key];
-        }), operators_1.distinctUntilChanged(undefined, function (_a) {
-            var sequenceKey = _a[0], nodeKey = _a[1];
-            return sequenceKey;
-        })), this._graphService.graphMode$, this._direction$).pipe(operators_1.switchMap(function (_a) {
-            var _b = _a[0], sequenceKey = _b[0], nodeKey = _b[1], mode = _a[1], direction = _a[2];
-            if (direction !== Edge_1.EdgeDirection.Next && direction !== Edge_1.EdgeDirection.Prev) {
-                return rxjs_1.of([undefined, direction]);
-            }
-            var sequence$ = (mode === Graph_1.GraphMode.Sequence ?
-                _this._graphService.cacheSequenceNodes$(sequenceKey, nodeKey) :
-                _this._graphService.cacheSequence$(sequenceKey)).pipe(operators_1.retry(3), operators_1.catchError(function (error) {
-                console.error(error);
-                return rxjs_1.of(undefined);
-            }));
-            return rxjs_1.combineLatest(sequence$, rxjs_1.of(direction));
-        }), operators_1.switchMap(function (_a) {
-            var sequence = _a[0], direction = _a[1];
-            if (sequence === undefined) {
-                return rxjs_1.empty();
-            }
-            var sequenceKeys = sequence.keys.slice();
-            if (direction === Edge_1.EdgeDirection.Prev) {
-                sequenceKeys.reverse();
-            }
-            return _this._stateService.currentState$.pipe(operators_1.map(function (frame) {
-                return [frame.state.trajectory[frame.state.trajectory.length - 1].key, frame.state.nodesAhead];
-            }), operators_1.scan(function (_a, _b) {
-                var lastRequestKey = _a[0], previousRequestKeys = _a[1];
-                var lastTrajectoryKey = _b[0], nodesAhead = _b[1];
-                if (lastRequestKey === undefined) {
-                    lastRequestKey = lastTrajectoryKey;
-                }
-                var lastIndex = sequenceKeys.length - 1;
-                if (nodesAhead >= _this._nodesAhead || sequenceKeys[lastIndex] === lastRequestKey) {
-                    return [lastRequestKey, []];
-                }
-                var current = sequenceKeys.indexOf(lastTrajectoryKey);
-                var start = sequenceKeys.indexOf(lastRequestKey) + 1;
-                var end = Math.min(lastIndex, current + _this._nodesAhead - nodesAhead) + 1;
-                if (end <= start) {
-                    return [lastRequestKey, []];
-                }
-                return [sequenceKeys[end - 1], sequenceKeys.slice(start, end)];
-            }, [undefined, []]), operators_1.mergeMap(function (_a) {
-                var lastRequestKey = _a[0], newRequestKeys = _a[1];
-                return rxjs_1.from(newRequestKeys);
-            }));
-        }), operators_1.mergeMap(function (key) {
-            return _this._graphService.cacheNode$(key).pipe(operators_1.catchError(function () {
-                return rxjs_1.empty();
-            }));
-        }, 6))
-            .subscribe();
-        this._playingSubscription = this._stateService.currentState$.pipe(operators_1.filter(function (frame) {
-            return frame.state.nodesAhead < _this._nodesAhead;
-        }), operators_1.distinctUntilChanged(undefined, function (frame) {
-            return frame.state.lastNode.key;
-        }), operators_1.map(function (frame) {
-            var lastNode = frame.state.lastNode;
-            var trajectory = frame.state.trajectory;
-            var increasingTime = undefined;
-            for (var i = trajectory.length - 2; i >= 0; i--) {
-                var node = trajectory[i];
-                if (node.sequenceKey !== lastNode.sequenceKey) {
-                    break;
-                }
-                if (node.capturedAt !== lastNode.capturedAt) {
-                    increasingTime = node.capturedAt < lastNode.capturedAt;
-                    break;
-                }
-            }
-            return [frame.state.lastNode, increasingTime];
-        }), operators_1.withLatestFrom(this._direction$), operators_1.switchMap(function (_a) {
-            var _b = _a[0], node = _b[0], increasingTime = _b[1], direction = _a[1];
-            return rxjs_1.zip(([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-                node.sequenceEdges$ :
-                node.spatialEdges$).pipe(operators_1.first(function (status) {
-                return status.cached;
-            }), operators_1.timeout(15000)), rxjs_1.of(direction)).pipe(operators_1.map(function (_a) {
-                var s = _a[0], d = _a[1];
-                for (var _i = 0, _b = s.edges; _i < _b.length; _i++) {
-                    var edge = _b[_i];
-                    if (edge.data.direction === d) {
-                        return edge.to;
-                    }
-                }
-                return null;
-            }), operators_1.switchMap(function (key) {
-                return key != null ?
-                    _this._graphService.cacheNode$(key) :
-                    _this._bridge$(node, increasingTime).pipe(operators_1.filter(function (n) {
-                        return !!n;
-                    }));
-            }));
-        }))
-            .subscribe(function (node) {
-            _this._stateService.appendNodes([node]);
-        }, function (error) {
-            console.error(error);
-            _this.stop();
-        });
-        this._clearSubscription = this._stateService.currentNode$.pipe(operators_1.bufferCount(1, 10))
-            .subscribe(function (nodes) {
-            _this._stateService.clearPriorNodes();
-        });
-        this._setPlaying(true);
-        var currentLastNodes$ = this._stateService.currentState$.pipe(operators_1.map(function (frame) {
-            return frame.state;
-        }), operators_1.distinctUntilChanged(function (_a, _b) {
-            var kc1 = _a[0], kl1 = _a[1];
-            var kc2 = _b[0], kl2 = _b[1];
-            return kc1 === kc2 && kl1 === kl2;
-        }, function (state) {
-            return [state.currentNode.key, state.lastNode.key];
-        }), operators_1.filter(function (state) {
-            return state.currentNode.key === state.lastNode.key &&
-                state.currentIndex === state.trajectory.length - 1;
-        }), operators_1.map(function (state) {
-            return state.currentNode;
-        }));
-        this._stopSubscription = rxjs_1.combineLatest(currentLastNodes$, this._direction$).pipe(operators_1.switchMap(function (_a) {
-            var node = _a[0], direction = _a[1];
-            var edgeStatus$ = ([Edge_1.EdgeDirection.Next, Edge_1.EdgeDirection.Prev].indexOf(direction) > -1 ?
-                node.sequenceEdges$ :
-                node.spatialEdges$).pipe(operators_1.first(function (status) {
-                return status.cached;
-            }), operators_1.timeout(15000), operators_1.catchError(function (error) {
-                console.error(error);
-                return rxjs_1.of({ cached: false, edges: [] });
-            }));
-            return rxjs_1.combineLatest(rxjs_1.of(direction), edgeStatus$).pipe(operators_1.map(function (_a) {
-                var d = _a[0], es = _a[1];
-                for (var _i = 0, _b = es.edges; _i < _b.length; _i++) {
-                    var edge = _b[_i];
-                    if (edge.data.direction === d) {
-                        return true;
-                    }
-                }
-                return false;
-            }));
-        }), operators_1.mergeMap(function (hasEdge) {
-            if (hasEdge || !_this._bridging$) {
-                return rxjs_1.of(hasEdge);
-            }
-            return _this._bridging$.pipe(operators_1.map(function (node) {
-                return node != null;
-            }), operators_1.catchError(function (error) {
-                console.error(error);
-                return rxjs_1.of(false);
-            }));
-        }), operators_1.first(function (hasEdge) {
-            return !hasEdge;
-        }))
-            .subscribe(undefined, undefined, function () { _this.stop(); });
-        if (this._stopSubscription.closed) {
-            this._stopSubscription = null;
-        }
-    };
-    PlayService.prototype.setDirection = function (direction) {
-        this._directionSubject$.next(direction);
-    };
-    PlayService.prototype.setSpeed = function (speed) {
-        speed = Math.max(0, Math.min(1, speed));
-        if (speed === this._speed) {
-            return;
-        }
-        var stateSpeed = this._setSpeed(speed);
-        if (this._playing) {
-            this._stateService.setSpeed(stateSpeed);
-        }
-        this._speedSubject$.next(this._speed);
-    };
-    PlayService.prototype.stop = function () {
-        if (!this._playing) {
-            return;
-        }
-        if (!!this._stopSubscription) {
-            if (!this._stopSubscription.closed) {
-                this._stopSubscription.unsubscribe();
-            }
-            this._stopSubscription = null;
-        }
-        this._graphModeSubscription.unsubscribe();
-        this._graphModeSubscription = null;
-        this._cacheSubscription.unsubscribe();
-        this._cacheSubscription = null;
-        this._playingSubscription.unsubscribe();
-        this._playingSubscription = null;
-        this._clearSubscription.unsubscribe();
-        this._clearSubscription = null;
-        this._stateService.setSpeed(1);
-        this._stateService.cutNodes();
-        this._graphService.setGraphMode(Graph_1.GraphMode.Spatial);
-        this._setPlaying(false);
-    };
-    PlayService.prototype._bridge$ = function (node, increasingTime) {
-        var _this = this;
-        if (increasingTime === undefined) {
-            return rxjs_1.of(null);
-        }
-        var boundingBox = this._graphCalculator.boundingBoxCorners(node.latLon, 25);
-        this._bridging$ = this._graphService.cacheBoundingBox$(boundingBox[0], boundingBox[1]).pipe(operators_1.mergeMap(function (nodes) {
-            var nextNode = null;
-            for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-                var n = nodes_1[_i];
-                if (n.sequenceKey === node.sequenceKey ||
-                    !n.cameraUuid ||
-                    n.cameraUuid !== node.cameraUuid ||
-                    n.capturedAt === node.capturedAt ||
-                    n.capturedAt > node.capturedAt !== increasingTime) {
-                    continue;
-                }
-                var delta = Math.abs(n.capturedAt - node.capturedAt);
-                if (delta > 15000) {
-                    continue;
-                }
-                if (!nextNode || delta < Math.abs(nextNode.capturedAt - node.capturedAt)) {
-                    nextNode = n;
-                }
-            }
-            return !!nextNode ?
-                _this._graphService.cacheNode$(nextNode.key) :
-                rxjs_1.of(null);
-        }), operators_1.finalize(function () {
-            _this._bridging$ = null;
-        }), operators_1.publish(), operators_1.refCount());
-        return this._bridging$;
-    };
-    PlayService.prototype._mapSpeed = function (speed) {
-        var x = 2 * speed - 1;
-        return Math.pow(10, x) - 0.2 * x;
-    };
-    PlayService.prototype._mapNodesAhead = function (stateSpeed) {
-        return Math.round(Math.max(10, Math.min(50, 8 + 6 * stateSpeed)));
-    };
-    PlayService.prototype._setPlaying = function (playing) {
-        this._playing = playing;
-        this._playingSubject$.next(playing);
-    };
-    PlayService.prototype._setSpeed = function (speed) {
-        this._speed = speed;
-        var stateSpeed = this._mapSpeed(this._speed);
-        this._nodesAhead = this._mapNodesAhead(stateSpeed);
-        return stateSpeed;
-    };
-    PlayService.sequenceSpeed = 0.54;
-    return PlayService;
-}());
-exports.PlayService = PlayService;
-exports.default = PlayService;
-
-},{"../Edge":276,"../Graph":279,"rxjs":27,"rxjs/operators":225}],444:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var THREE = require("three");
-var Geo_1 = require("../Geo");
-var Projection = /** @class */ (function () {
-    function Projection(geoCoords, viewportCoords) {
-        this._geoCoords = !!geoCoords ? geoCoords : new Geo_1.GeoCoords();
-        this._viewportCoords = !!viewportCoords ? viewportCoords : new Geo_1.ViewportCoords();
-    }
-    Projection.prototype.basicToCanvas = function (basicPoint, container, render, transform) {
-        return this._viewportCoords
-            .basicToCanvas(basicPoint[0], basicPoint[1], container, transform, render.perspective);
-    };
-    Projection.prototype.canvasToBasic = function (canvasPoint, container, render, transform) {
-        var basicPoint = this._viewportCoords
-            .canvasToBasic(canvasPoint[0], canvasPoint[1], container, transform, render.perspective);
-        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {
-            basicPoint = null;
-        }
-        return basicPoint;
-    };
-    Projection.prototype.eventToUnprojection = function (event, container, render, reference, transform) {
-        var pixelPoint = this._viewportCoords.canvasPosition(event, container);
-        return this.canvasToUnprojection(pixelPoint, container, render, reference, transform);
-    };
-    Projection.prototype.canvasToUnprojection = function (canvasPoint, container, render, reference, transform) {
-        var canvasX = canvasPoint[0];
-        var canvasY = canvasPoint[1];
-        var _a = this._viewportCoords.canvasToViewport(canvasX, canvasY, container), viewportX = _a[0], viewportY = _a[1];
-        var point3d = new THREE.Vector3(viewportX, viewportY, 1)
-            .unproject(render.perspective);
-        var basicPoint = transform.projectBasic(point3d.toArray());
-        if (basicPoint[0] < 0 || basicPoint[0] > 1 || basicPoint[1] < 0 || basicPoint[1] > 1) {
-            basicPoint = null;
-        }
-        var direction3d = point3d.clone().sub(render.camera.position).normalize();
-        var dist = -2 / direction3d.z;
-        var latLon = null;
-        if (dist > 0 && dist < 100 && !!basicPoint) {
-            var point = direction3d.clone().multiplyScalar(dist).add(render.camera.position);
-            var latLonArray = this._geoCoords
-                .enuToGeodetic(point.x, point.y, point.z, reference.lat, reference.lon, reference.alt)
-                .slice(0, 2);
-            latLon = { lat: latLonArray[0], lon: latLonArray[1] };
-        }
-        var unprojection = {
-            basicPoint: basicPoint,
-            latLon: latLon,
-            pixelPoint: [canvasX, canvasY],
-        };
-        return unprojection;
-    };
-    return Projection;
-}());
-exports.Projection = Projection;
-exports.default = Projection;
-
-},{"../Geo":278,"three":226}],445:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var operators_1 = require("rxjs/operators");
-var THREE = require("three");
-var vd = require("virtual-dom");
-var rxjs_1 = require("rxjs");
-var Viewer_1 = require("../Viewer");
-var SpriteAtlas = /** @class */ (function () {
-    function SpriteAtlas() {
-    }
-    Object.defineProperty(SpriteAtlas.prototype, "json", {
-        set: function (value) {
-            this._json = value;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpriteAtlas.prototype, "image", {
-        set: function (value) {
-            this._image = value;
-            this._texture = new THREE.Texture(this._image);
-            this._texture.minFilter = THREE.NearestFilter;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(SpriteAtlas.prototype, "loaded", {
-        get: function () {
-            return !!(this._image && this._json);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    SpriteAtlas.prototype.getGLSprite = function (name) {
-        if (!this.loaded) {
-            throw new Error("Sprites cannot be retrieved before the atlas is loaded.");
-        }
-        var definition = this._json[name];
-        if (!definition) {
-            console.warn("Sprite with key" + name + "does not exist in sprite definition.");
-            return new THREE.Object3D();
-        }
-        var texture = this._texture.clone();
-        texture.needsUpdate = true;
-        var width = this._image.width;
-        var height = this._image.height;
-        texture.offset.x = definition.x / width;
-        texture.offset.y = (height - definition.y - definition.height) / height;
-        texture.repeat.x = definition.width / width;
-        texture.repeat.y = definition.height / height;
-        var material = new THREE.SpriteMaterial({ map: texture });
-        return new THREE.Sprite(material);
-    };
-    SpriteAtlas.prototype.getDOMSprite = function (name, float) {
-        if (!this.loaded) {
-            throw new Error("Sprites cannot be retrieved before the atlas is loaded.");
-        }
-        if (float == null) {
-            float = Viewer_1.Alignment.Center;
-        }
-        var definition = this._json[name];
-        if (!definition) {
-            console.warn("Sprite with key" + name + "does not exist in sprite definition.");
-            return vd.h("div", {}, []);
-        }
-        var clipTop = definition.y;
-        var clipRigth = definition.x + definition.width;
-        var clipBottom = definition.y + definition.height;
-        var clipLeft = definition.x;
-        var left = -definition.x;
-        var top = -definition.y;
-        var height = this._image.height;
-        var width = this._image.width;
-        switch (float) {
-            case Viewer_1.Alignment.Bottom:
-            case Viewer_1.Alignment.Center:
-            case Viewer_1.Alignment.Top:
-                left -= definition.width / 2;
-                break;
-            case Viewer_1.Alignment.BottomLeft:
-            case Viewer_1.Alignment.Left:
-            case Viewer_1.Alignment.TopLeft:
-                left -= definition.width;
-                break;
-            case Viewer_1.Alignment.BottomRight:
-            case Viewer_1.Alignment.Right:
-            case Viewer_1.Alignment.TopRight:
-            default:
-                break;
-        }
-        switch (float) {
-            case Viewer_1.Alignment.Center:
-            case Viewer_1.Alignment.Left:
-            case Viewer_1.Alignment.Right:
-                top -= definition.height / 2;
-                break;
-            case Viewer_1.Alignment.Top:
-            case Viewer_1.Alignment.TopLeft:
-            case Viewer_1.Alignment.TopRight:
-                top -= definition.height;
-                break;
-            case Viewer_1.Alignment.Bottom:
-            case Viewer_1.Alignment.BottomLeft:
-            case Viewer_1.Alignment.BottomRight:
-            default:
-                break;
-        }
-        var pixelRatioInverse = 1 / definition.pixelRatio;
-        clipTop *= pixelRatioInverse;
-        clipRigth *= pixelRatioInverse;
-        clipBottom *= pixelRatioInverse;
-        clipLeft *= pixelRatioInverse;
-        left *= pixelRatioInverse;
-        top *= pixelRatioInverse;
-        height *= pixelRatioInverse;
-        width *= pixelRatioInverse;
-        var properties = {
-            src: this._image.src,
-            style: {
-                clip: "rect(" + clipTop + "px, " + clipRigth + "px, " + clipBottom + "px, " + clipLeft + "px)",
-                height: height + "px",
-                left: left + "px",
-                position: "absolute",
-                top: top + "px",
-                width: width + "px",
-            },
-        };
-        return vd.h("img", properties, []);
-    };
-    return SpriteAtlas;
-}());
-var SpriteService = /** @class */ (function () {
-    function SpriteService(sprite) {
-        var _this = this;
-        this._retina = window.devicePixelRatio > 1;
-        this._spriteAtlasOperation$ = new rxjs_1.Subject();
-        this._spriteAtlas$ = this._spriteAtlasOperation$.pipe(operators_1.startWith(function (atlas) {
-            return atlas;
-        }), operators_1.scan(function (atlas, operation) {
-            return operation(atlas);
-        }, new SpriteAtlas()), operators_1.publishReplay(1), operators_1.refCount());
-        this._spriteAtlas$.subscribe(function () { });
-        if (sprite == null) {
-            return;
-        }
-        var format = this._retina ? "@2x" : "";
-        var imageXmlHTTP = new XMLHttpRequest();
-        imageXmlHTTP.open("GET", sprite + format + ".png", true);
-        imageXmlHTTP.responseType = "arraybuffer";
-        imageXmlHTTP.onload = function () {
-            var image = new Image();
-            image.onload = function () {
-                _this._spriteAtlasOperation$.next(function (atlas) {
-                    atlas.image = image;
-                    return atlas;
-                });
-            };
-            var blob = new Blob([imageXmlHTTP.response]);
-            image.src = window.URL.createObjectURL(blob);
-        };
-        imageXmlHTTP.onerror = function (error) {
-            console.error(new Error("Failed to fetch sprite sheet (" + sprite + format + ".png)"));
-        };
-        imageXmlHTTP.send();
-        var jsonXmlHTTP = new XMLHttpRequest();
-        jsonXmlHTTP.open("GET", sprite + format + ".json", true);
-        jsonXmlHTTP.responseType = "text";
-        jsonXmlHTTP.onload = function () {
-            var json = JSON.parse(jsonXmlHTTP.response);
-            _this._spriteAtlasOperation$.next(function (atlas) {
-                atlas.json = json;
-                return atlas;
-            });
-        };
-        jsonXmlHTTP.onerror = function (error) {
-            console.error(new Error("Failed to fetch sheet (" + sprite + format + ".json)"));
-        };
-        jsonXmlHTTP.send();
-    }
-    Object.defineProperty(SpriteService.prototype, "spriteAtlas$", {
-        get: function () {
-            return this._spriteAtlas$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return SpriteService;
-}());
-exports.SpriteService = SpriteService;
-exports.default = SpriteService;
-
-
-},{"../Viewer":286,"rxjs":27,"rxjs/operators":225,"three":226,"virtual-dom":231}],446:[function(require,module,exports){
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var TouchService = /** @class */ (function () {
-    function TouchService(canvasContainer, domContainer) {
-        var _this = this;
-        this._activeSubject$ = new rxjs_1.BehaviorSubject(false);
-        this._active$ = this._activeSubject$.pipe(operators_1.distinctUntilChanged(), operators_1.publishReplay(1), operators_1.refCount());
-        rxjs_1.fromEvent(domContainer, "touchmove")
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._touchStart$ = rxjs_1.fromEvent(canvasContainer, "touchstart");
-        this._touchMove$ = rxjs_1.fromEvent(canvasContainer, "touchmove");
-        this._touchEnd$ = rxjs_1.fromEvent(canvasContainer, "touchend");
-        this._touchCancel$ = rxjs_1.fromEvent(canvasContainer, "touchcancel");
-        var tapStart$ = this._touchStart$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        }), operators_1.share());
-        this._doubleTap$ = tapStart$.pipe(operators_1.bufferWhen(function () {
-            return tapStart$.pipe(operators_1.first(), operators_1.switchMap(function (event) {
-                return rxjs_1.merge(rxjs_1.timer(300), tapStart$).pipe(operators_1.take(1));
-            }));
-        }), operators_1.filter(function (events) {
-            return events.length === 2;
-        }), operators_1.map(function (events) {
-            return events[events.length - 1];
-        }), operators_1.share());
-        this._doubleTap$
-            .subscribe(function (event) {
-            event.preventDefault();
-        });
-        this._singleTouchMove$ = this._touchMove$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        }), operators_1.share());
-        var singleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
-            return te.touches.length === 1 && te.targetTouches.length === 1;
-        }));
-        var multipleTouchStart$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
-            return te.touches.length >= 1;
-        }));
-        var touchStop$ = rxjs_1.merge(this._touchEnd$, this._touchCancel$).pipe(operators_1.filter(function (te) {
-            return te.touches.length === 0;
-        }));
-        this._singleTouchDragStart$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
-            return _this._singleTouchMove$.pipe(operators_1.takeUntil(rxjs_1.merge(touchStop$, multipleTouchStart$)), operators_1.take(1));
-        }));
-        this._singleTouchDragEnd$ = singleTouchStart$.pipe(operators_1.mergeMap(function (e) {
-            return rxjs_1.merge(touchStop$, multipleTouchStart$).pipe(operators_1.first());
-        }));
-        this._singleTouchDrag$ = singleTouchStart$.pipe(operators_1.switchMap(function (te) {
-            return _this._singleTouchMove$.pipe(operators_1.skip(1), operators_1.takeUntil(rxjs_1.merge(multipleTouchStart$, touchStop$)));
-        }));
-        var touchesChanged$ = rxjs_1.merge(this._touchStart$, this._touchEnd$, this._touchCancel$);
-        this._pinchStart$ = touchesChanged$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 2 && te.targetTouches.length === 2;
-        }));
-        this._pinchEnd$ = touchesChanged$.pipe(operators_1.filter(function (te) {
-            return te.touches.length !== 2 || te.targetTouches.length !== 2;
-        }));
-        this._pinchOperation$ = new rxjs_1.Subject();
-        this._pinch$ = this._pinchOperation$.pipe(operators_1.scan(function (pinch, operation) {
-            return operation(pinch);
-        }, {
-            changeX: 0,
-            changeY: 0,
-            clientX: 0,
-            clientY: 0,
-            distance: 0,
-            distanceChange: 0,
-            distanceX: 0,
-            distanceY: 0,
-            originalEvent: null,
-            pageX: 0,
-            pageY: 0,
-            screenX: 0,
-            screenY: 0,
-            touch1: null,
-            touch2: null,
-        }));
-        this._touchMove$.pipe(operators_1.filter(function (te) {
-            return te.touches.length === 2 && te.targetTouches.length === 2;
-        }), operators_1.map(function (te) {
-            return function (previous) {
-                var touch1 = te.touches[0];
-                var touch2 = te.touches[1];
-                var minX = Math.min(touch1.clientX, touch2.clientX);
-                var maxX = Math.max(touch1.clientX, touch2.clientX);
-                var minY = Math.min(touch1.clientY, touch2.clientY);
-                var maxY = Math.max(touch1.clientY, touch2.clientY);
-                var centerClientX = minX + (maxX - minX) / 2;
-                var centerClientY = minY + (maxY - minY) / 2;
-                var centerPageX = centerClientX + touch1.pageX - touch1.clientX;
-                var centerPageY = centerClientY + touch1.pageY - touch1.clientY;
-                var centerScreenX = centerClientX + touch1.screenX - touch1.clientX;
-                var centerScreenY = centerClientY + touch1.screenY - touch1.clientY;
-                var distanceX = Math.abs(touch1.clientX - touch2.clientX);
-                var distanceY = Math.abs(touch1.clientY - touch2.clientY);
-                var distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
-                var distanceChange = distance - previous.distance;
-                var changeX = distanceX - previous.distanceX;
-                var changeY = distanceY - previous.distanceY;
-                var current = {
-                    changeX: changeX,
-                    changeY: changeY,
-                    clientX: centerClientX,
-                    clientY: centerClientY,
-                    distance: distance,
-                    distanceChange: distanceChange,
-                    distanceX: distanceX,
-                    distanceY: distanceY,
-                    originalEvent: te,
-                    pageX: centerPageX,
-                    pageY: centerPageY,
-                    screenX: centerScreenX,
-                    screenY: centerScreenY,
-                    touch1: touch1,
-                    touch2: touch2,
-                };
-                return current;
-            };
-        }))
-            .subscribe(this._pinchOperation$);
-        this._pinchChange$ = this._pinchStart$.pipe(operators_1.switchMap(function (te) {
-            return _this._pinch$.pipe(operators_1.skip(1), operators_1.takeUntil(_this._pinchEnd$));
-        }));
-    }
-    Object.defineProperty(TouchService.prototype, "active$", {
-        get: function () {
-            return this._active$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "activate$", {
-        get: function () {
-            return this._activeSubject$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "doubleTap$", {
-        get: function () {
-            return this._doubleTap$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchStart$", {
-        get: function () {
-            return this._touchStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchMove$", {
-        get: function () {
-            return this._touchMove$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchEnd$", {
-        get: function () {
-            return this._touchEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "touchCancel$", {
-        get: function () {
-            return this._touchCancel$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchDragStart$", {
-        get: function () {
-            return this._singleTouchDragStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchDrag$", {
-        get: function () {
-            return this._singleTouchDrag$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "singleTouchDragEnd$", {
-        get: function () {
-            return this._singleTouchDragEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "pinch$", {
-        get: function () {
-            return this._pinchChange$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "pinchStart$", {
-        get: function () {
-            return this._pinchStart$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(TouchService.prototype, "pinchEnd$", {
-        get: function () {
-            return this._pinchEnd$;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return TouchService;
-}());
-exports.TouchService = TouchService;
-
-},{"rxjs":27,"rxjs/operators":225}],447:[function(require,module,exports){
-"use strict";
-var __extends = (this && this.__extends) || (function () {
-    var extendStatics = function (d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    }
-    return function (d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-var rxjs_1 = require("rxjs");
-var operators_1 = require("rxjs/operators");
-var when = require("when");
-var Viewer_1 = require("../Viewer");
-var Utils_1 = require("../Utils");
+var Sm,Tm,Cm,Em=(Tm=String.prototype.split,Cm=/()??/.exec("")[1]===Sm,function(e,t,i){if("[object RegExp]"!==Object.prototype.toString.call(t))return Tm.call(e,t,i);var n,r,s,a,o=[],h=(t.ignoreCase?"i":"")+(t.multiline?"m":"")+(t.extended?"x":"")+(t.sticky?"y":""),c=0;for(t=new RegExp(t.source,h+"g"),e+="",Cm||(n=new RegExp("^"+t.source+"$(?!\\s)",h)),i=i===Sm?-1>>>0:i>>>0;(r=t.exec(e))&&!((s=r.index+r[0].length)>c&&(o.push(e.slice(c,r.index)),!Cm&&r.length>1&&r[0].replace(n,(function(){for(var e=1;e<arguments.length-2;e++)arguments[e]===Sm&&(r[e]=Sm)})),r.length>1&&r.index<e.length&&Array.prototype.push.apply(o,r.slice(1)),a=r[0].length,c=s,o.length>=i));)t.lastIndex===r.index&&t.lastIndex++;return c===e.length?!a&&t.test("")||o.push(""):o.push(e.slice(c)),o.length>i?o.slice(0,i):o}),Am=/([\.#]?[a-zA-Z0-9\u007F-\uFFFF_:-]+)/,Im=/^\.|#/,Rm=function(e,t){if(!e)return"DIV";var i,n,r,s,a=!t.hasOwnProperty("id"),o=Em(e,Am),h=null;Im.test(o[1])&&(h="DIV");for(s=0;s<o.length;s++)(n=o[s])&&(r=n.charAt(0),h?"."===r?(i=i||[]).push(n.substring(1,n.length)):"#"===r&&a&&(t.id=n.substring(1,n.length)):h=n);i&&(t.className&&i.push(t.className),t.className=i.join(" "));return t.namespace?h:h.toUpperCase()};var Pm=Lm;function Lm(e){if(!(this instanceof Lm))return new Lm(e);this.value=e}Lm.prototype.hook=function(e,t){e[t]!==this.value&&(e[t]=this.value)};var Dm="undefined"!=typeof window?window:void 0!==hd?hd:{};var Nm=function(e,t){if(e in Dm)return Dm[e];return Dm[e]=t,t};(function(e,t,i){var n="__INDIVIDUAL_ONE_VERSION_"+e,r=Nm(n+"_ENFORCE_SINGLETON",t);if(r!==t)throw new Error("Can only have one copy of "+e+".\nYou already have version "+r+" installed.\nThis means you cannot install version "+t);Nm(n,i)})("ev-store","7");var $m="__EV_STORE_KEY@7";var km=function(e){var t=e[$m];t||(t=e[$m]={});return t},Om=zm;function zm(e){if(!(this instanceof zm))return new zm(e);this.value=e}zm.prototype.hook=function(e,t){km(e)[t.substr(3)]=this.value},zm.prototype.unhook=function(e,t){km(e)[t.substr(3)]=void 0};var Fm=dd,Bm=vm,Um=wm,Vm=fd,Hm=gd,jm=_d,Gm=Cd,Wm=vd,qm=Rm,Xm=Pm,Zm=Om;function Ym(e,t,i,n){if("string"==typeof e)t.push(new Um(e));else if("number"==typeof e)t.push(new Um(String(e)));else if(Jm(e))t.push(e);else{if(!Fm(e)){if(null==e)return;throw function(e){var t=new Error;return t.type="virtual-hyperscript.unexpected.virtual-element",t.message="Unexpected virtual child passed to h().\nExpected a VNode / Vthunk / VWidget / string but:\ngot:\n"+Km(e.foreignObject)+".\nThe parent vnode is:\n"+Km(e.parentVnode),t.foreignObject=e.foreignObject,t.parentVnode=e.parentVnode,t}({foreignObject:e,parentVnode:{tagName:i,properties:n}})}for(var r=0;r<e.length;r++)Ym(e[r],t,i,n)}}function Jm(e){return Vm(e)||Hm(e)||jm(e)||Wm(e)}function Km(e){try{return JSON.stringify(e,null,"    ")}catch(t){return String(e)}}var Qm,ef,tf={diff:qd,patch:pm,h:function(e,t,i){var n,r,s,a,o=[];!i&&(h=t,"string"==typeof h||Fm(h)||Jm(h))&&(i=t,r={});var h;n=qm(e,r=r||t||{}),r.hasOwnProperty("key")&&(s=r.key,r.key=void 0);r.hasOwnProperty("namespace")&&(a=r.namespace,r.namespace=void 0);"INPUT"!==n||a||!r.hasOwnProperty("value")||void 0===r.value||Gm(r.value)||(r.value=Xm(r.value));(function(e){for(var t in e)if(e.hasOwnProperty(t)){var i=e[t];if(Gm(i))continue;"ev-"===t.substr(0,3)&&(e[t]=Zm(i))}})(r),null!=i&&Ym(i,o,n,r);return new Bm(n,r,o,s,a)},create:Zp,VNode:vm,VText:wm};class nf{constructor(){this._events={}}fire(e,t){if(this._listens(e))for(const i of this._events[e])i(t)}off(e,t){if(e){if(this._listens(e)){const i=this._events[e].indexOf(t);i>=0&&this._events[e].splice(i,1),this._events[e].length||delete this._events[e]}}else this._events={}}on(e,t){this._events[e]=this._events[e]||[],this._events[e].push(t)}_listens(e){return e in this._events}}class rf{constructor(){this._subscriptions=[]}push(e){this._subscriptions.push(e)}unsubscribe(){for(const e of this._subscriptions)e.unsubscribe();this._subscriptions=[]}}class sf extends nf{constructor(e,t,i){super(),this._activated$=new W(!1),this._configurationSubject$=new j,this._activated=!1,this._container=t,this._name=e,this._navigator=i,this._subscriptions=new rf,this._configuration$=this._configurationSubject$.pipe(Ot(this.defaultConfiguration),Lt(((e,t)=>{for(let i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e})),Rt(1),U()),this._configuration$.subscribe((()=>{}))}get activated(){return this._activated}get activated$(){return this._activated$}get defaultConfiguration(){return this._getDefaultConfiguration()}get configuration$(){return this._configuration$}get name(){return this._name}activate(e){this._activated||(void 0!==e&&this._configurationSubject$.next(e),this._activated=!0,this._activate(),this._activated$.next(!0))}configure(e){this._configurationSubject$.next(e)}deactivate(){this._activated&&(this._activated=!1,this._deactivate(),this._container.domRenderer.clear(this._name),this._container.glRenderer.clear(this._name),this._activated$.next(!1))}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}resize(){}}!function(e){e[e.Hidden=0]="Hidden",e[e.Loading=1]="Loading",e[e.Visible=2]="Visible"}(Qm||(Qm={}));class af extends sf{constructor(e,t,i){super(e,t,i)}_activate(){const e=this.configuration$.pipe(St((e=>!!e.id)),st((e=>!e.src)),zt((e=>this._getImageSrc$(e.id).pipe(ct((e=>(console.error(e),ie())))))),Rt(1),U()),t=this._subscriptions;t.push(e.pipe(De((e=>({src:e})))).subscribe((e=>{this._configurationSubject$.next(e)}))),t.push(Ve(this.configuration$,e).pipe(st((([e,t])=>!!e.src&&e.src!==t)),St()).subscribe((([,e])=>{window.URL.revokeObjectURL(e)}))),t.push(this._configuration$.pipe(vt(void 0,(e=>e.state)),zt((e=>Ve(Ce(e.state),this._navigator.stateService.currentImage$))),zt((([e,t])=>{const i=Ve(Ce(t.id),t.image$.pipe(st((e=>!!e)),De((e=>e.src))));return e===Qm.Visible?i.pipe(St()):i})),vt((([e,t],[i,n])=>e===i&&t===n)),De((([e,t])=>({id:e,src:t})))).subscribe(this._configurationSubject$)),t.push(Ve(this._configuration$,this._container.configurationService.exploreUrl$,this._container.renderService.size$).pipe(De((([e,t,i])=>{if(!e.src)return{name:this._name,vNode:tf.h("div",[])};const n=i.width<=640||i.height<=480?".mapillary-cover-compact":"";if(e.state===Qm.Hidden){const t=tf.h("div.mapillary-cover-container.mapillary-cover-done"+n,[this._getCoverBackgroundVNode(e)]);return{name:this._name,vNode:t}}const r=tf.h("div.mapillary-cover-container"+n,[this._getCoverButtonVNode(e,t)]);return{name:this._name,vNode:r}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{state:Qm.Visible}}_getCoverButtonVNode(e,t){const i=e.state===Qm.Loading?"div.mapillary-cover.mapillary-cover-loading":"div.mapillary-cover",n=tf.h("div.mapillary-cover-button",[tf.h("div.mapillary-cover-button-icon",[])]),r=tf.h("a.mapillary-cover-logo",{href:t,target:"_blank"},[]),s=tf.h("div.mapillary-cover-indicator",{onclick:()=>{this.configure({state:Qm.Loading})}},[]);return tf.h(i,[this._getCoverBackgroundVNode(e),s,n,r])}_getCoverBackgroundVNode(e){const t={style:{backgroundImage:`url(${e.src})`}},i=[];return e.state===Qm.Loading&&i.push(tf.h("div.mapillary-cover-spinner",{},[])),tf.h("div.mapillary-cover-background",t,i)}_getImageSrc$(e){return k.create((t=>{this._navigator.api.getImages$([e]).subscribe((i=>{for(const n of i){const i="number"==typeof e?e.toString():e;if(n.node_id===i)return void this._navigator.api.data.getImageBuffer(n.node.thumb.url).then((i=>{const n=new Image;n.crossOrigin="Anonymous",n.onload=()=>{t.next(n.src),t.complete()},n.onerror=()=>{t.error(new Error(`Failed to load cover image (${e})`))};const r=new Blob([i]);n.src=window.URL.createObjectURL(r)}),(e=>{t.error(e)}))}t.error(new Pu(`Non existent cover key: ${e}`))}),(e=>{t.error(e)}))}))}}af.componentName="cover";class of extends sf{_activate(){this._subscriptions.push(Ve(this._container.configurationService.exploreUrl$,this._navigator.stateService.currentImage$,this._container.renderService.size$).pipe(De((([e,t,i])=>{const n=this._makeAttribution(t.creatorUsername,e,t.id,t.capturedAt,i.width);return{name:this._name,vNode:n}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}makeImageUrl(e,t){return`${e}/app/?pKey=${t}&focus=photo`}_makeAttribution(e,t,i,n,r){const s=r<=640,a=this._makeDate(n,s),o=this._makeBy(e,t,i,s),h=s?".mapillary-attribution-compact":"";return tf.h("div.mapillary-attribution-container"+h,{},[...o,a])}_makeBy(e,t,i,n){const r=tf.h("div.mapillary-attribution-logo",[]);return e?this._makeCreatorBy(r,e,t,i,n):this._makeGeneralBy(r,t,i,n)}_makeCreatorBy(e,t,i,n,r){const s=tf.h("a.mapillary-attribution-icon-container",{href:i,rel:"noreferrer",target:"_blank"},[e]),a=r?`${t}`:`image by ${t}`,o=tf.h("div.mapillary-attribution-username",{textContent:a},[]);return[s,tf.h("a.mapillary-attribution-image-container",{href:this.makeImageUrl(i,n),rel:"noreferrer",target:"_blank"},[o])]}_makeGeneralBy(e,t,i,n){const r=tf.h("div.mapillary-attribution-username",{textContent:"images by"},[]),s=[tf.h("div.mapillary-attribution-icon-container",{},[e]),tf.h("div.mapillary-attribution-username",{textContent:"contributors"},[])];n||s.unshift(r);return[tf.h("a.mapillary-attribution-image-container",{href:this.makeImageUrl(t,i),rel:"noreferrer",target:"_blank"},s)]}_makeDate(e,t){const i=new Date(e).toDateString().split(" "),n=(i.length>3?t?[i[3]]:[i[1],i[2]+",",i[3]]:i).join(" ");return tf.h("div.mapillary-attribution-date",{textContent:n},[])}}of.componentName="attribution";class hf{constructor(){this._unprojectDepth=200}basicToCanvas(e,t,i,n,r){const s=n.unprojectBasic([e,t],this._unprojectDepth);return this.projectToCanvas(s,i,r)}basicToCanvasSafe(e,t,i,n,r){const s=this.basicToViewportSafe(e,t,n,r);if(null===s)return null;return this.viewportToCanvas(s[0],s[1],i)}basicToViewport(e,t,i,n){const r=i.unprojectBasic([e,t],this._unprojectDepth);return this.projectToViewport(r,n)}basicToViewportSafe(e,t,i,n){const r=i.unprojectBasic([e,t],this._unprojectDepth);if(this.worldToCamera(r,n)[2]>0)return null;return this.projectToViewport(r,n)}cameraToViewport(e,t){const i=(new Ki).fromArray(e).applyMatrix4(t.projectionMatrix);return[i.x,i.y]}canvasPosition(e,t){const i=t.getBoundingClientRect();return[e.clientX-i.left-t.clientLeft,e.clientY-i.top-t.clientTop]}canvasToBasic(e,t,i,n,r){const s=this.unprojectFromCanvas(e,t,i,r).toArray();return n.projectBasic(s)}canvasToViewport(e,t,i){const[n,r]=this.containerToCanvas(i);return[2*e/n-1,1-2*t/r]}containerToCanvas(e){return[e.offsetWidth,e.offsetHeight]}getBasicDistances(e,t){const i=this.viewportToBasic(-1,1,e,t),n=this.viewportToBasic(1,1,e,t),r=this.viewportToBasic(1,-1,e,t),s=this.viewportToBasic(-1,-1,e,t);let a=0,o=0,h=0,c=0;return i[1]<0&&n[1]<0&&(a=i[1]>n[1]?-i[1]:-n[1]),n[0]>1&&r[0]>1&&(o=n[0]<r[0]?n[0]-1:r[0]-1),r[1]>1&&s[1]>1&&(h=r[1]<s[1]?r[1]-1:s[1]-1),s[0]<0&&i[0]<0&&(c=s[0]>i[0]?-s[0]:-i[0]),[a,o,h,c]}getPixelDistances(e,t,i){const n=this.viewportToBasic(-1,1,t,i),r=this.viewportToBasic(1,1,t,i),s=this.viewportToBasic(1,-1,t,i),a=this.viewportToBasic(-1,-1,t,i);let o=0,h=0,c=0,l=0;const[u,d]=this.containerToCanvas(e);if(n[1]<0&&r[1]<0){const s=n[1]>r[1]?n[0]:r[0],a=this.basicToCanvas(s,0,e,t,i);o=a[1]>0?a[1]:0}if(r[0]>1&&s[0]>1){const n=r[0]<s[0]?r[1]:s[1],a=this.basicToCanvas(1,n,e,t,i);h=a[0]<u?u-a[0]:0}if(s[1]>1&&a[1]>1){const n=s[1]<a[1]?s[0]:a[0],r=this.basicToCanvas(n,1,e,t,i);c=r[1]<d?d-r[1]:0}if(a[0]<0&&n[0]<0){const r=a[0]>n[0]?a[1]:n[1],s=this.basicToCanvas(0,r,e,t,i);l=s[0]>0?s[0]:0}return[o,h,c,l]}insideElement(e,t){const i=t.getBoundingClientRect(),n=i.left+t.clientLeft,r=n+t.clientWidth,s=i.top+t.clientTop,a=s+t.clientHeight;return e.clientX>n&&e.clientX<r&&e.clientY>s&&e.clientY<a}projectToCanvas(e,t,i){const n=this.projectToViewport(e,i);return this.viewportToCanvas(n[0],n[1],t)}projectToCanvasSafe(e,t,i){if(this.worldToCamera(e,i)[2]>0)return null;const n=this.projectToViewport(e,i);return this.viewportToCanvas(n[0],n[1],t)}projectToViewport(e,t){const i=new Ki(e[0],e[1],e[2]).project(t);return[i.x,i.y]}unprojectFromCanvas(e,t,i,n){const r=this.canvasToViewport(e,t,i);return this.unprojectFromViewport(r[0],r[1],n)}unprojectFromViewport(e,t,i){return new Ki(e,t,1).unproject(i)}viewportToBasic(e,t,i,n){const r=new Ki(e,t,1).unproject(n).toArray();return i.projectBasic(r)}viewportToCanvas(e,t,i){const[n,r]=this.containerToCanvas(i);return[n*(e+1)/2,-r*(t-1)/2]}worldToCamera(e,t){return new Ki(e[0],e[1],e[2]).applyMatrix4(t.matrixWorldInverse).toArray()}}e.ComponentSize=void 0,(ef=e.ComponentSize||(e.ComponentSize={}))[ef.Automatic=0]="Automatic",ef[ef.Large=1]="Large",ef[ef.Small=2]="Small";class cf extends sf{constructor(e,t,i){super(e,t,i),this._spatial=new Du,this._viewportCoords=new hf,this._svgNamespace="http://www.w3.org/2000/svg",this._distinctThreshold=Math.PI/360,this._animationSpeed=.075}_activate(){const t=this._subscriptions,i=this._container.renderService.renderCamera$.pipe(De((e=>{let t=this._spatial.degToRad(e.perspective.fov),i=e.perspective.aspect===Number.POSITIVE_INFINITY?Math.PI:2*Math.atan(e.perspective.aspect*Math.tan(.5*t));return[this._spatial.azimuthalToBearing(e.rotation.phi),i]})),vt(((e,t)=>Math.abs(t[0]-e[0])<this._distinctThreshold&&Math.abs(t[1]-e[1])<this._distinctThreshold))),n=Ve(this._navigator.stateService.currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id))),this._navigator.panService.panImages$).pipe(De((([e,t])=>{const i=e.state.currentImage,n=e.state.currentTransform;if($u(i.cameraType))return[Math.PI,Math.PI];const r=this._computeProjectedPoints(n),s=this._spatial.degToRad(this._computeHorizontalFov(r));let a=s/2,o=s/2;for(const[e,,n]of t){const t=this._spatial.wrap(e.compassAngle-i.compassAngle,-180,180);t<0?a=this._spatial.degToRad(Math.abs(t))+n/2:o=this._spatial.degToRad(Math.abs(t))+n/2}return[a,o]})),vt((([e,t],[i,n])=>Math.abs(i-e)<this._distinctThreshold&&Math.abs(n-t)<this._distinctThreshold))),r=Ve(this._navigator.stateService.currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id))),this._container.renderService.bearing$).pipe(De((([e,t])=>this._spatial.degToRad(e.state.currentImage.compassAngle-t)))),s=new j,a=s.pipe(Lt(((e,t)=>t(e)),{alpha:0,curr:[0,0,0],prev:[0,0,0]}),De((e=>{const t=Oi.smootherstep(e.alpha,0,1),i=e.curr,n=e.prev;return[this._interpolate(n[0],i[0],t),this._interpolate(n[1],i[1],t)]})));t.push(n.pipe(De((e=>t=>{const i=Oi.smootherstep(t.alpha,0,1),n=t.curr,r=t.prev,s=[this._interpolate(r[0],n[0],i),this._interpolate(r[1],n[1],i)];return{alpha:0,curr:e.slice(),prev:s}}))).subscribe(s)),t.push(n.pipe(zt((()=>this._container.renderService.renderCameraFrame$.pipe($t(1),Lt((e=>e+this._animationSpeed),0),Bt((e=>e<=1+this._animationSpeed)),De((e=>Math.min(e,1)))))),De((e=>t=>({alpha:e,curr:t.curr.slice(),prev:t.prev.slice()})))).subscribe(s));const o=Ve(r,a).pipe(De((([e,t])=>[e,t[0],t[1]])));t.push(Ve(i,o,this._configuration$,this._container.renderService.size$).pipe(De((([[t,i],[n,r,s],a,o])=>{const h=this._createBackground(t),c=this._createFovIndicator(r,s,n),l=this._createNorth(t),u=this._createCircleSectorCompass(this._createCircleSector(Math.max(Math.PI/20,i),"#FFF")),d=a.size===e.ComponentSize.Small||a.size===e.ComponentSize.Automatic&&o.width<640?".mapillary-bearing-compact":"";return{name:this._name,vNode:tf.h("div.mapillary-bearing-indicator-container"+d,{oncontextmenu:e=>{e.preventDefault()}},[h,c,l,u])}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{size:e.ComponentSize.Automatic}}_createFovIndicator(e,t,i){const n=this._createFovArc(e,t),r=tf.h("g",{attributes:{transform:"translate(18,18)"},namespace:this._svgNamespace},[n]);return tf.h("svg",{attributes:{viewBox:"0 0 36 36"},namespace:this._svgNamespace,style:{height:"36px",left:"2px",position:"absolute",top:"2px",transform:`rotateZ(${this._spatial.radToDeg(i)}deg)`,width:"36px"}},[r])}_createFovArc(e,t){const i=16.75,n=e+t;if(n>2*Math.PI-Math.PI/90)return tf.h("circle",{attributes:{cx:"0",cy:"0","fill-opacity":"0",r:"16.75",stroke:"#FFF","stroke-width":"2.5"},namespace:this._svgNamespace},[]);let r=-Math.PI/2-e,s=r+n,a=i*Math.cos(r),o=i*Math.sin(r),h=i*Math.cos(s),c=i*Math.sin(s),l=`M ${a} ${o} A 16.75 16.75 0 ${n>=Math.PI?1:0} 1 ${h} ${c}`;return tf.h("path",{attributes:{d:l,"fill-opacity":"0",stroke:"#FFF","stroke-width":"2.5"},namespace:this._svgNamespace},[])}_createCircleSectorCompass(e){let t=tf.h("g",{attributes:{transform:"translate(1,1)"},namespace:this._svgNamespace},[e]);return tf.h("svg",{attributes:{viewBox:"0 0 2 2"},namespace:this._svgNamespace,style:{height:"26px",left:"7px",position:"absolute",top:"7px",width:"26px"}},[t])}_createCircleSector(e,t){if(e>2*Math.PI-Math.PI/90)return tf.h("circle",{attributes:{cx:"0",cy:"0",fill:t,r:"1"},namespace:this._svgNamespace},[]);let i=-Math.PI/2-e/2,n=i+e,r=Math.cos(i),s=Math.sin(i),a=Math.cos(n),o=Math.sin(n),h=`M 0 0 ${r} ${s} A 1 1 0 ${e>=Math.PI?1:0} 1 ${a} ${o}`;return tf.h("path",{attributes:{d:h,fill:t},namespace:this._svgNamespace},[])}_createNorth(e){const t=tf.h("div.mapillary-bearing-north",[]);return tf.h("div.mapillary-bearing-north-container",{style:{transform:`rotateZ(${this._spatial.radToDeg(-e)}deg)`}},[t])}_createBackground(e){return tf.h("div.mapillary-bearing-indicator-background",{style:{transform:`rotateZ(${this._spatial.radToDeg(-e)}deg)`}},[tf.h("div.mapillary-bearing-indicator-background-circle",[]),tf.h("div.mapillary-bearing-indicator-background-arrow-container",[tf.h("div.mapillary-bearing-indicator-background-arrow",[])])])}_computeProjectedPoints(e){return zu(e,[[1,0]],[[0,.5]],12,this._viewportCoords)}_computeHorizontalFov(e){const t=e.map((e=>this._coordToFov(e[0])));return Math.min(...t)}_coordToFov(e){return this._spatial.radToDeg(2*Math.atan(e))}_interpolate(e,t,i){return(1-i)*e+i*t}}cf.componentName="bearing";class lf extends sf{constructor(e,t,i){super(e,t,i)}_activate(){const t=this._subscriptions;t.push(Ve(this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$)),st((e=>e.cached))),this._configuration$).pipe(zt((t=>{let i=t[0],n=t[1],r=Math.max(0,Math.min(4,n.depth.sequence));return it(this._cache$(i.edges,e.NavigationDirection.Next,r),this._cache$(i.edges,e.NavigationDirection.Prev,r)).pipe(ct((e=>(console.error("Failed to cache sequence edges.",e),ie()))))}))).subscribe((()=>{}))),t.push(Ve(this._navigator.stateService.currentImage$.pipe(zt((e=>Ve(Ce(e),e.spatialEdges$.pipe(st((e=>e.cached))))))),this._configuration$).pipe(zt((([[t,i],n])=>{let r=i.edges,s=n.depth,a=Math.max(0,Math.min(2,s.spherical)),o=$u(t.cameraType)?0:Math.max(0,Math.min(3,s.step)),h=$u(t.cameraType)?0:Math.max(0,Math.min(1,s.turn)),c=this._cache$(r,e.NavigationDirection.Spherical,a);return it(this._cache$(r,e.NavigationDirection.StepForward,o),this._cache$(r,e.NavigationDirection.StepBackward,o),this._cache$(r,e.NavigationDirection.StepLeft,o),this._cache$(r,e.NavigationDirection.StepRight,o),c,this._cache$(r,e.NavigationDirection.TurnLeft,h),this._cache$(r,e.NavigationDirection.TurnRight,h),this._cache$(r,e.NavigationDirection.TurnU,h)).pipe(ct((e=>(console.error("Failed to cache spatial edges.",e),ie()))))}))).subscribe((()=>{})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{depth:{spherical:1,sequence:2,step:1,turn:0}}}_cache$(e,t,i){return at(Ce(e),Ce(i)).pipe(wt((e=>{let i=e[0],n=e[1],r=[];if(n>0)for(let e of i)e.data.direction===t&&r.push(at(this._navigator.graphService.cacheImage$(e.target).pipe(We((e=>this._imageToEdges$(e,t)))),Ce(n-1)));return ge(r).pipe(qe())})),$t(1))}_imageToEdges$(t,i){return([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(i)>-1?t.sequenceEdges$:t.spatialEdges$).pipe(St((e=>e.cached)),De((e=>e.edges)))}}lf.componentName="cache";class uf extends Pu{constructor(e){super(null!=e?e:"The request was cancelled."),Object.setPrototypeOf(this,uf.prototype),this.name="CancelMapillaryError"}}class df{constructor(e,t){this._spatial=new Du,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._configure(e),this._resize(t),this._reset()}get minWidth(){return this._minWidth}get maxWidth(){return this._maxWidth}get containerWidth(){return this._containerWidth}get containerWidthCss(){return this._containerWidthCss}get containerMarginCss(){return this._containerMarginCss}get containerLeftCss(){return this._containerLeftCss}get containerHeight(){return this._containerHeight}get containerHeightCss(){return this._containerHeightCss}get containerBottomCss(){return this._containerBottomCss}get stepCircleSize(){return this._stepCircleSize}get stepCircleSizeCss(){return this._stepCircleSizeCss}get stepCircleMarginCss(){return this._stepCircleMarginCss}get turnCircleSize(){return this._turnCircleSize}get turnCircleSizeCss(){return this._turnCircleSizeCss}get outerRadius(){return this._outerRadius}get innerRadius(){return this._innerRadius}get shadowOffset(){return this._shadowOffset}configure(e){this._configure(e),this._reset()}resize(e){this._resize(e),this._reset()}angleToCoordinates(e){return[Math.cos(e),Math.sin(e)]}relativeAngleToCoordiantes(e,t){let i=this._spatial.wrapAngle(e-t);return this.angleToCoordinates(i)}_configure(e){this._minWidth=e.minWidth,this._maxWidth=this._getMaxWidth(e.minWidth,e.maxWidth)}_resize(e){this._elementWidth=e.width,this._elementHeight=e.height}_reset(){this._containerWidth=this._getContainerWidth(this._elementWidth,this._elementHeight),this._containerHeight=this._getContainerHeight(this.containerWidth),this._stepCircleSize=this._getStepCircleDiameter(this._containerHeight),this._turnCircleSize=this._getTurnCircleDiameter(this.containerHeight),this._outerRadius=this._getOuterRadius(this._containerHeight),this._innerRadius=this._getInnerRadius(this._containerHeight),this._shadowOffset=3,this._containerWidthCss=this._numberToCssPixels(this._containerWidth),this._containerMarginCss=this._numberToCssPixels(-.5*this._containerWidth),this._containerLeftCss=this._numberToCssPixels(Math.floor(.5*this._elementWidth)),this._containerHeightCss=this._numberToCssPixels(this._containerHeight),this._containerBottomCss=this._numberToCssPixels(Math.floor(-.08*this._containerHeight)),this._stepCircleSizeCss=this._numberToCssPixels(this._stepCircleSize),this._stepCircleMarginCss=this._numberToCssPixels(-.5*this._stepCircleSize),this._turnCircleSizeCss=this._numberToCssPixels(this._turnCircleSize)}_getContainerWidth(e,t){let i=(e-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),n=(t-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight),r=Math.max(0,Math.min(1,Math.min(i,n)));return r=.04*Math.round(25*r),this._minWidth+r*(this._maxWidth-this._minWidth)}_getContainerHeight(e){return.77*e}_getStepCircleDiameter(e){return.34*e}_getTurnCircleDiameter(e){return.3*e}_getOuterRadius(e){return.31*e}_getInnerRadius(e){return.125*e}_numberToCssPixels(e){return e+"px"}_getMaxWidth(e,t){return e>t?e:t}}class pf{constructor(t,i){this._isEdge=!1,this._spatial=new Du,this._calculator=new df(t,i),this._image=null,this._rotation={phi:0,theta:0},this._epsilon=.5*Math.PI/180,this._highlightKey=null,this._distinguishSequence=!1,this._needsRender=!1,this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[],this._stepDirections=[e.NavigationDirection.StepForward,e.NavigationDirection.StepBackward,e.NavigationDirection.StepLeft,e.NavigationDirection.StepRight],this._turnDirections=[e.NavigationDirection.TurnLeft,e.NavigationDirection.TurnRight,e.NavigationDirection.TurnU],this._turnNames={},this._turnNames[e.NavigationDirection.TurnLeft]="mapillary-direction-turn-left",this._turnNames[e.NavigationDirection.TurnRight]="mapillary-direction-turn-right",this._turnNames[e.NavigationDirection.TurnU]="mapillary-direction-turn-around";let n=!!document.documentMode;this._isEdge=!n&&!!window.StyleMedia}get needsRender(){return this._needsRender}render(e){this._needsRender=!1;let t=this._rotation,i=[],n=[];return $u(this._image.cameraType)?i=i.concat(this._createSphericalArrows(e,t)):(i=i.concat(this._createPerspectiveToSphericalArrows(e,t)),i=i.concat(this._createStepArrows(e,t)),n=n.concat(this._createTurnArrows(e))),this._getContainer(i,n,t)}setEdges(e,t){this._setEdges(e,t),this._setNeedsRender()}setImage(e){this._image=e,this._clearEdges(),this._setNeedsRender()}setRenderCamera(e){let t=e.rotation;Math.abs(t.phi-this._rotation.phi)<this._epsilon||(this._rotation=t,this._setNeedsRender())}setConfiguration(e){let t=!1;this._highlightKey===e.highlightId&&this._distinguishSequence===e.distinguishSequence||(this._highlightKey=e.highlightId,this._distinguishSequence=e.distinguishSequence,t=!0),this._calculator.minWidth===e.minWidth&&this._calculator.maxWidth===e.maxWidth||(this._calculator.configure(e),t=!0),t&&this._setNeedsRender()}resize(e){this._calculator.resize(e),this._setNeedsRender()}_setNeedsRender(){null!=this._image&&(this._needsRender=!0)}_clearEdges(){this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[]}_setEdges(t,i){this._stepEdges=[],this._turnEdges=[],this._sphericalEdges=[],this._sequenceEdgeKeys=[];for(let i of t.edges){let t=i.data.direction;this._stepDirections.indexOf(t)>-1?this._stepEdges.push(i):this._turnDirections.indexOf(t)>-1?this._turnEdges.push(i):i.data.direction===e.NavigationDirection.Spherical&&this._sphericalEdges.push(i)}if(this._distinguishSequence&&null!=i){let e=this._sphericalEdges.concat(this._stepEdges).concat(this._turnEdges);for(let t of e){let e=t.target;for(let t of i.imageIds)if(t===e){this._sequenceEdgeKeys.push(e);break}}}}_createSphericalArrows(e,t){let i=[];for(let n of this._sphericalEdges)i.push(this._createVNodeByKey(e,n.target,n.data.worldMotionAzimuth,t,this._calculator.outerRadius,"mapillary-direction-arrow-spherical"));for(let n of this._stepEdges)i.push(this._createSphericalToPerspectiveArrow(e,n.target,n.data.worldMotionAzimuth,t,n.data.direction));return i}_createSphericalToPerspectiveArrow(t,i,n,r,s){let a=Math.PI/8,o=r.phi;switch(s){case e.NavigationDirection.StepBackward:o=r.phi-Math.PI;break;case e.NavigationDirection.StepLeft:o=r.phi+Math.PI/2;break;case e.NavigationDirection.StepRight:o=r.phi-Math.PI/2}return Math.abs(this._spatial.wrapAngle(n-o))<a?this._createVNodeByKey(t,i,n,r,this._calculator.outerRadius,"mapillary-direction-arrow-step"):this._createVNodeInactive(i,n,r)}_createPerspectiveToSphericalArrows(e,t){let i=[];for(let n of this._sphericalEdges)i.push(this._createVNodeByKey(e,n.target,n.data.worldMotionAzimuth,t,this._calculator.innerRadius,"mapillary-direction-arrow-spherical",!0));return i}_createStepArrows(e,t){let i=[];for(let n of this._stepEdges)i.push(this._createVNodeByDirection(e,n.target,n.data.worldMotionAzimuth,t,n.data.direction));return i}_createTurnArrows(e){let t=[];for(let i of this._turnEdges){let n=i.data.direction,r=this._turnNames[n];t.push(this._createVNodeByTurn(e,i.target,r,n))}return t}_createVNodeByKey(e,t,i,n,r,s,a){return this._createVNode(t,i,n,r,s,"mapillary-direction-circle",(i=>{e.moveTo$(t).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}),a)}_createVNodeByDirection(e,t,i,n,r){return this._createVNode(t,i,n,this._calculator.outerRadius,"mapillary-direction-arrow-step","mapillary-direction-circle",(t=>{e.moveDir$(r).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}))}_createVNodeByTurn(t,i,n,r){let s={height:this._calculator.turnCircleSizeCss,transform:"rotate(0)",width:this._calculator.turnCircleSizeCss};switch(r){case e.NavigationDirection.TurnLeft:s.left="5px",s.top="5px";break;case e.NavigationDirection.TurnRight:s.right="5px",s.top="5px";break;case e.NavigationDirection.TurnU:s.left="5px",s.bottom="5px"}let a={attributes:{"data-id":i},onclick:e=>{t.moveDir$(r).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))},style:s},o="mapillary-direction-turn-circle";this._sequenceEdgeKeys.indexOf(i)>-1&&(o+="-sequence"),this._highlightKey===i&&(o+="-highlight");let h=tf.h(`div.${n}`,{},[]);return tf.h("div."+o,a,[h])}_createVNodeInactive(e,t,i){return this._createVNode(e,t,i,this._calculator.outerRadius,"mapillary-direction-arrow-inactive","mapillary-direction-circle-inactive")}_createVNode(e,t,i,n,r,s,a,o){let h=this._calculator.angleToCoordinates(t-i.phi),c=Math.round(-n*h[1]+.5*this._calculator.containerWidth),l=Math.round(-n*h[0]+.5*this._calculator.containerHeight),u=this._calculator.relativeAngleToCoordiantes(t,i.phi),d=this._calculator.shadowOffset,p=`drop-shadow(${-d*u[1]}px ${d*u[0]}px 1px rgba(0,0,0,0.8))`,m={style:{"-webkit-filter":p,filter:p}},f=tf.h("div."+r,m,[]),g=-this._spatial.radToDeg(t-i.phi),_=o?`translate(${c}px, ${l}px) rotate(${g}deg) translateZ(-0.01px)`:`translate(${c}px, ${l}px) rotate(${g}deg)`,v={attributes:{"data-id":e},onclick:a,style:{height:this._calculator.stepCircleSizeCss,marginLeft:this._calculator.stepCircleMarginCss,marginTop:this._calculator.stepCircleMarginCss,transform:_,width:this._calculator.stepCircleSizeCss}};return this._sequenceEdgeKeys.indexOf(e)>-1&&(s+="-sequence"),this._highlightKey===e&&(s+="-highlight"),tf.h("div."+s,v,[f])}_getContainer(e,t,i){let n=this._isEdge?"rotateX(60deg)":`perspective(${this._calculator.containerWidthCss}) rotateX(60deg)`,r={oncontextmenu:e=>{e.preventDefault()},style:{bottom:this._calculator.containerBottomCss,height:this._calculator.containerHeightCss,left:this._calculator.containerLeftCss,marginLeft:this._calculator.containerMarginCss,transform:n,width:this._calculator.containerWidthCss}};return tf.h("div.mapillary-direction-perspective",r,t.concat(e))}}class mf extends sf{constructor(e,t,i,n){super(e,t,i),this._renderer=n||new pf(this.defaultConfiguration,{height:t.container.offsetHeight,width:t.container.offsetWidth}),this._hoveredIdSubject$=new j,this._hoveredId$=this._hoveredIdSubject$.pipe(Dt())}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}_activate(){const e=this._subscriptions;e.push(this._configuration$.subscribe((e=>{this._renderer.setConfiguration(e)}))),e.push(this._container.renderService.size$.subscribe((e=>{this._renderer.resize(e)}))),e.push(this._navigator.stateService.currentImage$.pipe(Ut((e=>{this._container.domRenderer.render$.next({name:this._name,vNode:tf.h("div",{},[])}),this._renderer.setImage(e)})),Vt(this._configuration$),zt((([e,t])=>Ve(e.spatialEdges$,t.distinguishSequence?this._navigator.graphService.cacheSequence$(e.sequenceId).pipe(ct((t=>(console.error(`Failed to cache sequence (${e.sequenceId})`,t),Ce(null))))):Ce(null))))).subscribe((([e,t])=>{this._renderer.setEdges(e,t)}))),e.push(this._container.renderService.renderCameraFrame$.pipe(Ut((e=>{this._renderer.setRenderCamera(e)})),De((()=>this._renderer)),st((e=>e.needsRender)),De((e=>({name:this._name,vNode:e.render(this._navigator)})))).subscribe(this._container.domRenderer.render$)),e.push(Ve(this._container.domRenderer.element$,this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$.pipe(Ot(null)),this._container.mouseService.mouseUp$.pipe(Ot(null))).pipe(De((([e])=>{let t=e.getElementsByClassName("mapillary-direction-perspective");for(let e=0;e<t.length;e++){let i=t.item(e).querySelector(":hover");if(null!=i&&i.hasAttribute("data-id"))return i.getAttribute("data-id")}return null})),vt()).subscribe(this._hoveredIdSubject$)),e.push(this._hoveredId$.subscribe((e=>{const t="hover",i={id:e,target:this,type:t};this.fire(t,i)})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{distinguishSequence:!1,maxWidth:460,minWidth:260}}}mf.componentName="direction";class ff{}ff.fisheye={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r = sqrt(x * x + y * y);\n    float theta = atan(r, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},ff.fisheyeCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x;\n    float y = vRstq.y;\n    float z = vRstq.z;\n\n    float r2 = sqrt(x * x + y * y);\n    float theta = atan(r2, z);\n\n    if (radial_peak > 0. && theta > radial_peak) {\n        theta = radial_peak;\n    }\n\n    float theta2 = theta * theta;\n    float theta_d = theta * (1.0 + theta2 * (k1 + theta2 * k2));\n    float s = focal * theta_d / r2;\n\n    float u = scale_x * s * x + 0.5;\n    float v = -scale_y * s * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},ff.perspective={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},ff.perspectiveCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float focal;\nuniform float k1;\nuniform float k2;\nuniform float scale_x;\nuniform float scale_y;\nuniform float radial_peak;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float x = vRstq.x / vRstq.z;\n    float y = vRstq.y / vRstq.z;\n    float r2 = x * x + y * y;\n\n    if (radial_peak > 0. && r2 > radial_peak * sqrt(r2)) {\n        r2 = radial_peak * radial_peak;\n    }\n\n    float d = 1.0 + k1 * r2 + k2 * r2 * r2;\n    float u = scale_x * focal * d * x + 0.5;\n    float v = - scale_y * focal * d * y + 0.5;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},ff.perspectiveDistorted={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if (u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},ff.perspectiveDistortedCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\nuniform sampler2D projectorTex;\nuniform float opacity;\nuniform float curtain;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    float u = vRstq.x / vRstq.w;\n    float v = vRstq.y / vRstq.w;\n\n    vec4 baseColor;\n    if ((u < curtain || curtain >= 1.0) && u >= 0. && u <= 1. && v >= 0. && v <= 1.) {\n        baseColor = texture2D(projectorTex, vec2(u, v));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},ff.spherical={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\n#define tau 6.28318530718\n\nuniform sampler2D projectorTex;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lng = atan(b.x, b.z);\n    float x = lng / tau + 0.5;\n    float y = lat / tau * 2.0 + 0.5;\n    vec4 baseColor = texture2D(projectorTex, vec2(x, y));\n    baseColor.a = opacity;\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},ff.sphericalCurtain={fragment:"\n#ifdef GL_FRAGMENT_PRECISION_HIGH\nprecision highp float;\n#else\nprecision mediump float;\n#endif\n\n#define tau 6.28318530718\n\nuniform sampler2D projectorTex;\nuniform float curtain;\nuniform float opacity;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vec3 b = normalize(vRstq.xyz);\n    float lat = -asin(b.y);\n    float lng = atan(b.x, b.z);\n    float x = lng / tau + 0.5;\n    float y = lat / tau * 2.0 + 0.5;\n\n    bool inverted = curtain < 0.5;\n\n    float curtainMin = inverted ? curtain + 0.5 : curtain - 0.5;\n    float curtainMax = curtain;\n\n    bool insideCurtain = inverted ?\n        x > curtainMin || x < curtainMax :\n        x > curtainMin && x < curtainMax;\n\n    vec4 baseColor;\n    if (insideCurtain) {\n        baseColor = texture2D(projectorTex, vec2(x, y));\n        baseColor.a = opacity;\n    } else {\n        baseColor = vec4(0.0, 0.0, 0.0, 0.0);\n    }\n\n    gl_FragColor = baseColor;\n}\n",vertex:"\n#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform mat4 projectorMat;\n\nvarying vec4 vRstq;\n\nvoid main()\n{\n    vRstq = projectorMat * vec4(position, 1.0);\n    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"};class gf{constructor(e,t){this._imagePlaneDepth=null!=e?e:200,this._imageSphereRadius=null!=t?t:200}createMesh(e,t){return $u(t.cameraType)?this._createImageSphere(e,t):ku(t.cameraType)?this._createImagePlaneFisheye(e,t):this._createImagePlane(e,t)}createFlatMesh(e,t,i,n,r,s){let a=this._createTexture(e.image),o=this._createDistortedPlaneMaterialParameters(t,a),h=new as(o),c=this._getFlatImagePlaneGeoFromBasic(t,i,n,r,s);return new es(c,h)}createCurtainMesh(e,t){return $u(t.cameraType)?this._createSphereCurtainMesh(e,t):ku(t.cameraType)?this._createCurtainMeshFisheye(e,t):this._createCurtainMesh(e,t)}createDistortedCurtainMesh(e,t){return this._createDistortedCurtainMesh(e,t)}_createCurtainMesh(e,t){let i=this._createTexture(e.image),n=this._createCurtainPlaneMaterialParameters(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeo(t,e):this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createCurtainMeshFisheye(e,t){let i=this._createTexture(e.image),n=this._createCurtainPlaneMaterialParametersFisheye(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeoFisheye(t,e):this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createDistortedCurtainMesh(e,t){let i=this._createTexture(e.image),n=this._createDistortedCurtainPlaneMaterialParameters(t,i),r=new as(n),s=this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createSphereCurtainMesh(e,t){let i=this._createTexture(e.image),n=this._createCurtainSphereMaterialParameters(t,i),r=new as(n);return this._useMesh(t,e)?new es(this._getImageSphereGeo(t,e),r):new es(this._getFlatImageSphereGeo(t),r)}_createImageSphere(e,t){let i=this._createTexture(e.image),n=this._createSphereMaterialParameters(t,i),r=new as(n);return this._useMesh(t,e)?new es(this._getImageSphereGeo(t,e),r):new es(this._getFlatImageSphereGeo(t),r)}_createImagePlane(e,t){let i=this._createTexture(e.image),n=this._createPlaneMaterialParameters(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeo(t,e):this._getRegularFlatImagePlaneGeo(t);return new es(s,r)}_createImagePlaneFisheye(e,t){let i=this._createTexture(e.image),n=this._createPlaneMaterialParametersFisheye(t,i),r=new as(n),s=this._useMesh(t,e)?this._getImagePlaneGeoFisheye(t,e):this._getRegularFlatImagePlaneGeoFisheye(t);return new es(s,r)}_createSphereMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.spherical.fragment,side:2,transparent:!0,uniforms:{opacity:{value:1},projectorMat:{value:e.rt},projectorTex:{value:t}},vertexShader:ff.spherical.vertex}}_createCurtainSphereMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.sphericalCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},opacity:{value:1},projectorMat:{value:e.rt},projectorTex:{value:t}},vertexShader:ff.sphericalCurtain.vertex}}_createPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspective.fragment,side:2,transparent:!0,uniforms:{focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.perspective.vertex}}_createPlaneMaterialParametersFisheye(e,t){return{depthWrite:!1,fragmentShader:ff.fisheye.fragment,side:2,transparent:!0,uniforms:{focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.fisheye.vertex}}_createCurtainPlaneMaterialParametersFisheye(e,t){return{depthWrite:!1,fragmentShader:ff.fisheyeCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.fisheyeCurtain.vertex}}_createCurtainPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspectiveCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},focal:{value:e.focal},k1:{value:e.ck1},k2:{value:e.ck2},opacity:{value:1},projectorMat:{value:e.basicRt},projectorTex:{value:t},radial_peak:{value:e.radialPeak?e.radialPeak:0},scale_x:{value:Math.max(e.basicHeight,e.basicWidth)/e.basicWidth},scale_y:{value:Math.max(e.basicWidth,e.basicHeight)/e.basicHeight}},vertexShader:ff.perspectiveCurtain.vertex}}_createDistortedCurtainPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspectiveDistortedCurtain.fragment,side:2,transparent:!0,uniforms:{curtain:{value:1},opacity:{value:1},projectorMat:{value:e.projectorMatrix()},projectorTex:{value:t}},vertexShader:ff.perspectiveDistortedCurtain.vertex}}_createDistortedPlaneMaterialParameters(e,t){return{depthWrite:!1,fragmentShader:ff.perspectiveDistorted.fragment,side:2,transparent:!0,uniforms:{opacity:{value:1},projectorMat:{value:e.projectorMatrix()},projectorTex:{value:t}},vertexShader:ff.perspectiveDistorted.vertex}}_createTexture(e){let t=new Wi(e);return t.minFilter=Kt,t.needsUpdate=!0,t}_useMesh(e,t){return t.mesh.vertices.length&&e.hasValidScale}_getImageSphereGeo(e,t){const i=e.srtInverse;let n=5*e.scale,r=this._imageSphereRadius*e.scale,s=t.mesh.vertices,a=s.length/3,o=new Float32Array(s.length);for(let e=0;e<a;++e){let t=3*e,a=s[t+0],h=s[t+1],c=s[t+2],l=Math.sqrt(a*a+h*h+c*c),u=Math.max(n,Math.min(l,r))/l,d=new Ki(a*u,h*u,c*u);d.applyMatrix4(i),o[t+0]=d.x,o[t+1]=d.y,o[t+2]=d.z}let h=t.mesh.faces,c=new Uint16Array(h.length);for(let e=0;e<h.length;++e)c[e]=h[e];let l=new kr;return l.setAttribute("position",new Tr(o,3)),l.setIndex(new Tr(c,1)),l}_getImagePlaneGeo(e,t){const i=e.srtInverse;let n=5*e.scale,r=this._imagePlaneDepth*e.scale,s=t.mesh.vertices,a=s.length/3,o=new Float32Array(s.length);for(let e=0;e<a;++e){let t=3*e,a=s[t+0],h=s[t+1],c=s[t+2];e<4&&(a*=3,h*=3);let l=Math.max(n,Math.min(c,r)),u=l/c,d=new Ki(a*u,h*u,l);d.applyMatrix4(i),o[t+0]=d.x,o[t+1]=d.y,o[t+2]=d.z}let h=t.mesh.faces,c=new Uint16Array(h.length);for(let e=0;e<h.length;++e)c[e]=h[e];let l=new kr;return l.setAttribute("position",new Tr(o,3)),l.setIndex(new Tr(c,1)),l}_getImagePlaneGeoFisheye(e,t){const i=e.srtInverse;let n=5*e.scale,r=this._imagePlaneDepth*e.scale,s=t.mesh.vertices,a=s.length/3,o=new Float32Array(s.length);for(let e=0;e<a;++e){let t=3*e,a=s[t+0],h=s[t+1],c=s[t+2],l=Math.sqrt(a*a+h*h+c*c),u=Math.max(n,Math.min(l,r))/l,d=new Ki(a*u,h*u,c*u);d.applyMatrix4(i),o[t+0]=d.x,o[t+1]=d.y,o[t+2]=d.z}let h=t.mesh.faces,c=new Uint16Array(h.length);for(let e=0;e<h.length;++e)c[e]=h[e];let l=new kr;return l.setAttribute("position",new Tr(o,3)),l.setIndex(new Tr(c,1)),l}_getFlatImageSphereGeo(e){const t=new nl(this._imageSphereRadius,20,40),i=e.rt.clone().invert();return t.applyMatrix4(i),t}_getRegularFlatImagePlaneGeo(e){let t=e.width,i=e.height,n=Math.max(t,i),r=t/2/n,s=i/2/n;return this._getFlatImagePlaneGeo(e,r,s)}_getFlatImagePlaneGeo(e,t,i){let n=[];return n.push(e.unprojectSfM([-t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,i],this._imagePlaneDepth)),n.push(e.unprojectSfM([-t,i],this._imagePlaneDepth)),this._createFlatGeometry(n)}_getRegularFlatImagePlaneGeoFisheye(e){let t=e.width,i=e.height,n=Math.max(t,i),r=t/2/n,s=i/2/n;return this._getFlatImagePlaneGeoFisheye(e,r,s)}_getFlatImagePlaneGeoFisheye(e,t,i){let n=[];return n.push(e.unprojectSfM([-t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,-i],this._imagePlaneDepth)),n.push(e.unprojectSfM([t,i],this._imagePlaneDepth)),n.push(e.unprojectSfM([-t,i],this._imagePlaneDepth)),this._createFlatGeometry(n)}_getFlatImagePlaneGeoFromBasic(e,t,i,n,r){let s=[];return s.push(e.unprojectBasic([t,n],this._imagePlaneDepth)),s.push(e.unprojectBasic([i,n],this._imagePlaneDepth)),s.push(e.unprojectBasic([i,r],this._imagePlaneDepth)),s.push(e.unprojectBasic([t,r],this._imagePlaneDepth)),this._createFlatGeometry(s)}_createFlatGeometry(e){let t=new Float32Array(12);for(let i=0;i<e.length;i++){let n=3*i;t[n+0]=e[i][0],t[n+1]=e[i][1],t[n+2]=e[i][2]}let i=new Uint16Array(6);i[0]=0,i[1]=1,i[2]=3,i[3]=1,i[4]=2,i[5]=3;let n=new kr;return n.setAttribute("position",new Tr(t,3)),n.setIndex(new Tr(i,1)),n}}class _f{constructor(){this._planes={},this._planesOld={},this._planesPeriphery={},this._scene=new ch,this._sceneOld=new ch,this._scenePeriphery=new ch}get planes(){return this._planes}get planesOld(){return this._planesOld}get planesPeriphery(){return this._planesPeriphery}get scene(){return this._scene}get sceneOld(){return this._sceneOld}get scenePeriphery(){return this._scenePeriphery}updateImagePlanes(e){this._dispose(this._planesOld,this.sceneOld);for(const e in this._planes){if(!this._planes.hasOwnProperty(e))continue;const t=this._planes[e];this._scene.remove(t),this._sceneOld.add(t)}for(const t in e)e.hasOwnProperty(t)&&this._scene.add(e[t]);this._planesOld=this._planes,this._planes=e}addImagePlanes(e){for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];this._scene.add(i),this._planes[t]=i}}addImagePlanesOld(e){for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];this._sceneOld.add(i),this._planesOld[t]=i}}setImagePlanes(e){this._clear(),this.addImagePlanes(e)}addPeripheryPlanes(e){for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];this._scenePeriphery.add(i),this._planesPeriphery[t]=i}}setPeripheryPlanes(e){this._clearPeriphery(),this.addPeripheryPlanes(e)}setImagePlanesOld(e){this._clearOld(),this.addImagePlanesOld(e)}clear(){this._clear(),this._clearOld()}_clear(){this._dispose(this._planes,this._scene),this._planes={}}_clearOld(){this._dispose(this._planesOld,this._sceneOld),this._planesOld={}}_clearPeriphery(){this._dispose(this._planesPeriphery,this._scenePeriphery),this._planesPeriphery={}}_dispose(e,t){for(const i in e){if(!e.hasOwnProperty(i))continue;const n=e[i];t.remove(n),n.geometry.dispose(),n.material.dispose();let r=n.material.uniforms.projectorTex.value;null!=r&&r.dispose()}}}class vf{constructor(){this._factory=new gf,this._scene=new _f,this._alpha=0,this._alphaOld=0,this._fadeOutSpeed=.05,this._currentKey=null,this._previousKey=null,this._providerDisposers={},this._frameId=0,this._needsRender=!1}get frameId(){return this._frameId}get needsRender(){return this._needsRender}indicateNeedsRender(){this._needsRender=!0}addPeripheryPlane(e,t){const i=this._factory.createMesh(e,t),n={};n[e.id]=i,this._scene.addPeripheryPlanes(n),this._needsRender=!0}clearPeripheryPlanes(){this._scene.setPeripheryPlanes({}),this._needsRender=!0}updateFrame(e){this._updateFrameId(e.id),this._needsRender=this._updateAlpha(e.state.alpha)||this._needsRender,this._needsRender=this._updateAlphaOld(e.state.alpha)||this._needsRender,this._needsRender=this._updateImagePlanes(e.state)||this._needsRender}setTextureProvider(e,t){if(e!==this._currentKey)return;let i=t.textureCreated$.subscribe((e=>{this._updateTexture(e)})),n=t.textureUpdated$.subscribe((e=>{this._needsRender=!0}));if(e in this._providerDisposers){(0,this._providerDisposers[e])(),delete this._providerDisposers[e]}this._providerDisposers[e]=()=>{i.unsubscribe(),n.unsubscribe(),t.dispose()}}updateTextureImage(e,t){this._needsRender=!0;const i=this._extend({},this._scene.planes,this._scene.planesOld,this._scene.planesPeriphery);for(const n in i){if(!i.hasOwnProperty(n))continue;if(n!==t.id)continue;let r=i[n].material.uniforms.projectorTex.value;r.image=e,r.needsUpdate=!0}}render(e,t){const i=this._scene.planes,n=this._scene.planesOld,r=this._scene.planesPeriphery,s=Object.keys(n).length?1:this._alpha,a=Object.keys(n).length?1:Math.floor(this._alpha);for(const e in i){if(!i.hasOwnProperty(e))continue;i[e].material.uniforms.opacity.value=s}for(const e in n){if(!n.hasOwnProperty(e))continue;n[e].material.uniforms.opacity.value=this._alphaOld}for(const e in r){if(!r.hasOwnProperty(e))continue;r[e].material.uniforms.opacity.value=a}t.render(this._scene.scenePeriphery,e),t.render(this._scene.scene,e),t.render(this._scene.sceneOld,e);for(const e in i){if(!i.hasOwnProperty(e))continue;i[e].material.uniforms.opacity.value=this._alpha}t.render(this._scene.scene,e)}clearNeedsRender(){this._needsRender=!1}dispose(){this._scene.clear()}_updateFrameId(e){this._frameId=e}_updateAlpha(e){return e!==this._alpha&&(this._alpha=e,!0)}_updateAlphaOld(e){return!(e<1||0===this._alphaOld)&&(this._alphaOld=Math.max(0,this._alphaOld-this._fadeOutSpeed),!0)}_updateImagePlanes(e){if(null==e.currentImage||e.currentImage.id===this._currentKey)return!1;let t=null!=e.previousImage?e.previousImage.id:null,i=e.currentImage.id;if(this._previousKey!==t&&this._previousKey!==i&&this._previousKey in this._providerDisposers){(0,this._providerDisposers[this._previousKey])(),delete this._providerDisposers[this._previousKey]}if(null!=t){if(t!==this._currentKey&&t!==this._previousKey){let i=this._factory.createMesh(e.previousImage,e.previousTransform);const n={};n[t]=i,this._scene.updateImagePlanes(n)}this._previousKey=t}this._currentKey=i;let n=this._factory.createMesh(e.currentImage,e.currentTransform);const r={};return r[i]=n,this._scene.updateImagePlanes(r),this._alphaOld=1,!0}_updateTexture(e){this._needsRender=!0;const t=this._scene.planes;for(const i in t){if(!t.hasOwnProperty(i))continue;let n=t[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=e}}_extend(e,...t){for(const i of t)for(const t in i)i.hasOwnProperty(t)&&(e[t]=i[t]);return e}}var yf;!function(e){e[e.Background=0]="Background",e[e.Opaque=1]="Opaque"}(yf||(yf={}));class bf{constructor(e){this._api=e,this._urls$=new Map}getImage$(e){let t;const i=new Promise(((e,i)=>{t=i}));return[k.create((n=>{this._api.data.getImageBuffer(e,i).then((e=>{t=null;const i=new Image;i.crossOrigin="Anonymous",i.onload=()=>{window.URL.revokeObjectURL(i.src),n.next(i),n.complete()},i.onerror=()=>{t=null,window.URL.revokeObjectURL(i.src),n.error(new Error("Failed to load image tile"))};const r=new Blob([e]);i.src=window.URL.createObjectURL(r)}),(e=>{t=null,n.error(e)}))})),()=>{t&&t()}]}getURLs$(e,t){const i=this._inventId(e,t);if(this._urls$.has(i))return this._urls$.get(i);const n={imageId:e,z:t},r=this._api.getImageTiles$(n).pipe(De((e=>e.node)),Mt((()=>{this._urls$.delete(i)})),It(),U());return this._urls$.set(i,r),r}_inventId(e,t){return`${e}-${t}`}}class xf{constructor(){this._tiles=new Map,this._urlLevels=new Set,this._urls=new Map}add(e,t){if(this._tiles.has(e))throw new Error(`Image tile already stored (${e})`);this._tiles.set(e,t)}addURLs(e,t){const i=this._urls;for(const e of t){const t=this.inventId(e);if(this._urls.has(t))throw new Error(`URL already stored (${t})`);i.set(t,e.url)}this._urlLevels.add(e)}dispose(){this._tiles.forEach((e=>window.URL.revokeObjectURL(e.src))),this._tiles.clear(),this._urls.clear(),this._urlLevels.clear()}get(e){return this._tiles.get(e)}getURL(e){return this._urls.get(e)}has(e){return this._tiles.has(e)}hasURL(e){return this._urls.has(e)}hasURLLevel(e){return this._urlLevels.has(e)}inventId(e){return`${e.z}-${e.x}-${e.y}`}}class wf{constructor(){this._viewportCoords=new hf}computeRegionOfInterest(e,t,i){const n=this._viewportBoundaryPoints(4),r=this._viewportPointsBoundingBox(n,e,i);this._clipBoundingBox(r);const s=2/t.width,a=2/t.height,o=[[-.5*s,.5*a],[.5*s,.5*a],[.5*s,-.5*a],[-.5*s,-.5*a]],h=this._viewportPointsBoundingBox(o,e,i),c=h.minX<h.maxX;return{bbox:r,pixelHeight:h.maxY-h.minY,pixelWidth:h.maxX-h.minX+(c?0:1)}}_viewportBoundaryPoints(e){const t=[],i=[[-1,1],[1,1],[1,-1],[-1,-1]],n=[[2,0],[0,-2],[-2,0],[0,2]];for(let r=0;r<4;++r){const s=i[r],a=n[r];for(let i=0;i<e;++i)t.push([s[0]+a[0]*i/e,s[1]+a[1]*i/e])}return t}_viewportPointsBoundingBox(e,t,i){const n=e.map((e=>this._viewportCoords.viewportToBasic(e[0],e[1],i,t.perspective)));return $u(i.cameraType)?this._boundingBoxSpherical(n):this._boundingBox(n)}_boundingBox(e){const t={maxX:Number.NEGATIVE_INFINITY,maxY:Number.NEGATIVE_INFINITY,minX:Number.POSITIVE_INFINITY,minY:Number.POSITIVE_INFINITY};for(let i=0;i<e.length;++i)t.minX=Math.min(t.minX,e[i][0]),t.maxX=Math.max(t.maxX,e[i][0]),t.minY=Math.min(t.minY,e[i][1]),t.maxY=Math.max(t.maxY,e[i][1]);return t}_boundingBoxSpherical(e){const t=[],i=[];for(let n=0;n<e.length;++n)t.push(e[n][0]),i.push(e[n][1]);t.sort(((e,t)=>this._sign(e-t))),i.sort(((e,t)=>this._sign(e-t)));const n=this._intervalSpherical(t);return{maxX:n[1],maxY:i[i.length-1],minX:n[0],minY:i[0]}}_intervalSpherical(e){let t=0,i=-1;for(let n=0;n<e.length-1;++n){const r=e[n+1]-e[n];r>t&&(t=r,i=n)}return e[0]+1-e[e.length-1]>t?[e[0],e[e.length-1]]:[e[i+1],e[i]]}_clipBoundingBox(e){e.minX=Math.max(0,Math.min(1,e.minX)),e.maxX=Math.max(0,Math.min(1,e.maxX)),e.minY=Math.max(0,Math.min(1,e.minY)),e.maxY=Math.max(0,Math.min(1,e.maxY))}_sign(e){return e>0?1:e<0?-1:0}}function Mf(e,t,i){return Math.max(t,Math.min(i,e))}function Sf(e){return 1024/Tf(e)}function Tf(e){return Math.pow(2,e.z-e.max)}function Cf(e){return Math.ceil(function(e){const t=Math.max(e.w,e.h);return Math.log(t)/Math.log(2)}(e))}function Ef(e,t,i){const n=Sf(i),r=t.w,s=t.h,a=Math.ceil(r/n)-1,o=Math.ceil(s/n)-1;return{x:Mf(Math.floor(r*e[0]/n),0,a),y:Mf(Math.floor(s*e[1]/n),0,o)}}function Af(e,t,i){const n=1024*(1/Tf(i)),r=n*e.x,s=n*e.y,a=Math.min(n,t.w-r);return{h:Math.min(n,t.h-s),x:r,y:s,w:a}}function If(e,t,i){return i*e<=t&&t<i*(e+1)}function Rf(e,t){if(e.z===t.z)return e.x===t.x&&e.y===t.y;const i=e.z<t.z?e:t,n=e.z<t.z?t:e,r=1/Tf({max:n.z,z:i.z}),s=If(i.x,n.x,r),a=If(i.y,n.y,r);return s&&a}function Pf(e){return e.w>0&&e.h>0}class Lf{constructor(e,t,i,n,r,s,a){const o={h:i,w:t};Pf(o)||console.warn(`Original image size (${t}, ${i}) is invalid (${e}). Tiles will not be loaded.`),this._imageId=e,this._size=o,this._level={max:Cf(this._size),z:-1},this._holder=new rf,this._updated$=new j,this._createdSubject$=new j,this._created$=this._createdSubject$.pipe(Rt(1),U()),this._holder.push(this._created$.subscribe((()=>{}))),this._hasSubject$=new j,this._has$=this._hasSubject$.pipe(Ot(!1),Rt(1),U()),this._holder.push(this._has$.subscribe((()=>{}))),this._renderedLevel=new Set,this._rendered=new Map,this._subscriptions=new Map,this._urlSubscriptions=new Map,this._loader=r,this._store=s,this._background=n,this._renderer=a,this._aborts=[],this._render=null,this._disposed=!1}get disposed(){return this._disposed}get hasTexture$(){return this._has$}get id(){return this._imageId}get textureUpdated$(){return this._updated$}get textureCreated$(){return this._created$}abort(){this._subscriptions.forEach((e=>e.unsubscribe())),this._subscriptions.clear();for(const e of this._aborts)e();this._aborts=[]}dispose(){this._disposed?console.warn(`Texture already disposed (${this._imageId})`):(this._urlSubscriptions.forEach((e=>e.unsubscribe())),this._urlSubscriptions.clear(),this.abort(),null!=this._render&&(this._render.target.dispose(),this._render.target=null,this._render.camera=null,this._render=null),this._store.dispose(),this._holder.unsubscribe(),this._renderedLevel.clear(),this._background=null,this._renderer=null,this._disposed=!0)}setRegionOfInterest(e){if(!Pf(this._size))return;const t=1/e.pixelWidth,i=function(e,t,i){return Math.max(t,Math.min(i,Cf(e)))}({h:1/e.pixelHeight,w:t},11,this._level.max);i!==this._level.z&&(this.abort(),this._level.z=i,this._renderedLevel.clear(),this._rendered.forEach(((e,t)=>{e.z===i&&this._renderedLevel.add(t)}))),null==this._render&&this._initRender();const n=function(e,t,i,n){const r=[];if(e.x>t.x){const s=Sf(n),a=Math.ceil(i.w/s)-1;for(let t=e.x;t<=a;t++)r.push(t);for(let e=0;e<=t.x;e++)r.push(e)}else for(let i=e.x;i<=t.x;i++)r.push(i);const s=[];for(const i of r)for(let n=e.y;n<=t.y;n++)s.push({x:i,y:n});return s}(Ef([e.bbox.minX,e.bbox.minY],this._size,this._level),Ef([e.bbox.maxX,e.bbox.maxY],this._size,this._level),this._size,this._level);this._fetchTiles(i,n)}_fetchTile(e){const t=this._loader.getImage$(e.url),i=t[0],n=t[1];this._aborts.push(n);const r=this._store.inventId(e),s=i.subscribe((t=>{const i=Af(e,this._size,this._level);this._renderToTarget(i,t),this._subscriptions.delete(r),this._removeFromArray(n,this._aborts),this._markRendered(e),this._store.add(r,t),this._updated$.next(!0)}),(e=>{this._subscriptions.delete(r),this._removeFromArray(n,this._aborts),console.error(e)}));s.closed||this._subscriptions.set(r,s)}_fetchTiles(e,t){const i=(this._store.hasURLLevel(e)?Ce(void 0):this._loader.getURLs$(this._imageId,e).pipe(Ut((t=>{this._store.hasURLLevel(e)||this._store.addURLs(e,t)})))).subscribe((()=>{if(e===this._level.z){for(const i of t){const t={x:i.x,y:i.y,z:e,url:null},n=this._store.inventId(t);if(!this._renderedLevel.has(n)&&!this._subscriptions.has(n))if(this._store.has(n)){const e=Af(i,this._size,this._level);this._renderToTarget(e,this._store.get(n)),this._markRendered(t),this._updated$.next(!0)}else t.url=this._store.getURL(n),this._fetchTile(t)}this._urlSubscriptions.delete(e)}}),(t=>{this._urlSubscriptions.delete(e),console.error(t)}));i.closed||this._urlSubscriptions.set(e,i)}_initRender(){const e=this._size.w/2,t=this._size.h/2,i=new Ls(-e,e,t,-t,-1,1);i.position.z=1;const n=this._renderer.getContext(),r=n.getParameter(n.MAX_TEXTURE_SIZE),s=Math.max(this._size.w,this._size.h),a=r>s?1:r/s,o=Math.floor(a*this._size.w),h=Math.floor(a*this._size.h),c=new Zi(o,h,{depthBuffer:!1,format:ai,magFilter:Kt,minFilter:Kt,stencilBuffer:!1});this._render={camera:i,target:c};const l=Af({x:0,y:0},this._size,{max:this._level.max,z:0});this._renderToTarget(l,this._background),this._createdSubject$.next(c.texture),this._hasSubject$.next(!0)}_markRendered(e){const t=Array.from(this._rendered.entries()).filter((([t,i])=>i.z!==e.z));for(const[i,n]of t)Rf(e,n)&&this._rendered.delete(i);const i=this._store.inventId(e);this._rendered.set(i,e),this._renderedLevel.add(i)}_removeFromArray(e,t){const i=t.indexOf(e);-1!==i&&t.splice(i,1)}_renderToTarget(e,t){const i=new Wi(t);i.minFilter=Kt,i.needsUpdate=!0;const n=new ws(e.w,e.h),r=new wr({map:i,side:0}),s=new es(n,r);s.position.x=-this._size.w/2+e.x+e.w/2,s.position.y=this._size.h/2-e.y-e.h/2;const a=new ch;a.add(s);const o=this._renderer.getRenderTarget();this._renderer.resetState(),this._renderer.setRenderTarget(this._render.target),this._renderer.render(a,this._render.camera),this._renderer.setRenderTarget(o),a.remove(s),n.dispose(),r.dispose(),i.dispose()}}var Df,Nf,$f,kf;!function(e){e[e.Custom=0]="Custom",e[e.Earth=1]="Earth",e[e.Traversing=2]="Traversing",e[e.Waiting=3]="Waiting",e[e.WaitingInteractively=4]="WaitingInteractively"}(Df||(Df={}));class Of extends sf{constructor(e,t,i){super(e,t,i),this._imageTileLoader=new bf(i.api),this._roiCalculator=new wf,this._rendererOperation$=new j,this._rendererCreator$=new j,this._rendererDisposer$=new j,this._renderer$=this._rendererOperation$.pipe(Lt(((e,t)=>t(e)),null),st((e=>null!=e)),vt(void 0,(e=>e.frameId))),this._rendererCreator$.pipe(De((()=>e=>{if(null!=e)throw new Error("Multiple image plane states can not be created at the same time");return new vf}))).subscribe(this._rendererOperation$),this._rendererDisposer$.pipe(De((()=>e=>(e.dispose(),null)))).subscribe(this._rendererOperation$)}_activate(){const e=this._subscriptions;e.push(this._renderer$.pipe(De((e=>{const t={name:this._name,renderer:{frameId:e.frameId,needsRender:e.needsRender,render:e.render.bind(e),pass:yf.Background}};return e.clearNeedsRender(),t}))).subscribe(this._container.glRenderer.render$)),this._rendererCreator$.next(null),e.push(this._navigator.stateService.currentState$.pipe(De((e=>t=>(t.updateFrame(e),t)))).subscribe(this._rendererOperation$));const t=this._container.configurationService.imageTiling$.pipe(zt((e=>e?this._navigator.stateService.currentState$:new j)),vt(void 0,(e=>e.state.currentImage.id)),Vt(this._container.glRenderer.webGLRenderer$),De((([e,t])=>{const i=e.state,n=i.currentImage,r=i.currentTransform;return new Lf(n.id,r.basicWidth,r.basicHeight,n.image,this._imageTileLoader,new xf,t)})),Rt(1),U());e.push(t.subscribe((()=>{}))),e.push(t.pipe(De((e=>t=>(t.setTextureProvider(e.id,e),t)))).subscribe(this._rendererOperation$)),e.push(t.pipe(At()).subscribe((e=>{e[0].abort()})));const i=this._container.configurationService.imageTiling$.pipe(zt((e=>e?Ve(this._navigator.stateService.state$,this._navigator.stateService.inTranslation$):new j)),zt((([e,t])=>(e===Df.Traversing||e===Df.Waiting||e===Df.WaitingInteractively)&&!t?this._container.renderService.renderCameraFrame$:ie())),De((e=>({camera:e,height:e.size.height.valueOf(),lookat:e.camera.lookat.clone(),width:e.size.width.valueOf(),zoom:e.zoom.valueOf()}))),At(),De((([e,t])=>{const i=e.width===t.width&&e.height===t.height&&e.zoom===t.zoom&&e.lookat.equals(t.lookat);return{camera:t.camera,stalled:i}})),vt(((e,t)=>e.stalled===t.stalled)),st((e=>e.stalled)),Vt(this._container.renderService.size$,this._navigator.stateService.currentTransform$));e.push(t.pipe(zt((e=>i.pipe(De((([t,i,n])=>{const r=t.camera,s=(new hf).viewportToBasic(0,0,n,r.perspective);if(!(s[0]<0||s[1]<0||s[0]>1||s[1]>1))return[this._roiCalculator.computeRegionOfInterest(r,i,n),e]})),st((e=>!!e))))),st((e=>!e[1].disposed))).subscribe((([e,t])=>{t.setRegionOfInterest(e)})));const n=t.pipe(zt((e=>e.hasTexture$)),Ot(!1),Rt(1),U());e.push(n.subscribe((()=>{}))),e.push(this._navigator.panService.panImages$.pipe(st((e=>0===e.length)),De((()=>e=>(e.clearPeripheryPlanes(),e)))).subscribe(this._rendererOperation$));const r=this._navigator.panService.panImages$.pipe(zt((e=>ge(e).pipe(We((([e,t])=>Ve(this._navigator.graphService.cacheImage$(e.id).pipe(ct((t=>(console.error(`Failed to cache periphery image (${e.id})`,t),ie())))),Ce(t))))))),Dt());e.push(r.pipe(De((([e,t])=>i=>(i.addPeripheryPlane(e,t),i)))).subscribe(this._rendererOperation$)),e.push(r.pipe(We((([e])=>e.cacheImage$().pipe(ct((()=>ie()))))),De((e=>t=>(t.updateTextureImage(e.image,e),t)))).subscribe(this._rendererOperation$));const s=this._navigator.stateService.currentState$.pipe(De((e=>e.state.alpha<1)),vt()),a=Ve(this._container.mouseService.active$,this._container.touchService.active$,this._navigator.stateService.inMotion$,s).pipe(De((([e,t,i,n])=>!(e||t||i||n))),st((e=>e)));e.push(this._navigator.stateService.state$.pipe(zt((e=>e===Df.Traversing?this._navigator.panService.panImages$:ie())),zt((e=>a.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentImage$,this._navigator.stateService.currentTransform$),We((([,t,i,n])=>Ce([t,i,n,e])))))),zt((([e,t,i,n])=>{const r=e.camera.lookat.clone().sub(e.camera.position),s=[(new Du).viewingDirection(t.rotation).angleTo(r),void 0],a=(new hf).viewportToBasic(0,0,i,e.perspective);a[0]>=0&&a[0]<=1&&a[1]>=0&&a[1]<=1&&(s[0]=Number.NEGATIVE_INFINITY);for(const[e]of n){const t=(new Du).viewingDirection(e.rotation).angleTo(r);t<s[0]&&(s[0]=t,s[1]=e.id)}return s[1]?this._navigator.moveTo$(s[1]).pipe(ct((()=>ie()))):ie()}))).subscribe())}_deactivate(){this._rendererDisposer$.next(null),this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}}Of.componentName="image";class zf{constructor(e,t,i){this._component=e,this._container=t,this._navigator=i,this._enabled=!1}get isEnabled(){return this._enabled}enable(){!this._enabled&&this._component.activated&&(this._enable(),this._enabled=!0,this._component.configure(this._getConfiguration(!0)))}disable(){this._enabled&&(this._disable(),this._enabled=!1,this._component.activated&&this._component.configure(this._getConfiguration(!1)))}}class Ff extends zf{_enable(){const t=this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$)));this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(t)).subscribe((([t,i])=>{let n=null;switch(t.keyCode){case 38:n=e.NavigationDirection.Next;break;case 40:n=e.NavigationDirection.Prev;break;default:return}if(t.preventDefault(),t.altKey&&!t.shiftKey&&i.cached)for(const e of i.edges)if(e.data.direction===n)return void this._navigator.moveTo$(e.target).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keySequenceNavigation:e}}}class Bf extends zf{constructor(e,t,i,n){super(e,t,i),this._spatial=n}_enable(){const t=this._navigator.stateService.currentImage$.pipe(zt((e=>e.spatialEdges$)));this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(t,this._navigator.stateService.currentState$)).subscribe((([t,i,n])=>{let r=$u(n.state.currentImage.cameraType),s=null;switch(t.keyCode){case 37:s=t.shiftKey&&!r?e.NavigationDirection.TurnLeft:e.NavigationDirection.StepLeft;break;case 38:s=t.shiftKey&&!r?e.NavigationDirection.Spherical:e.NavigationDirection.StepForward;break;case 39:s=t.shiftKey&&!r?e.NavigationDirection.TurnRight:e.NavigationDirection.StepRight;break;case 40:s=t.shiftKey&&!r?e.NavigationDirection.TurnU:e.NavigationDirection.StepBackward;break;default:return}if(t.preventDefault(),!(t.altKey||!i.cached||t.shiftKey&&r))if(r){const t={};t[e.NavigationDirection.StepBackward]=Math.PI,t[e.NavigationDirection.StepForward]=0,t[e.NavigationDirection.StepLeft]=Math.PI/2,t[e.NavigationDirection.StepRight]=-Math.PI/2;const r=this._rotationFromCamera(n.state.camera).phi,a=this._spatial.wrapAngle(r+t[s]),o=Math.PI/4,h=i.edges.filter((t=>t.data.direction===e.NavigationDirection.Spherical||t.data.direction===s));let c=Number.MAX_VALUE,l=null;for(const e of h){const t=Math.abs(this._spatial.wrapAngle(e.data.worldMotionAzimuth-a));t<Math.min(c,o)&&(c=t,l=e.target)}if(null==l)return;this._moveTo(l)}else this._moveDir(s,i)}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keySpatialNavigation:e}}_moveDir(e,t){for(const i of t.edges)if(i.data.direction===e)return void this._moveTo(i.target)}_moveTo(e){this._navigator.moveTo$(e).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}_rotationFromCamera(e){let t=e.lookat.clone().sub(e.position),i=t.clone().dot(e.up),n=t.clone().sub(e.up.clone().multiplyScalar(i));return{phi:Math.atan2(n.y,n.x),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}}}class Uf extends zf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n}_enable(){this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i])=>{if(e.altKey||e.ctrlKey||e.metaKey)return;let n=0;switch(e.key){case"+":n=1;break;case"-":n=-1;break;default:return}e.preventDefault();const r=this._viewportCoords.unprojectFromViewport(0,0,t.perspective),s=i.projectBasic(r.toArray());this._navigator.stateService.zoomIn(n,s)}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keyZoom:e}}}class Vf extends zf{_enable(){this._keyDownSubscription=this._container.keyboardService.keyDown$.pipe(Vt(this._navigator.playService.playing$,this._navigator.playService.direction$,this._navigator.playService.speed$,this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$))),this._navigator.stateService.state$.pipe(De((e=>e===Df.Earth)),vt()))).subscribe((([t,i,n,r,s,a])=>{if(!(t.altKey||t.ctrlKey||t.metaKey)){switch(t.key){case"D":if(!t.shiftKey)return;const o=i?null:n===e.NavigationDirection.Next?e.NavigationDirection.Prev:n===e.NavigationDirection.Prev?e.NavigationDirection.Next:null;null!=o&&this._navigator.playService.setDirection(o);break;case" ":if(t.shiftKey)return;if(!a)if(i)this._navigator.playService.stop();else for(let e of s.edges)e.data.direction===n&&this._navigator.playService.play();break;case"<":this._navigator.playService.setSpeed(r-.05);break;case">":this._navigator.playService.setSpeed(r+.05);break;default:return}t.preventDefault()}}))}_disable(){this._keyDownSubscription.unsubscribe()}_getConfiguration(e){return{keyPlay:e}}}class Hf extends sf{constructor(e,t,i){super(e,t,i),this._keyPlayHandler=new Vf(this,t,i),this._keySequenceNavigationHandler=new Ff(this,t,i),this._keySpatialNavigationHandler=new Bf(this,t,i,new Du),this._keyZoomHandler=new Uf(this,t,i,new hf)}get keyPlay(){return this._keyPlayHandler}get keySequenceNavigation(){return this._keySequenceNavigationHandler}get keySpatialNavigation(){return this._keySpatialNavigationHandler}get keyZoom(){return this._keyZoomHandler}_activate(){this._subscriptions.push(this._configuration$.subscribe((e=>{e.keyPlay?this._keyPlayHandler.enable():this._keyPlayHandler.disable(),e.keySequenceNavigation?this._keySequenceNavigationHandler.enable():this._keySequenceNavigationHandler.disable(),e.keySpatialNavigation?this._keySpatialNavigationHandler.enable():this._keySpatialNavigationHandler.disable(),e.keyZoom?this._keyZoomHandler.enable():this._keyZoomHandler.disable()})))}_deactivate(){this._subscriptions.unsubscribe(),this._keyPlayHandler.disable(),this._keySequenceNavigationHandler.disable(),this._keySpatialNavigationHandler.disable(),this._keyZoomHandler.disable()}_getDefaultConfiguration(){return{keyPlay:!0,keySequenceNavigation:!0,keySpatialNavigation:!0,keyZoom:!0}}}Hf.componentName="keyboard";class jf{constructor(e,t){this._needsRender=!1,this._interactiveObjects=[],this._markers={},this._objectMarkers={},this._raycaster=t||new su,this._scene=e||new ch}get markers(){return this._markers}get needsRender(){return this._needsRender}add(e,t){e.id in this._markers&&this._dispose(e.id),e.createGeometry(t),this._scene.add(e.geometry),this._markers[e.id]=e;for(let t of e.getInteractiveObjects())this._interactiveObjects.push(t),this._objectMarkers[t.uuid]=e.id;this._needsRender=!0}clear(){for(const e in this._markers)this._markers.hasOwnProperty&&this._dispose(e);this._needsRender=!0}get(e){return this._markers[e]}getAll(){return Object.keys(this._markers).map((e=>this._markers[e]))}has(e){return e in this._markers}intersectObjects([e,t],i){this._raycaster.setFromCamera(new zi(e,t),i);const n=this._raycaster.intersectObjects(this._interactiveObjects);for(const e of n)if(e.object.uuid in this._objectMarkers)return this._objectMarkers[e.object.uuid];return null}lerpAltitude(e,t,i){e in this._markers&&(this._markers[e].lerpAltitude(t,i),this._needsRender=!0)}remove(e){e in this._markers&&(this._dispose(e),this._needsRender=!0)}render(e,t){t.render(this._scene,e),this._needsRender=!1}update(e,t,i){if(!(e in this._markers))return;this._markers[e].updatePosition(t,i),this._needsRender=!0}_dispose(e){const t=this._markers[e];this._scene.remove(t.geometry);for(let i of t.getInteractiveObjects()){const t=this._interactiveObjects.indexOf(i);-1!==t?this._interactiveObjects.splice(t,1):console.warn(`Object does not exist (${i.id}) for ${e}`),delete this._objectMarkers[i.uuid]}t.disposeGeometry(),delete this._markers[e]}}class Gf extends sf{constructor(e,t,i){super(e,t,i),this._graphCalculator=new Mu,this._markerScene=new jf,this._markerSet=new Vu,this._viewportCoords=new hf,this._relativeGroundAltitude=-2}add(e){this._markerSet.add(e)}fire(e,t){super.fire(e,t)}get(e){return this._markerSet.get(e)}getAll(){return this._markerSet.getAll()}getMarkerIdAt(e){return new Promise(((t,i)=>{this._container.renderService.renderCamera$.pipe(St(),De((t=>{const i=this._viewportCoords.canvasToViewport(e[0],e[1],this._container.container);return this._markerScene.intersectObjects(i,t.perspective)}))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}has(e){return this._markerSet.has(e)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}remove(e){this._markerSet.remove(e)}removeAll(){this._markerSet.removeAll()}_activate(){const e=this._navigator.stateService.currentState$.pipe(De((e=>e.state.camera.position.z+this._relativeGroundAltitude)),vt(((e,t)=>Math.abs(e-t)<.01)),Rt(1),U()),t=Ve(e,this._navigator.stateService.reference$).pipe(St(),De((()=>{})),Rt(1),U()),i=this._configuration$.pipe(De((e=>({visibleBBoxSize:Math.max(1,Math.min(200,e.visibleBBoxSize))})))),n=this._navigator.stateService.currentImage$.pipe(De((e=>e.lngLat)),Rt(1),U()),r=Ve(i,n).pipe(De((([e,t])=>this._graphCalculator.boundingBoxCorners(t,e.visibleBBoxSize/2))),Rt(1),U()),s=Ve(Ze(Ce(this._markerSet),this._markerSet.changed$),r).pipe(De((([e,t])=>e.search(t)))),a=this._subscriptions;a.push(t.pipe(zt((()=>s.pipe(Vt(this._navigator.stateService.reference$,e))))).subscribe((([e,t,i])=>{const n=this._markerScene,r=n.markers,s=Object.assign({},r);for(const a of e)if(a.id in r)delete s[a.id];else{const e=_u(a.lngLat.lng,a.lngLat.lat,t.alt+i,t.lng,t.lat,t.alt);n.add(a,e)}for(const e in s)s.hasOwnProperty(e)&&n.remove(e)}))),a.push(t.pipe(zt((()=>this._markerSet.updated$.pipe(Vt(r,this._navigator.stateService.reference$,e))))).subscribe((([e,[t,i],n,r])=>{const s=this._markerScene;for(const a of e){const e=s.has(a.id),o=a.lngLat.lat>t.lat&&a.lngLat.lat<i.lat&&a.lngLat.lng>t.lng&&a.lngLat.lng<i.lng;if(o){const e=_u(a.lngLat.lng,a.lngLat.lat,n.alt+r,n.lng,n.lat,n.alt);s.add(a,e)}else!o&&e&&s.remove(a.id)}}))),a.push(this._navigator.stateService.reference$.pipe($t(1),Vt(e)).subscribe((([e,t])=>{const i=this._markerScene;for(const n of i.getAll()){const r=_u(n.lngLat.lng,n.lngLat.lat,e.alt+t,e.lng,e.lat,e.alt);i.update(n.id,r)}}))),a.push(e.pipe($t(1),Vt(this._navigator.stateService.reference$,n)).subscribe((([e,t,i])=>{const n=this._markerScene,r=_u(i.lng,i.lat,t.alt+e,t.lng,t.lat,t.alt);for(const i of n.getAll()){const s=_u(i.lngLat.lng,i.lngLat.lat,t.alt+e,t.lng,t.lat,t.alt),a=s[0]-r[0],o=s[1]-r[1],h=Math.sqrt(a*a+o*o);h>50||n.lerpAltitude(i.id,e,Math.min(1,Math.max(0,1.2-1.2*h/50)))}}))),a.push(this._navigator.stateService.currentState$.pipe(De((e=>{const t=this._markerScene;return{name:this._name,renderer:{frameId:e.id,needsRender:t.needsRender,render:t.render.bind(t),pass:yf.Opaque}}}))).subscribe(this._container.glRenderer.render$));const o=Ve(this._container.renderService.renderCamera$,this._container.mouseService.mouseMove$).pipe(De((([e,t])=>{const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(t,i),s=this._viewportCoords.canvasToViewport(n,r,i);return this._markerScene.intersectObjects(s,e.perspective)})),Rt(1),U()),h=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).pipe(De((()=>!0))),c=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragEnd$).pipe(De((()=>!1))),l=it(h,c).pipe(Ot(!1));a.push(it(h.pipe(Vt(o)),Ve(c,Ce(null))).pipe(Ot([!1,null]),At()).subscribe((([e,t])=>{const i=t[0],n=i?"markerdragstart":"markerdragend",r=i?t[1]:e[1],s={marker:this._markerScene.get(r),target:this,type:n};this.fire(n,s)})));const u=it(this._container.mouseService.mouseDown$.pipe(De((()=>!0))),this._container.mouseService.documentMouseUp$.pipe(De((()=>!1)))).pipe(Ot(!1));a.push(Ve(this._container.mouseService.active$,o.pipe(vt()),u,l).pipe(De((([e,t,i,n])=>!e&&null!=t&&i||n)),vt()).subscribe((e=>{e?(this._container.mouseService.claimMouse(this._name,1),this._container.mouseService.claimWheel(this._name,1)):(this._container.mouseService.unclaimMouse(this._name),this._container.mouseService.unclaimWheel(this._name))})));const d=this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$).pipe(Vt(o,this._container.renderService.renderCamera$),De((([e,t,i])=>{const n=this._markerScene.get(t),r=this._container.container,[s,a]=this._viewportCoords.projectToCanvas(n.geometry.position.toArray(),r,i.perspective),[o,h]=this._viewportCoords.canvasPosition(e,r);return[n,[o-s,h-a],i]})),Rt(1),U());a.push(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$).pipe(Vt(d,this._navigator.stateService.reference$,i)).subscribe((([e,[t,i,n],r,s])=>{if(!this._markerScene.has(t.id))return;const a=this._container.container,[o,h]=this._viewportCoords.canvasPosition(e,a),c=o-i[0],l=h-i[1],[u,d]=this._viewportCoords.canvasToViewport(c,l,a),p=new Ki(u,d,1).unproject(n.perspective).sub(n.perspective.position).normalize(),m=Math.min(this._relativeGroundAltitude/p.z,s.visibleBBoxSize/2-.1);if(m<0)return;const f=p.clone().multiplyScalar(m).add(n.perspective.position);f.z=n.perspective.position.z+this._relativeGroundAltitude;const[g,_]=vu(f.x,f.y,f.z,r.lng,r.lat,r.alt);this._markerScene.update(t.id,f.toArray(),{lat:_,lng:g}),this._markerSet.update(t);const v="markerposition",y={marker:t,target:this,type:v};this.fire(v,y)})))}_deactivate(){this._subscriptions.unsubscribe(),this._markerScene.clear()}_getDefaultConfiguration(){return{visibleBBoxSize:100}}}function Wf(e,t){return e.x<=Math.max(t.p1.x,t.p2.x)&&e.x>=Math.min(t.p1.x,t.p2.x)&&e.y>=Math.max(t.p1.y,t.p2.y)&&e.y>=Math.min(t.p1.y,t.p2.y)}function qf(e,t){const i=e.p2.x-e.p1.x,n=e.p2.y-e.p1.y,r=t.p2.x-t.p1.x,s=t.p2.y-t.p1.y,a=i*s-n*r;return a*a<1e-10*(i*i+n*n)*(r*r+s*s)}function Xf(e,t,i){const n=(t.y-e.y)*(i.x-t.x)-(i.y-t.y)*(t.x-e.x);return(r=n)>0?1:r<0?-1:0;var r}function Zf(e,t){if(qf(e,t))return!1;const i=Xf(e.p1,e.p2,t.p1),n=Xf(e.p1,e.p2,t.p2),r=Xf(t.p1,t.p2,e.p1),s=Xf(t.p1,t.p2,e.p2);return i!==n&&r!==s||(!(0!==i||!Wf(t.p1,e))||(!(0!==n||!Wf(t.p2,e))||(!(0!==r||!Wf(e.p1,t))||!(0!==s||!Wf(e.p2,t)))))}function Yf(e,t){if(qf(e,t))return;const i=e.p1.x,n=e.p2.x,r=e.p1.y,s=e.p2.y,a=t.p1.x,o=t.p2.x,h=t.p1.y,c=t.p2.y,l=(i-n)*(h-c)-(r-s)*(a-o);return{x:((i*s-r*n)*(a-o)-(i-n)*(a*c-h*o))/l,y:((i*s-r*n)*(h-c)-(r-s)*(a*c-h*o))/l}}function Jf(e,t){return e>=-1&&e<=1&&t>=-1&&t<=1}function Kf(e,t){return e>=0&&e<=1&&t>=0&&t<=1}function Qf(e,t,i){const n=function(e){let t=[],i=[[0,0],[1,0],[1,1],[0,1]],n=[[1,0],[0,1],[-1,0],[0,-1]];for(let r=0;r<4;++r){let s=i[r],a=n[r];for(let i=0;i<e;++i)t.push([s[0]+a[0]*i/e,s[1]+a[1]*i/e])}return t}(100).map((n=>i.basicToViewportSafe(n[0],n[1],e,t))),r=[],s=[{x:-1,y:1},{x:1,y:1},{x:1,y:-1},{x:-1,y:-1}],a=[!1,!1,!1,!1];for(let e=0;e<n.length;e++){const t=n[e],i=n[(e+1)%n.length];if(null===t)continue;if(null===i){Jf(t[0],t[1])&&r.push(t);continue}const[o,h]=t,[c,l]=i;if(Jf(o,h))if(Jf(c,l))r.push(t);else for(let e=0;e<4;e++){const i={p1:{x:o,y:h},p2:{x:c,y:l}},n={p1:s[e],p2:s[(e+1)%4]};if(Zf(i,n)){const s=Yf(i,n);r.push(t,[s.x,s.y]),a[e]=!0}}}const[o,h]=i.viewportToBasic(-1,1,e,t),[c,l]=i.viewportToBasic(1,1,e,t),[u,d]=i.viewportToBasic(1,-1,e,t),[p,m]=i.viewportToBasic(-1,-1,e,t);Kf(o,h)&&(a[3]=a[0]=!0),Kf(c,l)&&(a[0]=a[1]=!0),Kf(u,d)&&(a[1]=a[2]=!0),Kf(p,m)&&(a[2]=a[3]=!0);const f=[-1,-1,1,1];for(let e of r){const t=e[0],i=e[1];t>f[1]&&(f[1]=t),t<f[3]&&(f[3]=t),i>f[0]&&(f[0]=i),i<f[2]&&(f[2]=i)}const g=[1,1,-1,-1],_=[];for(let e=0;e<4;e++)a[e]?_.push(0):_.push(Math.abs(g[e]-f[e]));return _}Gf.componentName="marker";class eg extends zf{constructor(e,t,i,n,r){super(e,t,i),this._spatial=r,this._viewportCoords=n}_enable(){const e=this._navigator.stateService.currentState$.pipe(De((e=>e.state.alpha<1)),vt());this._bounceSubscription=Ve(e,this._navigator.stateService.inTranslation$,this._container.mouseService.active$,this._container.touchService.active$).pipe(De((e=>e[0]||e[1]||e[2]||e[3])),vt(),zt((e=>e?ie():Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$.pipe(St())))),Vt(this._navigator.panService.panImages$)).subscribe((([[e,t],i])=>{if(!t.hasValidScale&&e.camera.focal<.1)return;if(0===e.perspective.aspect||e.perspective.aspect===Number.POSITIVE_INFINITY)return;const n=Qf(t,e.perspective,this._viewportCoords),r=this._viewportCoords.viewportToBasic(0,0,t,e.perspective);(r[0]<0||r[0]>1)&&i.length>0&&(n[0]=n[2]=0);for(const[,t]of i){const i=Qf(t,e.perspective,this._viewportCoords);for(let e=1;e<n.length;e+=2)i[e]<n[e]&&(n[e]=i[e])}if(Math.max(...n)<.01)return;const s=n[1]-n[3],a=n[0]-n[2],o=this._viewportCoords.unprojectFromViewport(0,0,e.perspective).sub(e.perspective.position),h=this._viewportCoords.unprojectFromViewport(s,0,e.perspective).sub(e.perspective.position),c=this._viewportCoords.unprojectFromViewport(0,a,e.perspective).sub(e.perspective.position);let l=(s>0?1:-1)*h.angleTo(o),u=(a>0?1:-1)*c.angleTo(o);const d=Math.PI/60;l=this._spatial.clamp(.1*l,-d,d),u=this._spatial.clamp(.1*u,-d,d),this._navigator.stateService.rotateUnbounded({phi:l,theta:u})}))}_disable(){this._bounceSubscription.unsubscribe()}_getConfiguration(){return{}}}class tg{static filteredPairwiseMouseDrag$(e,t){return this._filteredPairwiseMouseDrag$(e,t,t.mouseDragStart$,t.mouseDrag$,t.mouseDragEnd$)}static filteredPairwiseMouseRightDrag$(e,t){return this._filteredPairwiseMouseDrag$(e,t,t.mouseRightDragStart$,t.mouseRightDrag$,t.mouseRightDragEnd$)}static _filteredPairwiseMouseDrag$(e,t,i,n,r){return t.filtered$(e,i).pipe(zt((i=>it(Ze(Ce(i),t.filtered$(e,n)),t.filtered$(e,r).pipe(De((()=>null)))).pipe(Bt((e=>!!e)),Ot(null)))),At(),st((e=>null!=e[0]&&null!=e[1])))}}class ig extends zf{constructor(e,t,i,n,r){super(e,t,i),this._spatial=r,this._viewportCoords=n}_enable(){let e=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragStart$).pipe(De((()=>!0)),Dt()),t=this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$).pipe(De((()=>!1)),Dt());this._activeMouseSubscription=it(e,t).subscribe(this._container.mouseService.activate$);const i=it(e,t).pipe(zt((e=>e?this._container.mouseService.documentMouseMove$:ie())));this._preventDefaultSubscription=it(i,this._container.touchService.touchMove$).subscribe((e=>{e.preventDefault()}));let n=this._container.touchService.singleTouchDragStart$.pipe(De((()=>!0))),r=this._container.touchService.singleTouchDragEnd$.pipe(De((()=>!1)));this._activeTouchSubscription=it(n,r).subscribe(this._container.touchService.activate$);const s=this._navigator.stateService.currentState$.pipe(De((e=>$u(e.state.currentImage.cameraType)||e.state.imagesAhead<1)),vt(),zt((e=>{if(!e)return ie();const t=tg.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService),i=it(this._container.touchService.singleTouchDragStart$,this._container.touchService.singleTouchDrag$,this._container.touchService.singleTouchDragEnd$.pipe(De((()=>null)))).pipe(De((e=>null!=e&&e.touches.length>0?e.touches[0]:null)),At(),st((e=>null!=e[0]&&null!=e[1])));return it(t,i)})),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,this._navigator.panService.panImages$),De((([e,t,i,n])=>{let r=e[0],s=e[1],a=s.clientX-r.clientX,o=s.clientY-r.clientY,h=this._container.container,[c,l]=this._viewportCoords.canvasPosition(s,h),u=this._viewportCoords.unprojectFromCanvas(c,l,h,t.perspective).sub(t.perspective.position),d=this._viewportCoords.unprojectFromCanvas(c-a,l,h,t.perspective).sub(t.perspective.position),p=this._viewportCoords.unprojectFromCanvas(c,l-o,h,t.perspective).sub(t.perspective.position),m=(a>0?1:-1)*d.angleTo(u),f=(o>0?-1:1)*p.angleTo(u);const g=Qf(i,t.perspective,this._viewportCoords);for(const[,e]of n){const i=Qf(e,t.perspective,this._viewportCoords);for(let e=0;e<g.length;e++)i[e]<g[e]&&(g[e]=i[e])}return g[0]>0&&f<0&&(f/=Math.max(1,200*g[0])),g[2]>0&&f>0&&(f/=Math.max(1,200*g[2])),g[1]>0&&m<0&&(m/=Math.max(1,200*g[1])),g[3]>0&&m>0&&(m/=Math.max(1,200*g[3])),{phi:m,theta:f}})),Dt());var a;this._rotateWithoutInertiaSubscription=s.subscribe((e=>{this._navigator.stateService.rotateWithoutInertia(e)})),this._rotateSubscription=s.pipe(Lt(((e,t)=>(this._drainBuffer(e),e.push([Date.now(),t]),e)),[]),(a=it(this._container.mouseService.filtered$(this._component.name,this._container.mouseService.mouseDragEnd$),this._container.touchService.singleTouchDragEnd$),F((function(e,t){var i=!1,n=null;e.subscribe(new B(t,(function(e){i=!0,n=e}))),a.subscribe(new B(t,(function(){if(i){i=!1;var e=n;n=null,t.next(e)}}),w))}))),De((e=>{const t=this._drainBuffer(e.slice()),i={phi:0,theta:0};for(const e of t)i.phi+=e[1].phi,i.theta+=e[1].theta;const n=t.length;n>0&&(i.phi/=n,i.theta/=n);const r=Math.PI/18;return i.phi=this._spatial.clamp(i.phi,-r,r),i.theta=this._spatial.clamp(i.theta,-r,r),i}))).subscribe((e=>{this._navigator.stateService.rotate(e)}))}_disable(){this._activeMouseSubscription.unsubscribe(),this._activeTouchSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._rotateSubscription.unsubscribe(),this._rotateWithoutInertiaSubscription.unsubscribe(),this._activeMouseSubscription=null,this._activeTouchSubscription=null,this._preventDefaultSubscription=null,this._rotateSubscription=null}_getConfiguration(e){return{dragPan:e}}_drainBuffer(e){const t=Date.now();for(;e.length>0&&t-e[0][0]>50;)e.shift();return e}}class ng extends zf{constructor(e,t,i,n,r){super(e,t,i),this._spatial=r,this._viewportCoords=n,this._subscriptions=new rf}_enable(){const e=this._navigator.stateService.state$.pipe(De((e=>e===Df.Earth)),Rt(1),U()),t=this._subscriptions;t.push(e.pipe(zt((e=>e?this._container.mouseService.mouseWheel$:ie()))).subscribe((e=>{e.preventDefault()}))),t.push(e.pipe(zt((e=>e?tg.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService).pipe(st((([e,t])=>!(e.ctrlKey&&t.ctrlKey)))):ie())),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$),De((([[e,t],i,n])=>{const r=[0,0,1],s=[0,0,-2],a=this._planeIntersection(t,r,s,i.perspective,this._container.container),o=this._planeIntersection(e,r,s,i.perspective,this._container.container);if(!a||!o)return null;return(new Ki).subVectors(a,o).multiplyScalar(-1).toArray()})),st((e=>!!e))).subscribe((e=>{this._navigator.stateService.truck(e)}))),t.push(e.pipe(zt((e=>e?tg.filteredPairwiseMouseDrag$(this._component.name,this._container.mouseService).pipe(st((([e,t])=>e.ctrlKey&&t.ctrlKey))):ie())),De((([e,t])=>this._mousePairToRotation(e,t)))).subscribe((e=>{this._navigator.stateService.orbit(e)}))),t.push(e.pipe(zt((e=>e?tg.filteredPairwiseMouseRightDrag$(this._component.name,this._container.mouseService).pipe(st((([e,t])=>!e.ctrlKey&&!t.ctrlKey))):ie())),De((([e,t])=>this._mousePairToRotation(e,t)))).subscribe((e=>{this._navigator.stateService.orbit(e)}))),t.push(e.pipe(zt((e=>e?this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$):ie())),De((e=>{let t=e.deltaY;1===e.deltaMode?t*=40:2===e.deltaMode&&(t*=800);return-t/this._viewportCoords.containerToCanvas(this._container.container)[1]}))).subscribe((e=>{this._navigator.stateService.dolly(e)})))}_disable(){this._subscriptions.unsubscribe()}_getConfiguration(){return{}}_eventToViewport(e,t){const i=this._viewportCoords.canvasPosition(e,t);return this._viewportCoords.canvasToViewport(i[0],i[1],t)}_mousePairToRotation(e,t){const[i,n]=this._eventToViewport(t,this._container.container),[r,s]=this._eventToViewport(e,this._container.container);return{phi:(r-i)*Math.PI,theta:(n-s)*Math.PI/2}}_planeIntersection(e,t,i,n,r){const[s,a]=this._viewportCoords.canvasPosition(e,r),o=this._viewportCoords.unprojectFromCanvas(s,a,r,n).sub(n.position).normalize();if(Math.abs(this._spatial.angleToPlane(o.toArray(),t))<Math.PI/90)return null;const h=n.position.clone(),c=(new Ki).fromArray(t),l=(new Ki).fromArray(i),u=(new Ki).subVectors(l,h).dot(c)/o.clone().dot(c),d=(new Ki).addVectors(h,o.multiplyScalar(u));return this._viewportCoords.worldToCamera(d.toArray(),n)[2]>0?null:d}}class rg extends zf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n}_enable(){this._container.mouseService.claimWheel(this._component.name,0),this._preventDefaultSubscription=this._container.mouseService.mouseWheel$.subscribe((e=>{e.preventDefault()})),this._zoomSubscription=this._container.mouseService.filteredWheel$(this._component.name,this._container.mouseService.mouseWheel$).pipe(Vt(this._navigator.stateService.currentState$,((e,t)=>[e,t])),st((e=>{let t=e[1].state;return $u(t.currentImage.cameraType)||t.imagesAhead<1})),De((e=>e[0])),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$,((e,t,i)=>[e,t,i]))).subscribe((e=>{let t=e[0],i=e[1],n=e[2],r=this._container.container,[s,a]=this._viewportCoords.canvasPosition(t,r),o=this._viewportCoords.unprojectFromCanvas(s,a,r,i.perspective),h=n.projectBasic(o.toArray()),c=t.deltaY;1===t.deltaMode?c*=40:2===t.deltaMode&&(c*=800);let l=-3*c/this._viewportCoords.containerToCanvas(r)[1];this._navigator.stateService.zoomIn(l,h)}))}_disable(){this._container.mouseService.unclaimWheel(this._component.name),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null}_getConfiguration(e){return{scrollZoom:e}}}class sg extends zf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n}_enable(){this._preventDefaultSubscription=this._container.touchService.pinch$.subscribe((e=>{e.originalEvent.preventDefault()}));let e=this._container.touchService.pinchStart$.pipe(De((e=>!0))),t=this._container.touchService.pinchEnd$.pipe(De((e=>!1)));this._activeSubscription=it(e,t).subscribe(this._container.touchService.activate$),this._zoomSubscription=this._container.touchService.pinch$.pipe(Vt(this._navigator.stateService.currentState$),st((e=>{let t=e[1].state;return $u(t.currentImage.cameraType)||t.imagesAhead<1})),De((e=>e[0])),Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i])=>{let n=this._container.container,[r,s]=this._viewportCoords.canvasPosition(e,n),a=this._viewportCoords.unprojectFromCanvas(r,s,n,t.perspective),o=i.projectBasic(a.toArray());const[h,c]=this._viewportCoords.containerToCanvas(n);let l=3*e.distanceChange/Math.min(h,c);this._navigator.stateService.zoomIn(l,o)}))}_disable(){this._activeSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._zoomSubscription.unsubscribe(),this._preventDefaultSubscription=null,this._zoomSubscription=null}_getConfiguration(e){return{touchZoom:e}}}class ag extends sf{constructor(e,t,i){super(e,t,i);const n=new Du,r=new hf;this._bounceHandler=new eg(this,t,i,r,n),this._dragPanHandler=new ig(this,t,i,r,n),this._earthControlHandler=new ng(this,t,i,r,n),this._scrollZoomHandler=new rg(this,t,i,r),this._touchZoomHandler=new sg(this,t,i,r)}get dragPan(){return this._dragPanHandler}get earthControl(){return this._earthControlHandler}get scrollZoom(){return this._scrollZoomHandler}get touchZoom(){return this._touchZoomHandler}_activate(){this._bounceHandler.enable(),this._subscriptions.push(this._configuration$.subscribe((e=>{e.dragPan?this._dragPanHandler.enable():this._dragPanHandler.disable(),e.earthControl?this._earthControlHandler.enable():this._earthControlHandler.disable(),e.scrollZoom?this._scrollZoomHandler.enable():this._scrollZoomHandler.disable(),e.touchZoom?this._touchZoomHandler.enable():this._touchZoomHandler.disable()}))),this._container.mouseService.claimMouse(this._name,0)}_deactivate(){this._container.mouseService.unclaimMouse(this._name),this._subscriptions.unsubscribe(),this._bounceHandler.disable(),this._dragPanHandler.disable(),this._earthControlHandler.disable(),this._scrollZoomHandler.disable(),this._touchZoomHandler.disable()}_getDefaultConfiguration(){return{dragPan:!0,earthControl:!0,scrollZoom:!0,touchZoom:!0}}}ag.componentName="pointer";class og{constructor(e){this._document=e||document}get document(){return this._document}createElement(e,t,i){const n=this._document.createElement(e);return t&&(n.className=t),i&&i.appendChild(n),n}}class hg extends sf{constructor(e,t,i,n){super(e,t,i),this._dom=n||new og,this._popups=[],this._added$=new j,this._popups$=new j}add(e){for(const t of e)-1===this._popups.indexOf(t)&&(this._popups.push(t),this._activated&&t.setParentContainer(this._popupContainer));this._added$.next(e),this._popups$.next(this._popups)}getAll(){return this._popups.slice()}remove(e){for(const t of e)this._remove(t);this._popups$.next(this._popups)}removeAll(){for(const e of this._popups.slice())this._remove(e);this._popups$.next(this._popups)}_activate(){this._popupContainer=this._dom.createElement("div","mapillary-popup-container",this._container.container);for(const e of this._popups)e.setParentContainer(this._popupContainer);const e=this._subscriptions;e.push(Ve(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$).subscribe((([e,t,i])=>{for(const n of this._popups)n.update(e,t,i)})));const t=this._popups$.pipe(Ot(this._popups),zt((e=>ge(e).pipe(We((e=>e.changed$))))),De((e=>[e])));e.push(it(this._added$,t).pipe(Vt(this._container.renderService.renderCamera$,this._container.renderService.size$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i,n])=>{for(const r of e)r.update(t,i,n)})))}_deactivate(){this._subscriptions.unsubscribe();for(const e of this._popups)e.remove();this._container.container.removeChild(this._popupContainer),delete this._popupContainer}_getDefaultConfiguration(){return{}}_remove(e){const t=this._popups.indexOf(e);if(-1===t)return;const i=this._popups.splice(t,1)[0];this._activated&&i.remove()}}hg.componentName="popup",function(e){e[e.Sequence=0]="Sequence",e[e.Spatial=1]="Spatial"}(Nf||(Nf={})),function(e){e[e.Default=0]="Default",e[e.Playback=1]="Playback",e[e.Timeline=2]="Timeline"}($f||($f={}));class cg{constructor(e){this._container=e,this._minThresholdWidth=320,this._maxThresholdWidth=1480,this._minThresholdHeight=240,this._maxThresholdHeight=820,this._stepperDefaultWidth=108,this._controlsDefaultWidth=88,this._defaultHeight=30,this._expandControls=!1,this._mode=$f.Default,this._speed=.5,this._changingSpeed=!1,this._index=null,this._changingPosition=!1,this._mouseEnterDirection$=new j,this._mouseLeaveDirection$=new j,this._notifyChanged$=new j,this._notifyChangingPositionChanged$=new j,this._notifySpeedChanged$=new j,this._notifyIndexChanged$=new j}get changed$(){return this._notifyChanged$}get changingPositionChanged$(){return this._notifyChangingPositionChanged$}get speed$(){return this._notifySpeedChanged$}get index$(){return this._notifyIndexChanged$}get mouseEnterDirection$(){return this._mouseEnterDirection$}get mouseLeaveDirection$(){return this._mouseLeaveDirection$}activate(){this._changingSubscription||(this._changingSubscription=it(this._container.mouseService.documentMouseUp$,this._container.touchService.touchEnd$.pipe(st((e=>0===e.touches.length)))).subscribe((()=>{this._changingSpeed&&(this._changingSpeed=!1),this._changingPosition&&this._setChangingPosition(!1)})))}deactivate(){this._changingSubscription&&(this._changingSpeed=!1,this._changingPosition=!1,this._expandControls=!1,this._mode=$f.Default,this._changingSubscription.unsubscribe(),this._changingSubscription=null)}render(e,t,i,n,r,s,a,o,h){if(!1===t.visible)return tf.h("div.mapillary-sequence-container",{},[]);const c=this._createStepper(e,t,a,i,o,h),l=this._createSequenceControls(i),u=this._createPlaybackControls(i,n,o,t),d=this._createTimelineControls(i,r,s);return tf.h("div.mapillary-sequence-container",[c,l,u,d])}getContainerWidth(e,t){let i=t.minWidth,n=t.maxWidth;n<i&&(n=i);let r=(e.width-this._minThresholdWidth)/(this._maxThresholdWidth-this._minThresholdWidth),s=(e.height-this._minThresholdHeight)/(this._maxThresholdHeight-this._minThresholdHeight);return i+Math.max(0,Math.min(1,Math.min(r,s)))*(n-i)}_createPositionInput(e,t){this._index=e;const i=e=>{this._index=Number(e.target.value),this._notifyIndexChanged$.next(this._index)},n=this._container.domContainer.getBoundingClientRect(),r=e=>{e.stopPropagation(),this._setChangingPosition(!0)},s=e=>{!0===this._changingPosition&&e.stopPropagation()},a={max:null!=t?t:1,min:0,onchange:i,oninput:i,onkeydown:e=>{"ArrowDown"!==e.key&&"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key||e.preventDefault()},onpointerdown:r,onpointermove:s,ontouchmove:s,ontouchstart:r,style:{width:`${Math.max(276,Math.min(410,5+.8*n.width))-65}px`},type:"range",value:null!=e?e:0},o=null==e||null==t||t<=1;o&&(a.disabled="true");const h=tf.h("input.mapillary-sequence-position",a,[]),c=o?".mapillary-sequence-position-container-inactive":".mapillary-sequence-position-container";return tf.h("div"+c,[h])}_createSpeedInput(e){this._speed=e;const t=e=>{this._speed=Number(e.target.value)/1e3,this._notifySpeedChanged$.next(this._speed)},i=this._container.domContainer.getBoundingClientRect(),n=Math.max(276,Math.min(410,5+.8*i.width))-160,r=e=>{this._changingSpeed=!0,e.stopPropagation()},s=e=>{!0===this._changingSpeed&&e.stopPropagation()},a=tf.h("input.mapillary-sequence-speed",{max:1e3,min:0,onchange:t,oninput:t,onkeydown:e=>{"ArrowDown"!==e.key&&"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key||e.preventDefault()},onpointerdown:r,onpointermove:s,ontouchmove:s,ontouchstart:r,style:{width:`${n}px`},type:"range",value:1e3*e},[]);return tf.h("div.mapillary-sequence-speed-container",[a])}_createPlaybackControls(t,i,n,r){if(this._mode!==$f.Playback)return tf.h("div.mapillary-sequence-playback",[]);const s=tf.h("div.mapillary-sequence-switch-icon.mapillary-sequence-icon-visible",[]),a=r.direction===e.NavigationDirection.Next?e.NavigationDirection.Prev:e.NavigationDirection.Next,o=r.playing,h={onclick:()=>{o||n.configure({direction:a})}},c=r.playing?".mapillary-sequence-switch-button-inactive":".mapillary-sequence-switch-button",l=tf.h("div"+c,h,[s]),u=tf.h("div.mapillary-sequence-slow-icon.mapillary-sequence-icon-visible",[]),d=tf.h("div.mapillary-sequence-slow-container",[u]),p=tf.h("div.mapillary-sequence-fast-icon.mapillary-sequence-icon-visible",[]),m=tf.h("div.mapillary-sequence-fast-container",[p]),f=tf.h("div.mapillary-sequence-close-icon.mapillary-sequence-icon-visible",[]),g={onclick:()=>{this._mode=$f.Default,this._notifyChanged$.next(this)}},_=tf.h("div.mapillary-sequence-close-button",g,[f]),v=[l,d,this._createSpeedInput(i),m,_],y={style:{top:`${Math.round(t/this._stepperDefaultWidth*this._defaultHeight+10)}px`}};return tf.h("div.mapillary-sequence-playback",y,v)}_createPlayingButton(t,i,n,r,s){let a=r.direction===e.NavigationDirection.Next&&null!=t||r.direction===e.NavigationDirection.Prev&&null!=i;a=a&&n;let o={onclick:r.playing?()=>{s.stop()}:a?()=>{s.play()}:null},h={};r.direction===e.NavigationDirection.Prev&&(h.style={transform:"rotate(180deg) translate(50%, 50%)"});let c=tf.h("div.mapillary-sequence-icon",h,[]),l=r.playing?"mapillary-sequence-stop":a?"mapillary-sequence-play":"mapillary-sequence-play-inactive";return tf.h("div."+l,o,[c])}_createSequenceControls(e){const t=Math.round(8/this._stepperDefaultWidth*e),i={onclick:()=>{this._expandControls=!this._expandControls,this._mode=$f.Default,this._notifyChanged$.next(this)},style:{"border-bottom-right-radius":`${t}px`,"border-top-right-radius":`${t}px`}},n=tf.h("div.mapillary-sequence-expander-bar",[]),r=tf.h("div.mapillary-sequence-expander-button",i,[n]),s=this._mode===$f.Playback?".mapillary-sequence-fast-icon-gray.mapillary-sequence-icon-visible":".mapillary-sequence-fast-icon",a=tf.h("div"+s,[]),o={onclick:()=>{this._mode=this._mode===$f.Playback?$f.Default:$f.Playback,this._notifyChanged$.next(this)}},h=tf.h("div.mapillary-sequence-playback-button",o,[a]),c=this._mode===$f.Timeline?".mapillary-sequence-timeline-icon-gray.mapillary-sequence-icon-visible":".mapillary-sequence-timeline-icon",l=tf.h("div"+c,[]),u={onclick:()=>{this._mode=this._mode===$f.Timeline?$f.Default:$f.Timeline,this._notifyChanged$.next(this)}},d=tf.h("div.mapillary-sequence-timeline-button",u,[l]),p={style:{height:this._defaultHeight/this._stepperDefaultWidth*e+"px",transform:`translate(${e/2+2}px, 0)`,width:this._controlsDefaultWidth/this._stepperDefaultWidth*e+"px"}},m=".mapillary-sequence-controls"+(this._expandControls?".mapillary-sequence-controls-expanded":"");return tf.h("div"+m,p,[h,d,r])}_createSequenceArrows(t,i,n,r,s){let a={onclick:null!=t?()=>{s.moveDir$(e.NavigationDirection.Next).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}:null,onpointerenter:()=>{this._mouseEnterDirection$.next(e.NavigationDirection.Next)},onpointerleave:()=>{this._mouseLeaveDirection$.next(e.NavigationDirection.Next)}};const o=Math.round(8/this._stepperDefaultWidth*n);let h={onclick:null!=i?()=>{s.moveDir$(e.NavigationDirection.Prev).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))}:null,onpointerenter:()=>{this._mouseEnterDirection$.next(e.NavigationDirection.Prev)},onpointerleave:()=>{this._mouseLeaveDirection$.next(e.NavigationDirection.Prev)},style:{"border-bottom-left-radius":`${o}px`,"border-top-left-radius":`${o}px`}},c=this._getStepClassName(e.NavigationDirection.Next,t,r.highlightId),l=this._getStepClassName(e.NavigationDirection.Prev,i,r.highlightId),u=tf.h("div.mapillary-sequence-icon",[]),d=tf.h("div.mapillary-sequence-icon",[]);return[tf.h("div."+l,h,[d]),tf.h("div."+c,a,[u])]}_createStepper(t,i,n,r,s,a){let o=null,h=null;for(let i of t.edges)i.data.direction===e.NavigationDirection.Next&&(o=i.target),i.data.direction===e.NavigationDirection.Prev&&(h=i.target);const c=this._createPlayingButton(o,h,n,i,s),l=this._createSequenceArrows(o,h,r,i,a);l.splice(1,0,c);const u={oncontextmenu:e=>{e.preventDefault()},style:{height:this._defaultHeight/this._stepperDefaultWidth*r+"px",width:r+"px"}};return tf.h("div.mapillary-sequence-stepper",u,l)}_createTimelineControls(e,t,i){if(this._mode!==$f.Timeline)return tf.h("div.mapillary-sequence-timeline",[]);const n=this._createPositionInput(t,i),r=tf.h("div.mapillary-sequence-close-icon.mapillary-sequence-icon-visible",[]),s={onclick:()=>{this._mode=$f.Default,this._notifyChanged$.next(this)}},a=tf.h("div.mapillary-sequence-close-button",s,[r]),o={style:{top:`${Math.round(e/this._stepperDefaultWidth*this._defaultHeight+10)}px`}};return tf.h("div.mapillary-sequence-timeline",o,[n,a])}_getStepClassName(t,i,n){let r=t===e.NavigationDirection.Next?"mapillary-sequence-step-next":"mapillary-sequence-step-prev";return null==i?r+="-inactive":n===i&&(r+="-highlight"),r}_setChangingPosition(e){this._changingPosition=e,this._notifyChangingPositionChanged$.next(e)}}class lg extends sf{constructor(e,t,i,n,r){super(e,t,i),this._sequenceDOMRenderer=n||new cg(t),this._scheduler=r,this._containerWidth$=new j,this._hoveredIdSubject$=new j,this._hoveredId$=this._hoveredIdSubject$.pipe(Dt()),this._navigator.playService.playing$.pipe($t(1),Vt(this._configuration$)).subscribe((([e,t])=>{const i="playing",n={playing:e,target:this,type:i};this.fire(i,n),e!==t.playing&&(e?this.play():this.stop())})),this._navigator.playService.direction$.pipe($t(1),Vt(this._configuration$)).subscribe((([e,t])=>{e!==t.direction&&this.configure({direction:e})}))}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}play(){this.configure({playing:!0})}stop(){this.configure({playing:!1})}_activate(){this._sequenceDOMRenderer.activate();const e=this._navigator.stateService.currentImage$.pipe(zt((e=>e.sequenceEdges$)),Rt(1),U()),t=this._navigator.stateService.currentImage$.pipe(vt(void 0,(e=>e.sequenceId)),zt((e=>Ze(Ce(null),this._navigator.graphService.cacheSequence$(e.sequenceId).pipe(Pt(3),ct((e=>(console.error("Failed to cache sequence",e),Ce(null)))))))),Ot(null),Rt(1),U()),i=this._subscriptions;i.push(t.subscribe());const n=this._sequenceDOMRenderer.index$.pipe(Vt(t),De((([e,t])=>null!=t?t.imageIds[e]:null)),st((e=>!!e)),vt(),It(),U());i.push(it(n.pipe(ft(100,this._scheduler)),n.pipe(ot(400,this._scheduler))).pipe(vt(),zt((e=>this._navigator.moveTo$(e).pipe(ct((()=>ie())))))).subscribe()),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(st((e=>e))).subscribe((()=>{this._navigator.graphService.setGraphMode(Nf.Sequence)}))),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(st((e=>!e))).subscribe((()=>{this._navigator.graphService.setGraphMode(Nf.Spatial)}))),this._navigator.graphService.graphMode$.pipe(zt((e=>e===Nf.Spatial?this._navigator.stateService.currentImage$.pipe(_t(2)):ie())),st((e=>!e.spatialEdges.cached)),zt((e=>this._navigator.graphService.cacheImage$(e.id).pipe(ct((()=>ie())))))).subscribe(),i.push(this._sequenceDOMRenderer.changingPositionChanged$.pipe(st((e=>e))).subscribe((()=>{this._navigator.playService.stop()}))),i.push(Ve(this._navigator.graphService.graphMode$,this._sequenceDOMRenderer.changingPositionChanged$.pipe(Ot(!1),vt())).pipe(Vt(this._navigator.stateService.currentImage$),zt((([[e,t],i])=>t&&e===Nf.Sequence?this._navigator.graphService.cacheSequenceImages$(i.sequenceId,i.id).pipe(Pt(3),ct((e=>(console.error("Failed to cache sequence images.",e),ie())))):ie()))).subscribe());const r=t.pipe(zt((e=>{if(!e)return Ce({index:null,max:null});let t=!0;return this._sequenceDOMRenderer.changingPositionChanged$.pipe(Ot(!1),vt(),zt((e=>{const i=!e&&t?0:1;return t=!1,e?n:this._navigator.stateService.currentImage$.pipe(De((e=>e.id)),vt(),$t(i))})),De((t=>{const i=e.imageIds.indexOf(t);return-1===i?{index:null,max:null}:{index:i,max:e.imageIds.length-1}})))}))),s=this._navigator.stateService.state$.pipe(De((e=>e===Df.Earth)),vt());i.push(Ve(e,this._configuration$,this._containerWidth$,this._sequenceDOMRenderer.changed$.pipe(Ot(this._sequenceDOMRenderer)),this._navigator.playService.speed$,r,s).pipe(De((([e,t,i,,n,r,s])=>{const a=this._sequenceDOMRenderer.render(e,t,i,n,r.index,r.max,!s,this,this._navigator);return{name:this._name,vNode:a}}))).subscribe(this._container.domRenderer.render$)),i.push(this._sequenceDOMRenderer.speed$.subscribe((e=>{this._navigator.playService.setSpeed(e)}))),i.push(this._configuration$.pipe(De((e=>e.direction)),vt()).subscribe((e=>{this._navigator.playService.setDirection(e)}))),i.push(Ve(this._container.renderService.size$,this._configuration$.pipe(vt(((e,t)=>e[0]===t[0]&&e[1]===t[1]),(e=>[e.minWidth,e.maxWidth])))).pipe(De((([e,t])=>this._sequenceDOMRenderer.getContainerWidth(e,t)))).subscribe(this._containerWidth$)),i.push(this._configuration$.pipe(De((e=>e.playing)),vt()).subscribe((e=>{e?this._navigator.playService.play():this._navigator.playService.stop()}))),i.push(this._sequenceDOMRenderer.mouseEnterDirection$.pipe(zt((t=>Ze(e.pipe(De((e=>{for(let i of e.edges)if(i.data.direction===t)return i.target;return null})),Ft(this._sequenceDOMRenderer.mouseLeaveDirection$)),Ce(null)))),vt()).subscribe(this._hoveredIdSubject$)),i.push(this._hoveredId$.subscribe((e=>{const t="hover",i={id:e,target:this,type:t};this.fire(t,i)})))}_deactivate(){this._subscriptions.unsubscribe(),this._sequenceDOMRenderer.deactivate()}_getDefaultConfiguration(){return{direction:e.NavigationDirection.Next,maxWidth:108,minWidth:70,playing:!1,visible:!0}}}lg.componentName="sequence",e.SliderConfigurationMode=void 0,(kf=e.SliderConfigurationMode||(e.SliderConfigurationMode={}))[kf.Motion=0]="Motion",kf[kf.Stationary=1]="Stationary";class ug{constructor(e,t,i,n,r,s,a,o,h,c){this._orientation=this._getValue(e,1);let l=null!=a?a.width:4,u=null!=a?a.height:3,d=this._orientation<5;this._width=this._getValue(t,d?l:u),this._height=this._getValue(i,d?u:l),this._basicAspect=d?this._width/this._height:this._height/this._width,this._basicWidth=d?t:i,this._basicHeight=d?i:t;const p=this._getCameraParameters(h,c),m=p[0],f=p[1],g=p[2];this._focal=this._getValue(m,1),this._scale=this._getValue(n,0),this._worldToCamera=this.createWorldToCamera(r,s),this._worldToCameraInverse=(new Rn).copy(this._worldToCamera).invert(),this._scaledWorldToCamera=this._createScaledWorldToCamera(this._worldToCamera,this._scale),this._scaledWorldToCameraInverse=(new Rn).copy(this._scaledWorldToCamera).invert(),this._basicWorldToCamera=this._createBasicWorldToCamera(this._worldToCamera,e),this._textureScale=o||[1,1],this._ck1=f||0,this._ck2=g||0,this._cameraType=c||"perspective",this._radialPeak=this._getRadialPeak(this._ck1,this._ck2)}get ck1(){return this._ck1}get ck2(){return this._ck2}get cameraType(){return this._cameraType}get basicAspect(){return this._basicAspect}get basicHeight(){return this._basicHeight}get basicRt(){return this._basicWorldToCamera}get basicWidth(){return this._basicWidth}get focal(){return this._focal}get height(){return this._height}get orientation(){return this._orientation}get rt(){return this._worldToCamera}get srt(){return this._scaledWorldToCamera}get srtInverse(){return this._scaledWorldToCameraInverse}get scale(){return this._scale}get hasValidScale(){return this._scale>.01&&this._scale<50}get radialPeak(){return this._radialPeak}get width(){return this._width}upVector(){let e=this._worldToCamera.elements;switch(this._orientation){case 1:return new Ki(-e[1],-e[5],-e[9]);case 3:return new Ki(e[1],e[5],e[9]);case 6:return new Ki(-e[0],-e[4],-e[8]);case 8:return new Ki(e[0],e[4],e[8]);default:return new Ki(-e[1],-e[5],-e[9])}}projectorMatrix(){let e=this._normalizedToTextureMatrix(),t=this._focal,i=(new Rn).set(t,0,0,0,0,t,0,0,0,0,0,0,0,0,1,0);return e.multiply(i),e.multiply(this._worldToCamera),e}projectBasic(e){let t=this.projectSfM(e);return this._sfmToBasic(t)}unprojectBasic(e,t,i){let n=this._basicToSfm(e);return this.unprojectSfM(n,t,i)}projectSfM(e){let t=new Xi(e[0],e[1],e[2],1);return t.applyMatrix4(this._worldToCamera),this._bearingToSfm([t.x,t.y,t.z])}unprojectSfM(e,t,i){const n=this._sfmToBearing(e),r=(i&&!$u(this._cameraType)?new Xi(t*n[0]/n[2],t*n[1]/n[2],t,1):new Xi(t*n[0],t*n[1],t*n[2],1)).applyMatrix4(this._worldToCameraInverse);return[r.x/r.w,r.y/r.w,r.z/r.w]}_sfmToBearing(e){if($u(this._cameraType)){let t=2*e[0]*Math.PI,i=2*-e[1]*Math.PI;return[Math.cos(i)*Math.sin(t),-Math.sin(i),Math.cos(i)*Math.cos(t)]}if(ku(this._cameraType)){let[t,i]=[e[0]/this._focal,e[1]/this._focal];const n=Math.sqrt(t*t+i*i);let r=n/this._distortionFromDistortedRadius(n,this._ck1,this._ck2,this._radialPeak),s=Math.cos(r),a=Math.sin(r);const o=n>1e-8?1/n:1;return[a*t*o,a*i*o,s]}{let[t,i]=[e[0]/this._focal,e[1]/this._focal];const n=Math.sqrt(t*t+i*i);let r=this._distortionFromDistortedRadius(n,this._ck1,this._ck2,this._radialPeak);let s=new Ki(t/r,i/r,1);return s.normalize(),[s.x,s.y,s.z]}}_distortionFromDistortedRadius(e,t,i,n){let r=1;for(let s=0;s<10;s++){let s=e/r;s>n&&(s=n),r=1+t*Math.pow(s,2)+i*Math.pow(s,4)}return r}_bearingToSfm(e){if($u(this._cameraType)){let t=e[0],i=e[1],n=e[2],r=Math.atan2(t,n),s=Math.atan2(-i,Math.sqrt(t*t+n*n));return[r/(2*Math.PI),-s/(2*Math.PI)]}if(ku(this._cameraType)){if(e[2]>0){const[t,i,n]=e,r=Math.sqrt(t*t+i*i);let s=Math.atan2(r,n);s>this._radialPeak&&(s=this._radialPeak);const a=1+Math.pow(s,2)*(this._ck1+Math.pow(s,2)*this._ck2),o=this._focal*a*s/r;return[o*t,o*i]}return[e[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,e[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]}if(e[2]>0){let[t,i]=[e[0]/e[2],e[1]/e[2]],n=t*t+i*i;const r=Math.pow(this._radialPeak,2);n>r&&(n=r);const s=1+this._ck1*n+this._ck2*Math.pow(n,2);return[this._focal*s*t,this._focal*s*i]}return[e[0]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY,e[1]<0?Number.NEGATIVE_INFINITY:Number.POSITIVE_INFINITY]}_basicToSfm(e){let t,i;switch(this._orientation){case 1:t=e[0],i=e[1];break;case 3:t=1-e[0],i=1-e[1];break;case 6:t=e[1],i=1-e[0];break;case 8:t=1-e[1],i=e[0];break;default:t=e[0],i=e[1]}let n=this._width,r=this._height,s=Math.max(n,r);return[t*n/s-n/s/2,i*r/s-r/s/2]}_sfmToBasic(e){let t,i,n=this._width,r=this._height,s=Math.max(n,r),a=(e[0]+n/s/2)/n*s,o=(e[1]+r/s/2)/r*s;switch(this._orientation){case 1:t=a,i=o;break;case 3:t=1-a,i=1-o;break;case 6:t=1-o,i=a;break;case 8:t=o,i=1-a;break;default:t=a,i=o}return[t,i]}_getValue(e,t){return null!=e&&e>0?e:t}_getCameraParameters(e,t){if($u(t))return[];if(!e||0===e.length)return[1,0,0];const i=3-e.length;return i<=0?e:e.concat(new Array(i).fill(0))}createWorldToCamera(e,t){const i=new Ki(e[0],e[1],e[2]),n=i.length();n>0&&i.normalize();const r=new Rn;return r.makeRotationAxis(i,n),r.setPosition(new Ki(t[0],t[1],t[2])),r}_createScaledWorldToCamera(e,t){const i=e.clone(),n=i.elements;return n[12]=t*n[12],n[13]=t*n[13],n[14]=t*n[14],i.scale(new Ki(t,t,t)),i}_createBasicWorldToCamera(e,t){const i=new Ki(0,0,1);let n=0;switch(t){case 3:n=Math.PI;break;case 6:n=Math.PI/2;break;case 8:n=3*Math.PI/2}return(new Rn).makeRotationAxis(i,n).multiply(e)}_getRadialPeak(e,t){const i=5*t,n=3*e,r=Math.pow(n,2)-4*i*1;if(r<0)return;const s=(-n-Math.sqrt(r))/2/i,a=(-n+Math.sqrt(r))/2/i,o=Math.min(s,a),h=Math.max(s,a);return o>0?Math.sqrt(o):h>0?Math.sqrt(h):void 0}_normalizedToTextureMatrix(){const e=Math.max(this._width,this._height),t=this._orientation<5?this._textureScale[0]:this._textureScale[1],i=this._orientation<5?this._textureScale[1]:this._textureScale[0],n=e/this._width*t,r=e/this._height*i;switch(this._orientation){case 1:return(new Rn).set(n,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1);case 3:return(new Rn).set(-n,0,0,.5,0,r,0,.5,0,0,1,0,0,0,0,1);case 6:return(new Rn).set(0,-r,0,.5,-n,0,0,.5,0,0,1,0,0,0,0,1);case 8:return(new Rn).set(0,r,0,.5,n,0,0,.5,0,0,1,0,0,0,0,1);default:return(new Rn).set(n,0,0,.5,0,-r,0,.5,0,0,1,0,0,0,0,1)}}}class dg{constructor(){this._factory=new gf,this._scene=new _f,this._spatial=new Du,this._currentKey=null,this._previousKey=null,this._disabled=!1,this._curtain=1,this._frameId=0,this._needsRender=!1,this._mode=null,this._currentProviderDisposers={},this._previousProviderDisposers={}}get disabled(){return this._disabled}get frameId(){return this._frameId}get needsRender(){return this._needsRender}setTextureProvider(e,t){this._setTextureProvider(e,this._currentKey,t,this._currentProviderDisposers,this._updateTexture.bind(this))}setTextureProviderPrev(e,t){this._setTextureProvider(e,this._previousKey,t,this._previousProviderDisposers,this._updateTexturePrev.bind(this))}update(e,t){this._updateFrameId(e.id),this._updateImagePlanes(e.state,t)}updateCurtain(e){this._curtain!==e&&(this._curtain=e,this._updateCurtain(),this._needsRender=!0)}updateTexture(e,t){const i=t.id===this._currentKey?this._scene.planes:t.id===this._previousKey?this._scene.planesOld:{};if(0!==Object.keys(i).length){this._needsRender=!0;for(const t in i){if(!i.hasOwnProperty(t))continue;let n=i[t].material.uniforms.projectorTex.value;n.image=e,n.needsUpdate=!0}}}updateTextureImage(e,t){if(this._currentKey!==t.id)return;this._needsRender=!0;const i=this._scene.planes;for(const t in i){if(!i.hasOwnProperty(t))continue;let n=i[t].material.uniforms.projectorTex.value;n.image=e,n.needsUpdate=!0}}render(e,t){this.disabled||t.render(this._scene.sceneOld,e),t.render(this._scene.scene,e),this._needsRender=!1}dispose(){this._scene.clear();for(const e in this._currentProviderDisposers)this._currentProviderDisposers.hasOwnProperty(e)&&this._currentProviderDisposers[e]();for(const e in this._previousProviderDisposers)this._previousProviderDisposers.hasOwnProperty(e)&&this._previousProviderDisposers[e]();this._currentProviderDisposers={},this._previousProviderDisposers={}}_getBasicCorners(e,t){let i,n;return e>t?(i=.5,n=.5*e/t):(i=.5*t/e,n=.5),[[.5-i,.5-n],[.5+i,.5+n]]}_setDisabled(e){this._disabled=null==e.currentImage||null==e.previousImage||$u(e.currentImage.cameraType)&&!$u(e.previousImage.cameraType)}_setTextureProvider(e,t,i,n,r){if(e!==t)return;let s=i.textureCreated$.subscribe(r),a=i.textureUpdated$.subscribe((e=>{this._needsRender=!0}));if(e in n){(0,n[e])(),delete n[e]}n[e]=()=>{s.unsubscribe(),a.unsubscribe(),i.dispose()}}_updateCurtain(){const e=this._scene.planes;for(const t in e){if(!e.hasOwnProperty(t))continue;let i=e[t].material;i.uniforms.curtain&&(i.uniforms.curtain.value=this._curtain)}}_updateFrameId(e){this._frameId=e}_updateImagePlanes(t,i){const n=null!=t.currentImage&&this._currentKey!==t.currentImage.id,r=null!=t.previousImage&&this._previousKey!==t.previousImage.id,s=this._mode!==i;if(!(n||r||s))return;this._setDisabled(t),this._needsRender=!0,this._mode=i;const a=t.motionless||i===e.SliderConfigurationMode.Stationary||$u(t.currentImage.cameraType);if((this.disabled||r)&&this._previousKey in this._previousProviderDisposers&&(this._previousProviderDisposers[this._previousKey](),delete this._previousProviderDisposers[this._previousKey]),this.disabled)this._scene.setImagePlanesOld({});else if(r||s){const e=t.previousImage;this._previousKey=e.id;const i=t.currentTransform.rt.elements;let n=[i[12],i[13],i[14]];const r=t.currentTransform.basicAspect,s=t.previousTransform.basicAspect,o=r>s?[1,s/r]:[r/s,1];let h=t.currentImage.rotation,c=t.currentImage.width,l=t.currentImage.height;$u(e.cameraType)&&(h=t.previousImage.rotation,n=this._spatial.rotate(this._spatial.opticalCenter(t.currentImage.rotation,n).toArray(),h).multiplyScalar(-1).toArray(),c=t.previousImage.width,l=t.previousImage.height);const u=new ug(t.currentImage.exifOrientation,c,l,t.currentImage.scale,h,n,e.image,o,t.currentImage.cameraParameters,t.currentImage.cameraType);let d;if($u(e.cameraType))d=this._factory.createMesh(e,a||$u(t.currentImage.cameraType)?u:t.previousTransform);else if(a){const[[e,i],[n,a]]=this._getBasicCorners(r,s);d=this._factory.createFlatMesh(t.previousImage,u,e,n,i,a)}else d=this._factory.createMesh(t.previousImage,t.previousTransform);const p={};p[e.id]=d,this._scene.setImagePlanesOld(p)}if(n||s){this._currentKey in this._currentProviderDisposers&&(this._currentProviderDisposers[this._currentKey](),delete this._currentProviderDisposers[this._currentKey]),this._currentKey=t.currentImage.id;const e={};$u(t.currentImage.cameraType)?e[t.currentImage.id]=this._factory.createCurtainMesh(t.currentImage,t.currentTransform):e[t.currentImage.id]=a?this._factory.createDistortedCurtainMesh(t.currentImage,t.currentTransform):this._factory.createCurtainMesh(t.currentImage,t.currentTransform),this._scene.setImagePlanes(e),this._updateCurtain()}}_updateTexture(e){this._needsRender=!0;const t=this._scene.planes;for(const i in t){if(!t.hasOwnProperty(i))continue;let n=t[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=e}}_updateTexturePrev(e){this._needsRender=!0;const t=this._scene.planesOld;for(const i in t){if(!t.hasOwnProperty(i))continue;let n=t[i].material,r=n.uniforms.projectorTex.value;n.uniforms.projectorTex.value=null,r.dispose(),n.uniforms.projectorTex.value=e}}}class pg{constructor(e){this._container=e,this._interacting=!1,this._notifyModeChanged$=new j,this._notifyPositionChanged$=new j,this._stopInteractionSubscription=null}get mode$(){return this._notifyModeChanged$}get position$(){return this._notifyPositionChanged$}activate(){this._stopInteractionSubscription||(this._stopInteractionSubscription=it(this._container.mouseService.documentMouseUp$,this._container.touchService.touchEnd$.pipe(st((e=>0===e.touches.length)))).subscribe((e=>{this._interacting&&(this._interacting=!1)})))}deactivate(){this._stopInteractionSubscription&&(this._interacting=!1,this._stopInteractionSubscription.unsubscribe(),this._stopInteractionSubscription=null)}render(e,t,i,n,r){const s=[];if(r){s.push(tf.h("div.mapillary-slider-border",[]));const r=!(i||n);r&&(s.push(this._createModeButton(t)),s.push(this._createModeButton2d(t))),s.push(this._createPositionInput(e,r))}const a=this._container.domContainer.getBoundingClientRect(),o=Math.max(215,Math.min(400,a.width-100));return tf.h("div.mapillary-slider-container",{style:{width:`${o}px`}},s)}_createModeButton(t){const i={onclick:()=>{t!==e.SliderConfigurationMode.Motion&&this._notifyModeChanged$.next(e.SliderConfigurationMode.Motion)}},n=t===e.SliderConfigurationMode.Stationary?"mapillary-slider-mode-button-inactive":"mapillary-slider-mode-button";return tf.h("div."+n,i,[tf.h("div.mapillary-slider-mode-icon",[])])}_createModeButton2d(t){const i={onclick:()=>{t!==e.SliderConfigurationMode.Stationary&&this._notifyModeChanged$.next(e.SliderConfigurationMode.Stationary)}},n=t===e.SliderConfigurationMode.Motion?"mapillary-slider-mode-button-2d-inactive":"mapillary-slider-mode-button-2d";return tf.h("div."+n,i,[tf.h("div.mapillary-slider-mode-icon-2d",[])])}_createPositionInput(e,t){const i=e=>{this._notifyPositionChanged$.next(Number(e.target.value)/1e3)},n=e=>{this._interacting=!0,e.stopPropagation()},r=e=>{this._interacting&&e.stopPropagation()},s=this._container.domContainer.getBoundingClientRect(),a=Math.max(215,Math.min(400,s.width-105))-84+(t?0:52),o=tf.h("input.mapillary-slider-position",{max:1e3,min:0,onchange:i,oninput:i,onkeydown:e=>{"ArrowDown"!==e.key&&"ArrowLeft"!==e.key&&"ArrowRight"!==e.key&&"ArrowUp"!==e.key||e.preventDefault()},onpointerdown:n,onpointermove:r,ontouchmove:r,ontouchstart:n,style:{width:`${a}px`},type:"range",value:1e3*e},[]);return tf.h("div.mapillary-slider-position-container",[o])}}class mg extends sf{constructor(e,t,i,n){super(e,t,i),this._viewportCoords=n||new hf,this._domRenderer=new pg(t),this._imageTileLoader=new bf(i.api),this._roiCalculator=new wf,this._spatial=new Du,this._glRendererOperation$=new j,this._glRendererCreator$=new j,this._glRendererDisposer$=new j,this._glRenderer$=this._glRendererOperation$.pipe(Lt(((e,t)=>t(e)),null),st((e=>null!=e)),vt(void 0,(e=>e.frameId))),this._glRendererCreator$.pipe(De((()=>e=>{if(null!=e)throw new Error("Multiple slider states can not be created at the same time");return new dg}))).subscribe(this._glRendererOperation$),this._glRendererDisposer$.pipe(De((()=>e=>(e.dispose(),null)))).subscribe(this._glRendererOperation$)}_activate(){const t=this._subscriptions;t.push(this._domRenderer.mode$.subscribe((e=>{this.configure({mode:e})}))),t.push(this._glRenderer$.pipe(De((e=>({name:this._name,renderer:{frameId:e.frameId,needsRender:e.needsRender,render:e.render.bind(e),pass:yf.Background}})))).subscribe(this._container.glRenderer.render$));const i=Ze(this.configuration$.pipe(De((e=>null!=e.initialPosition?e.initialPosition:1)),St()),this._domRenderer.position$),n=this.configuration$.pipe(De((e=>e.mode)),vt()),r=this._navigator.stateService.currentState$.pipe(De((e=>e.state.motionless)),vt()),s=this._navigator.stateService.currentState$.pipe(De((e=>$u(e.state.currentImage.cameraType))),vt()),a=Ve(this._configuration$.pipe(De((e=>e.sliderVisible))),this._navigator.stateService.currentState$.pipe(De((e=>!(null==e.state.currentImage||null==e.state.previousImage||$u(e.state.currentImage.cameraType)&&!$u(e.state.previousImage.cameraType)))),vt())).pipe(De((([e,t])=>e&&t)),vt());this._waitSubscription=Ve(n,r,s,a).pipe(Vt(this._navigator.stateService.state$)).subscribe((([[t,i,n,r],s])=>{const a=r&&(i||t===e.SliderConfigurationMode.Stationary||n);a&&s!==Df.WaitingInteractively?this._navigator.stateService.waitInteractively():a||s===Df.Waiting||this._navigator.stateService.wait()})),t.push(Ve(i,n,r,s,a).subscribe((([t,i,n,r])=>{n||i===e.SliderConfigurationMode.Stationary||r?this._navigator.stateService.moveTo(1):this._navigator.stateService.moveTo(t)}))),t.push(Ve(i,n,r,s,a,this._container.renderService.size$).pipe(De((([e,t,i,n,r])=>({name:this._name,vNode:this._domRenderer.render(e,t,i,n,r)})))).subscribe(this._container.domRenderer.render$)),this._glRendererCreator$.next(null),t.push(Ve(i,s,a,this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(De((([e,t,i,n,r])=>{if(!t)return i?e:1;const s=this._viewportCoords.viewportToBasic(-1.15,0,r,n.perspective),a=this._viewportCoords.viewportToBasic(1.15,0,r,n.perspective),o=a[0]<s[0]?a[0]+1:a[0],h=s[0]+e*(o-s[0]);return h>1?h-1:h})),De((e=>t=>(t.updateCurtain(e),t)))).subscribe(this._glRendererOperation$)),t.push(Ve(this._navigator.stateService.currentState$,n).pipe(De((([e,t])=>i=>(i.update(e,t),i)))).subscribe(this._glRendererOperation$)),t.push(this._configuration$.pipe(st((e=>null!=e.ids)),zt((e=>at(at(this._catchCacheImage$(e.ids.background),this._catchCacheImage$(e.ids.foreground)).pipe(De((e=>({background:e[0],foreground:e[1]})))),this._navigator.stateService.currentState$.pipe(St())).pipe(De((e=>({images:e[0],state:e[1].state}))))))).subscribe((e=>{null!=e.state.currentImage&&null!=e.state.previousImage&&e.state.currentImage.id===e.images.foreground.id&&e.state.previousImage.id===e.images.background.id||(e.state.currentImage.id!==e.images.background.id?e.state.currentImage.id!==e.images.foreground.id||1!==e.state.trajectory.length?(this._navigator.stateService.setImages([e.images.background]),this._navigator.stateService.setImages([e.images.foreground])):this._navigator.stateService.prependImages([e.images.background]):this._navigator.stateService.setImages([e.images.foreground]))}),(e=>{console.error(e)})));const o=this._container.configurationService.imageTiling$.pipe(zt((e=>e?this._navigator.stateService.currentState$:new j)),vt(void 0,(e=>e.state.currentImage.id)),Vt(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$),De((([e,t,i])=>{const n=e.state;Math.max(i.width,i.height);const r=n.currentImage,s=n.currentTransform;return new Lf(r.id,s.basicWidth,s.basicHeight,r.image,this._imageTileLoader,new xf,t)})),Rt(1),U());t.push(o.subscribe((()=>{}))),t.push(o.pipe(De((e=>t=>(t.setTextureProvider(e.id,e),t)))).subscribe(this._glRendererOperation$)),t.push(o.pipe(At()).subscribe((e=>{e[0].abort()})));const h=this._container.configurationService.imageTiling$.pipe(zt((e=>e?Ve(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.pipe(ft(250))):new j)),De((([e,t])=>[e.camera.position.clone(),e.camera.lookat.clone(),e.zoom.valueOf(),t.height.valueOf(),t.width.valueOf()])),At(),kt((e=>e[1][2]-e[0][2]<0||0===e[1][2])),De((e=>{let t=e[0][0].equals(e[1][0]),i=e[0][1].equals(e[1][1]),n=e[0][2]===e[1][2],r=e[0][3]===e[1][3],s=e[0][4]===e[1][4];return t&&i&&n&&r&&s})),vt(),st((e=>e)),zt((()=>this._container.renderService.renderCameraFrame$.pipe(St()))),Vt(this._container.renderService.size$,this._navigator.stateService.currentTransform$));t.push(o.pipe(zt((e=>h.pipe(De((([t,i,n])=>[this._roiCalculator.computeRegionOfInterest(t,i,n),e]))))),st((e=>!e[1].disposed))).subscribe((e=>{let t=e[0];e[1].setRegionOfInterest(t)})));const c=o.pipe(zt((e=>e.hasTexture$)),Ot(!1),Rt(1),U());t.push(c.subscribe((()=>{})));const l=this._container.configurationService.imageTiling$.pipe(zt((e=>e?this._navigator.stateService.currentState$:new j)),st((e=>!!e.state.previousImage)),vt(void 0,(e=>e.state.previousImage.id)),Vt(this._container.glRenderer.webGLRenderer$,this._container.renderService.size$),De((([e,t,i])=>{const n=e.state,r=n.previousImage,s=n.previousTransform;return new Lf(r.id,s.basicWidth,s.basicHeight,r.image,this._imageTileLoader,new xf,t)})),Rt(1),U());t.push(l.subscribe((()=>{}))),t.push(l.pipe(De((e=>t=>(t.setTextureProviderPrev(e.id,e),t)))).subscribe(this._glRendererOperation$)),t.push(l.pipe(At()).subscribe((e=>{e[0].abort()})));const u=this._container.configurationService.imageTiling$.pipe(zt((e=>e?Ve(this._container.renderService.renderCameraFrame$,this._container.renderService.size$.pipe(ft(250))):new j)),De((([e,t])=>[e.camera.position.clone(),e.camera.lookat.clone(),e.zoom.valueOf(),t.height.valueOf(),t.width.valueOf()])),At(),kt((e=>e[1][2]-e[0][2]<0||0===e[1][2])),De((e=>{let t=e[0][0].equals(e[1][0]),i=e[0][1].equals(e[1][1]),n=e[0][2]===e[1][2],r=e[0][3]===e[1][3],s=e[0][4]===e[1][4];return t&&i&&n&&r&&s})),vt(),st((e=>e)),zt((()=>this._container.renderService.renderCameraFrame$.pipe(St()))),Vt(this._container.renderService.size$,this._navigator.stateService.currentTransform$));t.push(l.pipe(zt((e=>u.pipe(De((([t,i,n])=>[this._roiCalculator.computeRegionOfInterest(t,i,n),e]))))),st((e=>!e[1].disposed)),Vt(this._navigator.stateService.currentState$)).subscribe((([[e,t],i])=>{let n=null;if($u(i.state.previousImage.cameraType))if($u(i.state.currentImage.cameraType)){const t=this._spatial.viewingDirection(i.state.currentImage.rotation),r=this._spatial.viewingDirection(i.state.previousImage.rotation),s=this._spatial.angleBetweenVector2(t.x,t.y,r.x,r.y)/(2*Math.PI);n={bbox:{maxX:this._spatial.wrap(e.bbox.maxX+s,0,1),maxY:e.bbox.maxY,minX:this._spatial.wrap(e.bbox.minX+s,0,1),minY:e.bbox.minY},pixelHeight:e.pixelHeight,pixelWidth:e.pixelWidth}}else{const t=this._spatial.viewingDirection(i.state.currentImage.rotation),r=this._spatial.viewingDirection(i.state.previousImage.rotation),s=this._spatial.angleBetweenVector2(t.x,t.y,r.x,r.y)/(2*Math.PI),a=this._spatial.angleToPlane(t.toArray(),[0,0,1]),o=(this._spatial.angleToPlane(r.toArray(),[0,0,1])-a)/(2*Math.PI),h=i.state.currentTransform,c=Math.max(h.basicWidth,h.basicHeight),l=c>0?2*Math.atan(.5*h.basicWidth/(c*h.focal)):Math.PI/3,u=c>0?2*Math.atan(.5*h.basicHeight/(c*h.focal)):Math.PI/3,d=l/(2*Math.PI),p=u/Math.PI,m=(e.bbox.maxX-e.bbox.minX)*d,f=(e.bbox.maxY-e.bbox.minY)*p,g=e.pixelWidth*d,_=e.pixelHeight*p,v=(e.bbox.minX+e.bbox.maxX)/2-.5,y=(e.bbox.minY+e.bbox.maxY)/2-.5,b=.5+s+d*v-m/2,x=.5+s+d*v+m/2,w=.5+o+p*y-f/2,M=.5+o+p*y+f/2;n={bbox:{maxX:this._spatial.wrap(x,0,1),maxY:M,minX:this._spatial.wrap(b,0,1),minY:w},pixelHeight:_,pixelWidth:g}}else{const t=i.state.currentTransform.basicAspect,r=i.state.previousTransform.basicAspect,[[s,a],[o,h]]=this._getBasicCorners(t,r),c=o-s,l=h-a,u=e.pixelWidth/c,d=e.pixelHeight/l,p=(c-1)/(2*c)+e.bbox.minX/c,m=(c-1)/(2*c)+e.bbox.maxX/c,f=(l-1)/(2*l)+e.bbox.minY/l,g={maxX:m,maxY:(l-1)/(2*l)+e.bbox.maxY/l,minX:p,minY:f};this._clipBoundingBox(g),n={bbox:g,pixelHeight:d,pixelWidth:u}}t.setRegionOfInterest(n)})));const d=l.pipe(zt((e=>e.hasTexture$)),Ot(!1),Rt(1),U());t.push(d.subscribe((()=>{})))}_deactivate(){this._waitSubscription.unsubscribe(),this._navigator.stateService.state$.pipe(St()).subscribe((e=>{e!==Df.Traversing&&this._navigator.stateService.traverse()})),this._glRendererDisposer$.next(null),this._domRenderer.deactivate(),this._subscriptions.unsubscribe(),this.configure({ids:null})}_getDefaultConfiguration(){return{initialPosition:1,mode:e.SliderConfigurationMode.Motion,sliderVisible:!0}}_catchCacheImage$(e){return this._navigator.graphService.cacheImage$(e).pipe(ct((t=>(console.error(`Failed to cache slider image (${e})`,t),ie()))))}_getBasicCorners(e,t){let i,n;return e>t?(i=.5,n=.5*e/t):(i=.5*t/e,n=.5),[[.5-i,.5-n],[.5+i,.5+n]]}_clipBoundingBox(e){e.minX=Math.max(0,Math.min(1,e.minX)),e.maxX=Math.max(0,Math.min(1,e.maxX)),e.minY=Math.max(0,Math.min(1,e.minY)),e.maxY=Math.max(0,Math.min(1,e.maxY))}}mg.componentName="slider";class fg{constructor(t,i){this._subscriptions=new rf,this._graphService=t,this._stateService=i;const n=this._subscriptions;this._directionSubject$=new j,this._direction$=this._directionSubject$.pipe(Ot(e.NavigationDirection.Next),Rt(1),U()),n.push(this._direction$.subscribe()),this._playing=!1,this._playingSubject$=new j,this._playing$=this._playingSubject$.pipe(Ot(this._playing),Rt(1),U()),n.push(this._playing$.subscribe()),this._speed=.5,this._speedSubject$=new j,this._speed$=this._speedSubject$.pipe(Ot(this._speed),Rt(1),U()),n.push(this._speed$.subscribe()),this._imagesAhead=this._mapImagesAhead(this._mapSpeed(this._speed)),this._bridging$=null}get playing(){return this._playing}get direction$(){return this._direction$}get playing$(){return this._playing$}get speed$(){return this._speed$}play(){if(this._playing)return;this._stateService.cutImages();const t=this._setSpeed(this._speed);this._stateService.setSpeed(t),this._graphModeSubscription=this._speed$.pipe(De((e=>e>fg.sequenceSpeed?Nf.Sequence:Nf.Spatial)),vt()).subscribe((e=>{this._graphService.setGraphMode(e)})),this._cacheSubscription=Ve(this._stateService.currentImage$.pipe(De((e=>[e.sequenceId,e.id])),vt(void 0,(([e])=>e))),this._graphService.graphMode$,this._direction$).pipe(zt((([[t,i],n,r])=>{if(r!==e.NavigationDirection.Next&&r!==e.NavigationDirection.Prev)return Ce([void 0,r]);return Ve((n===Nf.Sequence?this._graphService.cacheSequenceImages$(t,i):this._graphService.cacheSequence$(t)).pipe(Pt(3),ct((e=>(console.error(e),Ce(void 0))))),Ce(r))})),zt((([t,i])=>{if(void 0===t)return ie();const n=t.imageIds.slice();return i===e.NavigationDirection.Prev&&n.reverse(),this._stateService.currentState$.pipe(De((e=>[e.state.trajectory[e.state.trajectory.length-1].id,e.state.imagesAhead])),Lt((([e,t],[i,r])=>{void 0===e&&(e=i);const s=n.length-1;if(r>=this._imagesAhead||n[s]===e)return[e,[]];const a=n.indexOf(i),o=n.indexOf(e)+1,h=Math.min(s,a+this._imagesAhead-r)+1;return h<=o?[e,[]]:[n[h-1],n.slice(o,h)]}),[void 0,[]]),We((([e,t])=>ge(t))))})),We((e=>this._graphService.cacheImage$(e).pipe(ct((()=>ie())))),6)).subscribe(),this._playingSubscription=this._stateService.currentState$.pipe(st((e=>e.state.imagesAhead<this._imagesAhead)),vt(void 0,(e=>e.state.lastImage.id)),De((e=>{const t=e.state.lastImage,i=e.state.trajectory;let n;for(let e=i.length-2;e>=0;e--){const r=i[e];if(r.sequenceId!==t.sequenceId)break;if(r.capturedAt!==t.capturedAt){n=r.capturedAt<t.capturedAt;break}}return[e.state.lastImage,n]})),Vt(this._direction$),zt((([[t,i],n])=>at(([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(n)>-1?t.sequenceEdges$:t.spatialEdges$).pipe(St((e=>e.cached)),Pe(15e3)),Ce(n)).pipe(De((([e,t])=>{for(let i of e.edges)if(i.data.direction===t)return i.target;return null})),zt((e=>null!=e?this._graphService.cacheImage$(e):ie())))))).subscribe((e=>{this._stateService.appendImagess([e])}),(e=>{console.error(e),this.stop()})),this._clearSubscription=this._stateService.currentImage$.pipe(ht(1,10)).subscribe((e=>{this._stateService.clearPriorImages()})),this._setPlaying(!0);const i=this._stateService.currentState$.pipe(De((e=>e.state)),vt((([e,t],[i,n])=>e===i&&t===n),(e=>[e.currentImage.id,e.lastImage.id])),st((e=>e.currentImage.id===e.lastImage.id&&e.currentIndex===e.trajectory.length-1)),De((e=>e.currentImage)));this._stopSubscription=Ve(i,this._direction$).pipe(zt((([t,i])=>{const n=([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(i)>-1?t.sequenceEdges$:t.spatialEdges$).pipe(St((e=>e.cached)),Pe(15e3),ct((e=>(console.error(e),Ce({cached:!1,edges:[]})))));return Ve(Ce(i),n).pipe(De((([e,t])=>{for(const i of t.edges)if(i.data.direction===e)return!0;return!1})))})),We((e=>e||!this._bridging$?Ce(e):this._bridging$.pipe(De((e=>null!=e)),ct((e=>(console.error(e),Ce(!1))))))),St((e=>!e))).subscribe(void 0,void 0,(()=>{this.stop()})),this._stopSubscription.closed&&(this._stopSubscription=null),this._earthSubscription=this._stateService.state$.pipe(De((e=>e===Df.Earth)),vt(),St((e=>e))).subscribe(void 0,void 0,(()=>{this.stop()})),this._earthSubscription.closed&&(this._earthSubscription=null)}dispose(){this.stop(),this._subscriptions.unsubscribe()}setDirection(e){this._directionSubject$.next(e)}setSpeed(e){if((e=Math.max(0,Math.min(1,e)))===this._speed)return;const t=this._setSpeed(e);this._playing&&this._stateService.setSpeed(t),this._speedSubject$.next(this._speed)}stop(){this._playing&&(this._stopSubscription&&(this._stopSubscription.closed||this._stopSubscription.unsubscribe(),this._stopSubscription=null),this._earthSubscription&&(this._earthSubscription.closed||this._earthSubscription.unsubscribe(),this._earthSubscription=null),this._graphModeSubscription.unsubscribe(),this._graphModeSubscription=null,this._cacheSubscription.unsubscribe(),this._cacheSubscription=null,this._playingSubscription.unsubscribe(),this._playingSubscription=null,this._clearSubscription.unsubscribe(),this._clearSubscription=null,this._stateService.setSpeed(1),this._stateService.cutImages(),this._graphService.setGraphMode(Nf.Spatial),this._setPlaying(!1))}_mapSpeed(e){const t=2*e-1;return Math.pow(10,t)-.2*t}_mapImagesAhead(e){return Math.round(Math.max(10,Math.min(50,8+6*e)))}_setPlaying(e){this._playing=e,this._playingSubject$.next(e)}_setSpeed(e){this._speed=e;const t=this._mapSpeed(this._speed);return this._imagesAhead=this._mapImagesAhead(t),t}}var gg,_g;fg.sequenceSpeed=.54,e.CameraVisualizationMode=void 0,(gg=e.CameraVisualizationMode||(e.CameraVisualizationMode={}))[gg.Hidden=0]="Hidden",gg[gg.Homogeneous=1]="Homogeneous",gg[gg.Cluster=2]="Cluster",gg[gg.ConnectedComponent=3]="ConnectedComponent",gg[gg.Sequence=4]="Sequence",e.OriginalPositionMode=void 0,(_g=e.OriginalPositionMode||(e.OriginalPositionMode={}))[_g.Hidden=0]="Hidden",_g[_g.Altitude=1]="Altitude",_g[_g.Flat=2]="Flat";class vg extends tc{constructor(e){super(),this._originalSize=e.originalSize;const{cluster:t,color:i,scale:n,translation:r}=e;this._makeAttributes(t),this.material.size=n*this._originalSize,this.setColor(i),this.matrixAutoUpdate=!1,this.position.fromArray(r),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}setColor(e){this.material.vertexColors=null==e,this.material.color=new xr(e),this.material.needsUpdate=!0}resize(e){this.material.size=e*this._originalSize,this.material.needsUpdate=!0}_makeAttributes(e){const t=[],i=[],n=e.points;for(const e in n){if(!n.hasOwnProperty(e))continue;const r=n[e];t.push(...r.coordinates);const s=r.color;i.push(s[0]),i.push(s[1]),i.push(s[2])}const r=this.geometry;r.setAttribute("position",new Tr(new Float32Array(t),3)),r.setAttribute("color",new Tr(new Float32Array(i),3))}}class yg extends Wh{constructor(e){super(),this._makeAttributes(e),this.matrixAutoUpdate=!1,this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}_makeAttributes(e){const t=e.slice();t.push(e[0]);let i=0;const n=new Float32Array(3*(e.length+1));for(const e of t)n[i++]=e[0],n[i++]=e[1],n[i++]=e[2];this.geometry.setAttribute("position",new Tr(n,3))}}function bg(e,t){return e===t}function xg(e){const t=function(e){return Math.pow(2,e)}(e)/2;return{min:[-t,-t,-t],max:[t,t,t]}}class wg{constructor(e,t,i,n){this.level=e,this.leafLevel=t,this.boundingBox=i,this.parent=n,this.children=[],this.items=[],n&&n.children.push(this)}get isEmpty(){return!(this.children.length||this.items.length)}add(e){const t=this;if(!t.boundingBox.containsPoint(e.position))throw new Error("Item not contained in node");if(bg(t.level,t.leafLevel))return t.items.push(e),this;for(const i of t.children)if(i.boundingBox.containsPoint(e.position))return i.add(e);for(const i of t._generateBoundingBoxes())if(i.containsPoint(e.position)){return new wg(t.level-1,t.leafLevel,i,t).add(e)}throw new Error("Item not contained in children")}intersect(e,t,i){if(e.intersectBox(this.boundingBox,t))if(bg(this.level,this.leafLevel))i.push(this);else for(const n of this.children)n.intersect(e,t,i)}remove(e){const t=this.items.indexOf(e);if(t<0)throw new Error(`Item does not exist ${e.uuid}`);this.items.splice(t,1)}traverse(){const e=this;if(!e.isEmpty)return;const t=e.parent;if(!t)return;const i=t.children.indexOf(e);if(i<0)throw new Error("Corrupt octree");t.children.splice(i,1),this.parent=null,t.traverse()}_generateBoundingBoxes(){const e=this.boundingBox.min,t=(this.boundingBox.max.x-e.x)/2,i=[[e.x,e.y+t,e.z+t],[e.x+t,e.y+t,e.z+t],[e.x,e.y,e.z+t],[e.x+t,e.y,e.z+t],[e.x,e.y+t,e.z],[e.x+t,e.y+t,e.z],[e.x,e.y,e.z],[e.x+t,e.y,e.z]],n=[];for(const[e,r,s]of i)n.push(new tn(new Ki(e,r,s),new Ki(e+t,r+t,s+t)));return n}}class Mg{constructor(e,t){if(this.rootLevel=e,this.leafLevel=t,t>e)throw new Error;this._index=new Map,this._root=this._makeRoot()}get root(){return this._root}add(e){if(!this.root.boundingBox.containsPoint(e.position))return void console.warn(`Object outside bounding box ${e.uuid}`);const t=this._root.add(e);this._index.set(e.uuid,t)}has(e){return this._index.has(e.uuid)}intersect(e){const t=[],i=new Ki;return this._root.intersect(e,i,t),t.map((e=>e.items)).reduce(((e,t)=>(e.push(...t),e)),[])}reset(){this._root=this._makeRoot(),this._index.clear()}remove(e){if(!this.has(e))throw new Error(`Frame does not exist ${e.uuid}`);const t=this._index.get(e.uuid);t.remove(e),t.traverse(),this._index.delete(e.uuid)}_makeRoot(){const e=this.rootLevel,t=xg(e),i=new tn((new Ki).fromArray(t.min),(new Ki).fromArray(t.max));return new wg(e,this.leafLevel,i)}}class Sg{constructor(e,t){this._objects=[],this._objectImageMap=new Map,this._octree=null!=e?e:new Mg(14,6),this._raycaster=null!=t?t:new su,this._interactiveLayer=1,this._raycaster=t||new su(void 0,void 0,1,1e4),this._lineThreshold=.2,this._largeLineThreshold=.4,this._raycaster.params.Line.threshold=this._lineThreshold,this._raycaster.layers.set(this._interactiveLayer)}get interactiveLayer(){return this._interactiveLayer}get octree(){return this._octree}get raycaster(){return this._raycaster}add(e,t){const i=e.uuid;this._objectImageMap.set(i,t),this._objects.push(e),this._octree.add(e)}intersectObjects(e,t){this._raycaster.setFromCamera((new zi).fromArray(e),t);const i=this._octree.intersect(this.raycaster.ray),n=this._raycaster.intersectObjects(i),r=this._objectImageMap;for(const e of n){const t=e.object.uuid;if(r.has(t))return r.get(t)}return null}remove(e){const t=this._objects,i=t.indexOf(e);if(-1!==i){const n=t.splice(i,1);for(const e of n)this._objectImageMap.delete(e.uuid);this._octree.remove(e)}else console.warn("Object does not exist")}resetIntersectionThreshold(e){this._raycaster.params.Line.threshold=e?this._largeLineThreshold:this._lineThreshold}}class Tg extends Wh{constructor(e){super(e.geometry,e.material);const t=e.mode,i=e.originalOrigin,n=e.transform.unprojectBasic([0,0],0);this._relativeAltitude=i[2]-n[2],this._makeAttributes(n,i,t),this.matrixAutoUpdate=!1,this.position.fromArray(n),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}setMode(e){const t=this.geometry.attributes.position;t.array[5]=this._modeToAltitude(e),t.needsUpdate=!0,this.geometry.computeBoundingSphere()}_makeAttributes(e,t,i){const n=new Float32Array(6);n[0]=0,n[1]=0,n[2]=0,n[3]=t[0]-e[0],n[4]=t[1]-e[1],n[5]=this._modeToAltitude(i);const r=new Tr(n,3);this.geometry.setAttribute("position",r),r.needsUpdate=!0,this.geometry.computeBoundingSphere()}_modeToAltitude(t){return t===e.OriginalPositionMode.Altitude?this._relativeAltitude:0}}class Cg extends Zh{constructor(e){super(e.geometry,e.material);const t=e.color,i=e.size,n=e.scale,r=e.transform,s=r.unprojectBasic([0,0],0),a=this._makePositions(i,r,s);this._makeAttributes(a,t),this.geometry.computeBoundingSphere(),this.geometry.computeBoundingBox(),this.matrixAutoUpdate=!1,this.position.fromArray(s),this.scale.set(n,n,n),this.updateMatrix(),this.updateMatrixWorld(!1)}dispose(){this.geometry.dispose(),this.material.dispose()}setColor(e){return this._updateColorAttribute(e),this}resize(e){return this.scale.set(e,e,e),this.updateMatrix(),this.updateMatrixWorld(!1),this}_makeAttributes(e,t){const i=this.geometry,n=new Tr(new Float32Array(e),3);i.setAttribute("position",n),n.needsUpdate=!0;const r=new Tr(new Float32Array(e.length),3);i.setAttribute("color",r),this._updateColorAttribute(t)}_updateColorAttribute(e){const[t,i,n]=new xr(e).toArray(),r=this.geometry.attributes.color,s=r.array,a=s.length;let o=0;for(let e=0;e<a;e++)s[o++]=t,s[o++]=i,s[o++]=n;r.needsUpdate=!0}}class Eg extends Cg{_makePositions(e,t,i){const n=[];n.push(...this._makeAxis(e,t,i)),n.push(...this._makeLat(.5,10,e,t,i));for(const r of[0,.25,.5,.75])n.push(...this._makeLng(r,10,e,t,i));return n}_makeAxis(e,t,i){const n=t.unprojectBasic([.5,1],.8*e),r=t.unprojectBasic([.5,0],1.2*e);return[n[0]-i[0],n[1]-i[1],n[2]-i[2],r[0]-i[0],r[1]-i[1],r[2]-i[2]]}_makeLat(e,t,i,n,r){const s=.8*i,[a,o,h]=r,c=[],l=n.unprojectBasic([0,e],s);l[0]-=a,l[1]-=o,l[2]-=h,c.push(...l);for(let i=1;i<=t;i++){const r=n.unprojectBasic([i/t,e],s);r[0]-=a,r[1]-=o,r[2]-=h,c.push(...r,...r)}return c.push(...l),c}_makeLng(e,t,i,n,r){const s=.8*i,[a,o,h]=r,c=[],l=n.unprojectBasic([e,0],s);l[0]-=a,l[1]-=o,l[2]-=h,c.push(...l);for(let i=0;i<=t;i++){const r=n.unprojectBasic([e,i/t],s);r[0]-=a,r[1]-=o,r[2]-=h,c.push(...r,...r)}return c.push(...l),c}}class Ag extends Cg{_makePositions(e,t,i){const n=[];return n.push(...this._makeDiags(e,t,i)),n.push(...this._makeFrame(e,8,t,i)),n}_makeDiags(e,t,i){const[n,r,s]=i,a=[0,0,0],o=[];for(const i of[[0,0],[1,0],[1,1],[0,1]]){const h=t.unprojectBasic(i,e);h[0]-=n,h[1]-=r,h[2]-=s,o.push(...a,...h)}return o}_makeFrame(e,t,i,n){const r=[];r.push(...this._subsample([0,1],[0,0],t)),r.push(...this._subsample([0,0],[1,0],t)),r.push(...this._subsample([1,0],[1,1],t));const[s,a,o]=n,h=[];for(const t of r){const n=i.unprojectBasic(t,e);n[0]-=s,n[1]-=a,n[2]-=o,h.push(...n)}return h}_interpolate(e,t,i){return e+i*(t-e)}_subsample(e,t,i){if(i<1)return[e,t];const n=[];n.push(e);for(let r=0;r<=i;r++){const s=[];for(let n=0;n<3;n++)s.push(this._interpolate(e[n],t[n],r/(i+1)));n.push(s),n.push(s)}return n.push(t),n}}function Ig(e,t,i){const[n,r,s]=t,[a,o,h]=vu(n,r,s,i.lng,i.lat,i.alt);return _u(a,o,h,e.lng,e.lat,e.alt)}class Rg{constructor(e,t,i){this.id=e,this._scene=t,this._intersection=i,this.cameras=new tr,this.keys=[],this._positionLines={},this._positions=new tr,this._cameraFrames={},this._clusters=new Map,this._connectedComponents=new Map,this._sequences=new Map,this._props={},this.clusterVisibles={},this._frameMaterial=new Bh({fog:!1,vertexColors:!0}),this._positionMaterial=new Bh({fog:!1,color:16711680}),this._scene.add(this.cameras,this._positions)}addImage(e){const t=e.image,i=t.id;if(this.hasImage(i))throw new Error(`Image exists ${i}`);const n=e.idMap.ccId;this._connectedComponents.has(n)||this._connectedComponents.set(n,[]);const r=e.idMap.clusterId;this._clusters.has(r)||this._clusters.set(r,[]);const s=e.idMap.sequenceId;this._sequences.has(s)||this._sequences.set(s,[]),this._props[i]={image:t,ids:{ccId:n,clusterId:r,sequenceId:s}},this.keys.push(i)}applyCameraColor(e,t){this._cameraFrames[e].setColor(t)}applyCameraSize(e){for(const t of this.cameras.children)t.resize(e)}applyFilter(e){var t;const i=this.clusterVisibles;for(const e in i)i.hasOwnProperty(e)&&(i[e]=!1);const n=this._cameraFrames,r=this._positionLines,s=this._intersection.interactiveLayer;for(const a of Object.values(this._props)){const o=a.image,h=e(o),c=o.id;r[c].visible=h;const l=n[c];this._setCameraVisibility(l,h,s),i[t=a.ids.clusterId]||(i[t]=h)}}applyPositionMode(t){this._positions.visible=t!==e.OriginalPositionMode.Hidden;for(const e of this._positions.children)e.setMode(t)}dispose(){this._disposeCameras(),this._disposePositions(),this._scene=null,this._intersection=null}getCamerasByMode(t){if(t===e.CameraVisualizationMode.Cluster)return this._clusters;if(t===e.CameraVisualizationMode.ConnectedComponent)return this._connectedComponents;if(t===e.CameraVisualizationMode.Sequence)return this._sequences;const i=e.CameraVisualizationMode,n=i[i.Homogeneous],r=new Map;return r.set(n,this.cameras.children),r}getColorId(t,i){const n=this._props[t],r=e.CameraVisualizationMode;switch(i){case r.Cluster:return n.ids.clusterId;case r.ConnectedComponent:return n.ids.ccId;case r.Sequence:return n.ids.sequenceId;default:return r[r.Homogeneous]}}hasImage(e){return-1!==this.keys.indexOf(e)}resetReference(e,t){const i=this._cameraFrames;for(const n in i){if(!i.hasOwnProperty(n))continue;const r=i[n];r.position.fromArray(Ig(e,r.position.toArray(),t))}const n=this._positionLines;for(const i in n){if(!n.hasOwnProperty(i))continue;const r=n[i];r.position.fromArray(Ig(e,r.position.toArray(),t))}}visualize(e){var t,i;const n=e.id,r=e.visible,s=e.transform,a={color:e.color,material:this._frameMaterial,scale:e.scale,size:e.maxSize,transform:s},o=$u(s.cameraType)?new Eg(a):new Ag(a),h=this._intersection.interactiveLayer;this._setCameraVisibility(o,r,h),this.cameras.add(o),this._cameraFrames[n]=o;this._intersection.add(o,n);const c=this._props[n].ids;(t=this.clusterVisibles)[i=c.clusterId]||(t[i]=r),this._connectedComponents.get(c.ccId).push(o),this._clusters.get(c.clusterId).push(o),this._sequences.get(c.sequenceId).push(o);const l={material:this._positionMaterial,mode:e.positionMode,originalOrigin:e.originalPosition,transform:s},u=new Tg(l);u.visible=r,this._positions.add(u),this._positionLines[n]=u}_disposeCameras(){const e=this._intersection,t=this.cameras;for(const i of t.children.slice())i.dispose(),e.remove(i),t.remove(i);this._scene.remove(this.cameras)}_disposePositions(){const e=this._positions;for(const t of e.children.slice())t.dispose(),e.remove(t);this._scene.remove(this._positions)}_setCameraVisibility(e,t,i){e.visible=t,t?e.layers.enable(i):e.layers.disable(i)}}class Pg{constructor(){this._colors=new Map;const t=e.CameraVisualizationMode;this._colors.set(t[t.Homogeneous],"#FFFFFF")}getColor(e){const t=this._colors;return t.has(e)||t.set(e,this._randomColor()),t.get(e)}_randomColor(){return`hsl(${Math.floor(360*Math.random())}, 100%, 50%)`}}function Lg(t){return t!==e.CameraVisualizationMode.Hidden}var Dg;e.PointVisualizationMode=void 0,(Dg=e.PointVisualizationMode||(e.PointVisualizationMode={}))[Dg.Hidden=0]="Hidden",Dg[Dg.Original=1]="Original",Dg[Dg.Cluster=2]="Cluster";class Ng{constructor(t,i){this._rayNearScale=1.1,this._originalPointSize=2,this._originalCameraSize=2,this._imageCellMap=new Map,this._scene=i||new ch,this._scene.autoUpdate=!1,this._intersection=new Sg,this._assets=new Pg,this._needsRender=!1,this._images={},this._cells={},this._cellClusters={},this._clusters={},this._cameraVisualizationMode=t.cameraVisualizationMode?t.cameraVisualizationMode:e.CameraVisualizationMode.Homogeneous,this._cameraSize=t.cameraSize,this._pointSize=t.pointSize,this._pointVisualizationMode=t.pointVisualizationMode?t.pointVisualizationMode:e.PointVisualizationMode.Original,this._positionMode=t.originalPositionMode,this._cellsVisible=t.cellsVisible,this._hoveredId=null,this._selectedId=null,this._colors={hover:"#FF0000",select:"#FF8000"},this._filter=()=>!0}get needsRender(){return this._needsRender}get intersection(){return this._intersection}addCluster(t,i,n){if(this.hasCluster(t.id,n))return;const r=t.id;if(!(r in this._clusters)){this._clusters[r]={points:new tr,cellIds:[]};const n=this._getClusterVisible(r),s=this._clusters[r],a=this._pointVisualizationMode===e.PointVisualizationMode.Cluster?this._assets.getColor(r):null,o=new vg({cluster:t,color:a,originalSize:this._originalPointSize,scale:this._pointSize,translation:i});s.points.visible=n,s.points.add(o),this._scene.add(s.points)}-1===this._clusters[r].cellIds.indexOf(n)&&this._clusters[r].cellIds.push(n),n in this._cellClusters||(this._cellClusters[n]={keys:[]}),-1===this._cellClusters[n].keys.indexOf(r)&&this._cellClusters[n].keys.push(r),this._needsRender=!0}addImage(e,t,i,n){var r,s,a;const o=e.id,h={clusterId:null!==(r=e.clusterId)&&void 0!==r?r:"NO_CLUSTER_ID",sequenceId:null!==(s=e.sequenceId)&&void 0!==s?s:"NO_SEQUENCE_ID",ccId:null!==(a=e.mergeId)&&void 0!==a?a:"NO_MERGE_ID"};if(!(n in this._images)){const e=new Rg(n,this._scene,this._intersection);e.cameras.visible=Lg(this._cameraVisualizationMode),e.applyPositionMode(this._positionMode),this._images[n]=e}const c=this._images[n];if(c.hasImage(o))return;c.addImage({idMap:h,image:e});const l=c.getColorId(o,this._cameraVisualizationMode),u=this._assets.getColor(l),d=this._filter(e);if(c.visualize({id:o,color:u,positionMode:this._positionMode,scale:this._cameraSize,transform:t,visible:d,maxSize:this._originalCameraSize,originalPosition:i}),this._imageCellMap.set(o,n),o===this._selectedId&&this._highlight(o,this._colors.select,this._cameraVisualizationMode),h.clusterId in this._clusters){const e=this._getClusterVisible(h.clusterId);this._clusters[h.clusterId].points.visible=e}this._needsRender=!0}addCell(e,t){if(this.hasCell(t))return;const i=new yg(e);this._cells[t]=new tr,this._cells[t].visible=this._cellsVisible,this._cells[t].add(i),this._scene.add(this._cells[t]),this._needsRender=!0}deactivate(){this._filter=()=>!0,this._selectedId=null,this._hoveredId=null,this.uncache()}hasCluster(e,t){return e in this._clusters&&-1!==this._clusters[e].cellIds.indexOf(t)}hasCell(e){return e in this._cells}hasImage(e,t){return t in this._images&&this._images[t].hasImage(e)}render(e,t){t.render(this._scene,e),this._needsRender=!1}resetReference(e,t){const i=this._clusters;for(const n in i){if(!i.hasOwnProperty(n))continue;const r=i[n];r.points.position.fromArray(Ig(e,r.points.position.toArray(),t))}const n=this._cells;for(const i in n){if(!n.hasOwnProperty(i))continue;const r=n[i];r.position.fromArray(Ig(e,r.position.toArray(),t))}const r=this._images;for(const i in r){if(!r.hasOwnProperty(i))continue;r[i].resetReference(e,t)}}setCameraSize(e){if(Math.abs(e-this._cameraSize)<.001)return;const t=this._images;for(const i of Object.keys(t))t[i].applyCameraSize(e);this._intersection.raycaster.near=this._getNear(e),this._cameraSize=e,this._needsRender=!0}setFilter(t){this._filter=t;const i={};for(const e of Object.values(this._images)){e.applyFilter(t);const n=e.clusterVisibles;for(const e in n)n.hasOwnProperty(e)&&(e in i||(i[e]=!1),i[e]||(i[e]=n[e]))}const n=this._pointVisualizationMode!==e.PointVisualizationMode.Hidden;for(const e in i){if(!i.hasOwnProperty(e))continue;i[e]&&(i[e]=n);const t=i[e];e in this._clusters&&(this._clusters[e].points.visible=t)}this._needsRender=!0}setHoveredImage(e){if(null!=e&&!this._imageCellMap.has(e))throw new Pu(`Image does not exist: ${e}`);this._hoveredId!==e&&(this._needsRender=!0,null!=this._hoveredId&&(this._hoveredId===this._selectedId?this._highlight(this._hoveredId,this._colors.select,this._cameraVisualizationMode):this._resetCameraColor(this._hoveredId)),this._highlight(e,this._colors.hover,this._cameraVisualizationMode),this._hoveredId=e)}setNavigationState(e){this._intersection.resetIntersectionThreshold(e)}setPointSize(e){if(Math.abs(e-this._pointSize)<.001)return;const t=this._clusters;for(const i in t)if(t.hasOwnProperty(i))for(const n of t[i].points.children)n.resize(e);this._pointSize=e,this._needsRender=!0}setPointVisualizationMode(t){if(t!==this._pointVisualizationMode){this._pointVisualizationMode=t;for(const i in this._clusters){if(!this._clusters.hasOwnProperty(i))continue;const n=this._clusters[i];n.points.visible=this._getClusterVisible(i);for(const r of n.points.children){const n=t===e.PointVisualizationMode.Cluster?this._assets.getColor(i):null;r.setColor(n)}}this._needsRender=!0}}setPositionMode(e){if(e!==this._positionMode){for(const t of Object.values(this._images))t.applyPositionMode(e);this._positionMode=e,this._needsRender=!0}}setSelectedImage(e){this._selectedId!==e&&(this._needsRender=!0,null!=this._selectedId&&this._resetCameraColor(this._selectedId),this._highlight(e,this._colors.select,this._cameraVisualizationMode),this._selectedId=e)}setCellVisibility(e){if(e!==this._cellsVisible){for(const t in this._cells)this._cells.hasOwnProperty(t)&&(this._cells[t].visible=e);this._cellsVisible=e,this._needsRender=!0}}setCameraVisualizationMode(e){if(e===this._cameraVisualizationMode)return;const t=Lg(e),i=this._assets;for(const n of Object.values(this._images)){n.cameras.visible=t;n.getCamerasByMode(e).forEach(((e,t)=>{const n=i.getColor(t);for(const t of e)t.setColor(n)}))}this._highlight(this._hoveredId,this._colors.hover,e),this._highlight(this._selectedId,this._colors.select,e),this._cameraVisualizationMode=e,this._needsRender=!0}uncache(e){for(const t of Object.keys(this._cellClusters))e&&-1!==e.indexOf(t)||this._disposeReconstruction(t);for(const t of Object.keys(this._images)){if(e&&-1!==e.indexOf(t))continue;const i=this._imageCellMap,n=this._images[t].keys;for(const e of n)i.delete(e);this._images[t].dispose(),delete this._images[t]}for(const t of Object.keys(this._cells))e&&-1!==e.indexOf(t)||this._disposeCell(t);this._needsRender=!0}_getClusterVisible(t){if(this._pointVisualizationMode===e.PointVisualizationMode.Hidden)return!1;let i=!1;for(const e of Object.values(this._images)){const n=e.clusterVisibles;t in n&&(i||(i=n[t]))}return i}_disposePoints(e){for(const t of this._cellClusters[e].keys){if(!(t in this._clusters))continue;const i=this._clusters[t].cellIds.indexOf(e);if(-1!==i&&(this._clusters[t].cellIds.splice(i,1),!(this._clusters[t].cellIds.length>0))){for(const e of this._clusters[t].points.children.slice())e.dispose();this._scene.remove(this._clusters[t].points),delete this._clusters[t]}}}_disposeReconstruction(e){this._disposePoints(e),delete this._cellClusters[e]}_disposeCell(e){const t=this._cells[e];for(const e of t.children.slice())e.dispose(),t.remove(e);this._scene.remove(t),delete this._cells[e]}_getNear(e){const t=this._rayNearScale*this._originalCameraSize*e;return Math.max(1,t)}_resetCameraColor(e){const t=this._imageCellMap;if(null==e||!t.has(e))return;const i=t.get(e),n=this._images[i],r=n.getColorId(e,this._cameraVisualizationMode),s=this._assets.getColor(r);n.applyCameraColor(e,s)}_highlight(t,i,n){const r=this._imageCellMap;if(null==t||!r.has(t))return;const s=r.get(t);i=n===e.CameraVisualizationMode.Homogeneous?i:"#FFFFFF",this._images[s].applyCameraColor(t,i)}}class $g{constructor(e,t){this._graphService=e,this._data=t,this._cells={},this._cacheRequests={},this._clusters={},this._clusterCells={},this._cellClusters={},this._cachingCells$={},this._cachingClusters$={}}cacheClusters$(e){if(!this.hasCell(e))throw new Error("Cannot cache reconstructions of a non-existing cell.");if(this.hasClusters(e))throw new Error("Cannot cache reconstructions that already exists.");if(this.isCachingClusters(e))return this._cachingClusters$[e];const t=this.getCell(e).filter((e=>!!e.clusterId&&!!e.clusterUrl)).map((e=>({key:e.clusterId,url:e.clusterUrl}))),i=Array.from(new Map(t.map((e=>[e.key,e]))).values());let n;this._cellClusters[e]=i,this._cacheRequests[e]=[];const r=new Promise(((e,t)=>{n=t}));return this._cacheRequests[e].push(n),this._cachingClusters$[e]=this._cacheClusters$(i,e,r).pipe(Mt((()=>{e in this._cachingClusters$&&delete this._cachingClusters$[e],e in this._cacheRequests&&delete this._cacheRequests[e]})),It(),U()),this._cachingClusters$[e]}cacheCell$(e){if(this.hasCell(e))throw new Error("Cannot cache cell that already exists.");return this.isCachingCell(e)||(this._cachingCells$[e]=this._graphService.cacheCell$(e).pipe(ct((e=>(console.error(e),ie()))),st((()=>!(e in this._cells))),Ut((t=>{this._cells[e]=[],this._cells[e].push(...t),delete this._cachingCells$[e]})),Mt((()=>{e in this._cachingCells$&&delete this._cachingCells$[e]})),It(),U())),this._cachingCells$[e]}isCachingClusters(e){return e in this._cachingClusters$}isCachingCell(e){return e in this._cachingCells$}hasClusters(e){if(e in this._cachingClusters$||!(e in this._cellClusters))return!1;for(const t of this._cellClusters[e])if(!(t.key in this._clusters))return!1;return!0}hasCell(e){return!(e in this._cachingCells$)&&e in this._cells}getClusters(e){return e in this._cellClusters?this._cellClusters[e].map((e=>this._clusters[e.key])).filter((e=>!!e)):[]}getCell(e){return e in this._cells?this._cells[e]:[]}uncache(e){for(let t of Object.keys(this._cacheRequests))if(!e||-1===e.indexOf(t)){for(const e of this._cacheRequests[t])e();delete this._cacheRequests[t]}for(let t of Object.keys(this._cellClusters))if(!e||-1===e.indexOf(t)){for(const e of this._cellClusters[t]){if(!(e.key in this._clusterCells))continue;const i=this._clusterCells[e.key].indexOf(t);-1!==i&&(this._clusterCells[e.key].splice(i,1),this._clusterCells[e.key].length>0||(delete this._clusterCells[e.key],delete this._clusters[e.key]))}delete this._cellClusters[t]}for(let t of Object.keys(this._cells))e&&-1!==e.indexOf(t)||delete this._cells[t]}updateCell$(e){if(!this.hasCell(e))throw new Error("Cannot update cell that does not exists.");return this._graphService.cacheCell$(e).pipe(ct((e=>(console.error(e),ie()))),st((()=>e in this._cells)),Ut((t=>{this._cells[e]=[],this._cells[e].push(...t)})),It(),U())}updateClusters$(e){if(!this.hasCell(e))throw new Error("Cannot update reconstructions of a non-existing cell.");if(!this.hasClusters(e))throw new Error("Cannot update reconstructions for cell that is not cached.");const t=this.getCell(e).filter((e=>!!e.clusterId&&!!e.clusterUrl)).map((e=>({key:e.clusterId,url:e.clusterUrl}))),i=Array.from(new Map(t.map((e=>[e.key,e]))).values()).filter((e=>!(e.key in this._clusters)));return this._cellClusters[e].push(...i),this._cacheClusters$(i,e,null)}_cacheClusters$(e,t,i){return ge(e).pipe(We((e=>this._hasCluster(e.key)?Ce(this._getCluster(e.key)):this._getCluster$(e.url,e.key,i).pipe(ct((e=>(e instanceof uf||console.error(e),ie()))))),6),st((()=>t in this._cellClusters)),Ut((e=>{this._hasCluster(e.id)||(this._clusters[e.id]=e),e.id in this._clusterCells||(this._clusterCells[e.id]=[]),-1===this._clusterCells[e.id].indexOf(t)&&this._clusterCells[e.id].push(t)})))}_getCluster(e){return this._clusters[e]}_getCluster$(e,t,i){return k.create((n=>{this._data.getCluster(e,i).then((e=>{e.id=t,n.next(e),n.complete()}),(e=>{n.error(e)}))}))}_hasCluster(e){return e in this._clusters}}function kg(e,t,i){const n=new Set;return n.add(e),Og(n,[e],0,t,i),Array.from(n)}function Og(e,t,i,n,r){if(i>=n)return;const s=[];for(const e of t){const t=r.getAdjacent(e);s.push(...t)}const a=[];for(const t of s)e.has(t)||(e.add(t),a.push(t));Og(e,a,i+1,n,r)}class zg extends sf{constructor(e,t,i){super(e,t,i),this._cache=new $g(i.graphService,i.api.data),this._scene=new Ng(this._getDefaultConfiguration()),this._viewportCoords=new hf,this._spatial=new Du}getFrameIdAt(e){return new Promise(((t,i)=>{this._container.renderService.renderCamera$.pipe(St(),De((t=>{const i=this._viewportCoords.canvasToViewport(e[0],e[1],this._container.container);return this._scene.intersection.intersectObjects(i,t.perspective)}))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}_activate(){this._navigator.cacheService.configure({cellDepth:3});const t=this._subscriptions;t.push(this._navigator.stateService.reference$.pipe(At()).subscribe((([e,t])=>{this._scene.resetReference(t,e)}))),t.push(this._navigator.graphService.filter$.subscribe((e=>{this._scene.setFilter(e)})));const i=this._container.renderService.bearing$.pipe(De((e=>6*Math.floor(e/6))),vt(),Rt(1),U()),n=this._navigator.stateService.currentImage$.pipe(De((e=>this._navigator.api.data.geometry.lngLatToCellId(e.originalLngLat))),vt(),Rt(1),U()),r=this._configuration$.pipe(De((e=>this._spatial.clamp(e.cellGridDepth,1,3))),vt(),Rt(1),U()),s=Ve(this._navigator.playService.playing$,this._navigator.playService.speed$).pipe(De((([e,t])=>e&&t>fg.sequenceSpeed)),vt(),Rt(1),U()),a=this._navigator.stateService.state$.pipe(De((e=>function(e){return e===Df.Custom||e===Df.Earth}(e))),vt(),Rt(1),U());t.push(a.subscribe((e=>{this._scene.setNavigationState(e)})));const o=Ve(a,s,i,r,this._navigator.stateService.currentImage$).pipe(vt((([e,t,i,n,r],[s,a,o,h,c])=>{if(e!==s)return!1;const l=r.id===c.id&&t===a&&n===h;return e?l:l&&i===o})),dt((([e,t,i,n,r])=>{if(e){const e=this._navigator.api.data.geometry,i=e.lngLatToCellId(r.originalLngLat);return Ce(t?[i]:kg(i,n,e))}const s=t?30:90;return Ce(this._cellsInFov(r,i,s))})),zt((e=>ge(e).pipe(We((e=>(this._cache.hasCell(e)?Ce(this._cache.getCell(e)):this._cache.cacheCell$(e)).pipe(De((t=>({id:e,images:t}))))),6)))));t.push(o.pipe(Vt(this._navigator.stateService.reference$)).subscribe((([e,t])=>{this._scene.hasCell(e.id)||this._scene.addCell(this._cellToTopocentric(e.id,t),e.id)}))),t.push(o.pipe(Vt(this._navigator.stateService.reference$)).subscribe((([e,t])=>{this._addSceneImages(e,t)}))),t.push(o.pipe(dt((e=>{const t=e.id;let i;return i=this._cache.hasClusters(t)?ge(this._cache.getClusters(t)):this._cache.isCachingClusters(t)?this._cache.cacheClusters$(t).pipe(Ct(null,{}),zt((()=>ge(this._cache.getClusters(t))))):this._cache.hasCell(t)?this._cache.cacheClusters$(t):ie(),Ve(Ce(t),i)})),Vt(this._navigator.stateService.reference$)).subscribe((([[e,t],i])=>{this._scene.hasCluster(t.id,e)||this._scene.addCluster(t,this._computeTranslation(t,i),e)}))),t.push(this._configuration$.pipe(De((t=>{var i;t.cameraSize=this._spatial.clamp(t.cameraSize,.01,1),t.pointSize=this._spatial.clamp(t.pointSize,.01,1);const n=t.pointsVisible?null!==(i=t.pointVisualizationMode)&&void 0!==i?i:e.PointVisualizationMode.Original:e.PointVisualizationMode.Hidden;return{cameraSize:t.cameraSize,cameraVisualizationMode:t.cameraVisualizationMode,cellsVisible:t.cellsVisible,originalPositionMode:t.originalPositionMode,pointSize:t.pointSize,pointVisualizationMode:n}})),vt(((e,t)=>e.cameraSize===t.cameraSize&&e.cameraVisualizationMode===t.cameraVisualizationMode&&e.cellsVisible===t.cellsVisible&&e.originalPositionMode===t.originalPositionMode&&e.pointSize===t.pointSize&&e.pointVisualizationMode===t.pointVisualizationMode))).subscribe((e=>{this._scene.setCameraSize(e.cameraSize);const t=e.cameraVisualizationMode;this._scene.setCameraVisualizationMode(t),this._scene.setCellVisibility(e.cellsVisible),this._scene.setPointSize(e.pointSize);const i=e.pointVisualizationMode;this._scene.setPointVisualizationMode(i);const n=e.originalPositionMode;this._scene.setPositionMode(n)}))),t.push(Ve(n,r).subscribe((([e,t])=>{const i=kg(e,t,this._navigator.api.data.geometry);this._scene.uncache(i),this._cache.uncache(i)}))),t.push(this._navigator.playService.playing$.pipe(zt((e=>e?ie():this._container.mouseService.dblClick$)),Vt(this._container.renderService.renderCamera$),zt((([e,t])=>{const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(e,i),s=this._viewportCoords.canvasToViewport(n,r,i),a=this._scene.intersection.intersectObjects(s,t.perspective);return a?this._navigator.moveTo$(a).pipe(ct((()=>ie()))):ie()}))).subscribe());const h=Ve(this._configuration$,this._navigator.stateService.state$).pipe(De((([e,t])=>(e.cameraSize=this._spatial.clamp(e.cameraSize,.01,1),{size:e.cameraSize,visible:Lg(e.cameraVisualizationMode),state:t}))),vt(((e,t)=>e.size===t.size&&e.visible===t.visible&&e.state===t.state))),c=this._container.mouseService.mouseMove$.pipe(Rt(1),U());t.push(c.subscribe());const l=it(this._container.mouseService.mouseEnter$,this._container.mouseService.mouseLeave$,this._container.mouseService.windowBlur$);t.push(Ve(this._navigator.playService.playing$,l,a,this._navigator.graphService.filter$).pipe(zt((([e,t])=>e||"pointerenter"!==t.type?Ve(Ce(t),Ce(null),Ce(null)):Ve(Ze(c.pipe(_t(1)),this._container.mouseService.mouseMove$),this._container.renderService.renderCamera$,h)))).subscribe((([e,t])=>{if("pointermove"!==e.type)return void this._scene.setHoveredImage(null);const i=this._container.container,[n,r]=this._viewportCoords.canvasPosition(e,i),s=this._viewportCoords.canvasToViewport(n,r,i),a=this._scene.intersection.intersectObjects(s,t.perspective);this._scene.setHoveredImage(a)}))),t.push(this._navigator.stateService.currentId$.subscribe((e=>{this._scene.setSelectedImage(e)}))),t.push(this._navigator.stateService.currentState$.pipe(De((e=>{const t=this._scene;return{name:this._name,renderer:{frameId:e.id,needsRender:t.needsRender,render:t.render.bind(t),pass:yf.Opaque}}}))).subscribe(this._container.glRenderer.render$));const u=this._navigator.graphService.dataAdded$.pipe(st((e=>this._cache.hasCell(e))),We((e=>this._cache.updateCell$(e).pipe(De((t=>({id:e,images:t}))),Vt(this._navigator.stateService.reference$)))),It(),U());t.push(u.subscribe((([e,t])=>{this._addSceneImages(e,t)}))),t.push(u.pipe(dt((([e])=>{const t=e.id,i=this._cache;let n;return n=i.hasClusters(t)?i.updateClusters$(t):i.isCachingClusters(t)?this._cache.cacheClusters$(t).pipe(Ct(null,{}),zt((()=>ge(i.updateClusters$(t))))):ie(),Ve(Ce(t),n)})),Vt(this._navigator.stateService.reference$)).subscribe((([[e,t],i])=>{this._scene.hasCluster(t.id,e)||this._scene.addCluster(t,this._computeTranslation(t,i),e)})))}_deactivate(){this._subscriptions.unsubscribe(),this._cache.uncache(),this._scene.deactivate(),this._navigator.cacheService.configure()}_getDefaultConfiguration(){return{cameraSize:.1,cameraVisualizationMode:e.CameraVisualizationMode.Homogeneous,cellGridDepth:1,originalPositionMode:e.OriginalPositionMode.Hidden,pointSize:.1,pointsVisible:!0,pointVisualizationMode:e.PointVisualizationMode.Original,cellsVisible:!1}}_addSceneImages(e,t){const i=e.id,n=e.images;for(const e of n)this._scene.hasImage(e.id,i)||this._scene.addImage(e,this._createTransform(e,t),this._computeOriginalPosition(e,t),i)}_cellsInFov(e,t,i){const n=this._spatial,r=this._navigator.api.data.geometry,s=r.lngLatToCellId(e.originalLngLat),a=[s],o=i/2,h=r.getAdjacent(s);for(const i of h){const s=r.getVertices(i);for(const r of s){const[s,h]=_u(r.lng,r.lat,0,e.lngLat.lng,e.lngLat.lat,0),c=Math.atan2(h,s),l=n.radToDeg(n.azimuthalToBearing(c));Math.abs(l-t)<o&&a.push(i)}}return a}_computeOriginalPosition(e,t){return _u(e.originalLngLat.lng,e.originalLngLat.lat,null!=e.originalAltitude?e.originalAltitude:e.computedAltitude,t.lng,t.lat,t.alt)}_cellToTopocentric(e,t){return this._navigator.api.data.geometry.getVertices(e).map((e=>_u(e.lng,e.lat,-2,t.lng,t.lat,t.alt)))}_computeTranslation(e,t){return _u(e.reference.lng,e.reference.lat,e.reference.alt,t.lng,t.lat,t.alt)}_createTransform(e,t){const i=Ou({alt:e.computedAltitude,lat:e.lngLat.lat,lng:e.lngLat.lng},e.rotation,t);return new ug(e.exifOrientation,e.width,e.height,e.scale,e.rotation,i,void 0,void 0,e.cameraParameters,e.cameraType)}}zg.componentName="spatial";class Fg{constructor(){this._notifyChanged$=new j}get changed$(){return this._notifyChanged$}}class Bg extends Pu{constructor(e){super(null!=e?e:"The provided geometry value is incorrect"),Object.setPrototypeOf(this,Bg.prototype),this.name="GeometryTagError"}}class Ug extends Fg{constructor(e){super();if(e.length<2)throw new Bg("A points geometry must have two or more positions.");this._points=[];for(const t of e){if(t[0]<0||t[0]>1||t[1]<0||t[1]>1)throw new Bg("Basic coordinates of points must be on the interval [0, 1].");this._points.push(t.slice())}}get points(){return this._points}addPoint2d(e){const t=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._points.push(t),this._notifyChanged$.next(this)}getPoint2d(e){return this._points[e].slice()}removePoint2d(e){if(e<0||e>=this._points.length||this._points.length<3)throw new Bg("Index for removed point must be valid.");this._points.splice(e,1),this._notifyChanged$.next(this)}setVertex2d(e,t,i){this.setPoint2d(e,t,i)}setPoint2d(e,t,i){const n=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];this._points[e]=n,this._notifyChanged$.next(this)}getPoints3d(e){return this._getPoints3d(this._points,e)}getPoint3d(e,t){return t.unprojectBasic(this._points[e],200)}getPoints2d(){return this._points.slice()}getCentroid2d(e){if(!e)throw new Bg("Get centroid must be called with a transform for points geometries.");const[t,i,n,r]=this.getRect2d(e);return[t<n?(t+n)/2:(t+n+1)/2%1,(i+r)/2]}getCentroid3d(e){let t=this.getCentroid2d();return e.unprojectBasic(t,200)}getRect2d(e){let t=1,i=0,n=1,r=0;const s=this._points;for(const e of s)e[0]<t&&(t=e[0]),e[0]>i&&(i=e[0]),e[1]<n&&(n=e[1]),e[1]>r&&(r=e[1]);if($u(e.cameraType)){const e=[];for(let t=0;t<s.length;t++)e[t]=t;e.sort(((e,t)=>s[e][0]<s[t][0]?-1:s[e][0]>s[t][0]?1:e<t?-1:1));let n=s[e[0]][0]+1-s[e[e.length-1]][0],r=0;for(let t=0;t<e.length-1;t++){const i=e[t],a=e[t+1],o=s[a][0]-s[i][0];o>n&&(n=o,r=t+1)}r>0&&(t=s[e[r]][0],i=s[e[r-1]][0])}return[t,n,i,r]}setCentroid2d(e,t){throw new Error("Not implemented")}_getPoints3d(e,t){return e.map((e=>t.unprojectBasic(e,200)))}}class Vg{constructor(e,t,i){this._geometry=e,this._transform=t,this._viewportCoords=i||new hf,this._aborted$=new j,this._created$=new j,this._glObjectsChanged$=new j,this._geometryChangedSubscription=this._geometry.changed$.subscribe((()=>{this._onGeometryChanged(),this._glObjectsChanged$.next(this)}))}get geometry(){return this._geometry}get glObjects(){return this._glObjects}get aborted$(){return this._aborted$}get created$(){return this._created$}get glObjectsChanged$(){return this._glObjectsChanged$}get geometryChanged$(){return this._geometry.changed$.pipe(De((()=>this)))}dispose(){this._geometryChangedSubscription.unsubscribe()}_canvasToTransform(e){return`translate(-50%,-50%) translate(${Math.round(e[0])}px,${Math.round(e[1])}px)`}_colorToBackground(e){return"#"+("000000"+e.toString(16)).substr(-6)}_createOutine(e,t){const i=this._getLinePositions(e),n=new kr;n.setAttribute("position",new Tr(i,3));const r=new Bh({color:t,linewidth:1});return new Wh(n,r)}_disposeLine(e){null!=e&&(e.geometry.dispose(),e.material.dispose())}_getLinePositions(e){const t=e.length,i=new Float32Array(3*t);for(let n=0;n<t;++n){const t=3*n,r=e[n];i[t]=r[0],i[t+1]=r[1],i[t+2]=r[2]}return i}}var Hg={exports:{}};function jg(e,t,i){i=i||2;var n,r,s,a,o,h,c,l=t&&t.length,u=l?t[0]*i:e.length,d=Gg(e,0,u,i,!0),p=[];if(!d||d.next===d.prev)return p;if(l&&(d=function(e,t,i,n){var r,s,a,o=[];for(r=0,s=t.length;r<s;r++)(a=Gg(e,t[r]*n,r<s-1?t[r+1]*n:e.length,n,!1))===a.next&&(a.steiner=!0),o.push(i_(a));for(o.sort(Kg),r=0;r<o.length;r++)i=Wg(i=Qg(o[r],i),i.next);return i}(e,t,d,i)),e.length>80*i){n=s=e[0],r=a=e[1];for(var m=i;m<u;m+=i)(o=e[m])<n&&(n=o),(h=e[m+1])<r&&(r=h),o>s&&(s=o),h>a&&(a=h);c=0!==(c=Math.max(s-n,a-r))?1/c:0}return qg(d,p,i,n,r,c),p}function Gg(e,t,i,n,r){var s,a;if(r===f_(e,t,i,n)>0)for(s=t;s<i;s+=n)a=d_(s,e[s],e[s+1],a);else for(s=i-n;s>=t;s-=n)a=d_(s,e[s],e[s+1],a);return a&&a_(a,a.next)&&(p_(a),a=a.next),a}function Wg(e,t){if(!e)return e;t||(t=e);var i,n=e;do{if(i=!1,n.steiner||!a_(n,n.next)&&0!==s_(n.prev,n,n.next))n=n.next;else{if(p_(n),(n=t=n.prev)===n.next)break;i=!0}}while(i||n!==t);return t}function qg(e,t,i,n,r,s,a){if(e){!a&&s&&function(e,t,i,n){var r=e;do{null===r.z&&(r.z=t_(r.x,r.y,t,i,n)),r.prevZ=r.prev,r.nextZ=r.next,r=r.next}while(r!==e);r.prevZ.nextZ=null,r.prevZ=null,function(e){var t,i,n,r,s,a,o,h,c=1;do{for(i=e,e=null,s=null,a=0;i;){for(a++,n=i,o=0,t=0;t<c&&(o++,n=n.nextZ);t++);for(h=c;o>0||h>0&&n;)0!==o&&(0===h||!n||i.z<=n.z)?(r=i,i=i.nextZ,o--):(r=n,n=n.nextZ,h--),s?s.nextZ=r:e=r,r.prevZ=s,s=r;i=n}s.nextZ=null,c*=2}while(a>1)}(r)}(e,n,r,s);for(var o,h,c=e;e.prev!==e.next;)if(o=e.prev,h=e.next,s?Zg(e,n,r,s):Xg(e))t.push(o.i/i),t.push(e.i/i),t.push(h.i/i),p_(e),e=h.next,c=h.next;else if((e=h)===c){a?1===a?qg(e=Yg(Wg(e),t,i),t,i,n,r,s,2):2===a&&Jg(e,t,i,n,r,s):qg(Wg(e),t,i,n,r,s,1);break}}}function Xg(e){var t=e.prev,i=e,n=e.next;if(s_(t,i,n)>=0)return!1;for(var r=e.next.next;r!==e.prev;){if(n_(t.x,t.y,i.x,i.y,n.x,n.y,r.x,r.y)&&s_(r.prev,r,r.next)>=0)return!1;r=r.next}return!0}function Zg(e,t,i,n){var r=e.prev,s=e,a=e.next;if(s_(r,s,a)>=0)return!1;for(var o=r.x<s.x?r.x<a.x?r.x:a.x:s.x<a.x?s.x:a.x,h=r.y<s.y?r.y<a.y?r.y:a.y:s.y<a.y?s.y:a.y,c=r.x>s.x?r.x>a.x?r.x:a.x:s.x>a.x?s.x:a.x,l=r.y>s.y?r.y>a.y?r.y:a.y:s.y>a.y?s.y:a.y,u=t_(o,h,t,i,n),d=t_(c,l,t,i,n),p=e.prevZ,m=e.nextZ;p&&p.z>=u&&m&&m.z<=d;){if(p!==e.prev&&p!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&s_(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,m!==e.prev&&m!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&s_(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;p&&p.z>=u;){if(p!==e.prev&&p!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,p.x,p.y)&&s_(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;m&&m.z<=d;){if(m!==e.prev&&m!==e.next&&n_(r.x,r.y,s.x,s.y,a.x,a.y,m.x,m.y)&&s_(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function Yg(e,t,i){var n=e;do{var r=n.prev,s=n.next.next;!a_(r,s)&&o_(r,n,n.next,s)&&l_(r,s)&&l_(s,r)&&(t.push(r.i/i),t.push(n.i/i),t.push(s.i/i),p_(n),p_(n.next),n=e=s),n=n.next}while(n!==e);return Wg(n)}function Jg(e,t,i,n,r,s){var a=e;do{for(var o=a.next.next;o!==a.prev;){if(a.i!==o.i&&r_(a,o)){var h=u_(a,o);return a=Wg(a,a.next),h=Wg(h,h.next),qg(a,t,i,n,r,s),void qg(h,t,i,n,r,s)}o=o.next}a=a.next}while(a!==e)}function Kg(e,t){return e.x-t.x}function Qg(e,t){var i=function(e,t){var i,n=t,r=e.x,s=e.y,a=-1/0;do{if(s<=n.y&&s>=n.next.y&&n.next.y!==n.y){var o=n.x+(s-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(o<=r&&o>a){if(a=o,o===r){if(s===n.y)return n;if(s===n.next.y)return n.next}i=n.x<n.next.x?n:n.next}}n=n.next}while(n!==t);if(!i)return null;if(r===a)return i;var h,c=i,l=i.x,u=i.y,d=1/0;n=i;do{r>=n.x&&n.x>=l&&r!==n.x&&n_(s<u?r:a,s,l,u,s<u?a:r,s,n.x,n.y)&&(h=Math.abs(s-n.y)/(r-n.x),l_(n,e)&&(h<d||h===d&&(n.x>i.x||n.x===i.x&&e_(i,n)))&&(i=n,d=h)),n=n.next}while(n!==c);return i}(e,t);if(!i)return t;var n=u_(i,e),r=Wg(i,i.next);return Wg(n,n.next),t===i?r:t}function e_(e,t){return s_(e.prev,e,t.prev)<0&&s_(t.next,e,e.next)<0}function t_(e,t,i,n,r){return(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-i)*r)|e<<8))|e<<4))|e<<2))|e<<1))|(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-n)*r)|t<<8))|t<<4))|t<<2))|t<<1))<<1}function i_(e){var t=e,i=e;do{(t.x<i.x||t.x===i.x&&t.y<i.y)&&(i=t),t=t.next}while(t!==e);return i}function n_(e,t,i,n,r,s,a,o){return(r-a)*(t-o)-(e-a)*(s-o)>=0&&(e-a)*(n-o)-(i-a)*(t-o)>=0&&(i-a)*(s-o)-(r-a)*(n-o)>=0}function r_(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!function(e,t){var i=e;do{if(i.i!==e.i&&i.next.i!==e.i&&i.i!==t.i&&i.next.i!==t.i&&o_(i,i.next,e,t))return!0;i=i.next}while(i!==e);return!1}(e,t)&&(l_(e,t)&&l_(t,e)&&function(e,t){var i=e,n=!1,r=(e.x+t.x)/2,s=(e.y+t.y)/2;do{i.y>s!=i.next.y>s&&i.next.y!==i.y&&r<(i.next.x-i.x)*(s-i.y)/(i.next.y-i.y)+i.x&&(n=!n),i=i.next}while(i!==e);return n}(e,t)&&(s_(e.prev,e,t.prev)||s_(e,t.prev,t))||a_(e,t)&&s_(e.prev,e,e.next)>0&&s_(t.prev,t,t.next)>0)}function s_(e,t,i){return(t.y-e.y)*(i.x-t.x)-(t.x-e.x)*(i.y-t.y)}function a_(e,t){return e.x===t.x&&e.y===t.y}function o_(e,t,i,n){var r=c_(s_(e,t,i)),s=c_(s_(e,t,n)),a=c_(s_(i,n,e)),o=c_(s_(i,n,t));return r!==s&&a!==o||(!(0!==r||!h_(e,i,t))||(!(0!==s||!h_(e,n,t))||(!(0!==a||!h_(i,e,n))||!(0!==o||!h_(i,t,n)))))}function h_(e,t,i){return t.x<=Math.max(e.x,i.x)&&t.x>=Math.min(e.x,i.x)&&t.y<=Math.max(e.y,i.y)&&t.y>=Math.min(e.y,i.y)}function c_(e){return e>0?1:e<0?-1:0}function l_(e,t){return s_(e.prev,e,e.next)<0?s_(e,t,e.next)>=0&&s_(e,e.prev,t)>=0:s_(e,t,e.prev)<0||s_(e,e.next,t)<0}function u_(e,t){var i=new m_(e.i,e.x,e.y),n=new m_(t.i,t.x,t.y),r=e.next,s=t.prev;return e.next=t,t.prev=e,i.next=r,r.prev=i,n.next=i,i.prev=n,s.next=n,n.prev=s,n}function d_(e,t,i,n){var r=new m_(e,t,i);return n?(r.next=n.next,r.prev=n,n.next.prev=r,n.next=r):(r.prev=r,r.next=r),r}function p_(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function m_(e,t,i){this.i=e,this.x=t,this.y=i,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function f_(e,t,i,n){for(var r=0,s=t,a=i-n;s<i;s+=n)r+=(e[a]-e[s])*(e[s+1]+e[a+1]),a=s;return r}Hg.exports=jg,Hg.exports.default=jg,jg.deviation=function(e,t,i,n){var r=t&&t.length,s=r?t[0]*i:e.length,a=Math.abs(f_(e,0,s,i));if(r)for(var o=0,h=t.length;o<h;o++){var c=t[o]*i,l=o<h-1?t[o+1]*i:e.length;a-=Math.abs(f_(e,c,l,i))}var u=0;for(o=0;o<n.length;o+=3){var d=n[o]*i,p=n[o+1]*i,m=n[o+2]*i;u+=Math.abs((e[d]-e[m])*(e[p+1]-e[d+1])-(e[d]-e[p])*(e[m+1]-e[d+1]))}return 0===a&&0===u?0:Math.abs((u-a)/a)},jg.flatten=function(e){for(var t=e[0][0].length,i={vertices:[],holes:[],dimensions:t},n=0,r=0;r<e.length;r++){for(var s=0;s<e[r].length;s++)for(var a=0;a<t;a++)i.vertices.push(e[r][s][a]);r>0&&(n+=e[r-1].length,i.holes.push(n))}return i};var g_=Hg.exports,__={exports:{}};function v_(e,t){return e<t?-1:e>t?1:0}var y_=cd(Object.freeze({__proto__:null,default:class{constructor(e=[],t=v_){if(this.data=e,this.length=this.data.length,this.compare=t,this.length>0)for(let e=(this.length>>1)-1;e>=0;e--)this._down(e)}push(e){this.data.push(e),this.length++,this._up(this.length-1)}pop(){if(0===this.length)return;const e=this.data[0],t=this.data.pop();return this.length--,this.length>0&&(this.data[0]=t,this._down(0)),e}peek(){return this.data[0]}_up(e){const{data:t,compare:i}=this,n=t[e];for(;e>0;){const r=e-1>>1,s=t[r];if(i(n,s)>=0)break;t[e]=s,e=r}t[e]=n}_down(e){const{data:t,compare:i}=this,n=this.length>>1,r=t[e];for(;e<n;){let n=1+(e<<1),s=t[n];const a=n+1;if(a<this.length&&i(t[a],s)<0&&(n=a,s=t[a]),i(s,r)>=0)break;t[e]=s,e=n}t[e]=r}}}));function b_(e,t,i){var n,r,s,a;t=t||1;for(var o=0;o<e[0].length;o++){var h=e[0][o];(!o||h[0]<n)&&(n=h[0]),(!o||h[1]<r)&&(r=h[1]),(!o||h[0]>s)&&(s=h[0]),(!o||h[1]>a)&&(a=h[1])}var c=s-n,l=a-r,u=Math.min(c,l),d=u/2;if(0===u){var p=[n,r];return p.distance=0,p}for(var m=new y_(void 0,x_),f=n;f<s;f+=u)for(var g=r;g<a;g+=u)m.push(new w_(f+d,g+d,d,e));var _=function(e){for(var t=0,i=0,n=0,r=e[0],s=0,a=r.length,o=a-1;s<a;o=s++){var h=r[s],c=r[o],l=h[0]*c[1]-c[0]*h[1];i+=(h[0]+c[0])*l,n+=(h[1]+c[1])*l,t+=3*l}return 0===t?new w_(r[0][0],r[0][1],0,e):new w_(i/t,n/t,0,e)}(e),v=new w_(n+c/2,r+l/2,0,e);v.d>_.d&&(_=v);for(var y=m.length;m.length;){var b=m.pop();b.d>_.d&&(_=b,i&&console.log("found best %d after %d probes",Math.round(1e4*b.d)/1e4,y)),b.max-_.d<=t||(d=b.h/2,m.push(new w_(b.x-d,b.y-d,d,e)),m.push(new w_(b.x+d,b.y-d,d,e)),m.push(new w_(b.x-d,b.y+d,d,e)),m.push(new w_(b.x+d,b.y+d,d,e)),y+=4)}i&&(console.log("num probes: "+y),console.log("best distance: "+_.d));var x=[_.x,_.y];return x.distance=_.d,x}function x_(e,t){return t.max-e.max}function w_(e,t,i,n){this.x=e,this.y=t,this.h=i,this.d=function(e,t,i){for(var n=!1,r=1/0,s=0;s<i.length;s++)for(var a=i[s],o=0,h=a.length,c=h-1;o<h;c=o++){var l=a[o],u=a[c];l[1]>t!=u[1]>t&&e<(u[0]-l[0])*(t-l[1])/(u[1]-l[1])+l[0]&&(n=!n),r=Math.min(r,M_(e,t,l,u))}return 0===r?0:(n?1:-1)*Math.sqrt(r)}(e,t,n),this.max=this.d+this.h*Math.SQRT2}function M_(e,t,i,n){var r=i[0],s=i[1],a=n[0]-r,o=n[1]-s;if(0!==a||0!==o){var h=((e-r)*a+(t-s)*o)/(a*a+o*o);h>1?(r=n[0],s=n[1]):h>0&&(r+=a*h,s+=o*h)}return(a=e-r)*a+(o=t-s)*o}y_.default&&(y_=y_.default),__.exports=b_,__.exports.default=b_;var S_=__.exports;function T_(e,t){return e>t?1:e<t?-1:0}class C_{constructor(e=T_,t=!1){this._compare=e,this._root=null,this._size=0,this._noDuplicates=!!t}rotateLeft(e){var t=e.right;t&&(e.right=t.left,t.left&&(t.left.parent=e),t.parent=e.parent),e.parent?e===e.parent.left?e.parent.left=t:e.parent.right=t:this._root=t,t&&(t.left=e),e.parent=t}rotateRight(e){var t=e.left;t&&(e.left=t.right,t.right&&(t.right.parent=e),t.parent=e.parent),e.parent?e===e.parent.left?e.parent.left=t:e.parent.right=t:this._root=t,t&&(t.right=e),e.parent=t}_splay(e){for(;e.parent;){var t=e.parent;t.parent?t.left===e&&t.parent.left===t?(this.rotateRight(t.parent),this.rotateRight(t)):t.right===e&&t.parent.right===t?(this.rotateLeft(t.parent),this.rotateLeft(t)):t.left===e&&t.parent.right===t?(this.rotateRight(t),this.rotateLeft(t)):(this.rotateLeft(t),this.rotateRight(t)):t.left===e?this.rotateRight(t):this.rotateLeft(t)}}splay(e){for(var t,i,n,r,s;e.parent;)(i=(t=e.parent).parent)&&i.parent?((n=i.parent).left===i?n.left=e:n.right=e,e.parent=n):(e.parent=null,this._root=e),r=e.left,s=e.right,e===t.left?(i&&(i.left===t?(t.right?(i.left=t.right,i.left.parent=i):i.left=null,t.right=i,i.parent=t):(r?(i.right=r,r.parent=i):i.right=null,e.left=i,i.parent=e)),s?(t.left=s,s.parent=t):t.left=null,e.right=t,t.parent=e):(i&&(i.right===t?(t.left?(i.right=t.left,i.right.parent=i):i.right=null,t.left=i,i.parent=t):(s?(i.left=s,s.parent=i):i.left=null,e.right=i,i.parent=e)),r?(t.right=r,r.parent=t):t.right=null,e.left=t,t.parent=e)}replace(e,t){e.parent?e===e.parent.left?e.parent.left=t:e.parent.right=t:this._root=t,t&&(t.parent=e.parent)}minNode(e=this._root){if(e)for(;e.left;)e=e.left;return e}maxNode(e=this._root){if(e)for(;e.right;)e=e.right;return e}insert(e,t){var i=this._root,n=null,r=this._compare;if(this._noDuplicates)for(;i;){if(n=i,0===r(i.key,e))return;i=r(i.key,e)<0?i.right:i.left}else for(;i;)n=i,i=r(i.key,e)<0?i.right:i.left;return i={key:e,data:t,left:null,right:null,parent:n},n?r(n.key,i.key)<0?n.right=i:n.left=i:this._root=i,this.splay(i),this._size++,i}find(e){for(var t=this._root,i=this._compare;t;){var n=i(t.key,e);if(n<0)t=t.right;else{if(!(n>0))return t;t=t.left}}return null}contains(e){for(var t=this._root,i=this._compare;t;){var n=i(e,t.key);if(0===n)return!0;t=n<0?t.left:t.right}return!1}remove(e){var t=this.find(e);if(!t)return!1;if(this.splay(t),t.left)if(t.right){var i=this.minNode(t.right);i.parent!==t&&(this.replace(i,i.right),i.right=t.right,i.right.parent=i),this.replace(t,i),i.left=t.left,i.left.parent=i}else this.replace(t,t.left);else this.replace(t,t.right);return this._size--,!0}removeNode(e){if(!e)return!1;if(this.splay(e),e.left)if(e.right){var t=this.minNode(e.right);t.parent!==e&&(this.replace(t,t.right),t.right=e.right,t.right.parent=t),this.replace(e,t),t.left=e.left,t.left.parent=t}else this.replace(e,e.left);else this.replace(e,e.right);return this._size--,!0}erase(e){var t=this.find(e);if(t){this.splay(t);var i=t.left,n=t.right,r=null;i&&(i.parent=null,r=this.maxNode(i),this.splay(r),this._root=r),n&&(i?r.right=n:this._root=n,n.parent=r),this._size--}}pop(){var e=this._root,t=null;if(e){for(;e.left;)e=e.left;t={key:e.key,data:e.data},this.remove(e.key)}return t}next(e){var t=e;if(t)if(t.right)for(t=t.right;t&&t.left;)t=t.left;else for(t=e.parent;t&&t.right===e;)e=t,t=t.parent;return t}prev(e){var t=e;if(t)if(t.left)for(t=t.left;t&&t.right;)t=t.right;else for(t=e.parent;t&&t.left===e;)e=t,t=t.parent;return t}forEach(e){for(var t=this._root,i=[],n=!1,r=0;!n;)t?(i.push(t),t=t.left):i.length>0?(e(t=i.pop(),r++),t=t.right):n=!0;return this}range(e,t,i,n){const r=[],s=this._compare;let a,o=this._root;for(;0!==r.length||o;)if(o)r.push(o),o=o.left;else{if(o=r.pop(),a=s(o.key,t),a>0)break;if(s(o.key,e)>=0&&i.call(n,o))return this;o=o.right}return this}keys(){for(var e=this._root,t=[],i=[],n=!1;!n;)e?(t.push(e),e=e.left):t.length>0?(e=t.pop(),i.push(e.key),e=e.right):n=!0;return i}values(){for(var e=this._root,t=[],i=[],n=!1;!n;)e?(t.push(e),e=e.left):t.length>0?(e=t.pop(),i.push(e.data),e=e.right):n=!0;return i}at(e){for(var t=this._root,i=[],n=!1,r=0;!n;)if(t)i.push(t),t=t.left;else if(i.length>0){if(t=i.pop(),r===e)return t;r++,t=t.right}else n=!0;return null}load(e=[],t=[],i=!1){if(0!==this._size)throw new Error("bulk-load: tree is not empty");const n=e.length;return i&&A_(e,t,0,n-1,this._compare),this._root=E_(null,e,t,0,n),this._size=n,this}min(){var e=this.minNode(this._root);return e?e.key:null}max(){var e=this.maxNode(this._root);return e?e.key:null}isEmpty(){return null===this._root}get size(){return this._size}static createTree(e,t,i,n,r){return new C_(i,r).load(e,t,n)}}function E_(e,t,i,n,r){const s=r-n;if(s>0){const a=n+Math.floor(s/2),o={key:t[a],data:i[a],parent:e};return o.left=E_(o,t,i,n,a),o.right=E_(o,t,i,a+1,r),o}return null}function A_(e,t,i,n,r){if(i>=n)return;const s=e[i+n>>1];let a=i-1,o=n+1;for(;;){do{a++}while(r(e[a],s)<0);do{o--}while(r(e[o],s)>0);if(a>=o)break;let i=e[a];e[a]=e[o],e[o]=i,i=t[a],t[a]=t[o],t[o]=i}A_(e,t,i,o,r),A_(e,t,o+1,n,r)}function I_(e,t,i){null===t?(e.inOut=!1,e.otherInOut=!0):(e.isSubject===t.isSubject?(e.inOut=!t.inOut,e.otherInOut=t.otherInOut):(e.inOut=!t.otherInOut,e.otherInOut=t.isVertical()?!t.inOut:t.inOut),t&&(e.prevInResult=!R_(t,i)||t.isVertical()?t.prevInResult:t));let n=R_(e,i);e.resultTransition=n?function(e,t){let i,n=!e.inOut,r=!e.otherInOut;switch(t){case 0:i=n&&r;break;case 1:i=n||r;break;case 3:i=n^r;break;case 2:i=e.isSubject?n&&!r:r&&!n}return i?1:-1}(e,i):0}function R_(e,t){switch(e.type){case 0:switch(t){case 0:return!e.otherInOut;case 1:return e.otherInOut;case 2:return e.isSubject&&e.otherInOut||!e.isSubject&&!e.otherInOut;case 3:return!0}break;case 2:return 0===t||1===t;case 3:return 2===t;case 1:return!1}return!1}class P_{constructor(e,t,i,n,r){this.left=t,this.point=e,this.otherEvent=i,this.isSubject=n,this.type=r||0,this.inOut=!1,this.otherInOut=!1,this.prevInResult=null,this.resultTransition=0,this.otherPos=-1,this.outputContourId=-1,this.isExteriorRing=!0}isBelow(e){const t=this.point,i=this.otherEvent.point;return this.left?(t[0]-e[0])*(i[1]-e[1])-(i[0]-e[0])*(t[1]-e[1])>0:(i[0]-e[0])*(t[1]-e[1])-(t[0]-e[0])*(i[1]-e[1])>0}isAbove(e){return!this.isBelow(e)}isVertical(){return this.point[0]===this.otherEvent.point[0]}get inResult(){return 0!==this.resultTransition}clone(){const e=new P_(this.point,this.left,this.otherEvent,this.isSubject,this.type);return e.contourId=this.contourId,e.resultTransition=this.resultTransition,e.prevInResult=this.prevInResult,e.isExteriorRing=this.isExteriorRing,e.inOut=this.inOut,e.otherInOut=this.otherInOut,e}}function L_(e,t){return e[0]===t[0]&&e[1]===t[1]}const D_=134217729;function N_(e,t,i,n,r){let s,a,o,h,c=t[0],l=n[0],u=0,d=0;l>c==l>-c?(s=c,c=t[++u]):(s=l,l=n[++d]);let p=0;if(u<e&&d<i)for(l>c==l>-c?(a=c+s,o=s-(a-c),c=t[++u]):(a=l+s,o=s-(a-l),l=n[++d]),s=a,0!==o&&(r[p++]=o);u<e&&d<i;)l>c==l>-c?(a=s+c,h=a-s,o=s-(a-h)+(c-h),c=t[++u]):(a=s+l,h=a-s,o=s-(a-h)+(l-h),l=n[++d]),s=a,0!==o&&(r[p++]=o);for(;u<e;)a=s+c,h=a-s,o=s-(a-h)+(c-h),c=t[++u],s=a,0!==o&&(r[p++]=o);for(;d<i;)a=s+l,h=a-s,o=s-(a-h)+(l-h),l=n[++d],s=a,0!==o&&(r[p++]=o);return 0===s&&0!==p||(r[p++]=s),p}function $_(e){return new Float64Array(e)}const k_=$_(4),O_=$_(8),z_=$_(12),F_=$_(16),B_=$_(4);function U_(e,t,i,n,r,s){const a=(t-s)*(i-r),o=(e-r)*(n-s),h=a-o;if(0===a||0===o||a>0!=o>0)return h;const c=Math.abs(a+o);return Math.abs(h)>=33306690738754716e-32*c?h:-function(e,t,i,n,r,s,a){let o,h,c,l,u,d,p,m,f,g,_,v,y,b,x,w,M,S;const T=e-r,C=i-r,E=t-s,A=n-s;b=T*A,d=D_*T,p=d-(d-T),m=T-p,d=D_*A,f=d-(d-A),g=A-f,x=m*g-(b-p*f-m*f-p*g),w=E*C,d=D_*E,p=d-(d-E),m=E-p,d=D_*C,f=d-(d-C),g=C-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,k_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,k_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,k_[2]=v-(S-u)+(_-u),k_[3]=S;let I=function(e,t){let i=t[0];for(let n=1;n<e;n++)i+=t[n];return i}(4,k_),R=22204460492503146e-32*a;if(I>=R||-I>=R)return I;if(u=e-T,o=e-(T+u)+(u-r),u=i-C,c=i-(C+u)+(u-r),u=t-E,h=t-(E+u)+(u-s),u=n-A,l=n-(A+u)+(u-s),0===o&&0===h&&0===c&&0===l)return I;if(R=11093356479670487e-47*a+33306690738754706e-32*Math.abs(I),I+=T*l+A*o-(E*c+C*h),I>=R||-I>=R)return I;b=o*A,d=D_*o,p=d-(d-o),m=o-p,d=D_*A,f=d-(d-A),g=A-f,x=m*g-(b-p*f-m*f-p*g),w=h*C,d=D_*h,p=d-(d-h),m=h-p,d=D_*C,f=d-(d-C),g=C-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,B_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,B_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,B_[2]=v-(S-u)+(_-u),B_[3]=S;const P=N_(4,k_,4,B_,O_);b=T*l,d=D_*T,p=d-(d-T),m=T-p,d=D_*l,f=d-(d-l),g=l-f,x=m*g-(b-p*f-m*f-p*g),w=E*c,d=D_*E,p=d-(d-E),m=E-p,d=D_*c,f=d-(d-c),g=c-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,B_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,B_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,B_[2]=v-(S-u)+(_-u),B_[3]=S;const L=N_(P,O_,4,B_,z_);b=o*l,d=D_*o,p=d-(d-o),m=o-p,d=D_*l,f=d-(d-l),g=l-f,x=m*g-(b-p*f-m*f-p*g),w=h*c,d=D_*h,p=d-(d-h),m=h-p,d=D_*c,f=d-(d-c),g=c-f,M=m*g-(w-p*f-m*f-p*g),_=x-M,u=x-_,B_[0]=x-(_+u)+(u-M),v=b+_,u=v-b,y=b-(v-u)+(_-u),_=y-w,u=y-_,B_[1]=y-(_+u)+(u-w),S=v+_,u=S-v,B_[2]=v-(S-u)+(_-u),B_[3]=S;const D=N_(L,z_,4,B_,F_);return F_[D-1]}(e,t,i,n,r,s,c)}function V_(e,t,i){const n=U_(e[0],e[1],t[0],t[1],i[0],i[1]);return n>0?-1:n<0?1:0}function H_(e,t){const i=e.point,n=t.point;return i[0]>n[0]?1:i[0]<n[0]?-1:i[1]!==n[1]?i[1]>n[1]?1:-1:function(e,t,i,n){if(e.left!==t.left)return e.left?1:-1;if(0!==V_(i,e.otherEvent.point,t.otherEvent.point))return e.isBelow(t.otherEvent.point)?-1:1;return!e.isSubject&&t.isSubject?1:-1}(e,t,i)}function j_(e,t,i){const n=new P_(t,!1,e,e.isSubject),r=new P_(t,!0,e.otherEvent,e.isSubject);return L_(e.point,e.otherEvent.point)&&console.warn("what is that, a collapsed segment?",e),n.contourId=r.contourId=e.contourId,H_(r,e.otherEvent)>0&&(e.otherEvent.left=!0,r.left=!1),e.otherEvent.otherEvent=r,e.otherEvent=n,i.push(r),i.push(n),i}function G_(e,t){return e[0]*t[1]-e[1]*t[0]}function W_(e,t){return e[0]*t[0]+e[1]*t[1]}function q_(e,t,i){const n=function(e,t,i,n,r){const s=[t[0]-e[0],t[1]-e[1]],a=[n[0]-i[0],n[1]-i[1]];function o(e,t,i){return[e[0]+t*i[0],e[1]+t*i[1]]}const h=[i[0]-e[0],i[1]-e[1]];let c=G_(s,a),l=c*c;const u=W_(s,s);if(l>0){const t=G_(h,a)/c;if(t<0||t>1)return null;const n=G_(h,s)/c;return n<0||n>1?null:0===t||1===t?r?null:[o(e,t,s)]:0===n||1===n?r?null:[o(i,n,a)]:[o(e,t,s)]}if(c=G_(h,s),l=c*c,l>0)return null;const d=W_(s,h)/u,p=d+W_(s,a)/u,m=Math.min(d,p),f=Math.max(d,p);return m<=1&&f>=0?1===m?r?null:[o(e,m>0?m:0,s)]:0===f?r?null:[o(e,f<1?f:1,s)]:r&&0===m&&1===f?null:[o(e,m>0?m:0,s),o(e,f<1?f:1,s)]:null}(e.point,e.otherEvent.point,t.point,t.otherEvent.point),r=n?n.length:0;if(0===r)return 0;if(1===r&&(L_(e.point,t.point)||L_(e.otherEvent.point,t.otherEvent.point)))return 0;if(2===r&&e.isSubject===t.isSubject)return 0;if(1===r)return L_(e.point,n[0])||L_(e.otherEvent.point,n[0])||j_(e,n[0],i),L_(t.point,n[0])||L_(t.otherEvent.point,n[0])||j_(t,n[0],i),1;const s=[];let a=!1,o=!1;return L_(e.point,t.point)?a=!0:1===H_(e,t)?s.push(t,e):s.push(e,t),L_(e.otherEvent.point,t.otherEvent.point)?o=!0:1===H_(e.otherEvent,t.otherEvent)?s.push(t.otherEvent,e.otherEvent):s.push(e.otherEvent,t.otherEvent),a&&o||a?(t.type=1,e.type=t.inOut===e.inOut?2:3,a&&!o&&j_(s[1].otherEvent,s[0].point,i),2):o?(j_(s[0],s[1].point,i),3):s[0]!==s[3].otherEvent?(j_(s[0],s[1].point,i),j_(s[1],s[2].point,i),3):(j_(s[0],s[1].point,i),j_(s[3].otherEvent,s[2].point,i),3)}function X_(e,t){if(e===t)return 0;if(0!==V_(e.point,e.otherEvent.point,t.point)||0!==V_(e.point,e.otherEvent.point,t.otherEvent.point))return L_(e.point,t.point)?e.isBelow(t.otherEvent.point)?-1:1:e.point[0]===t.point[0]?e.point[1]<t.point[1]?-1:1:1===H_(e,t)?t.isAbove(e.point)?-1:1:e.isBelow(t.point)?-1:1;if(e.isSubject!==t.isSubject)return e.isSubject?-1:1;{let i=e.point,n=t.point;if(i[0]===n[0]&&i[1]===n[1])return i=e.otherEvent.point,n=t.otherEvent.point,i[0]===n[0]&&i[1]===n[1]?0:e.contourId>t.contourId?1:-1}return 1===H_(e,t)?1:-1}class Z_{constructor(){this.points=[],this.holeIds=[],this.holeOf=null,this.depth=null}isExterior(){return null==this.holeOf}}function Y_(e,t,i,n){let r,s=e+1,a=t[e].point;const o=t.length;for(s<o&&(r=t[s].point);s<o&&r[0]===a[0]&&r[1]===a[1];){if(!i[s])return s;s++,r=t[s].point}for(s=e-1;i[s]&&s>n;)s--;return s}function J_(e,t,i){const n=new Z_;if(null!=e.prevInResult){const r=e.prevInResult,s=r.outputContourId;if(r.resultTransition>0){const e=t[s];if(null!=e.holeOf){const r=e.holeOf;t[r].holeIds.push(i),n.holeOf=r,n.depth=t[s].depth}else t[s].holeIds.push(i),n.holeOf=s,n.depth=t[s].depth+1}else n.holeOf=null,n.depth=t[s].depth}else n.holeOf=null,n.depth=0;return n}function K_(e){let t,i;const n=function(e){let t,i,n,r;const s=[];for(i=0,n=e.length;i<n;i++)t=e[i],(t.left&&t.inResult||!t.left&&t.otherEvent.inResult)&&s.push(t);let a=!1;for(;!a;)for(a=!0,i=0,n=s.length;i<n;i++)i+1<n&&1===H_(s[i],s[i+1])&&(r=s[i],s[i]=s[i+1],s[i+1]=r,a=!1);for(i=0,n=s.length;i<n;i++)t=s[i],t.otherPos=i;for(i=0,n=s.length;i<n;i++)t=s[i],t.left||(r=t.otherPos,t.otherPos=t.otherEvent.otherPos,t.otherEvent.otherPos=r);return s}(e),r={},s=[];for(t=0,i=n.length;t<i;t++){if(r[t])continue;const e=s.length,i=J_(n[t],s,e),a=t=>{r[t]=!0,n[t].outputContourId=e};let o=t,h=t;const c=n[t].point;for(i.points.push(c);a(o),o=n[o].otherPos,a(o),i.points.push(n[o].point),o=Y_(o,n,r,h),o!=h;);s.push(i)}return s}var Q_={exports:{}};function ev(e,t){if(!(this instanceof ev))return new ev(e,t);if(this.data=e||[],this.length=this.data.length,this.compare=t||tv,this.length>0)for(var i=(this.length>>1)-1;i>=0;i--)this._down(i)}function tv(e,t){return e<t?-1:e>t?1:0}Q_.exports=ev,Q_.exports.default=ev,ev.prototype={push:function(e){this.data.push(e),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var e=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),e}},peek:function(){return this.data[0]},_up:function(e){for(var t=this.data,i=this.compare,n=t[e];e>0;){var r=e-1>>1,s=t[r];if(i(n,s)>=0)break;t[e]=s,e=r}t[e]=n},_down:function(e){for(var t=this.data,i=this.compare,n=this.length>>1,r=t[e];e<n;){var s=1+(e<<1),a=s+1,o=t[s];if(a<this.length&&i(t[a],o)<0&&(s=a,o=t[a]),i(o,r)>=0)break;t[e]=o,e=s}t[e]=r}};var iv=Q_.exports;const nv=Math.max,rv=Math.min;let sv=0;function av(e,t,i,n,r,s){let a,o,h,c,l,u;for(a=0,o=e.length-1;a<o;a++){if(h=e[a],c=e[a+1],l=new P_(h,!1,void 0,t),u=new P_(c,!1,l,t),l.otherEvent=u,h[0]===c[0]&&h[1]===c[1])continue;l.contourId=u.contourId=i,s||(l.isExteriorRing=!1,u.isExteriorRing=!1),H_(l,u)>0?u.left=!0:l.left=!0;const o=h[0],d=h[1];r[0]=rv(r[0],o),r[1]=rv(r[1],d),r[2]=nv(r[2],o),r[3]=nv(r[3],d),n.push(l),n.push(u)}}const ov=[];function hv(e,t,i){"number"==typeof e[0][0][0]&&(e=[e]),"number"==typeof t[0][0][0]&&(t=[t]);let n=function(e,t,i){let n=null;return e.length*t.length==0&&(0===i?n=ov:2===i?n=e:1!==i&&3!==i||(n=0===e.length?t:e)),n}(e,t,i);if(n)return n===ov?null:n;const r=[1/0,1/0,-1/0,-1/0],s=[1/0,1/0,-1/0,-1/0],a=function(e,t,i,n,r){const s=new iv(null,H_);let a,o,h,c,l,u;for(h=0,c=e.length;h<c;h++)for(a=e[h],l=0,u=a.length;l<u;l++)o=0===l,o&&sv++,av(a[l],!0,sv,s,i,o);for(h=0,c=t.length;h<c;h++)for(a=t[h],l=0,u=a.length;l<u;l++)o=0===l,2===r&&(o=!1),o&&sv++,av(a[l],!1,sv,s,n,o);return s}(e,t,r,s,i);if(n=function(e,t,i,n,r){let s=null;return(i[0]>n[2]||n[0]>i[2]||i[1]>n[3]||n[1]>i[3])&&(0===r?s=ov:2===r?s=e:1!==r&&3!==r||(s=e.concat(t))),s}(e,t,r,s,i),n)return n===ov?null:n;const o=K_(function(e,t,i,n,r,s){const a=new C_(X_),o=[],h=Math.min(n[2],r[2]);let c,l,u;for(;0!==e.length;){let t=e.pop();if(o.push(t),0===s&&t.point[0]>h||2===s&&t.point[0]>n[2])break;if(t.left){l=c=a.insert(t),u=a.minNode(),c=c!==u?a.prev(c):null,l=a.next(l);const i=c?c.key:null;let n;if(I_(t,i,s),l&&2===q_(t,l.key,e)&&(I_(t,i,s),I_(t,l.key,s)),c&&2===q_(c.key,t,e)){let e=c;e=e!==u?a.prev(e):null,n=e?e.key:null,I_(i,n,s),I_(t,i,s)}}else t=t.otherEvent,l=c=a.find(t),c&&l&&(c=c!==u?a.prev(c):null,l=a.next(l),a.remove(t),l&&c&&q_(c.key,l.key,e))}return o}(a,0,0,r,s,i)),h=[];for(let e=0;e<o.length;e++){let t=o[e];if(t.isExterior()){let e=[t.points];for(let i=0;i<t.holeIds.length;i++){let n=t.holeIds[i];e.push(o[n].points)}h.push(e)}}return h}class cv extends Fg{constructor(){super(),this._subsampleThreshold=.005}_getPoleOfInaccessibility2d(e){return S_([e],.03)}_project(e,t){const i=this._createCamera(t.upVector().toArray(),t.unprojectSfM([0,0],0),t.unprojectSfM([0,0],10));return this._deunproject(e,t,i)}_subsample(e,t=this._subsampleThreshold){const i=[],n=e.length;for(let r=0;r<n;r++){const s=e[r],a=e[(r+1)%n];i.push(s);const o=Math.sqrt(Math.pow(a[0]-s[0],2)+Math.pow(a[1]-s[1],2)),h=Math.floor(o/t),c=1/(h+1);for(let e=1;e<=h;e++){const t=e*c,n=[(1-t)*s[0]+t*a[0],(1-t)*s[1]+t*a[1]];i.push(n)}}return i}_triangulate(e,t,i,n){let r=[e.slice(0,-1)];for(let e of null!=i?i:[])r.push(e.slice(0,-1));let s=t.slice(0,-1);for(let e of null!=n?n:[])s=s.concat(e.slice(0,-1));let a=g_.flatten(r),o=g_(a.vertices,a.holes,a.dimensions),h=[];for(let e=0;e<o.length;++e){let t=s[o[e]];h.push(t[0]),h.push(t[1]),h.push(t[2])}return h}_triangulateSpherical(e,t,i){const n=[],r=1e-9;for(let s=0;s<3;s++)for(let a=0;a<3;a++){const o=s/3+(0===s?-1e-9:r),h=a/3+(0===a?-1e-9:r),c=(s+1)/3+r,l=(a+1)/3+r,u=[[o,h],[o,l],[c,l],[c,h],[o,h]],d=[(2*s+1)/6,(2*a+1)/6];n.push(...this._triangulateSubarea(e,t,u,d,i))}return n}_unproject(e,t,i=200){return e.map((e=>t.unprojectBasic(e,i)))}_createCamera(e,t,i){const n=new os;return n.up.copy((new Ki).fromArray(e)),n.position.copy((new Ki).fromArray(t)),n.lookAt((new Ki).fromArray(i)),n.updateMatrix(),n.updateMatrixWorld(!0),n}_deunproject(e,t,i){return e.map((e=>{const n=t.unprojectBasic(e,1e4),r=new Ki(n[0],n[1],n[2]).applyMatrix4(i.matrixWorldInverse);return[r.x/r.z,r.y/r.z]}))}_triangulateSubarea(e,t,i,n,r){const s=hv([e,...t],[i],0);if(!s)return[];const a=[],o=this._subsampleThreshold,h=this._createCamera(r.upVector().toArray(),r.unprojectSfM([0,0],0),r.unprojectBasic(n,10));for(const e of s){const t=this._subsample(e[0],o),i=this._deunproject(t,r,h),n=this._unproject(t,r),s=[],c=[];for(let t=1;t<e.length;t++){let i=this._subsample(e[t],o);const n=this._deunproject(i,r,h),a=this._unproject(i,r);s.push(n),c.push(a)}a.push(...this._triangulate(i,n,s,c))}return a}}class lv extends cv{constructor(e){if(super(),4!==e.length)throw new Bg("Rectangle needs to have four values.");if(e[1]>e[3])throw new Bg("Basic Y coordinates values can not be inverted.");for(let t of e)if(t<0||t>1)throw new Bg("Basic coordinates must be on the interval [0, 1].");this._anchorIndex=void 0,this._rect=e.slice(0,4),this._inverted=this._rect[0]>this._rect[2]}get anchorIndex(){return this._anchorIndex}get inverted(){return this._inverted}get rect(){return this._rect}initializeAnchorIndexing(e){if(void 0!==this._anchorIndex)throw new Bg("Anchor indexing is already initialized.");if(e<0||e>3)throw new Bg(`Invalid anchor index: ${e}.`);this._anchorIndex=void 0===e?0:e}terminateAnchorIndexing(){this._anchorIndex=void 0}setOppositeVertex2d(e,t){if(void 0===this._anchorIndex)throw new Bg("Anchor indexing needs to be initialized.");const i=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))],n=this._rect.slice(),r=0===this._anchorIndex?[n[0],n[3]]:1===this._anchorIndex?[n[0],n[1]]:2===this._anchorIndex?[n[2],n[1]]:[n[2],n[3]];if($u(t.cameraType)){const e=this._anchorIndex<2?i[0]-n[2]:i[0]-n[0];!this._inverted&&this._anchorIndex<2&&i[0]<.25&&n[2]>.75&&e<-.5||!this._inverted&&this._anchorIndex>=2&&i[0]<.25&&n[2]>.75&&e<-.5?(this._inverted=!0,this._anchorIndex=r[1]>i[1]?0:1):this._inverted&&this._anchorIndex>=2&&i[0]<.25&&n[0]>.75&&e<-.5?(this._inverted=!1,this._anchorIndex=r[0]>i[0]?r[1]>i[1]?3:2:r[1]>i[1]?0:1):!this._inverted&&this._anchorIndex>=2&&i[0]>.75&&n[0]<.25&&e>.5||!this._inverted&&this._anchorIndex<2&&i[0]>.75&&n[0]<.25&&e>.5?(this._inverted=!0,this._anchorIndex=r[1]>i[1]?3:2):this._inverted&&this._anchorIndex<2&&i[0]>.75&&n[2]<.25&&e>.5?(this._inverted=!1,this._anchorIndex=r[0]>i[0]?r[1]>i[1]?3:2:r[1]>i[1]?0:1):this._inverted&&this._anchorIndex<2&&i[0]>n[0]?(this._inverted=!1,this._anchorIndex=r[1]>i[1]?0:1):this._inverted&&this._anchorIndex>=2&&i[0]<n[2]?(this._inverted=!1,this._anchorIndex=r[1]>i[1]?3:2):this._inverted?this._anchorIndex<2?this._anchorIndex=r[1]>i[1]?0:1:this._anchorIndex=r[1]>i[1]?3:2:this._anchorIndex=r[0]<=i[0]&&r[1]>i[1]?0:r[0]<=i[0]&&r[1]<=i[1]?1:r[0]>i[0]&&r[1]<=i[1]?2:3;const t=[];0===this._anchorIndex?(t[0]=r[0],t[1]=i[1],t[2]=i[0],t[3]=r[1]):1===this._anchorIndex?(t[0]=r[0],t[1]=r[1],t[2]=i[0],t[3]=i[1]):2===this._anchorIndex?(t[0]=i[0],t[1]=r[1],t[2]=r[0],t[3]=i[1]):(t[0]=i[0],t[1]=i[1],t[2]=r[0],t[3]=r[1]),(!this._inverted&&t[0]>t[2]||this._inverted&&t[0]<t[2])&&(t[0]=n[0],t[2]=n[2]),t[1]>t[3]&&(t[1]=n[1],t[3]=n[3]),this._rect[0]=t[0],this._rect[1]=t[1],this._rect[2]=t[2],this._rect[3]=t[3]}else{this._anchorIndex=r[0]<=i[0]&&r[1]>i[1]?0:r[0]<=i[0]&&r[1]<=i[1]?1:r[0]>i[0]&&r[1]<=i[1]?2:3;const e=[];0===this._anchorIndex?(e[0]=r[0],e[1]=i[1],e[2]=i[0],e[3]=r[1]):1===this._anchorIndex?(e[0]=r[0],e[1]=r[1],e[2]=i[0],e[3]=i[1]):2===this._anchorIndex?(e[0]=i[0],e[1]=r[1],e[2]=r[0],e[3]=i[1]):(e[0]=i[0],e[1]=i[1],e[2]=r[0],e[3]=r[1]),e[0]>e[2]&&(e[0]=n[0],e[2]=n[2]),e[1]>e[3]&&(e[1]=n[1],e[3]=n[3]),this._rect[0]=e[0],this._rect[1]=e[1],this._rect[2]=e[2],this._rect[3]=e[3]}this._notifyChanged$.next(this)}setVertex2d(e,t,i){let n=this._rect.slice(),r=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))],s=[];if(0===e?(s[0]=r[0],s[1]=n[1],s[2]=n[2],s[3]=r[1]):1===e?(s[0]=r[0],s[1]=r[1],s[2]=n[2],s[3]=n[3]):2===e?(s[0]=n[0],s[1]=r[1],s[2]=r[0],s[3]=n[3]):3===e&&(s[0]=n[0],s[1]=n[1],s[2]=r[0],s[3]=r[1]),$u(i.cameraType)){let t=e<2&&r[0]>.75&&n[0]<.25||e>=2&&this._inverted&&r[0]>.75&&n[2]<.25,i=e<2&&this._inverted&&r[0]<.25&&n[0]>.75||e>=2&&r[0]<.25&&n[2]>.75;t||i?this._inverted=!this._inverted:(s[0]-n[0]<-.25&&(s[0]=n[0]),s[2]-n[2]>.25&&(s[2]=n[2])),(!this._inverted&&s[0]>s[2]||this._inverted&&s[0]<s[2])&&(s[0]=n[0],s[2]=n[2])}else s[0]>s[2]&&(s[0]=n[0],s[2]=n[2]);s[1]>s[3]&&(s[1]=n[1],s[3]=n[3]),this._rect[0]=s[0],this._rect[1]=s[1],this._rect[2]=s[2],this._rect[3]=s[3],this._notifyChanged$.next(this)}setCentroid2d(e,t){let i=this._rect.slice(),n=i[0],r=this._inverted?i[2]+1:i[2],s=i[1],a=i[3],o=n+(r-n)/2,h=s+(a-s)/2,c=0;if($u(t.cameraType))c=this._inverted?e[0]+1-o:e[0]-o;else{let t=-n,i=1-r;c=Math.max(t,Math.min(i,e[0]-o))}let l=-s,u=1-a,d=Math.max(l,Math.min(u,e[1]-h));this._rect[0]=i[0]+c,this._rect[1]=i[1]+d,this._rect[2]=i[2]+c,this._rect[3]=i[3]+d,this._rect[0]<0?(this._rect[0]+=1,this._inverted=!this._inverted):this._rect[0]>1&&(this._rect[0]-=1,this._inverted=!this._inverted),this._rect[2]<0?(this._rect[2]+=1,this._inverted=!this._inverted):this._rect[2]>1&&(this._rect[2]-=1,this._inverted=!this._inverted),this._notifyChanged$.next(this)}getPoints3d(e){return this._getPoints2d().map((t=>e.unprojectBasic(t,200)))}getVertex2d(e){return this._rectToVertices2d(this._rect)[e]}getNonAdjustedVertex2d(e){return this._rectToNonAdjustedVertices2d(this._rect)[e]}getVertex3d(e,t){return t.unprojectBasic(this._rectToVertices2d(this._rect)[e],200)}getVertices2d(){return this._rectToVertices2d(this._rect)}getVertices3d(e){return this._rectToVertices2d(this._rect).map((t=>e.unprojectBasic(t,200)))}getCentroid2d(){const e=this._rect;return[(e[0]+(this._inverted?e[2]+1:e[2]))/2,(e[1]+e[3])/2]}getCentroid3d(e){const t=this.getCentroid2d();return e.unprojectBasic(t,200)}getPoleOfInaccessibility2d(){return this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect))}getPoleOfInaccessibility3d(e){let t=this._getPoleOfInaccessibility2d(this._rectToVertices2d(this._rect));return e.unprojectBasic(t,200)}getTriangles3d(e){return $u(e.cameraType)?[]:this._triangulate(this._project(this._getPoints2d(),e),this.getPoints3d(e))}validate(e){let t=this._rect;return!(!this._inverted&&e[0]<t[0]||e[0]-t[2]>.25||e[1]<t[1])}_getPoints2d(){let e=this._rectToVertices2d(this._rect),t=e.length-1,i=[];for(let n=0;n<t;++n){let t=e[n][0],r=e[n][1],s=(e[n+1][0]-t)/9,a=(e[n+1][1]-r)/9;for(let e=0;e<10;++e){let n=[t+e*s,r+e*a];i.push(n)}}return i}_rectToVertices2d(e){return[[e[0],e[3]],[e[0],e[1]],[this._inverted?e[2]+1:e[2],e[1]],[this._inverted?e[2]+1:e[2],e[3]],[e[0],e[3]]]}_rectToNonAdjustedVertices2d(e){return[[e[0],e[3]],[e[0],e[1]],[e[2],e[1]],[e[2],e[3]],[e[0],e[3]]]}}class uv extends Vg{constructor(e,t,i,n){super(e,i,n),this._options={color:null==t.color?16777215:t.color,indicateCompleter:null==t.indicateCompleter||t.indicateCompleter},this._rectGeometry=new lv(this._geometry.getRect2d(i)),this._createGlObjects()}create(){this._geometry.points.length<3||(this._geometry.removePoint2d(this._geometry.points.length-1),this._created$.next(this))}dispose(){super.dispose(),this._disposeObjects()}getDOMObjects(e,t){const i={offsetHeight:t.height,offsetWidth:t.width},n=[],r=this._geometry.getPoints2d(),s=r.length;for(let t=0;t<s-1;t++){const a=t,[o,h]=r[t],c=this._viewportCoords.basicToCanvasSafe(o,h,i,this._transform,e);if(!c)continue;const l=e=>{e.stopPropagation(),this._aborted$.next(this)},u=e=>{e.stopPropagation(),this._geometry.removePoint2d(a)},d=this._canvasToTransform(c),p={onclick:0===t&&s<3?l:u,style:{transform:d}};n.push(tf.h("div.mapillary-tag-interactor",p,[]));const m={style:{background:this._colorToBackground(this._options.color),transform:d}};n.push(tf.h("div.mapillary-tag-vertex",m,[]))}if(s>2&&!0===this._options.indicateCompleter){const[t,r]=this._geometry.getCentroid2d(this._transform),s=this._viewportCoords.basicToCanvasSafe(t,r,i,this._transform,e);if(s){const e=e=>{e.stopPropagation(),this._geometry.removePoint2d(this._geometry.points.length-1),this._created$.next(this)},t=this._canvasToTransform(s),i={onclick:e,style:{transform:t}};n.push(tf.h("div.mapillary-tag-completer.mapillary-tag-larger",i,[]));const r={style:{background:this._colorToBackground(this._options.color),transform:t}};n.push(tf.h("div.mapillary-tag-vertex.mapillary-tag-larger",r,[]));const a={style:{transform:t}};n.push(tf.h("div.mapillary-tag-dot",a,[]))}}return n}_onGeometryChanged(){this._disposeObjects(),this._rectGeometry=new lv(this._geometry.getRect2d(this._transform)),this._createGlObjects()}_createGlObjects(){this._glObjects=[];const e=this._rectGeometry.getPoints3d(this._transform);this._outline=this._createOutine(e,this._options.color),this._glObjects.push(this._outline)}_disposeObjects(){this._disposeLine(this._outline),this._outline=null,this._glObjects=null}}class dv extends cv{constructor(e,t){super();let i=e.length;if(i<3)throw new Bg("A polygon must have three or more positions.");if(e[0][0]!==e[i-1][0]||e[0][1]!==e[i-1][1])throw new Bg("First and last positions must be equivalent.");this._polygon=[];for(let t of e){if(t[0]<0||t[0]>1||t[1]<0||t[1]>1)throw new Bg("Basic coordinates of polygon must be on the interval [0, 1].");this._polygon.push(t.slice())}if(this._holes=[],null!=t)for(let e=0;e<t.length;e++){let i=t[e],n=i.length;if(n<3)throw new Bg("A polygon hole must have three or more positions.");if(i[0][0]!==i[n-1][0]||i[0][1]!==i[n-1][1])throw new Bg("First and last positions of hole must be equivalent.");this._holes.push([]);for(let t of i){if(t[0]<0||t[0]>1||t[1]<0||t[1]>1)throw new Bg("Basic coordinates of hole must be on the interval [0, 1].");this._holes[e].push(t.slice())}}}get polygon(){return this._polygon}get holes(){return this._holes}addVertex2d(e){let t=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._polygon.splice(this._polygon.length-1,0,t),this._notifyChanged$.next(this)}getVertex2d(e){return this._polygon[e].slice()}removeVertex2d(e){if(e<0||e>=this._polygon.length||this._polygon.length<4)throw new Bg("Index for removed vertex must be valid.");if(e>0&&e<this._polygon.length-1)this._polygon.splice(e,1);else{this._polygon.splice(0,1),this._polygon.pop();let e=this._polygon[0].slice();this._polygon.push(e)}this._notifyChanged$.next(this)}setVertex2d(e,t,i){let n=[Math.max(0,Math.min(1,t[0])),Math.max(0,Math.min(1,t[1]))];0===e||e===this._polygon.length-1?(this._polygon[0]=n.slice(),this._polygon[this._polygon.length-1]=n.slice()):this._polygon[e]=n.slice(),this._notifyChanged$.next(this)}setCentroid2d(e,t){let i=this._polygon.map((e=>e[0])),n=this._polygon.map((e=>e[1])),r=Math.min.apply(Math,i),s=Math.max.apply(Math,i),a=Math.min.apply(Math,n),o=Math.max.apply(Math,n),h=this.getCentroid2d(),c=-r,l=1-s,u=-a,d=1-o,p=Math.max(c,Math.min(l,e[0]-h[0])),m=Math.max(u,Math.min(d,e[1]-h[1]));for(let e of this._polygon)e[0]+=p,e[1]+=m;this._notifyChanged$.next(this)}getPoints3d(e){return this._getPoints3d(this._subsample(this._polygon),e)}getVertex3d(e,t){return t.unprojectBasic(this._polygon[e],200)}getVertices2d(){return this._polygon.slice()}getVertices3d(e){return this._getPoints3d(this._polygon,e)}getHolePoints3d(e){return this._holes.map((t=>this._getPoints3d(this._subsample(t),e)))}getHoleVertices3d(e){return this._holes.map((t=>this._getPoints3d(t,e)))}getCentroid2d(){let e=this._polygon,t=0,i=0,n=0;for(let r=0;r<e.length-1;r++){let s=e[r][0],a=e[r][1],o=e[r+1][0],h=e[r+1][1],c=s*h-o*a;t+=c,i+=(s+o)*c,n+=(a+h)*c}return t/=2,i/=6*t,n/=6*t,[i,n]}getCentroid3d(e){let t=this.getCentroid2d();return e.unprojectBasic(t,200)}get3dDomainTriangles3d(e){return this._triangulate(this._project(this._polygon,e),this.getVertices3d(e),this._holes.map((t=>this._project(t,e))),this.getHoleVertices3d(e))}getTriangles3d(e){if($u(e.cameraType))return this._triangulateSpherical(this._polygon.slice(),this.holes.slice(),e);const t=this._project(this._subsample(this._polygon),e),i=this.getPoints3d(e),n=this._holes.map((t=>this._project(this._subsample(t),e))),r=this.getHolePoints3d(e);return this._triangulate(t,i,n,r)}getPoleOfInaccessibility2d(){return this._getPoleOfInaccessibility2d(this._polygon.slice())}getPoleOfInaccessibility3d(e){let t=this._getPoleOfInaccessibility2d(this._polygon.slice());return e.unprojectBasic(t,200)}_getPoints3d(e,t){return e.map((e=>t.unprojectBasic(e,200)))}}class pv extends Vg{constructor(e,t,i,n){super(e,i,n),this._options={color:null==t.color?16777215:t.color},this._createGlObjects()}create(){if(this._geometry instanceof lv)this._created$.next(this);else if(this._geometry instanceof dv){const e=this._geometry;e.removeVertex2d(e.polygon.length-2),this._created$.next(this)}}dispose(){super.dispose(),this._disposeLine(this._outline),this._disposeObjects()}getDOMObjects(e,t){const i=[],n={offsetHeight:t.height,offsetWidth:t.width},r=e=>{e.stopPropagation(),this._aborted$.next(this)};if(this._geometry instanceof lv){const t=this._geometry.anchorIndex,s=void 0===t?1:t,[a,o]=this._geometry.getVertex2d(s),h=this._viewportCoords.basicToCanvasSafe(a,o,n,this._transform,e);if(null!=h){const e=this._colorToBackground(this._options.color),t=this._canvasToTransform(h),n={style:{background:e,transform:t}},s={onclick:r,style:{transform:t}};i.push(tf.h("div.mapillary-tag-interactor",s,[])),i.push(tf.h("div.mapillary-tag-vertex",n,[]))}}else if(this._geometry instanceof dv){const t=this._geometry,[s,a]=t.getVertex2d(0),o=this._viewportCoords.basicToCanvasSafe(s,a,n,this._transform,e);if(null!=o){const e={onclick:t.polygon.length>4?e=>{e.stopPropagation(),t.removeVertex2d(t.polygon.length-2),this._created$.next(this)}:r,style:{transform:this._canvasToTransform(o)}},n=t.polygon.length>4?"mapillary-tag-completer":"mapillary-tag-interactor";i.push(tf.h("div."+n,e,[]))}if(t.polygon.length>3){const[r,s]=t.getVertex2d(t.polygon.length-3),a=this._viewportCoords.basicToCanvasSafe(r,s,n,this._transform,e);if(null!=a){const e={onclick:e=>{e.stopPropagation(),t.removeVertex2d(t.polygon.length-3)},style:{transform:this._canvasToTransform(a)}};i.push(tf.h("div.mapillary-tag-interactor",e,[]))}}const h=t.polygon.slice();h.splice(-2,2);for(const t of h){const r=this._viewportCoords.basicToCanvasSafe(t[0],t[1],n,this._transform,e);if(null!=r){const e={style:{background:this._colorToBackground(this._options.color),transform:this._canvasToTransform(r)}};i.push(tf.h("div.mapillary-tag-vertex",e,[]))}}}return i}addPoint(e){if(this._geometry instanceof lv){if(!this._geometry.validate(e))return;this._created$.next(this)}else if(this._geometry instanceof dv){this._geometry.addVertex2d(e)}}_onGeometryChanged(){this._disposeLine(this._outline),this._disposeObjects(),this._createGlObjects()}_disposeObjects(){this._outline=null,this._glObjects=[]}_createGlObjects(){const e=this._geometry instanceof lv?this._geometry.getPoints3d(this._transform):this._geometry.getVertices3d(this._transform);this._outline=this._createOutine(e,this._options.color),this._glObjects=[this._outline]}}class mv{constructor(e,t){this._component=e,this._navigator=t,this._tagOperation$=new j,this._createPoints$=new j,this._createPolygon$=new j,this._createRect$=new j,this._delete$=new j,this._tag$=this._tagOperation$.pipe(Lt(((e,t)=>t(e)),null),Dt()),this._replayedTag$=this._tag$.pipe(Rt(1),U()),this._replayedTag$.subscribe(),this._createPoints$.pipe(Vt(this._component.configuration$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>()=>{const n=new Ug([[e[0],e[1]],[e[0],e[1]]]);return new uv(n,{color:t.createColor,indicateCompleter:t.indicatePointsCompleter},i)}))).subscribe(this._tagOperation$),this._createRect$.pipe(Vt(this._component.configuration$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>()=>{const n=new lv([e[0],e[1],e[0],e[1]]);return new pv(n,{color:t.createColor},i)}))).subscribe(this._tagOperation$),this._createPolygon$.pipe(Vt(this._component.configuration$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>()=>{const n=new dv([[e[0],e[1]],[e[0],e[1]],[e[0],e[1]]]);return new pv(n,{color:t.createColor},i)}))).subscribe(this._tagOperation$),this._delete$.pipe(De((()=>()=>null))).subscribe(this._tagOperation$)}get createRect$(){return this._createRect$}get createPolygon$(){return this._createPolygon$}get createPoints$(){return this._createPoints$}get delete$(){return this._delete$}get tag$(){return this._tag$}get replayedTag$(){return this._replayedTag$}}class fv{render(e,t,i,n,r){let s=[];for(const t of e)s=s.concat(t.getDOMObjects(i,n,r));return null!=t&&(s=s.concat(t.getDOMObjects(n,r))),tf.h("div.mapillary-tag-container",{},s)}clear(){return tf.h("div",{},[])}}class gv{constructor(e,t){this._createTag=null,this._needsRender=!1,this._raycaster=t||new su,this._scene=e||new ch,this._objectTags={},this._retrievableObjects=[],this._tags={}}get needsRender(){return this._needsRender}add(e){for(let t of e)t.tag.id in this._tags&&this._remove(t.tag.id),this._add(t);this._needsRender=!0}addCreateTag(e){for(const t of e.glObjects)this._scene.add(t);this._createTag={tag:e,objects:e.glObjects},this._needsRender=!0}clear(){for(const e of Object.keys(this._tags))this._remove(e);this._needsRender=!1}get(e){return this.has(e)?this._tags[e].tag:void 0}has(e){return e in this._tags}hasCreateTag(){return null!=this._createTag}intersectObjects([e,t],i){this._raycaster.setFromCamera(new zi(e,t),i);const n=this._raycaster.intersectObjects(this._retrievableObjects),r=[];for(const e of n)e.object.uuid in this._objectTags&&r.push(this._objectTags[e.object.uuid]);return r}remove(e){for(const t of e)this._remove(t);this._needsRender=!0}removeAll(){for(const e of Object.keys(this._tags))this._remove(e);this._needsRender=!0}removeCreateTag(){if(null!=this._createTag){for(const e of this._createTag.objects)this._scene.remove(e);this._createTag.tag.dispose(),this._createTag=null,this._needsRender=!0}}render(e,t){t.render(this._scene,e),this._needsRender=!1}update(){this._needsRender=!0}updateCreateTagObjects(e){if(this._createTag.tag!==e)throw new Error("Create tags do not have the same reference.");for(let e of this._createTag.objects)this._scene.remove(e);for(const t of e.glObjects)this._scene.add(t);this._createTag.objects=e.glObjects,this._needsRender=!0}updateObjects(e){const t=e.tag.id;if(this._tags[t].tag!==e)throw new Error("Tags do not have the same reference.");const i=this._tags[t];this._removeObjects(i),delete this._tags[t],this._add(e),this._needsRender=!0}_add(e){const t=e.tag.id,i={tag:e,objects:[],retrievableObjects:[]};this._tags[t]=i;for(const t of e.getGLObjects())i.objects.push(t),this._scene.add(t);for(const t of e.getRetrievableObjects())i.retrievableObjects.push(t),this._retrievableObjects.push(t),this._objectTags[t.uuid]=e.tag.id}_remove(e){const t=this._tags[e];this._removeObjects(t),t.tag.dispose(),delete this._tags[e]}_removeObjects(e){for(const t of e.objects)this._scene.remove(t);for(const t of e.retrievableObjects){const e=this._retrievableObjects.indexOf(t);-1!==e&&this._retrievableObjects.splice(e,1)}}}var _v,vv,yv,bv;e.TagMode=void 0,(_v=e.TagMode||(e.TagMode={}))[_v.Default=0]="Default",_v[_v.CreatePoint=1]="CreatePoint",_v[_v.CreatePoints=2]="CreatePoints",_v[_v.CreatePolygon=3]="CreatePolygon",_v[_v.CreateRect=4]="CreateRect",_v[_v.CreateRectDrag=5]="CreateRectDrag",function(e){e[e.None=0]="None",e[e.Centroid=1]="Centroid",e[e.Vertex=2]="Vertex"}(vv||(vv={}));class xv{constructor(e,t,i){this._tag=e,this._transform=t,this._viewportCoords=i||new hf,this._glObjectsChanged$=new j,this._interact$=new j}get glObjectsChanged$(){return this._glObjectsChanged$}get interact$(){return this._interact$}get tag(){return this._tag}}class wv extends xv{constructor(e,t){super(e,t),this._geometryChangedSubscription=this._tag.geometry.changed$.subscribe((()=>{this._onGeometryChanged()})),this._changedSubscription=this._tag.changed$.subscribe((()=>{this._onTagChanged()&&this._glObjectsChanged$.next(this)}))}dispose(){this._changedSubscription.unsubscribe(),this._geometryChangedSubscription.unsubscribe()}_colorToCss(e){return"#"+("000000"+e.toString(16)).substr(-6)}_createFill(){let e=this._getTriangles(),t=new Float32Array(e),i=new kr;i.setAttribute("position",new Tr(t,3)),i.computeBoundingSphere();let n=new wr({side:2,transparent:!0});return this._updateFillMaterial(n),new es(i,n)}_createLine(e){let t=this._getLinePositions(e),i=new kr;i.setAttribute("position",new Tr(t,3)),i.computeBoundingSphere();let n=new Bh;this._updateLineBasicMaterial(n);const r=new Wh(i,n);return r.renderOrder=1,r}_createOutline(){return this._createLine(this._getPoints3d())}_disposeFill(){null!=this._fill&&(this._fill.geometry.dispose(),this._fill.material.dispose(),this._fill=null)}_disposeOutline(){null!=this._outline&&(this._outline.geometry.dispose(),this._outline.material.dispose(),this._outline=null)}_getLinePositions(e){let t=e.length,i=new Float32Array(3*t);for(let n=0;n<t;++n){let t=3*n,r=e[n];i[t+0]=r[0],i[t+1]=r[1],i[t+2]=r[2]}return i}_interact(e,t,i){return n=>{let r=n.offsetX-n.target.offsetWidth/2,s=n.offsetY-n.target.offsetHeight/2;this._interact$.next({cursor:t,offsetX:r,offsetY:s,operation:e,tag:this._tag,vertexIndex:i})}}_updateFillGeometry(){let e=this._getTriangles(),t=new Float32Array(e),i=this._fill.geometry,n=i.getAttribute("position");n.array.length===t.length?(n.set(t),n.needsUpdate=!0):(i.deleteAttribute("position"),i.setAttribute("position",new Tr(t,3))),i.computeBoundingSphere()}_updateLine(e,t){let i=this._getLinePositions(t),n=e.geometry,r=n.getAttribute("position");r.set(i),r.needsUpdate=!0,n.computeBoundingSphere()}_updateOulineGeometry(){this._updateLine(this._outline,this._getPoints3d())}}class Mv extends wv{constructor(e,t){super(e,t),this._rectGeometry=new lv(this._tag.geometry.getRect2d(t)),this._fill=$u(t.cameraType)?null:this._createFill(),this._outline=this._tag.lineWidth>=1?this._createOutline():null}dispose(){super.dispose(),this._disposeFill(),this._disposeOutline()}getDOMObjects(e,t,i){const n=[],r={offsetHeight:i.height,offsetWidth:i.width};if(!this._tag.editable)return n;const s=this._colorToCss(this._tag.lineColor),a=this._tag.geometry.getPoints2d();for(let e=0;e<a.length;e++){const[i,o]=a[e],h=this._viewportCoords.basicToCanvasSafe(i,o,r,this._transform,t);if(null==h)continue;const c="crosshair",l=this._interact(vv.Vertex,c,e),u=`translate(-50%, -50%) translate(${Math.round(h[0])}px,${Math.round(h[1])}px)`,d={onpointerdown:l,style:{background:s,transform:u,cursor:c}};if(n.push(tf.h("div.mapillary-tag-resizer",d,[])),!this._tag.indicateVertices)continue;const p={style:{background:s,transform:u}};n.push(tf.h("div.mapillary-tag-vertex",p,[]))}return n}getGLObjects(){const e=[];return null!=this._fill&&e.push(this._fill),null!=this._outline&&e.push(this._outline),e}getRetrievableObjects(){return null!=this._fill?[this._fill]:[]}_onGeometryChanged(){this._rectGeometry=new lv(this._tag.geometry.getRect2d(this._transform)),null!=this._fill&&this._updateFillGeometry(),null!=this._outline&&this._updateOulineGeometry()}_onTagChanged(){let e=!1;return null!=this._fill&&this._updateFillMaterial(this._fill.material),null==this._outline?this._tag.lineWidth>=1&&(this._outline=this._createOutline(),e=!0):this._updateOutlineMaterial(),e}_getPoints3d(){return this._rectGeometry.getPoints3d(this._transform)}_getTriangles(){return this._rectGeometry.getTriangles3d(this._transform)}_updateFillMaterial(e){e.color=new xr(this._tag.fillColor),e.opacity=this._tag.fillOpacity,e.needsUpdate=!0}_updateLineBasicMaterial(e){e.color=new xr(this._tag.lineColor),e.linewidth=Math.max(this._tag.lineWidth,1),e.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,e.opacity=this._tag.lineOpacity,e.transparent=this._tag.lineOpacity<1,e.needsUpdate=!0}_updateOutlineMaterial(){let e=this._outline.material;this._updateLineBasicMaterial(e)}}class Sv extends nf{constructor(e,t){super(),this._id=e,this._geometry=t,this._notifyChanged$=new j,this._notifyChanged$.subscribe((e=>{const t={target:this,type:"tag"};this.fire("tag",t)})),this._geometry.changed$.subscribe((e=>{const t="geometry",i={target:this,type:t};this.fire(t,i)}))}get id(){return this._id}get geometry(){return this._geometry}get changed$(){return this._notifyChanged$}get geometryChanged$(){return this._geometry.changed$.pipe(De((()=>this)),Dt())}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}}class Tv extends Sv{constructor(e,t,i){super(e,t),i=i||{},this._editable=null!=i.editable&&i.editable,this._fillColor=null==i.fillColor?16777215:i.fillColor,this._fillOpacity=null==i.fillOpacity?0:i.fillOpacity,this._indicateVertices=null==i.indicateVertices||i.indicateVertices,this._lineColor=null==i.lineColor?16777215:i.lineColor,this._lineOpacity=null==i.lineOpacity?1:i.lineOpacity,this._lineWidth=null==i.lineWidth?1:i.lineWidth}get editable(){return this._editable}set editable(e){this._editable=e,this._notifyChanged$.next(this)}get fillColor(){return this._fillColor}set fillColor(e){this._fillColor=e,this._notifyChanged$.next(this)}get fillOpacity(){return this._fillOpacity}set fillOpacity(e){this._fillOpacity=e,this._notifyChanged$.next(this)}get geometry(){return this._geometry}get indicateVertices(){return this._indicateVertices}set indicateVertices(e){this._indicateVertices=e,this._notifyChanged$.next(this)}get lineColor(){return this._lineColor}set lineColor(e){this._lineColor=e,this._notifyChanged$.next(this)}get lineOpacity(){return this._lineOpacity}set lineOpacity(e){this._lineOpacity=e,this._notifyChanged$.next(this)}get lineWidth(){return this._lineWidth}set lineWidth(e){this._lineWidth=e,this._notifyChanged$.next(this)}setOptions(e){this._editable=null==e.editable?this._editable:e.editable,this._indicateVertices=null==e.indicateVertices?this._indicateVertices:e.indicateVertices,this._lineColor=null==e.lineColor?this._lineColor:e.lineColor,this._lineWidth=null==e.lineWidth?this._lineWidth:e.lineWidth,this._fillColor=null==e.fillColor?this._fillColor:e.fillColor,this._fillOpacity=null==e.fillOpacity?this._fillOpacity:e.fillOpacity,this._notifyChanged$.next(this)}}e.TagDomain=void 0,(yv=e.TagDomain||(e.TagDomain={}))[yv.TwoDimensional=0]="TwoDimensional",yv[yv.ThreeDimensional=1]="ThreeDimensional";class Cv extends wv{constructor(t,i){super(t,i),this._fill=$u(i.cameraType)?t.domain===e.TagDomain.TwoDimensional&&t.geometry instanceof dv?this._createFill():null:this._createFill(),this._holes=this._tag.lineWidth>=1?this._createHoles():[],this._outline=this._tag.lineWidth>=1?this._createOutline():null}dispose(){super.dispose(),this._disposeFill(),this._disposeHoles(),this._disposeOutline()}getDOMObjects(e,t,i){const n=[],r=this._tag.geometry instanceof lv,s=!$u(this._transform.cameraType),a={offsetHeight:i.height,offsetWidth:i.width};if(null!=this._tag.icon&&(r||s)){const[i,r]=this._tag.geometry instanceof lv?this._tag.geometry.getVertex2d(this._tag.iconIndex):this._tag.geometry.getPoleOfInaccessibility2d(),s=this._viewportCoords.basicToCanvasSafe(i,r,a,this._transform,t);if(null!=s){const t=()=>{this._interact$.next({offsetX:0,offsetY:0,operation:vv.None,tag:this._tag})};if(e.loaded){const i=e.getDOMSprite(this._tag.icon,this._tag.iconFloat),r={onclick:e=>{e.stopPropagation(),this._tag.click$.next(this._tag)},onpointerdown:t,style:{transform:`translate(${Math.round(s[0])}px,${Math.round(s[1])}px)`}};n.push(tf.h("div.mapillary-tag-symbol",r,[i]))}}}else if(null!=this._tag.text&&(r||s)){const[e,i]=this._tag.geometry instanceof lv?this._tag.geometry.getVertex2d(3):this._tag.geometry.getPoleOfInaccessibility2d(),r=this._viewportCoords.basicToCanvasSafe(e,i,a,this._transform,t);if(null!=r){const e=Math.round(r[0]),t=Math.round(r[1]),i=this._tag.geometry instanceof lv?`translate(${e}px,${t}px)`:`translate(-50%, -50%) translate(${e}px,${t}px)`,s={onpointerdown:()=>{this._interact$.next({offsetX:0,offsetY:0,operation:vv.None,tag:this._tag})},style:{color:this._colorToCss(this._tag.textColor),transform:i},textContent:this._tag.text};n.push(tf.h("span.mapillary-tag-symbol",s,[]))}}if(!this._tag.editable)return n;const o=this._colorToCss(this._tag.lineColor);if(this._tag.geometry instanceof lv){const[e,i]=this._tag.geometry.getCentroid2d(),r=this._viewportCoords.basicToCanvasSafe(e,i,a,this._transform,t);if(null!=r){const e={onpointerdown:this._interact(vv.Centroid,"move"),style:{background:o,transform:`translate(-50%, -50%) translate(${Math.round(r[0])}px,${Math.round(r[1])}px)`}};n.push(tf.h("div.mapillary-tag-mover",e,[]))}}const h=this._tag.geometry.getVertices2d();for(let e=0;e<h.length-1;e++){if(r&&(null!=this._tag.icon&&e===this._tag.iconIndex||null==this._tag.icon&&null!=this._tag.text&&3===e))continue;const[i,s]=h[e],c=this._viewportCoords.basicToCanvasSafe(i,s,a,this._transform,t);if(null==c)continue;const l=r?e%2==0?"nesw-resize":"nwse-resize":"crosshair",u=this._interact(vv.Vertex,l,e),d=`translate(-50%, -50%) translate(${Math.round(c[0])}px,${Math.round(c[1])}px)`,p={onpointerdown:u,style:{background:o,transform:d,cursor:l}};if(n.push(tf.h("div.mapillary-tag-resizer",p,[])),!this._tag.indicateVertices)continue;const m={style:{background:o,transform:d}};n.push(tf.h("div.mapillary-tag-vertex",m,[]))}return n}getGLObjects(){const e=[];null!=this._fill&&e.push(this._fill);for(const t of this._holes)e.push(t);return null!=this._outline&&e.push(this._outline),e}getRetrievableObjects(){return null!=this._fill?[this._fill]:[]}_onGeometryChanged(){null!=this._fill&&this._updateFillGeometry(),this._holes.length>0&&this._updateHoleGeometries(),null!=this._outline&&this._updateOulineGeometry()}_onTagChanged(){let e=!1;return null!=this._fill&&this._updateFillMaterial(this._fill.material),null==this._outline?this._tag.lineWidth>=1&&(this._holes=this._createHoles(),this._outline=this._createOutline(),e=!0):(this._updateHoleMaterials(),this._updateOutlineMaterial()),e}_getPoints3d(){return this._in3dDomain()?this._tag.geometry.getVertices3d(this._transform):this._tag.geometry.getPoints3d(this._transform)}_getTriangles(){return this._in3dDomain()?this._tag.geometry.get3dDomainTriangles3d(this._transform):this._tag.geometry.getTriangles3d(this._transform)}_updateFillMaterial(e){e.color=new xr(this._tag.fillColor),e.opacity=this._tag.fillOpacity,e.needsUpdate=!0}_updateLineBasicMaterial(e){e.color=new xr(this._tag.lineColor),e.linewidth=Math.max(this._tag.lineWidth,1),e.visible=this._tag.lineWidth>=1&&this._tag.lineOpacity>0,e.opacity=this._tag.lineOpacity,e.transparent=this._tag.lineOpacity<1,e.needsUpdate=!0}_createHoles(){let e=[];if(this._tag.geometry instanceof dv){let t=this._getHoles3d();for(let i of t){let t=this._createLine(i);e.push(t)}}return e}_disposeHoles(){for(let e of this._holes)e.geometry.dispose(),e.material.dispose();this._holes=[]}_getHoles3d(){const e=this._tag.geometry;return this._in3dDomain()?e.getHoleVertices3d(this._transform):e.getHolePoints3d(this._transform)}_in3dDomain(){return this._tag.geometry instanceof dv&&this._tag.domain===e.TagDomain.ThreeDimensional}_updateHoleGeometries(){let e=this._getHoles3d();if(e.length!==this._holes.length)throw new Error("Changing the number of holes is not supported.");for(let t=0;t<this._holes.length;t++){let i=e[t],n=this._holes[t];this._updateLine(n,i)}}_updateHoleMaterials(){for(const e of this._holes)this._updateLineBasicMaterial(e.material)}_updateOutlineMaterial(){this._updateLineBasicMaterial(this._outline.material)}}e.Alignment=void 0,(bv=e.Alignment||(e.Alignment={}))[bv.Bottom=0]="Bottom",bv[bv.BottomLeft=1]="BottomLeft",bv[bv.BottomRight=2]="BottomRight",bv[bv.Center=3]="Center",bv[bv.Left=4]="Left",bv[bv.Right=5]="Right",bv[bv.Top=6]="Top",bv[bv.TopLeft=7]="TopLeft",bv[bv.TopRight=8]="TopRight";class Ev extends Sv{constructor(t,i,n){super(t,i);const r=null!=(n=n||{}).domain&&i instanceof dv?n.domain:e.TagDomain.TwoDimensional,s=this._twoDimensionalPolygon(r,i);this._domain=r,this._editable=null!=n.editable&&!s&&n.editable,this._fillColor=null==n.fillColor?16777215:n.fillColor,this._fillOpacity=null==n.fillOpacity?0:n.fillOpacity,this._icon=void 0===n.icon?null:n.icon,this._iconFloat=null==n.iconFloat?e.Alignment.Center:n.iconFloat,this._iconIndex=null==n.iconIndex?3:n.iconIndex,this._indicateVertices=null==n.indicateVertices||n.indicateVertices,this._lineColor=null==n.lineColor?16777215:n.lineColor,this._lineOpacity=null==n.lineOpacity?1:n.lineOpacity,this._lineWidth=null==n.lineWidth?1:n.lineWidth,this._text=void 0===n.text?null:n.text,this._textColor=null==n.textColor?16777215:n.textColor,this._click$=new j,this._click$.subscribe((()=>{const e="click",t={target:this,type:e};this.fire(e,t)}))}get click$(){return this._click$}get domain(){return this._domain}get editable(){return this._editable}set editable(e){this._twoDimensionalPolygon(this._domain,this._geometry)||(this._editable=e,this._notifyChanged$.next(this))}get fillColor(){return this._fillColor}set fillColor(e){this._fillColor=e,this._notifyChanged$.next(this)}get fillOpacity(){return this._fillOpacity}set fillOpacity(e){this._fillOpacity=e,this._notifyChanged$.next(this)}get geometry(){return this._geometry}get icon(){return this._icon}set icon(e){this._icon=e,this._notifyChanged$.next(this)}get iconFloat(){return this._iconFloat}set iconFloat(e){this._iconFloat=e,this._notifyChanged$.next(this)}get iconIndex(){return this._iconIndex}set iconIndex(e){this._iconIndex=e,this._notifyChanged$.next(this)}get indicateVertices(){return this._indicateVertices}set indicateVertices(e){this._indicateVertices=e,this._notifyChanged$.next(this)}get lineColor(){return this._lineColor}set lineColor(e){this._lineColor=e,this._notifyChanged$.next(this)}get lineOpacity(){return this._lineOpacity}set lineOpacity(e){this._lineOpacity=e,this._notifyChanged$.next(this)}get lineWidth(){return this._lineWidth}set lineWidth(e){this._lineWidth=e,this._notifyChanged$.next(this)}get text(){return this._text}set text(e){this._text=e,this._notifyChanged$.next(this)}get textColor(){return this._textColor}set textColor(e){this._textColor=e,this._notifyChanged$.next(this)}fire(e,t){super.fire(e,t)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}setOptions(e){const t=this._twoDimensionalPolygon(this._domain,this._geometry);this._editable=t||null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._iconFloat=null==e.iconFloat?this._iconFloat:e.iconFloat,this._iconIndex=null==e.iconIndex?this._iconIndex:e.iconIndex,this._indicateVertices=null==e.indicateVertices?this._indicateVertices:e.indicateVertices,this._lineColor=null==e.lineColor?this._lineColor:e.lineColor,this._lineWidth=null==e.lineWidth?this._lineWidth:e.lineWidth,this._fillColor=null==e.fillColor?this._fillColor:e.fillColor,this._fillOpacity=null==e.fillOpacity?this._fillOpacity:e.fillOpacity,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)}_twoDimensionalPolygon(t,i){return t!==e.TagDomain.ThreeDimensional&&i instanceof dv}}class Av extends xv{dispose(){}getDOMObjects(t,i,n){const r=this._tag,s={offsetHeight:n.height,offsetWidth:n.width},a=[],[o,h]=r.geometry.getCentroid2d(),c=this._viewportCoords.basicToCanvasSafe(o,h,s,this._transform,i);if(null!=c){const i=e=>{this._interact$.next({offsetX:0,offsetY:0,operation:vv.None,tag:r})},n=Math.round(c[0]),s=Math.round(c[1]);if(null!=r.icon){if(t.loaded){const o=t.getDOMSprite(r.icon,e.Alignment.Bottom),h={onpointerdown:i,style:{pointerEvents:"all",transform:`translate(${n}px,${s+8}px)`}};a.push(tf.h("div",h,[o]))}}else if(null!=r.text){const e=`translate(-50%,0%) translate(${n}px,${s+8}px)`,t={onpointerdown:i,style:{color:this._colorToCss(r.textColor),transform:e},textContent:r.text};a.push(tf.h("span.mapillary-tag-symbol",t,[]))}const o=this._interact(vv.Centroid,r,"move"),h=this._colorToCss(r.color),l=`translate(-50%,-50%) translate(${n}px,${s}px)`;if(r.editable){let e={onpointerdown:o,style:{background:h,transform:l}};a.push(tf.h("div.mapillary-tag-spot-interactor",e,[]))}const u={style:{background:h,transform:l}};a.push(tf.h("div.mapillary-tag-vertex",u,[]))}return a}getGLObjects(){return[]}getRetrievableObjects(){return[]}_colorToCss(e){return"#"+("000000"+e.toString(16)).substr(-6)}_interact(e,t,i,n){return r=>{const s=r.offsetX-r.target.offsetWidth/2,a=r.offsetY-r.target.offsetHeight/2;this._interact$.next({cursor:i,offsetX:s,offsetY:a,operation:e,tag:t,vertexIndex:n})}}}class Iv extends Sv{constructor(e,t,i){super(e,t),i=i||{},this._color=null==i.color?16777215:i.color,this._editable=null!=i.editable&&i.editable,this._icon=void 0===i.icon?null:i.icon,this._text=void 0===i.text?null:i.text,this._textColor=null==i.textColor?16777215:i.textColor}get color(){return this._color}set color(e){this._color=e,this._notifyChanged$.next(this)}get editable(){return this._editable}set editable(e){this._editable=e,this._notifyChanged$.next(this)}get icon(){return this._icon}set icon(e){this._icon=e,this._notifyChanged$.next(this)}get text(){return this._text}set text(e){this._text=e,this._notifyChanged$.next(this)}get textColor(){return this._textColor}set textColor(e){this._textColor=e,this._notifyChanged$.next(this)}setOptions(e){this._color=null==e.color?this._color:e.color,this._editable=null==e.editable?this._editable:e.editable,this._icon=void 0===e.icon?this._icon:e.icon,this._text=void 0===e.text?this._text:e.text,this._textColor=null==e.textColor?this._textColor:e.textColor,this._notifyChanged$.next(this)}}class Rv{constructor(){this._active=!1,this._hash={},this._hashDeactivated={},this._notifyChanged$=new j}get active(){return this._active}get changed$(){return this._notifyChanged$}activate(e){if(!this._active){for(const t in this._hashDeactivated){if(!this._hashDeactivated.hasOwnProperty(t))continue;const i=this._hashDeactivated[t];this._add(i,e)}this._hashDeactivated={},this._active=!0,this._notifyChanged$.next(this)}}deactivate(){if(this._active){for(const e in this._hash)this._hash.hasOwnProperty(e)&&(this._hashDeactivated[e]=this._hash[e].tag);this._hash={},this._active=!1}}add(e,t){this._assertActivationState(!0);for(const i of e)this._add(i,t);this._notifyChanged$.next(this)}addDeactivated(e){this._assertActivationState(!1);for(const t of e){if(!(t instanceof Ev||t instanceof Iv||t instanceof Tv))throw new Error("Tag type not supported");this._hashDeactivated[t.id]=t}}get(e){return this.has(e)?this._hash[e]:void 0}getAll(){const e=this._hash;return Object.keys(e).map((t=>e[t]))}getAllDeactivated(){const e=this._hashDeactivated;return Object.keys(e).map((t=>e[t]))}getDeactivated(e){return this.hasDeactivated(e)?this._hashDeactivated[e]:void 0}has(e){return e in this._hash}hasDeactivated(e){return e in this._hashDeactivated}remove(e){this._assertActivationState(!0);const t=this._hash;for(const i of e)i in t&&delete t[i];this._notifyChanged$.next(this)}removeAll(){this._assertActivationState(!0),this._hash={},this._notifyChanged$.next(this)}removeAllDeactivated(){this._assertActivationState(!1),this._hashDeactivated={}}removeDeactivated(e){this._assertActivationState(!1);const t=this._hashDeactivated;for(const i of e)i in t&&delete t[i]}_add(e,t){if(e instanceof Ev)this._hash[e.id]=new Cv(e,t);else if(e instanceof Iv)this._hash[e.id]=new Av(e,t);else{if(!(e instanceof Tv))throw new Error("Tag type not supported");this._hash[e.id]=new Mv(e,t)}}_assertActivationState(e){if(e!==this._active)throw new Error("Tag set not in correct state for operation.")}}class Pv extends Fg{constructor(e){super();let t=e[0],i=e[1];if(t<0||t>1||i<0||i>1)throw new Bg("Basic coordinates must be on the interval [0, 1].");this._point=e.slice()}get point(){return this._point}getCentroid2d(){return this._point.slice()}getCentroid3d(e){return e.unprojectBasic(this._point,200)}setCentroid2d(e,t){let i=[Math.max(0,Math.min(1,e[0])),Math.max(0,Math.min(1,e[1]))];this._point[0]=i[0],this._point[1]=i[1],this._notifyChanged$.next(this)}}class Lv extends zf{constructor(e,t,i,n){super(e,t,i),this._name=`${this._component.name}-${this._getNameExtension()}`,this._viewportCoords=n}_getConfiguration(e){return{}}_mouseEventToBasic(e,t,i,n,r,s){r=null!=r?r:0,s=null!=s?s:0;const[a,o]=this._viewportCoords.canvasPosition(e,t);return this._viewportCoords.canvasToBasic(a-r,o-s,t,n,i.perspective)}}class Dv extends Lv{constructor(e,t,i,n,r){super(e,t,i,n),this._tagCreator=r,this._geometryCreated$=new j}get geometryCreated$(){return this._geometryCreated$}_enable(){this._enableCreate(),this._container.container.classList.add("component-tag-create")}_disable(){this._container.container.classList.remove("component-tag-create"),this._disableCreate()}_validateBasic(e){const t=e[0],i=e[1];return 0<=t&&t<=1&&0<=i&&i<=1}_mouseEventToBasic$(e){return e.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$),De((([e,t,i])=>this._mouseEventToBasic(e,this._container.container,t,i))))}}class Nv extends Dv{_enableCreate(){this._container.mouseService.deferPixels(this._name,4),this._geometryCreatedSubscription=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(st(this._validateBasic),De((e=>new Pv(e)))).subscribe(this._geometryCreated$)}_disableCreate(){this._container.mouseService.undeferPixels(this._name),this._geometryCreatedSubscription.unsubscribe()}_getNameExtension(){return"create-point"}}class $v extends Dv{_enableCreate(){this._container.mouseService.deferPixels(this._name,4);const e=this._navigator.stateService.currentTransform$.pipe(De((()=>{})),Rt(1),U());this._deleteSubscription=e.pipe($t(1)).subscribe(this._tagCreator.delete$);const t=this._mouseEventToBasic$(this._container.mouseService.proximateClick$).pipe(Dt());this._createSubscription=e.pipe(zt((()=>t.pipe(st(this._validateBasic),_t(1))))).subscribe(this._create$),this._setVertexSubscription=this._tagCreator.tag$.pipe(zt((e=>e?Ve(Ce(e),it(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$),this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$):ie()))).subscribe((([e,t,i,n])=>{const r=this._mouseEventToBasic(t,this._container.container,i,n);this._setVertex2d(e,r,n)})),this._addPointSubscription=this._tagCreator.tag$.pipe(zt((e=>e?Ve(Ce(e),t):ie()))).subscribe((([e,t])=>{this._addPoint(e,t)})),this._geometryCreateSubscription=this._tagCreator.tag$.pipe(zt((e=>e?e.created$.pipe(De((e=>e.geometry))):ie()))).subscribe(this._geometryCreated$)}_disableCreate(){this._container.mouseService.undeferPixels(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreateSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()}}class kv extends $v{get _create$(){return this._tagCreator.createPoints$}_addPoint(e,t){e.geometry.addPoint2d(t)}_getNameExtension(){return"create-points"}_setVertex2d(e,t,i){e.geometry.setPoint2d(e.geometry.points.length-1,t,i)}}class Ov extends $v{get _create$(){return this._tagCreator.createPolygon$}_addPoint(e,t){e.addPoint(t)}_getNameExtension(){return"create-polygon"}_setVertex2d(e,t,i){e.geometry.setVertex2d(e.geometry.polygon.length-2,t,i)}}class zv extends $v{get _create$(){return this._tagCreator.createRect$}_addPoint(e,t){const i=e.geometry;i.validate(t)||(t=i.getNonAdjustedVertex2d(3)),e.addPoint(t)}_enable(){super._enable(),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.pipe(st((e=>!!e))).subscribe((e=>{e.geometry.initializeAnchorIndexing()}))}_disable(){super._disable(),this._initializeAnchorIndexingSubscription.unsubscribe()}_getNameExtension(){return"create-rect"}_setVertex2d(e,t,i){e.geometry.setOppositeVertex2d(t,i)}}class Fv extends Dv{_enableCreate(){this._container.mouseService.claimMouse(this._name,2),this._deleteSubscription=this._navigator.stateService.currentTransform$.pipe(De((e=>null)),$t(1)).subscribe(this._tagCreator.delete$),this._createSubscription=this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDragStart$)).pipe(st(this._validateBasic)).subscribe(this._tagCreator.createRect$),this._initializeAnchorIndexingSubscription=this._tagCreator.tag$.pipe(st((e=>!!e))).subscribe((e=>{e.geometry.initializeAnchorIndexing()}));const e=Ve(it(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseMove$),this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseMove$)),this._container.renderService.renderCamera$).pipe(Vt(this._navigator.stateService.currentTransform$),De((([[e,t],i])=>this._mouseEventToBasic(e,this._container.container,t,i))));this._setVertexSubscription=this._tagCreator.tag$.pipe(zt((t=>t?Ve(Ce(t),e,this._navigator.stateService.currentTransform$):ie()))).subscribe((([e,t,i])=>{e.geometry.setOppositeVertex2d(t,i)}));const t=this._container.mouseService.mouseDragEnd$.pipe(Vt(this._mouseEventToBasic$(this._container.mouseService.filtered$(this._name,this._container.mouseService.mouseDrag$)).pipe(st(this._validateBasic)),((e,t)=>t)),Dt());this._addPointSubscription=this._tagCreator.tag$.pipe(zt((e=>e?Ve(Ce(e),t):ie()))).subscribe((([e,t])=>{const i=e.geometry;i.validate(t)||(t=i.getNonAdjustedVertex2d(3)),e.addPoint(t)})),this._geometryCreatedSubscription=this._tagCreator.tag$.pipe(zt((e=>e?e.created$.pipe(De((e=>e.geometry))):ie()))).subscribe(this._geometryCreated$)}_disableCreate(){this._container.mouseService.unclaimMouse(this._name),this._tagCreator.delete$.next(null),this._addPointSubscription.unsubscribe(),this._createSubscription.unsubscribe(),this._deleteSubscription.unsubscribe(),this._geometryCreatedSubscription.unsubscribe(),this._initializeAnchorIndexingSubscription.unsubscribe(),this._setVertexSubscription.unsubscribe()}_getNameExtension(){return"create-rect-drag"}}class Bv extends Lv{constructor(e,t,i,n,r){super(e,t,i,n),this._tagSet=r}_enable(){const e=this._tagSet.changed$.pipe(De((e=>e.getAll())),zt((e=>ge(e).pipe(We((e=>e.interact$))))),zt((e=>Ze(Ce(e),this._container.mouseService.documentMouseUp$.pipe(De((()=>({offsetX:0,offsetY:0,operation:vv.None,tag:null}))),St())))),Dt());it(this._container.mouseService.mouseMove$,this._container.mouseService.domMouseMove$).pipe(Dt()),this._claimMouseSubscription=e.pipe(zt((e=>e.tag?this._container.mouseService.domMouseDragStart$:ie()))).subscribe((()=>{this._container.mouseService.claimMouse(this._name,3)})),this._cursorSubscription=e.pipe(De((e=>e.cursor)),vt()).subscribe((e=>{const t=["crosshair","move","nesw-resize","nwse-resize"];for(const e of t)this._container.container.classList.remove(`component-tag-edit-${e}`);e&&this._container.container.classList.add(`component-tag-edit-${e}`)})),this._unclaimMouseSubscription=this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDragEnd$).subscribe((e=>{this._container.mouseService.unclaimMouse(this._name)})),this._preventDefaultSubscription=e.pipe(zt((e=>e.tag?this._container.mouseService.documentMouseMove$:ie()))).subscribe((e=>{e.preventDefault()})),this._updateGeometrySubscription=e.pipe(zt((e=>{if(e.operation===vv.None||!e.tag)return ie();return Ve(this._container.mouseService.filtered$(this._name,this._container.mouseService.domMouseDrag$).pipe(st((e=>this._viewportCoords.insideElement(e,this._container.container)))),this._container.renderService.renderCamera$).pipe(Vt(Ce(e),this._navigator.stateService.currentTransform$,(([e,t],i,n)=>[e,t,i,n])))}))).subscribe((([e,t,i,n])=>{const r=this._mouseEventToBasic(e,this._container.container,t,n,i.offsetX,i.offsetY),s=i.tag.geometry;i.operation===vv.Centroid?s.setCentroid2d(r,n):i.operation===vv.Vertex&&s.setVertex2d(i.vertexIndex,r,n)}))}_disable(){this._claimMouseSubscription.unsubscribe(),this._cursorSubscription.unsubscribe(),this._preventDefaultSubscription.unsubscribe(),this._unclaimMouseSubscription.unsubscribe(),this._updateGeometrySubscription.unsubscribe()}_getNameExtension(){return"edit-vertex"}}class Uv extends sf{constructor(e,t,i){super(e,t,i),this._tagDomRenderer=new fv,this._tagScene=new gv,this._tagSet=new Rv,this._tagCreator=new mv(this,i),this._viewportCoords=new hf,this._createHandlers={CreatePoint:new Nv(this,t,i,this._viewportCoords,this._tagCreator),CreatePoints:new kv(this,t,i,this._viewportCoords,this._tagCreator),CreatePolygon:new Ov(this,t,i,this._viewportCoords,this._tagCreator),CreateRect:new zv(this,t,i,this._viewportCoords,this._tagCreator),CreateRectDrag:new Fv(this,t,i,this._viewportCoords,this._tagCreator),Default:void 0},this._editVertexHandler=new Bv(this,t,i,this._viewportCoords,this._tagSet),this._renderTags$=this._tagSet.changed$.pipe(De((e=>{const t=e.getAll();return t.sort(((e,t)=>{const i=e.tag.id,n=t.tag.id;return i<n?-1:i>n?1:0})),t})),Dt()),this._tagChanged$=this._renderTags$.pipe(zt((e=>ge(e).pipe(We((e=>it(e.tag.changed$,e.tag.geometryChanged$)))))),Dt()),this._renderTagGLChanged$=this._renderTags$.pipe(zt((e=>ge(e).pipe(We((e=>e.glObjectsChanged$))))),Dt()),this._createGeometryChanged$=this._tagCreator.tag$.pipe(zt((e=>null!=e?e.geometryChanged$:ie())),Dt()),this._createGLObjectsChanged$=this._tagCreator.tag$.pipe(zt((e=>null!=e?e.glObjectsChanged$:ie())),Dt()),this._creatingConfiguration$=this._configuration$.pipe(vt(((e,t)=>e.mode===t.mode),(e=>({createColor:e.createColor,mode:e.mode}))),Rt(1),U()),this._creatingConfiguration$.subscribe((e=>{const t="tagmode",i={mode:e.mode,target:this,type:t};this.fire(t,i)}))}add(e){this._activated?this._navigator.stateService.currentTransform$.pipe(St()).subscribe((t=>{this._tagSet.add(e,t);const i=e.map((e=>this._tagSet.get(e.id)));this._tagScene.add(i)})):this._tagSet.addDeactivated(e)}calculateRect(e){return new Promise(((t,i)=>{this._navigator.stateService.currentTransform$.pipe(St(),De((t=>e.getRect2d(t)))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}create(){this._tagCreator.replayedTag$.pipe(St(),st((e=>!!e))).subscribe((e=>{e.create()}))}changeMode(e){this.configure({mode:e})}fire(e,t){super.fire(e,t)}get(e){if(this._activated){const t=this._tagSet.get(e);return void 0!==t?t.tag:void 0}return this._tagSet.getDeactivated(e)}getAll(){return this.activated?this._tagSet.getAll().map((e=>e.tag)):this._tagSet.getAllDeactivated()}getTagIdsAt(e){return new Promise(((t,i)=>{this._container.renderService.renderCamera$.pipe(St(),De((t=>{const i=this._viewportCoords.canvasToViewport(e[0],e[1],this._container.container);return this._tagScene.intersectObjects(i,t.perspective)}))).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}has(e){return this._activated?this._tagSet.has(e):this._tagSet.hasDeactivated(e)}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}remove(e){this._activated?(this._tagSet.remove(e),this._tagScene.remove(e)):this._tagSet.removeDeactivated(e)}removeAll(){this._activated?(this._tagSet.removeAll(),this._tagScene.removeAll()):this._tagSet.removeAllDeactivated()}_activate(){this._editVertexHandler.enable();const t=ge(Object.keys(this._createHandlers)).pipe(De((e=>this._createHandlers[e])),st((e=>!!e)),We((e=>e.geometryCreated$)),Dt()),i=this._subscriptions;i.push(t.subscribe((e=>{const t="geometrycreate",i={geometry:e,target:this,type:t};this.fire(t,i)}))),i.push(this._tagCreator.tag$.pipe(kt((e=>null==e)),vt()).subscribe((e=>{const t=null!=e?"tagcreatestart":"tagcreateend",i={target:this,type:t};this.fire(t,i)}))),i.push(t.subscribe((()=>{this.changeMode(e.TagMode.Default)}))),i.push(this._creatingConfiguration$.subscribe((t=>{this._disableCreateHandlers();const i=e.TagMode[t.mode],n=this._createHandlers[i];n&&n.enable()}))),i.push(this._renderTags$.subscribe((()=>{const e="tags",t={target:this,type:e};this.fire(e,t)}))),i.push(this._tagCreator.tag$.pipe(zt((e=>null!=e?e.aborted$.pipe(De((()=>null))):ie()))).subscribe((()=>{this.changeMode(e.TagMode.Default)}))),i.push(this._tagCreator.tag$.subscribe((e=>{this._tagScene.hasCreateTag()&&this._tagScene.removeCreateTag(),null!=e&&this._tagScene.addCreateTag(e)}))),i.push(this._createGLObjectsChanged$.subscribe((e=>{this._tagScene.updateCreateTagObjects(e)}))),i.push(this._renderTagGLChanged$.subscribe((e=>{this._tagScene.updateObjects(e)}))),i.push(this._tagChanged$.subscribe((()=>{this._tagScene.update()}))),i.push(Ve(this._renderTags$.pipe(Ot([]),Ut((()=>{this._container.domRenderer.render$.next({name:this._name,vNode:this._tagDomRenderer.clear()})}))),this._container.renderService.renderCamera$,this._container.spriteService.spriteAtlas$,this._container.renderService.size$,this._tagChanged$.pipe(Ot(null)),it(this._tagCreator.tag$,this._createGeometryChanged$).pipe(Ot(null))).pipe(De((([e,t,i,n,,r])=>({name:this._name,vNode:this._tagDomRenderer.render(e,r,i,t.perspective,n)})))).subscribe(this._container.domRenderer.render$)),i.push(this._navigator.stateService.currentState$.pipe(De((e=>{const t=this._tagScene;return{name:this._name,renderer:{frameId:e.id,needsRender:t.needsRender,render:t.render.bind(t),pass:yf.Opaque}}}))).subscribe(this._container.glRenderer.render$)),this._navigator.stateService.currentTransform$.pipe(St()).subscribe((e=>{this._tagSet.activate(e),this._tagScene.add(this._tagSet.getAll())}))}_deactivate(){this._editVertexHandler.disable(),this._disableCreateHandlers(),this._tagScene.clear(),this._tagSet.deactivate(),this._tagCreator.delete$.next(null),this._subscriptions.unsubscribe(),this._container.container.classList.remove("component-tag-create")}_getDefaultConfiguration(){return{createColor:16777215,indicatePointsCompleter:!0,mode:e.TagMode.Default}}_disableCreateHandlers(){const e=this._createHandlers;for(const t in e){if(!e.hasOwnProperty(t))continue;const i=e[t];i&&i.disable()}}}Uv.componentName="tag";class Vv extends sf{constructor(e,t,i){super(e,t,i),this._viewportCoords=new hf,this._zoomDelta$=new j}_activate(){const t=this._subscriptions;t.push(Ve(this._navigator.stateService.currentState$,this._navigator.stateService.state$,this._configuration$,this._container.renderService.size$).pipe(De((([t,i,n,r])=>{const s=t.state.zoom,a=tf.h("div.mapillary-zoom-in-icon",[]),o=s>=3||i===Df.Waiting?tf.h("div.mapillary-zoom-in-button-inactive",[a]):tf.h("div.mapillary-zoom-in-button",{onclick:()=>{this._zoomDelta$.next(1)}},[a]),h=tf.h("div.mapillary-zoom-out-icon",[]),c=s<=0||i===Df.Waiting?tf.h("div.mapillary-zoom-out-button-inactive",[h]):tf.h("div.mapillary-zoom-out-button",{onclick:()=>{this._zoomDelta$.next(-1)}},[h]),l=n.size===e.ComponentSize.Small||n.size===e.ComponentSize.Automatic&&r.width<640?".mapillary-zoom-compact":"";return{name:this._name,vNode:tf.h("div.mapillary-zoom-container"+l,{oncontextmenu:e=>{e.preventDefault()}},[o,c])}}))).subscribe(this._container.domRenderer.render$)),t.push(this._zoomDelta$.pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$)).subscribe((([e,t,i])=>{const n=this._viewportCoords.unprojectFromViewport(0,0,t.perspective),r=i.projectBasic(n.toArray());this._navigator.stateService.zoomIn(e,r)})))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{size:e.ComponentSize.Automatic}}}Vv.componentName="zoom";class Hv extends sf{constructor(e,t,i,n){super(e,t,i),this._canvasId=`${t.id}-${this._name}`,this._dom=n||new og}_activate(){const e=this._container.domRenderer.element$.pipe(De((()=>this._dom.document.getElementById(this._canvasId))),st((e=>!!e)),De((e=>{const t=e.parentElement,i=t.offsetWidth;return[e,{height:t.offsetHeight,width:i}]})),vt(((e,t)=>e.height===t.height&&e.width===t.width),(([,e])=>e)));this._subscriptions.push(Ve(e,this._navigator.stateService.currentImage$).subscribe((([[e,t],i])=>{e.width=t.width,e.height=t.height,e.getContext("2d").drawImage(i.image,0,0,t.width,t.height)}))),this._container.domRenderer.renderAdaptive$.next({name:this._name,vNode:tf.h(`canvas#${this._canvasId}`,[])})}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{}}}Hv.componentName="imagefallback";class jv extends sf{constructor(t,i,n){super(t,i,n),this._seqNames={},this._seqNames[e.NavigationDirection[e.NavigationDirection.Prev]]="-prev",this._seqNames[e.NavigationDirection[e.NavigationDirection.Next]]="-next",this._spaTopNames={},this._spaTopNames[e.NavigationDirection[e.NavigationDirection.TurnLeft]]="-turn-left",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.StepLeft]]="-left",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.StepForward]]="-forward",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.StepRight]]="-right",this._spaTopNames[e.NavigationDirection[e.NavigationDirection.TurnRight]]="-turn-right",this._spaBottomNames={},this._spaBottomNames[e.NavigationDirection[e.NavigationDirection.TurnU]]="-turn-around",this._spaBottomNames[e.NavigationDirection[e.NavigationDirection.StepBackward]]="-backward"}_activate(){this._subscriptions.push(Ve(this._navigator.stateService.currentImage$,this._configuration$).pipe(zt((([e,t])=>Ve(t.sequence?e.sequenceEdges$.pipe(De((e=>e.edges.map((e=>e.data.direction))))):Ce([]),!$u(e.cameraType)&&t.spatial?e.spatialEdges$.pipe(De((e=>e.edges.map((e=>e.data.direction))))):Ce([])).pipe(De((([e,t])=>e.concat(t)))))),De((e=>{const t=this._createArrowRow(this._seqNames,e),i=this._createArrowRow(this._spaTopNames,e),n=this._createArrowRow(this._spaBottomNames,e),r=tf.h("div.mapillary-navigation-sequence",t),s=tf.h("div.NavigationSpatialTop",i),a=tf.h("div.mapillary-navigation-spatial-bottom",n),o=tf.h("div.mapillary-navigation-spatial",[s,a]);return{name:this._name,vNode:tf.h("div.NavigationContainer",[r,o])}}))).subscribe(this._container.domRenderer.render$))}_deactivate(){this._subscriptions.unsubscribe()}_getDefaultConfiguration(){return{sequence:!0,spatial:!0}}_createArrowRow(t,i){const n=[];for(const r in t){if(!t.hasOwnProperty(r))continue;const s=e.NavigationDirection[r];-1!==i.indexOf(s)?n.push(this._createVNode(s,t[r],"visible")):n.push(this._createVNode(s,t[r],"hidden"))}return n}_createVNode(e,t,i){return tf.h(`span.mapillary-navigation-button.mapillary-navigation${t}`,{onclick:()=>{this._navigator.moveDir$(e).subscribe(void 0,(e=>{e instanceof uf||console.error(e)}))},style:{visibility:i}},[])}}jv.componentName="navigationfallback";function Gv(e){let t=e.length;for(;--t>=0;)e[t]=0}const Wv=256,qv=286,Xv=30,Zv=15,Yv=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),Jv=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),Kv=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),Qv=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),ey=new Array(576);Gv(ey);const ty=new Array(60);Gv(ty);const iy=new Array(512);Gv(iy);const ny=new Array(256);Gv(ny);const ry=new Array(29);Gv(ry);const sy=new Array(Xv);function ay(e,t,i,n,r){this.static_tree=e,this.extra_bits=t,this.extra_base=i,this.elems=n,this.max_length=r,this.has_stree=e&&e.length}let oy,hy,cy;function ly(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}Gv(sy);const uy=e=>e<256?iy[e]:iy[256+(e>>>7)],dy=(e,t)=>{e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255},py=(e,t,i)=>{e.bi_valid>16-i?(e.bi_buf|=t<<e.bi_valid&65535,dy(e,e.bi_buf),e.bi_buf=t>>16-e.bi_valid,e.bi_valid+=i-16):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=i)},my=(e,t,i)=>{py(e,i[2*t],i[2*t+1])},fy=(e,t)=>{let i=0;do{i|=1&e,e>>>=1,i<<=1}while(--t>0);return i>>>1},gy=(e,t,i)=>{const n=new Array(16);let r,s,a=0;for(r=1;r<=Zv;r++)n[r]=a=a+i[r-1]<<1;for(s=0;s<=t;s++){let t=e[2*s+1];0!==t&&(e[2*s]=fy(n[t]++,t))}},_y=e=>{let t;for(t=0;t<qv;t++)e.dyn_ltree[2*t]=0;for(t=0;t<Xv;t++)e.dyn_dtree[2*t]=0;for(t=0;t<19;t++)e.bl_tree[2*t]=0;e.dyn_ltree[512]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0},vy=e=>{e.bi_valid>8?dy(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0},yy=(e,t,i,n)=>{const r=2*t,s=2*i;return e[r]<e[s]||e[r]===e[s]&&n[t]<=n[i]},by=(e,t,i)=>{const n=e.heap[i];let r=i<<1;for(;r<=e.heap_len&&(r<e.heap_len&&yy(t,e.heap[r+1],e.heap[r],e.depth)&&r++,!yy(t,n,e.heap[r],e.depth));)e.heap[i]=e.heap[r],i=r,r<<=1;e.heap[i]=n},xy=(e,t,i)=>{let n,r,s,a,o=0;if(0!==e.last_lit)do{n=e.pending_buf[e.d_buf+2*o]<<8|e.pending_buf[e.d_buf+2*o+1],r=e.pending_buf[e.l_buf+o],o++,0===n?my(e,r,t):(s=ny[r],my(e,s+Wv+1,t),a=Yv[s],0!==a&&(r-=ry[s],py(e,r,a)),n--,s=uy(n),my(e,s,i),a=Jv[s],0!==a&&(n-=sy[s],py(e,n,a)))}while(o<e.last_lit);my(e,256,t)},wy=(e,t)=>{const i=t.dyn_tree,n=t.stat_desc.static_tree,r=t.stat_desc.has_stree,s=t.stat_desc.elems;let a,o,h,c=-1;for(e.heap_len=0,e.heap_max=573,a=0;a<s;a++)0!==i[2*a]?(e.heap[++e.heap_len]=c=a,e.depth[a]=0):i[2*a+1]=0;for(;e.heap_len<2;)h=e.heap[++e.heap_len]=c<2?++c:0,i[2*h]=1,e.depth[h]=0,e.opt_len--,r&&(e.static_len-=n[2*h+1]);for(t.max_code=c,a=e.heap_len>>1;a>=1;a--)by(e,i,a);h=s;do{a=e.heap[1],e.heap[1]=e.heap[e.heap_len--],by(e,i,1),o=e.heap[1],e.heap[--e.heap_max]=a,e.heap[--e.heap_max]=o,i[2*h]=i[2*a]+i[2*o],e.depth[h]=(e.depth[a]>=e.depth[o]?e.depth[a]:e.depth[o])+1,i[2*a+1]=i[2*o+1]=h,e.heap[1]=h++,by(e,i,1)}while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],((e,t)=>{const i=t.dyn_tree,n=t.max_code,r=t.stat_desc.static_tree,s=t.stat_desc.has_stree,a=t.stat_desc.extra_bits,o=t.stat_desc.extra_base,h=t.stat_desc.max_length;let c,l,u,d,p,m,f=0;for(d=0;d<=Zv;d++)e.bl_count[d]=0;for(i[2*e.heap[e.heap_max]+1]=0,c=e.heap_max+1;c<573;c++)l=e.heap[c],d=i[2*i[2*l+1]+1]+1,d>h&&(d=h,f++),i[2*l+1]=d,l>n||(e.bl_count[d]++,p=0,l>=o&&(p=a[l-o]),m=i[2*l],e.opt_len+=m*(d+p),s&&(e.static_len+=m*(r[2*l+1]+p)));if(0!==f){do{for(d=h-1;0===e.bl_count[d];)d--;e.bl_count[d]--,e.bl_count[d+1]+=2,e.bl_count[h]--,f-=2}while(f>0);for(d=h;0!==d;d--)for(l=e.bl_count[d];0!==l;)u=e.heap[--c],u>n||(i[2*u+1]!==d&&(e.opt_len+=(d-i[2*u+1])*i[2*u],i[2*u+1]=d),l--)}})(e,t),gy(i,c,e.bl_count)},My=(e,t,i)=>{let n,r,s=-1,a=t[1],o=0,h=7,c=4;for(0===a&&(h=138,c=3),t[2*(i+1)+1]=65535,n=0;n<=i;n++)r=a,a=t[2*(n+1)+1],++o<h&&r===a||(o<c?e.bl_tree[2*r]+=o:0!==r?(r!==s&&e.bl_tree[2*r]++,e.bl_tree[32]++):o<=10?e.bl_tree[34]++:e.bl_tree[36]++,o=0,s=r,0===a?(h=138,c=3):r===a?(h=6,c=3):(h=7,c=4))},Sy=(e,t,i)=>{let n,r,s=-1,a=t[1],o=0,h=7,c=4;for(0===a&&(h=138,c=3),n=0;n<=i;n++)if(r=a,a=t[2*(n+1)+1],!(++o<h&&r===a)){if(o<c)do{my(e,r,e.bl_tree)}while(0!=--o);else 0!==r?(r!==s&&(my(e,r,e.bl_tree),o--),my(e,16,e.bl_tree),py(e,o-3,2)):o<=10?(my(e,17,e.bl_tree),py(e,o-3,3)):(my(e,18,e.bl_tree),py(e,o-11,7));o=0,s=r,0===a?(h=138,c=3):r===a?(h=6,c=3):(h=7,c=4)}};let Ty=!1;const Cy=(e,t,i,n)=>{py(e,0+(n?1:0),3),((e,t,i,n)=>{vy(e),n&&(dy(e,i),dy(e,~i)),e.pending_buf.set(e.window.subarray(t,t+i),e.pending),e.pending+=i})(e,t,i,!0)};var Ey={_tr_init:e=>{Ty||((()=>{let e,t,i,n,r;const s=new Array(16);for(i=0,n=0;n<28;n++)for(ry[n]=i,e=0;e<1<<Yv[n];e++)ny[i++]=n;for(ny[i-1]=n,r=0,n=0;n<16;n++)for(sy[n]=r,e=0;e<1<<Jv[n];e++)iy[r++]=n;for(r>>=7;n<Xv;n++)for(sy[n]=r<<7,e=0;e<1<<Jv[n]-7;e++)iy[256+r++]=n;for(t=0;t<=Zv;t++)s[t]=0;for(e=0;e<=143;)ey[2*e+1]=8,e++,s[8]++;for(;e<=255;)ey[2*e+1]=9,e++,s[9]++;for(;e<=279;)ey[2*e+1]=7,e++,s[7]++;for(;e<=287;)ey[2*e+1]=8,e++,s[8]++;for(gy(ey,287,s),e=0;e<Xv;e++)ty[2*e+1]=5,ty[2*e]=fy(e,5);oy=new ay(ey,Yv,257,qv,Zv),hy=new ay(ty,Jv,0,Xv,Zv),cy=new ay(new Array(0),Kv,0,19,7)})(),Ty=!0),e.l_desc=new ly(e.dyn_ltree,oy),e.d_desc=new ly(e.dyn_dtree,hy),e.bl_desc=new ly(e.bl_tree,cy),e.bi_buf=0,e.bi_valid=0,_y(e)},_tr_stored_block:Cy,_tr_flush_block:(e,t,i,n)=>{let r,s,a=0;e.level>0?(2===e.strm.data_type&&(e.strm.data_type=(e=>{let t,i=4093624447;for(t=0;t<=31;t++,i>>>=1)if(1&i&&0!==e.dyn_ltree[2*t])return 0;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return 1;for(t=32;t<Wv;t++)if(0!==e.dyn_ltree[2*t])return 1;return 0})(e)),wy(e,e.l_desc),wy(e,e.d_desc),a=(e=>{let t;for(My(e,e.dyn_ltree,e.l_desc.max_code),My(e,e.dyn_dtree,e.d_desc.max_code),wy(e,e.bl_desc),t=18;t>=3&&0===e.bl_tree[2*Qv[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t})(e),r=e.opt_len+3+7>>>3,s=e.static_len+3+7>>>3,s<=r&&(r=s)):r=s=i+5,i+4<=r&&-1!==t?Cy(e,t,i,n):4===e.strategy||s===r?(py(e,2+(n?1:0),3),xy(e,ey,ty)):(py(e,4+(n?1:0),3),((e,t,i,n)=>{let r;for(py(e,t-257,5),py(e,i-1,5),py(e,n-4,4),r=0;r<n;r++)py(e,e.bl_tree[2*Qv[r]+1],3);Sy(e,e.dyn_ltree,t-1),Sy(e,e.dyn_dtree,i-1)})(e,e.l_desc.max_code+1,e.d_desc.max_code+1,a+1),xy(e,e.dyn_ltree,e.dyn_dtree)),_y(e),n&&vy(e)},_tr_tally:(e,t,i)=>(e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&i,e.last_lit++,0===t?e.dyn_ltree[2*i]++:(e.matches++,t--,e.dyn_ltree[2*(ny[i]+Wv+1)]++,e.dyn_dtree[2*uy(t)]++),e.last_lit===e.lit_bufsize-1),_tr_align:e=>{py(e,2,3),my(e,256,ey),(e=>{16===e.bi_valid?(dy(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)})(e)}};var Ay=(e,t,i,n)=>{let r=65535&e|0,s=e>>>16&65535|0,a=0;for(;0!==i;){a=i>2e3?2e3:i,i-=a;do{r=r+t[n++]|0,s=s+r|0}while(--a);r%=65521,s%=65521}return r|s<<16|0};const Iy=new Uint32Array((()=>{let e,t=[];for(var i=0;i<256;i++){e=i;for(var n=0;n<8;n++)e=1&e?3988292384^e>>>1:e>>>1;t[i]=e}return t})());var Ry=(e,t,i,n)=>{const r=Iy,s=n+i;e^=-1;for(let i=n;i<s;i++)e=e>>>8^r[255&(e^t[i])];return-1^e},Py={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},Ly={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:Dy,_tr_stored_block:Ny,_tr_flush_block:$y,_tr_tally:ky,_tr_align:Oy}=Ey,{Z_NO_FLUSH:zy,Z_PARTIAL_FLUSH:Fy,Z_FULL_FLUSH:By,Z_FINISH:Uy,Z_BLOCK:Vy,Z_OK:Hy,Z_STREAM_END:jy,Z_STREAM_ERROR:Gy,Z_DATA_ERROR:Wy,Z_BUF_ERROR:qy,Z_DEFAULT_COMPRESSION:Xy,Z_FILTERED:Zy,Z_HUFFMAN_ONLY:Yy,Z_RLE:Jy,Z_FIXED:Ky,Z_DEFAULT_STRATEGY:Qy,Z_UNKNOWN:eb,Z_DEFLATED:tb}=Ly,ib=258,nb=262,rb=103,sb=113,ab=666,ob=(e,t)=>(e.msg=Py[t],t),hb=e=>(e<<1)-(e>4?9:0),cb=e=>{let t=e.length;for(;--t>=0;)e[t]=0};let lb=(e,t,i)=>(t<<e.hash_shift^i)&e.hash_mask;const ub=e=>{const t=e.state;let i=t.pending;i>e.avail_out&&(i=e.avail_out),0!==i&&(e.output.set(t.pending_buf.subarray(t.pending_out,t.pending_out+i),e.next_out),e.next_out+=i,t.pending_out+=i,e.total_out+=i,e.avail_out-=i,t.pending-=i,0===t.pending&&(t.pending_out=0))},db=(e,t)=>{$y(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,ub(e.strm)},pb=(e,t)=>{e.pending_buf[e.pending++]=t},mb=(e,t)=>{e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t},fb=(e,t,i,n)=>{let r=e.avail_in;return r>n&&(r=n),0===r?0:(e.avail_in-=r,t.set(e.input.subarray(e.next_in,e.next_in+r),i),1===e.state.wrap?e.adler=Ay(e.adler,t,r,i):2===e.state.wrap&&(e.adler=Ry(e.adler,t,r,i)),e.next_in+=r,e.total_in+=r,r)},gb=(e,t)=>{let i,n,r=e.max_chain_length,s=e.strstart,a=e.prev_length,o=e.nice_match;const h=e.strstart>e.w_size-nb?e.strstart-(e.w_size-nb):0,c=e.window,l=e.w_mask,u=e.prev,d=e.strstart+ib;let p=c[s+a-1],m=c[s+a];e.prev_length>=e.good_match&&(r>>=2),o>e.lookahead&&(o=e.lookahead);do{if(i=t,c[i+a]===m&&c[i+a-1]===p&&c[i]===c[s]&&c[++i]===c[s+1]){s+=2,i++;do{}while(c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&c[++s]===c[++i]&&s<d);if(n=ib-(d-s),s=d-ib,n>a){if(e.match_start=t,a=n,n>=o)break;p=c[s+a-1],m=c[s+a]}}}while((t=u[t&l])>h&&0!=--r);return a<=e.lookahead?a:e.lookahead},_b=e=>{const t=e.w_size;let i,n,r,s,a;do{if(s=e.window_size-e.lookahead-e.strstart,e.strstart>=t+(t-nb)){e.window.set(e.window.subarray(t,t+t),0),e.match_start-=t,e.strstart-=t,e.block_start-=t,n=e.hash_size,i=n;do{r=e.head[--i],e.head[i]=r>=t?r-t:0}while(--n);n=t,i=n;do{r=e.prev[--i],e.prev[i]=r>=t?r-t:0}while(--n);s+=t}if(0===e.strm.avail_in)break;if(n=fb(e.strm,e.window,e.strstart+e.lookahead,s),e.lookahead+=n,e.lookahead+e.insert>=3)for(a=e.strstart-e.insert,e.ins_h=e.window[a],e.ins_h=lb(e,e.ins_h,e.window[a+1]);e.insert&&(e.ins_h=lb(e,e.ins_h,e.window[a+3-1]),e.prev[a&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=a,a++,e.insert--,!(e.lookahead+e.insert<3)););}while(e.lookahead<nb&&0!==e.strm.avail_in)},vb=(e,t)=>{let i,n;for(;;){if(e.lookahead<nb){if(_b(e),e.lookahead<nb&&t===zy)return 1;if(0===e.lookahead)break}if(i=0,e.lookahead>=3&&(e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),0!==i&&e.strstart-i<=e.w_size-nb&&(e.match_length=gb(e,i)),e.match_length>=3)if(n=ky(e,e.strstart-e.match_start,e.match_length-3),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=3){e.match_length--;do{e.strstart++,e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart}while(0!=--e.match_length);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=lb(e,e.ins_h,e.window[e.strstart+1]);else n=ky(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(n&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=e.strstart<2?e.strstart:2,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2},yb=(e,t)=>{let i,n,r;for(;;){if(e.lookahead<nb){if(_b(e),e.lookahead<nb&&t===zy)return 1;if(0===e.lookahead)break}if(i=0,e.lookahead>=3&&(e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=2,0!==i&&e.prev_length<e.max_lazy_match&&e.strstart-i<=e.w_size-nb&&(e.match_length=gb(e,i),e.match_length<=5&&(e.strategy===Zy||3===e.match_length&&e.strstart-e.match_start>4096)&&(e.match_length=2)),e.prev_length>=3&&e.match_length<=e.prev_length){r=e.strstart+e.lookahead-3,n=ky(e,e.strstart-1-e.prev_match,e.prev_length-3),e.lookahead-=e.prev_length-1,e.prev_length-=2;do{++e.strstart<=r&&(e.ins_h=lb(e,e.ins_h,e.window[e.strstart+3-1]),i=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart)}while(0!=--e.prev_length);if(e.match_available=0,e.match_length=2,e.strstart++,n&&(db(e,!1),0===e.strm.avail_out))return 1}else if(e.match_available){if(n=ky(e,0,e.window[e.strstart-1]),n&&db(e,!1),e.strstart++,e.lookahead--,0===e.strm.avail_out)return 1}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(n=ky(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<2?e.strstart:2,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2};function bb(e,t,i,n,r){this.good_length=e,this.max_lazy=t,this.nice_length=i,this.max_chain=n,this.func=r}const xb=[new bb(0,0,0,0,((e,t)=>{let i=65535;for(i>e.pending_buf_size-5&&(i=e.pending_buf_size-5);;){if(e.lookahead<=1){if(_b(e),0===e.lookahead&&t===zy)return 1;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;const n=e.block_start+i;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,db(e,!1),0===e.strm.avail_out))return 1;if(e.strstart-e.block_start>=e.w_size-nb&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):(e.strstart>e.block_start&&(db(e,!1),e.strm.avail_out),1)})),new bb(4,4,8,4,vb),new bb(4,5,16,8,vb),new bb(4,6,32,32,vb),new bb(4,4,16,16,yb),new bb(8,16,32,32,yb),new bb(8,16,128,128,yb),new bb(8,32,128,256,yb),new bb(32,128,258,1024,yb),new bb(32,258,258,4096,yb)];function wb(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=tb,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(1146),this.dyn_dtree=new Uint16Array(122),this.bl_tree=new Uint16Array(78),cb(this.dyn_ltree),cb(this.dyn_dtree),cb(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(16),this.heap=new Uint16Array(573),cb(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(573),cb(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Mb=e=>{if(!e||!e.state)return ob(e,Gy);e.total_in=e.total_out=0,e.data_type=eb;const t=e.state;return t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?42:sb,e.adler=2===t.wrap?0:1,t.last_flush=zy,Dy(t),Hy},Sb=e=>{const t=Mb(e);var i;return t===Hy&&((i=e.state).window_size=2*i.w_size,cb(i.head),i.max_lazy_match=xb[i.level].max_lazy,i.good_match=xb[i.level].good_length,i.nice_match=xb[i.level].nice_length,i.max_chain_length=xb[i.level].max_chain,i.strstart=0,i.block_start=0,i.lookahead=0,i.insert=0,i.match_length=i.prev_length=2,i.match_available=0,i.ins_h=0),t},Tb=(e,t,i,n,r,s)=>{if(!e)return Gy;let a=1;if(t===Xy&&(t=6),n<0?(a=0,n=-n):n>15&&(a=2,n-=16),r<1||r>9||i!==tb||n<8||n>15||t<0||t>9||s<0||s>Ky)return ob(e,Gy);8===n&&(n=9);const o=new wb;return e.state=o,o.strm=e,o.wrap=a,o.gzhead=null,o.w_bits=n,o.w_size=1<<o.w_bits,o.w_mask=o.w_size-1,o.hash_bits=r+7,o.hash_size=1<<o.hash_bits,o.hash_mask=o.hash_size-1,o.hash_shift=~~((o.hash_bits+3-1)/3),o.window=new Uint8Array(2*o.w_size),o.head=new Uint16Array(o.hash_size),o.prev=new Uint16Array(o.w_size),o.lit_bufsize=1<<r+6,o.pending_buf_size=4*o.lit_bufsize,o.pending_buf=new Uint8Array(o.pending_buf_size),o.d_buf=1*o.lit_bufsize,o.l_buf=3*o.lit_bufsize,o.level=t,o.strategy=s,o.method=i,Sb(e)};var Cb={deflateInit:(e,t)=>Tb(e,t,tb,15,8,Qy),deflateInit2:Tb,deflateReset:Sb,deflateResetKeep:Mb,deflateSetHeader:(e,t)=>e&&e.state?2!==e.state.wrap?Gy:(e.state.gzhead=t,Hy):Gy,deflate:(e,t)=>{let i,n;if(!e||!e.state||t>Vy||t<0)return e?ob(e,Gy):Gy;const r=e.state;if(!e.output||!e.input&&0!==e.avail_in||r.status===ab&&t!==Uy)return ob(e,0===e.avail_out?qy:Gy);r.strm=e;const s=r.last_flush;if(r.last_flush=t,42===r.status)if(2===r.wrap)e.adler=0,pb(r,31),pb(r,139),pb(r,8),r.gzhead?(pb(r,(r.gzhead.text?1:0)+(r.gzhead.hcrc?2:0)+(r.gzhead.extra?4:0)+(r.gzhead.name?8:0)+(r.gzhead.comment?16:0)),pb(r,255&r.gzhead.time),pb(r,r.gzhead.time>>8&255),pb(r,r.gzhead.time>>16&255),pb(r,r.gzhead.time>>24&255),pb(r,9===r.level?2:r.strategy>=Yy||r.level<2?4:0),pb(r,255&r.gzhead.os),r.gzhead.extra&&r.gzhead.extra.length&&(pb(r,255&r.gzhead.extra.length),pb(r,r.gzhead.extra.length>>8&255)),r.gzhead.hcrc&&(e.adler=Ry(e.adler,r.pending_buf,r.pending,0)),r.gzindex=0,r.status=69):(pb(r,0),pb(r,0),pb(r,0),pb(r,0),pb(r,0),pb(r,9===r.level?2:r.strategy>=Yy||r.level<2?4:0),pb(r,3),r.status=sb);else{let t=tb+(r.w_bits-8<<4)<<8,i=-1;i=r.strategy>=Yy||r.level<2?0:r.level<6?1:6===r.level?2:3,t|=i<<6,0!==r.strstart&&(t|=32),t+=31-t%31,r.status=sb,mb(r,t),0!==r.strstart&&(mb(r,e.adler>>>16),mb(r,65535&e.adler)),e.adler=1}if(69===r.status)if(r.gzhead.extra){for(i=r.pending;r.gzindex<(65535&r.gzhead.extra.length)&&(r.pending!==r.pending_buf_size||(r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),ub(e),i=r.pending,r.pending!==r.pending_buf_size));)pb(r,255&r.gzhead.extra[r.gzindex]),r.gzindex++;r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),r.gzindex===r.gzhead.extra.length&&(r.gzindex=0,r.status=73)}else r.status=73;if(73===r.status)if(r.gzhead.name){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),ub(e),i=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindex<r.gzhead.name.length?255&r.gzhead.name.charCodeAt(r.gzindex++):0,pb(r,n)}while(0!==n);r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),0===n&&(r.gzindex=0,r.status=91)}else r.status=91;if(91===r.status)if(r.gzhead.comment){i=r.pending;do{if(r.pending===r.pending_buf_size&&(r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),ub(e),i=r.pending,r.pending===r.pending_buf_size)){n=1;break}n=r.gzindex<r.gzhead.comment.length?255&r.gzhead.comment.charCodeAt(r.gzindex++):0,pb(r,n)}while(0!==n);r.gzhead.hcrc&&r.pending>i&&(e.adler=Ry(e.adler,r.pending_buf,r.pending-i,i)),0===n&&(r.status=rb)}else r.status=rb;if(r.status===rb&&(r.gzhead.hcrc?(r.pending+2>r.pending_buf_size&&ub(e),r.pending+2<=r.pending_buf_size&&(pb(r,255&e.adler),pb(r,e.adler>>8&255),e.adler=0,r.status=sb)):r.status=sb),0!==r.pending){if(ub(e),0===e.avail_out)return r.last_flush=-1,Hy}else if(0===e.avail_in&&hb(t)<=hb(s)&&t!==Uy)return ob(e,qy);if(r.status===ab&&0!==e.avail_in)return ob(e,qy);if(0!==e.avail_in||0!==r.lookahead||t!==zy&&r.status!==ab){let i=r.strategy===Yy?((e,t)=>{let i;for(;;){if(0===e.lookahead&&(_b(e),0===e.lookahead)){if(t===zy)return 1;break}if(e.match_length=0,i=ky(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,i&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2})(r,t):r.strategy===Jy?((e,t)=>{let i,n,r,s;const a=e.window;for(;;){if(e.lookahead<=ib){if(_b(e),e.lookahead<=ib&&t===zy)return 1;if(0===e.lookahead)break}if(e.match_length=0,e.lookahead>=3&&e.strstart>0&&(r=e.strstart-1,n=a[r],n===a[++r]&&n===a[++r]&&n===a[++r])){s=e.strstart+ib;do{}while(n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&n===a[++r]&&r<s);e.match_length=ib-(s-r),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=3?(i=ky(e,1,e.match_length-3),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(i=ky(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),i&&(db(e,!1),0===e.strm.avail_out))return 1}return e.insert=0,t===Uy?(db(e,!0),0===e.strm.avail_out?3:4):e.last_lit&&(db(e,!1),0===e.strm.avail_out)?1:2})(r,t):xb[r.level].func(r,t);if(3!==i&&4!==i||(r.status=ab),1===i||3===i)return 0===e.avail_out&&(r.last_flush=-1),Hy;if(2===i&&(t===Fy?Oy(r):t!==Vy&&(Ny(r,0,0,!1),t===By&&(cb(r.head),0===r.lookahead&&(r.strstart=0,r.block_start=0,r.insert=0))),ub(e),0===e.avail_out))return r.last_flush=-1,Hy}return t!==Uy?Hy:r.wrap<=0?jy:(2===r.wrap?(pb(r,255&e.adler),pb(r,e.adler>>8&255),pb(r,e.adler>>16&255),pb(r,e.adler>>24&255),pb(r,255&e.total_in),pb(r,e.total_in>>8&255),pb(r,e.total_in>>16&255),pb(r,e.total_in>>24&255)):(mb(r,e.adler>>>16),mb(r,65535&e.adler)),ub(e),r.wrap>0&&(r.wrap=-r.wrap),0!==r.pending?Hy:jy)},deflateEnd:e=>{if(!e||!e.state)return Gy;const t=e.state.status;return 42!==t&&69!==t&&73!==t&&91!==t&&t!==rb&&t!==sb&&t!==ab?ob(e,Gy):(e.state=null,t===sb?ob(e,Wy):Hy)},deflateSetDictionary:(e,t)=>{let i=t.length;if(!e||!e.state)return Gy;const n=e.state,r=n.wrap;if(2===r||1===r&&42!==n.status||n.lookahead)return Gy;if(1===r&&(e.adler=Ay(e.adler,t,i,0)),n.wrap=0,i>=n.w_size){0===r&&(cb(n.head),n.strstart=0,n.block_start=0,n.insert=0);let e=new Uint8Array(n.w_size);e.set(t.subarray(i-n.w_size,i),0),t=e,i=n.w_size}const s=e.avail_in,a=e.next_in,o=e.input;for(e.avail_in=i,e.next_in=0,e.input=t,_b(n);n.lookahead>=3;){let e=n.strstart,t=n.lookahead-2;do{n.ins_h=lb(n,n.ins_h,n.window[e+3-1]),n.prev[e&n.w_mask]=n.head[n.ins_h],n.head[n.ins_h]=e,e++}while(--t);n.strstart=e,n.lookahead=2,_b(n)}return n.strstart+=n.lookahead,n.block_start=n.strstart,n.insert=n.lookahead,n.lookahead=0,n.match_length=n.prev_length=2,n.match_available=0,e.next_in=a,e.input=o,e.avail_in=s,n.wrap=r,Hy},deflateInfo:"pako deflate (from Nodeca project)"};const Eb=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var Ab=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const i=t.shift();if(i){if("object"!=typeof i)throw new TypeError(i+"must be non-object");for(const t in i)Eb(i,t)&&(e[t]=i[t])}}return e},Ib=e=>{let t=0;for(let i=0,n=e.length;i<n;i++)t+=e[i].length;const i=new Uint8Array(t);for(let t=0,n=0,r=e.length;t<r;t++){let r=e[t];i.set(r,n),n+=r.length}return i};let Rb=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(e){Rb=!1}const Pb=new Uint8Array(256);for(let e=0;e<256;e++)Pb[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;Pb[254]=Pb[254]=1;var Lb=e=>{if("function"==typeof TextEncoder&&TextEncoder.prototype.encode)return(new TextEncoder).encode(e);let t,i,n,r,s,a=e.length,o=0;for(r=0;r<a;r++)i=e.charCodeAt(r),55296==(64512&i)&&r+1<a&&(n=e.charCodeAt(r+1),56320==(64512&n)&&(i=65536+(i-55296<<10)+(n-56320),r++)),o+=i<128?1:i<2048?2:i<65536?3:4;for(t=new Uint8Array(o),s=0,r=0;s<o;r++)i=e.charCodeAt(r),55296==(64512&i)&&r+1<a&&(n=e.charCodeAt(r+1),56320==(64512&n)&&(i=65536+(i-55296<<10)+(n-56320),r++)),i<128?t[s++]=i:i<2048?(t[s++]=192|i>>>6,t[s++]=128|63&i):i<65536?(t[s++]=224|i>>>12,t[s++]=128|i>>>6&63,t[s++]=128|63&i):(t[s++]=240|i>>>18,t[s++]=128|i>>>12&63,t[s++]=128|i>>>6&63,t[s++]=128|63&i);return t},Db=(e,t)=>{const i=t||e.length;if("function"==typeof TextDecoder&&TextDecoder.prototype.decode)return(new TextDecoder).decode(e.subarray(0,t));let n,r;const s=new Array(2*i);for(r=0,n=0;n<i;){let t=e[n++];if(t<128){s[r++]=t;continue}let a=Pb[t];if(a>4)s[r++]=65533,n+=a-1;else{for(t&=2===a?31:3===a?15:7;a>1&&n<i;)t=t<<6|63&e[n++],a--;a>1?s[r++]=65533:t<65536?s[r++]=t:(t-=65536,s[r++]=55296|t>>10&1023,s[r++]=56320|1023&t)}}return((e,t)=>{if(t<65534&&e.subarray&&Rb)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let i="";for(let n=0;n<t;n++)i+=String.fromCharCode(e[n]);return i})(s,r)},Nb=(e,t)=>{(t=t||e.length)>e.length&&(t=e.length);let i=t-1;for(;i>=0&&128==(192&e[i]);)i--;return i<0||0===i?t:i+Pb[e[i]]>t?i:t};var $b=function(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0};const kb=Object.prototype.toString,{Z_NO_FLUSH:Ob,Z_SYNC_FLUSH:zb,Z_FULL_FLUSH:Fb,Z_FINISH:Bb,Z_OK:Ub,Z_STREAM_END:Vb,Z_DEFAULT_COMPRESSION:Hb,Z_DEFAULT_STRATEGY:jb,Z_DEFLATED:Gb}=Ly;function Wb(e){this.options=Ab({level:Hb,method:Gb,chunkSize:16384,windowBits:15,memLevel:8,strategy:jb},e||{});let t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new $b,this.strm.avail_out=0;let i=Cb.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(i!==Ub)throw new Error(Py[i]);if(t.header&&Cb.deflateSetHeader(this.strm,t.header),t.dictionary){let e;if(e="string"==typeof t.dictionary?Lb(t.dictionary):"[object ArrayBuffer]"===kb.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,i=Cb.deflateSetDictionary(this.strm,e),i!==Ub)throw new Error(Py[i]);this._dict_set=!0}}Wb.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize;let r,s;if(this.ended)return!1;for(s=t===~~t?t:!0===t?Bb:Ob,"string"==typeof e?i.input=Lb(e):"[object ArrayBuffer]"===kb.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;)if(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),(s===zb||s===Fb)&&i.avail_out<=6)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else{if(r=Cb.deflate(i,s),r===Vb)return i.next_out>0&&this.onData(i.output.subarray(0,i.next_out)),r=Cb.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===Ub;if(0!==i.avail_out){if(s>0&&i.next_out>0)this.onData(i.output.subarray(0,i.next_out)),i.avail_out=0;else if(0===i.avail_in)break}else this.onData(i.output)}return!0},Wb.prototype.onData=function(e){this.chunks.push(e)},Wb.prototype.onEnd=function(e){e===Ub&&(this.result=Ib(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var qb=function(e,t){let i,n,r,s,a,o,h,c,l,u,d,p,m,f,g,_,v,y,b,x,w,M,S,T;const C=e.state;i=e.next_in,S=e.input,n=i+(e.avail_in-5),r=e.next_out,T=e.output,s=r-(t-e.avail_out),a=r+(e.avail_out-257),o=C.dmax,h=C.wsize,c=C.whave,l=C.wnext,u=C.window,d=C.hold,p=C.bits,m=C.lencode,f=C.distcode,g=(1<<C.lenbits)-1,_=(1<<C.distbits)-1;e:do{p<15&&(d+=S[i++]<<p,p+=8,d+=S[i++]<<p,p+=8),v=m[d&g];t:for(;;){if(y=v>>>24,d>>>=y,p-=y,y=v>>>16&255,0===y)T[r++]=65535&v;else{if(!(16&y)){if(0==(64&y)){v=m[(65535&v)+(d&(1<<y)-1)];continue t}if(32&y){C.mode=12;break e}e.msg="invalid literal/length code",C.mode=30;break e}b=65535&v,y&=15,y&&(p<y&&(d+=S[i++]<<p,p+=8),b+=d&(1<<y)-1,d>>>=y,p-=y),p<15&&(d+=S[i++]<<p,p+=8,d+=S[i++]<<p,p+=8),v=f[d&_];i:for(;;){if(y=v>>>24,d>>>=y,p-=y,y=v>>>16&255,!(16&y)){if(0==(64&y)){v=f[(65535&v)+(d&(1<<y)-1)];continue i}e.msg="invalid distance code",C.mode=30;break e}if(x=65535&v,y&=15,p<y&&(d+=S[i++]<<p,p+=8,p<y&&(d+=S[i++]<<p,p+=8)),x+=d&(1<<y)-1,x>o){e.msg="invalid distance too far back",C.mode=30;break e}if(d>>>=y,p-=y,y=r-s,x>y){if(y=x-y,y>c&&C.sane){e.msg="invalid distance too far back",C.mode=30;break e}if(w=0,M=u,0===l){if(w+=h-y,y<b){b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,M=T}}else if(l<y){if(w+=h+l-y,y-=l,y<b){b-=y;do{T[r++]=u[w++]}while(--y);if(w=0,l<b){y=l,b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,M=T}}}else if(w+=l-y,y<b){b-=y;do{T[r++]=u[w++]}while(--y);w=r-x,M=T}for(;b>2;)T[r++]=M[w++],T[r++]=M[w++],T[r++]=M[w++],b-=3;b&&(T[r++]=M[w++],b>1&&(T[r++]=M[w++]))}else{w=r-x;do{T[r++]=T[w++],T[r++]=T[w++],T[r++]=T[w++],b-=3}while(b>2);b&&(T[r++]=T[w++],b>1&&(T[r++]=T[w++]))}break}}break}}while(i<n&&r<a);b=p>>3,i-=b,p-=b<<3,d&=(1<<p)-1,e.next_in=i,e.next_out=r,e.avail_in=i<n?n-i+5:5-(i-n),e.avail_out=r<a?a-r+257:257-(r-a),C.hold=d,C.bits=p};const Xb=15,Zb=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),Yb=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),Jb=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),Kb=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]);var Qb=(e,t,i,n,r,s,a,o)=>{const h=o.bits;let c,l,u,d,p,m,f=0,g=0,_=0,v=0,y=0,b=0,x=0,w=0,M=0,S=0,T=null,C=0;const E=new Uint16Array(16),A=new Uint16Array(16);let I,R,P,L=null,D=0;for(f=0;f<=Xb;f++)E[f]=0;for(g=0;g<n;g++)E[t[i+g]]++;for(y=h,v=Xb;v>=1&&0===E[v];v--);if(y>v&&(y=v),0===v)return r[s++]=20971520,r[s++]=20971520,o.bits=1,0;for(_=1;_<v&&0===E[_];_++);for(y<_&&(y=_),w=1,f=1;f<=Xb;f++)if(w<<=1,w-=E[f],w<0)return-1;if(w>0&&(0===e||1!==v))return-1;for(A[1]=0,f=1;f<Xb;f++)A[f+1]=A[f]+E[f];for(g=0;g<n;g++)0!==t[i+g]&&(a[A[t[i+g]]++]=g);if(0===e?(T=L=a,m=19):1===e?(T=Zb,C-=257,L=Yb,D-=257,m=256):(T=Jb,L=Kb,m=-1),S=0,g=0,f=_,p=s,b=y,x=0,u=-1,M=1<<y,d=M-1,1===e&&M>852||2===e&&M>592)return 1;for(;;){I=f-x,a[g]<m?(R=0,P=a[g]):a[g]>m?(R=L[D+a[g]],P=T[C+a[g]]):(R=96,P=0),c=1<<f-x,l=1<<b,_=l;do{l-=c,r[p+(S>>x)+l]=I<<24|R<<16|P|0}while(0!==l);for(c=1<<f-1;S&c;)c>>=1;if(0!==c?(S&=c-1,S+=c):S=0,g++,0==--E[f]){if(f===v)break;f=t[i+a[g]]}if(f>y&&(S&d)!==u){for(0===x&&(x=y),p+=_,b=f-x,w=1<<b;b+x<v&&(w-=E[b+x],!(w<=0));)b++,w<<=1;if(M+=1<<b,1===e&&M>852||2===e&&M>592)return 1;u=S&d,r[u]=y<<24|b<<16|p-s|0}}return 0!==S&&(r[p+S]=f-x<<24|64<<16|0),o.bits=y,0};const{Z_FINISH:ex,Z_BLOCK:tx,Z_TREES:ix,Z_OK:nx,Z_STREAM_END:rx,Z_NEED_DICT:sx,Z_STREAM_ERROR:ax,Z_DATA_ERROR:ox,Z_MEM_ERROR:hx,Z_BUF_ERROR:cx,Z_DEFLATED:lx}=Ly,ux=12,dx=30,px=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function mx(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const fx=e=>{if(!e||!e.state)return ax;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=1,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(852),t.distcode=t.distdyn=new Int32Array(592),t.sane=1,t.back=-1,nx},gx=e=>{if(!e||!e.state)return ax;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,fx(e)},_x=(e,t)=>{let i;if(!e||!e.state)return ax;const n=e.state;return t<0?(i=0,t=-t):(i=1+(t>>4),t<48&&(t&=15)),t&&(t<8||t>15)?ax:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=i,n.wbits=t,gx(e))},vx=(e,t)=>{if(!e)return ax;const i=new mx;e.state=i,i.window=null;const n=_x(e,t);return n!==nx&&(e.state=null),n};let yx,bx,xx=!0;const wx=e=>{if(xx){yx=new Int32Array(512),bx=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(Qb(1,e.lens,0,288,yx,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;Qb(2,e.lens,0,32,bx,0,e.work,{bits:5}),xx=!1}e.lencode=yx,e.lenbits=9,e.distcode=bx,e.distbits=5},Mx=(e,t,i,n)=>{let r;const s=e.state;return null===s.window&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new Uint8Array(s.wsize)),n>=s.wsize?(s.window.set(t.subarray(i-s.wsize,i),0),s.wnext=0,s.whave=s.wsize):(r=s.wsize-s.wnext,r>n&&(r=n),s.window.set(t.subarray(i-n,i-n+r),s.wnext),(n-=r)?(s.window.set(t.subarray(i-n,i),0),s.wnext=n,s.whave=s.wsize):(s.wnext+=r,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=r))),0};var Sx={inflateReset:gx,inflateReset2:_x,inflateResetKeep:fx,inflateInit:e=>vx(e,15),inflateInit2:vx,inflate:(e,t)=>{let i,n,r,s,a,o,h,c,l,u,d,p,m,f,g,_,v,y,b,x,w,M,S=0;const T=new Uint8Array(4);let C,E;const A=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(!e||!e.state||!e.output||!e.input&&0!==e.avail_in)return ax;i=e.state,i.mode===ux&&(i.mode=13),a=e.next_out,r=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,c=i.hold,l=i.bits,u=o,d=h,M=nx;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(2&i.wrap&&35615===c){i.check=0,T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0),c=0,l=0,i.mode=2;break}if(i.flags=0,i.head&&(i.head.done=!1),!(1&i.wrap)||(((255&c)<<8)+(c>>8))%31){e.msg="incorrect header check",i.mode=dx;break}if((15&c)!==lx){e.msg="unknown compression method",i.mode=dx;break}if(c>>>=4,l-=4,w=8+(15&c),0===i.wbits)i.wbits=w;else if(w>i.wbits){e.msg="invalid window size",i.mode=dx;break}i.dmax=1<<i.wbits,e.adler=i.check=1,i.mode=512&c?10:ux,c=0,l=0;break;case 2:for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(i.flags=c,(255&i.flags)!==lx){e.msg="unknown compression method",i.mode=dx;break}if(57344&i.flags){e.msg="unknown header flags set",i.mode=dx;break}i.head&&(i.head.text=c>>8&1),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0)),c=0,l=0,i.mode=3;case 3:for(;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.head&&(i.head.time=c),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,T[2]=c>>>16&255,T[3]=c>>>24&255,i.check=Ry(i.check,T,4,0)),c=0,l=0,i.mode=4;case 4:for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.head&&(i.head.xflags=255&c,i.head.os=c>>8),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0)),c=0,l=0,i.mode=5;case 5:if(1024&i.flags){for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.length=c,i.head&&(i.head.extra_len=c),512&i.flags&&(T[0]=255&c,T[1]=c>>>8&255,i.check=Ry(i.check,T,2,0)),c=0,l=0}else i.head&&(i.head.extra=null);i.mode=6;case 6:if(1024&i.flags&&(p=i.length,p>o&&(p=o),p&&(i.head&&(w=i.head.extra_len-i.length,i.head.extra||(i.head.extra=new Uint8Array(i.head.extra_len)),i.head.extra.set(n.subarray(s,s+p),w)),512&i.flags&&(i.check=Ry(i.check,n,p,s)),o-=p,s+=p,i.length-=p),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===o)break e;p=0;do{w=n[s+p++],i.head&&w&&i.length<65536&&(i.head.name+=String.fromCharCode(w))}while(w&&p<o);if(512&i.flags&&(i.check=Ry(i.check,n,p,s)),o-=p,s+=p,w)break e}else i.head&&(i.head.name=null);i.length=0,i.mode=8;case 8:if(4096&i.flags){if(0===o)break e;p=0;do{w=n[s+p++],i.head&&w&&i.length<65536&&(i.head.comment+=String.fromCharCode(w))}while(w&&p<o);if(512&i.flags&&(i.check=Ry(i.check,n,p,s)),o-=p,s+=p,w)break e}else i.head&&(i.head.comment=null);i.mode=9;case 9:if(512&i.flags){for(;l<16;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(c!==(65535&i.check)){e.msg="header crc mismatch",i.mode=dx;break}c=0,l=0}i.head&&(i.head.hcrc=i.flags>>9&1,i.head.done=!0),e.adler=i.check=0,i.mode=ux;break;case 10:for(;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}e.adler=i.check=px(c),c=0,l=0,i.mode=11;case 11:if(0===i.havedict)return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,i.hold=c,i.bits=l,sx;e.adler=i.check=1,i.mode=ux;case ux:if(t===tx||t===ix)break e;case 13:if(i.last){c>>>=7&l,l-=7&l,i.mode=27;break}for(;l<3;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}switch(i.last=1&c,c>>>=1,l-=1,3&c){case 0:i.mode=14;break;case 1:if(wx(i),i.mode=20,t===ix){c>>>=2,l-=2;break e}break;case 2:i.mode=17;break;case 3:e.msg="invalid block type",i.mode=dx}c>>>=2,l-=2;break;case 14:for(c>>>=7&l,l-=7&l;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if((65535&c)!=(c>>>16^65535)){e.msg="invalid stored block lengths",i.mode=dx;break}if(i.length=65535&c,c=0,l=0,i.mode=15,t===ix)break e;case 15:i.mode=16;case 16:if(p=i.length,p){if(p>o&&(p=o),p>h&&(p=h),0===p)break e;r.set(n.subarray(s,s+p),a),o-=p,s+=p,h-=p,a+=p,i.length-=p;break}i.mode=ux;break;case 17:for(;l<14;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(i.nlen=257+(31&c),c>>>=5,l-=5,i.ndist=1+(31&c),c>>>=5,l-=5,i.ncode=4+(15&c),c>>>=4,l-=4,i.nlen>286||i.ndist>30){e.msg="too many length or distance symbols",i.mode=dx;break}i.have=0,i.mode=18;case 18:for(;i.have<i.ncode;){for(;l<3;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.lens[A[i.have++]]=7&c,c>>>=3,l-=3}for(;i.have<19;)i.lens[A[i.have++]]=0;if(i.lencode=i.lendyn,i.lenbits=7,C={bits:i.lenbits},M=Qb(0,i.lens,0,19,i.lencode,0,i.work,C),i.lenbits=C.bits,M){e.msg="invalid code lengths set",i.mode=dx;break}i.have=0,i.mode=19;case 19:for(;i.have<i.nlen+i.ndist;){for(;S=i.lencode[c&(1<<i.lenbits)-1],g=S>>>24,_=S>>>16&255,v=65535&S,!(g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(v<16)c>>>=g,l-=g,i.lens[i.have++]=v;else{if(16===v){for(E=g+2;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(c>>>=g,l-=g,0===i.have){e.msg="invalid bit length repeat",i.mode=dx;break}w=i.lens[i.have-1],p=3+(3&c),c>>>=2,l-=2}else if(17===v){for(E=g+3;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=g,l-=g,w=0,p=3+(7&c),c>>>=3,l-=3}else{for(E=g+7;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=g,l-=g,w=0,p=11+(127&c),c>>>=7,l-=7}if(i.have+p>i.nlen+i.ndist){e.msg="invalid bit length repeat",i.mode=dx;break}for(;p--;)i.lens[i.have++]=w}}if(i.mode===dx)break;if(0===i.lens[256]){e.msg="invalid code -- missing end-of-block",i.mode=dx;break}if(i.lenbits=9,C={bits:i.lenbits},M=Qb(1,i.lens,0,i.nlen,i.lencode,0,i.work,C),i.lenbits=C.bits,M){e.msg="invalid literal/lengths set",i.mode=dx;break}if(i.distbits=6,i.distcode=i.distdyn,C={bits:i.distbits},M=Qb(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,C),i.distbits=C.bits,M){e.msg="invalid distances set",i.mode=dx;break}if(i.mode=20,t===ix)break e;case 20:i.mode=21;case 21:if(o>=6&&h>=258){e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,i.hold=c,i.bits=l,qb(e,d),a=e.next_out,r=e.output,h=e.avail_out,s=e.next_in,n=e.input,o=e.avail_in,c=i.hold,l=i.bits,i.mode===ux&&(i.back=-1);break}for(i.back=0;S=i.lencode[c&(1<<i.lenbits)-1],g=S>>>24,_=S>>>16&255,v=65535&S,!(g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(_&&0==(240&_)){for(y=g,b=_,x=v;S=i.lencode[x+((c&(1<<y+b)-1)>>y)],g=S>>>24,_=S>>>16&255,v=65535&S,!(y+g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=y,l-=y,i.back+=y}if(c>>>=g,l-=g,i.back+=g,i.length=v,0===_){i.mode=26;break}if(32&_){i.back=-1,i.mode=ux;break}if(64&_){e.msg="invalid literal/length code",i.mode=dx;break}i.extra=15&_,i.mode=22;case 22:if(i.extra){for(E=i.extra;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.length+=c&(1<<i.extra)-1,c>>>=i.extra,l-=i.extra,i.back+=i.extra}i.was=i.length,i.mode=23;case 23:for(;S=i.distcode[c&(1<<i.distbits)-1],g=S>>>24,_=S>>>16&255,v=65535&S,!(g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(0==(240&_)){for(y=g,b=_,x=v;S=i.distcode[x+((c&(1<<y+b)-1)>>y)],g=S>>>24,_=S>>>16&255,v=65535&S,!(y+g<=l);){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}c>>>=y,l-=y,i.back+=y}if(c>>>=g,l-=g,i.back+=g,64&_){e.msg="invalid distance code",i.mode=dx;break}i.offset=v,i.extra=15&_,i.mode=24;case 24:if(i.extra){for(E=i.extra;l<E;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}i.offset+=c&(1<<i.extra)-1,c>>>=i.extra,l-=i.extra,i.back+=i.extra}if(i.offset>i.dmax){e.msg="invalid distance too far back",i.mode=dx;break}i.mode=25;case 25:if(0===h)break e;if(p=d-h,i.offset>p){if(p=i.offset-p,p>i.whave&&i.sane){e.msg="invalid distance too far back",i.mode=dx;break}p>i.wnext?(p-=i.wnext,m=i.wsize-p):m=i.wnext-p,p>i.length&&(p=i.length),f=i.window}else f=r,m=a-i.offset,p=i.length;p>h&&(p=h),h-=p,i.length-=p;do{r[a++]=f[m++]}while(--p);0===i.length&&(i.mode=21);break;case 26:if(0===h)break e;r[a++]=i.length,h--,i.mode=21;break;case 27:if(i.wrap){for(;l<32;){if(0===o)break e;o--,c|=n[s++]<<l,l+=8}if(d-=h,e.total_out+=d,i.total+=d,d&&(e.adler=i.check=i.flags?Ry(i.check,r,d,a-d):Ay(i.check,r,d,a-d)),d=h,(i.flags?c:px(c))!==i.check){e.msg="incorrect data check",i.mode=dx;break}c=0,l=0}i.mode=28;case 28:if(i.wrap&&i.flags){for(;l<32;){if(0===o)break e;o--,c+=n[s++]<<l,l+=8}if(c!==(4294967295&i.total)){e.msg="incorrect length check",i.mode=dx;break}c=0,l=0}i.mode=29;case 29:M=rx;break e;case dx:M=ox;break e;case 31:return hx;case 32:default:return ax}return e.next_out=a,e.avail_out=h,e.next_in=s,e.avail_in=o,i.hold=c,i.bits=l,(i.wsize||d!==e.avail_out&&i.mode<dx&&(i.mode<27||t!==ex))&&Mx(e,e.output,e.next_out,d-e.avail_out),u-=e.avail_in,d-=e.avail_out,e.total_in+=u,e.total_out+=d,i.total+=d,i.wrap&&d&&(e.adler=i.check=i.flags?Ry(i.check,r,d,e.next_out-d):Ay(i.check,r,d,e.next_out-d)),e.data_type=i.bits+(i.last?64:0)+(i.mode===ux?128:0)+(20===i.mode||15===i.mode?256:0),(0===u&&0===d||t===ex)&&M===nx&&(M=cx),M},inflateEnd:e=>{if(!e||!e.state)return ax;let t=e.state;return t.window&&(t.window=null),e.state=null,nx},inflateGetHeader:(e,t)=>{if(!e||!e.state)return ax;const i=e.state;return 0==(2&i.wrap)?ax:(i.head=t,t.done=!1,nx)},inflateSetDictionary:(e,t)=>{const i=t.length;let n,r,s;return e&&e.state?(n=e.state,0!==n.wrap&&11!==n.mode?ax:11===n.mode&&(r=1,r=Ay(r,t,i,0),r!==n.check)?ox:(s=Mx(e,t,i,i),s?(n.mode=31,hx):(n.havedict=1,nx))):ax},inflateInfo:"pako inflate (from Nodeca project)"};var Tx=function(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1};const Cx=Object.prototype.toString,{Z_NO_FLUSH:Ex,Z_FINISH:Ax,Z_OK:Ix,Z_STREAM_END:Rx,Z_NEED_DICT:Px,Z_STREAM_ERROR:Lx,Z_DATA_ERROR:Dx,Z_MEM_ERROR:Nx}=Ly;function $x(e){this.options=Ab({chunkSize:65536,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0==(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new $b,this.strm.avail_out=0;let i=Sx.inflateInit2(this.strm,t.windowBits);if(i!==Ix)throw new Error(Py[i]);if(this.header=new Tx,Sx.inflateGetHeader(this.strm,this.header),t.dictionary&&("string"==typeof t.dictionary?t.dictionary=Lb(t.dictionary):"[object ArrayBuffer]"===Cx.call(t.dictionary)&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(i=Sx.inflateSetDictionary(this.strm,t.dictionary),i!==Ix)))throw new Error(Py[i])}function kx(e,t){const i=new $x(t);if(i.push(e),i.err)throw i.msg||Py[i.err];return i.result}$x.prototype.push=function(e,t){const i=this.strm,n=this.options.chunkSize,r=this.options.dictionary;let s,a,o;if(this.ended)return!1;for(a=t===~~t?t:!0===t?Ax:Ex,"[object ArrayBuffer]"===Cx.call(e)?i.input=new Uint8Array(e):i.input=e,i.next_in=0,i.avail_in=i.input.length;;){for(0===i.avail_out&&(i.output=new Uint8Array(n),i.next_out=0,i.avail_out=n),s=Sx.inflate(i,a),s===Px&&r&&(s=Sx.inflateSetDictionary(i,r),s===Ix?s=Sx.inflate(i,a):s===Dx&&(s=Px));i.avail_in>0&&s===Rx&&i.state.wrap>0&&0!==e[i.next_in];)Sx.inflateReset(i),s=Sx.inflate(i,a);switch(s){case Lx:case Dx:case Px:case Nx:return this.onEnd(s),this.ended=!0,!1}if(o=i.avail_out,i.next_out&&(0===i.avail_out||s===Rx))if("string"===this.options.to){let e=Nb(i.output,i.next_out),t=i.next_out-e,r=Db(i.output,e);i.next_out=t,i.avail_out=n-t,t&&i.output.set(i.output.subarray(e,e+t),0),this.onData(r)}else this.onData(i.output.length===i.next_out?i.output:i.output.subarray(0,i.next_out));if(s!==Ix||0!==o){if(s===Rx)return s=Sx.inflateEnd(this.strm),this.onEnd(s),this.ended=!0,!0;if(0===i.avail_in)break}}return!0},$x.prototype.onData=function(e){this.chunks.push(e)},$x.prototype.onEnd=function(e){e===Ix&&("string"===this.options.to?this.result=this.chunks.join(""):this.result=Ib(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};var Ox={Inflate:$x,inflate:kx,inflateRaw:function(e,t){return(t=t||{}).raw=!0,kx(e,t)},ungzip:kx,constants:Ly};const{Inflate:zx,inflate:Fx,inflateRaw:Bx,ungzip:Ux}=Ox;var Vx=Fx,Hx={
+/*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
+read:function(e,t,i,n,r){var s,a,o=8*r-n-1,h=(1<<o)-1,c=h>>1,l=-7,u=i?r-1:0,d=i?-1:1,p=e[t+u];for(u+=d,s=p&(1<<-l)-1,p>>=-l,l+=o;l>0;s=256*s+e[t+u],u+=d,l-=8);for(a=s&(1<<-l)-1,s>>=-l,l+=n;l>0;a=256*a+e[t+u],u+=d,l-=8);if(0===s)s=1-c;else{if(s===h)return a?NaN:1/0*(p?-1:1);a+=Math.pow(2,n),s-=c}return(p?-1:1)*a*Math.pow(2,s-n)},write:function(e,t,i,n,r,s){var a,o,h,c=8*s-r-1,l=(1<<c)-1,u=l>>1,d=23===r?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:s-1,m=n?1:-1,f=t<0||0===t&&1/t<0?1:0;for(t=Math.abs(t),isNaN(t)||t===1/0?(o=isNaN(t)?1:0,a=l):(a=Math.floor(Math.log(t)/Math.LN2),t*(h=Math.pow(2,-a))<1&&(a--,h*=2),(t+=a+u>=1?d/h:d*Math.pow(2,1-u))*h>=2&&(a++,h/=2),a+u>=l?(o=0,a=l):a+u>=1?(o=(t*h-1)*Math.pow(2,r),a+=u):(o=t*Math.pow(2,u-1)*Math.pow(2,r),a=0));r>=8;e[i+p]=255&o,p+=m,o/=256,r-=8);for(a=a<<r|o,c+=r;c>0;e[i+p]=255&a,p+=m,a/=256,c-=8);e[i+p-m]|=128*f}},jx=Wx,Gx=Hx;function Wx(e){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(e)?e:new Uint8Array(e||0),this.pos=0,this.type=0,this.length=this.buf.length}Wx.Varint=0,Wx.Fixed64=1,Wx.Bytes=2,Wx.Fixed32=5;var qx=4294967296,Xx=1/qx,Zx="undefined"==typeof TextDecoder?null:new TextDecoder("utf8");function Yx(e){return e.type===Wx.Bytes?e.readVarint()+e.pos:e.pos+1}function Jx(e,t,i){return i?4294967296*t+(e>>>0):4294967296*(t>>>0)+(e>>>0)}function Kx(e,t,i){var n=t<=16383?1:t<=2097151?2:t<=268435455?3:Math.floor(Math.log(t)/(7*Math.LN2));i.realloc(n);for(var r=i.pos-1;r>=e;r--)i.buf[r+n]=i.buf[r]}function Qx(e,t){for(var i=0;i<e.length;i++)t.writeVarint(e[i])}function ew(e,t){for(var i=0;i<e.length;i++)t.writeSVarint(e[i])}function tw(e,t){for(var i=0;i<e.length;i++)t.writeFloat(e[i])}function iw(e,t){for(var i=0;i<e.length;i++)t.writeDouble(e[i])}function nw(e,t){for(var i=0;i<e.length;i++)t.writeBoolean(e[i])}function rw(e,t){for(var i=0;i<e.length;i++)t.writeFixed32(e[i])}function sw(e,t){for(var i=0;i<e.length;i++)t.writeSFixed32(e[i])}function aw(e,t){for(var i=0;i<e.length;i++)t.writeFixed64(e[i])}function ow(e,t){for(var i=0;i<e.length;i++)t.writeSFixed64(e[i])}function hw(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+16777216*e[t+3]}function cw(e,t,i){e[i]=t,e[i+1]=t>>>8,e[i+2]=t>>>16,e[i+3]=t>>>24}function lw(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16)+(e[t+3]<<24)}function uw(e){const t=Vx(e,{to:"string"});return JSON.parse(t)}function dw(e,t){return pw(e,"GET","arraybuffer",[],null,t)}function pw(e,t,i,n,r,s){const a=new XMLHttpRequest,o=new Promise(((s,o)=>{a.open(t,e,!0);for(const e of n)a.setRequestHeader(e.name,e.value);a.responseType=i,a.timeout=15e3,a.onload=()=>{var t;if(200!==a.status){const i=null!==(t=a.response)&&void 0!==t?t:new Pu(`Response status error: ${e}`);o(i)}a.response||o(new Pu(`Response empty: ${e}`)),s(a.response)},a.onerror=()=>{o(new Pu(`Request error: ${e}`))},a.ontimeout=()=>{o(new Pu(`Request timeout: ${e}`))},a.onabort=()=>{o(new Pu(`Request aborted: ${e}`))},a.send("POST"===t?r:null)}));return s&&s.catch((()=>{a.abort()})),o}function mw(e){return new jx(e).readFields(fw,{faces:[],vertices:[]})}function fw(e,t,i){1===e?t.vertices.push(i.readFloat()):2===e?t.faces.push(i.readVarint()):console.warn(`Unsupported pbf tag (${e})`)}Wx.prototype={destroy:function(){this.buf=null},readFields:function(e,t,i){for(i=i||this.length;this.pos<i;){var n=this.readVarint(),r=n>>3,s=this.pos;this.type=7&n,e(r,t,this),this.pos===s&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=hw(this.buf,this.pos);return this.pos+=4,e},readSFixed32:function(){var e=lw(this.buf,this.pos);return this.pos+=4,e},readFixed64:function(){var e=hw(this.buf,this.pos)+hw(this.buf,this.pos+4)*qx;return this.pos+=8,e},readSFixed64:function(){var e=hw(this.buf,this.pos)+lw(this.buf,this.pos+4)*qx;return this.pos+=8,e},readFloat:function(){var e=Gx.read(this.buf,this.pos,!0,23,4);return this.pos+=4,e},readDouble:function(){var e=Gx.read(this.buf,this.pos,!0,52,8);return this.pos+=8,e},readVarint:function(e){var t,i,n=this.buf;return t=127&(i=n[this.pos++]),i<128?t:(t|=(127&(i=n[this.pos++]))<<7,i<128?t:(t|=(127&(i=n[this.pos++]))<<14,i<128?t:(t|=(127&(i=n[this.pos++]))<<21,i<128?t:function(e,t,i){var n,r,s=i.buf;if(r=s[i.pos++],n=(112&r)>>4,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<3,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<10,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<17,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(127&r)<<24,r<128)return Jx(e,n,t);if(r=s[i.pos++],n|=(1&r)<<31,r<128)return Jx(e,n,t);throw new Error("Expected varint not more than 10 bytes")}(t|=(15&(i=n[this.pos]))<<28,e,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var e=this.readVarint();return e%2==1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.pos;return this.pos=e,e-t>=12&&Zx?function(e,t,i){return Zx.decode(e.subarray(t,i))}(this.buf,t,e):function(e,t,i){var n="",r=t;for(;r<i;){var s,a,o,h=e[r],c=null,l=h>239?4:h>223?3:h>191?2:1;if(r+l>i)break;1===l?h<128&&(c=h):2===l?128==(192&(s=e[r+1]))&&(c=(31&h)<<6|63&s)<=127&&(c=null):3===l?(s=e[r+1],a=e[r+2],128==(192&s)&&128==(192&a)&&((c=(15&h)<<12|(63&s)<<6|63&a)<=2047||c>=55296&&c<=57343)&&(c=null)):4===l&&(s=e[r+1],a=e[r+2],o=e[r+3],128==(192&s)&&128==(192&a)&&128==(192&o)&&((c=(15&h)<<18|(63&s)<<12|(63&a)<<6|63&o)<=65535||c>=1114112)&&(c=null)),null===c?(c=65533,l=1):c>65535&&(c-=65536,n+=String.fromCharCode(c>>>10&1023|55296),c=56320|1023&c),n+=String.fromCharCode(c),r+=l}return n}(this.buf,t,e)},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.subarray(this.pos,e);return this.pos=e,t},readPackedVarint:function(e,t){if(this.type!==Wx.Bytes)return e.push(this.readVarint(t));var i=Yx(this);for(e=e||[];this.pos<i;)e.push(this.readVarint(t));return e},readPackedSVarint:function(e){if(this.type!==Wx.Bytes)return e.push(this.readSVarint());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readSVarint());return e},readPackedBoolean:function(e){if(this.type!==Wx.Bytes)return e.push(this.readBoolean());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readBoolean());return e},readPackedFloat:function(e){if(this.type!==Wx.Bytes)return e.push(this.readFloat());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readFloat());return e},readPackedDouble:function(e){if(this.type!==Wx.Bytes)return e.push(this.readDouble());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readDouble());return e},readPackedFixed32:function(e){if(this.type!==Wx.Bytes)return e.push(this.readFixed32());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readFixed32());return e},readPackedSFixed32:function(e){if(this.type!==Wx.Bytes)return e.push(this.readSFixed32());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed32());return e},readPackedFixed64:function(e){if(this.type!==Wx.Bytes)return e.push(this.readFixed64());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readFixed64());return e},readPackedSFixed64:function(e){if(this.type!==Wx.Bytes)return e.push(this.readSFixed64());var t=Yx(this);for(e=e||[];this.pos<t;)e.push(this.readSFixed64());return e},skip:function(e){var t=7&e;if(t===Wx.Varint)for(;this.buf[this.pos++]>127;);else if(t===Wx.Bytes)this.pos=this.readVarint()+this.pos;else if(t===Wx.Fixed32)this.pos+=4;else{if(t!==Wx.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t<this.pos+e;)t*=2;if(t!==this.length){var i=new Uint8Array(t);i.set(this.buf),this.buf=i,this.length=t}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(e){this.realloc(4),cw(this.buf,e,this.pos),this.pos+=4},writeSFixed32:function(e){this.realloc(4),cw(this.buf,e,this.pos),this.pos+=4},writeFixed64:function(e){this.realloc(8),cw(this.buf,-1&e,this.pos),cw(this.buf,Math.floor(e*Xx),this.pos+4),this.pos+=8},writeSFixed64:function(e){this.realloc(8),cw(this.buf,-1&e,this.pos),cw(this.buf,Math.floor(e*Xx),this.pos+4),this.pos+=8},writeVarint:function(e){(e=+e||0)>268435455||e<0?function(e,t){var i,n;e>=0?(i=e%4294967296|0,n=e/4294967296|0):(n=~(-e/4294967296),4294967295^(i=~(-e%4294967296))?i=i+1|0:(i=0,n=n+1|0));if(e>=0x10000000000000000||e<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");t.realloc(10),function(e,t,i){i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos++]=127&e|128,e>>>=7,i.buf[i.pos]=127&e}(i,0,t),function(e,t){var i=(7&e)<<4;if(t.buf[t.pos++]|=i|((e>>>=3)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;if(t.buf[t.pos++]=127&e|((e>>>=7)?128:0),!e)return;t.buf[t.pos++]=127&e}(n,t)}(e,this):(this.realloc(4),this.buf[this.pos++]=127&e|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=127&(e>>>=7)|(e>127?128:0),e<=127||(this.buf[this.pos++]=e>>>7&127))))},writeSVarint:function(e){this.writeVarint(e<0?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e),this.realloc(4*e.length),this.pos++;var t=this.pos;this.pos=function(e,t,i){for(var n,r,s=0;s<t.length;s++){if((n=t.charCodeAt(s))>55295&&n<57344){if(!r){n>56319||s+1===t.length?(e[i++]=239,e[i++]=191,e[i++]=189):r=n;continue}if(n<56320){e[i++]=239,e[i++]=191,e[i++]=189,r=n;continue}n=r-55296<<10|n-56320|65536,r=null}else r&&(e[i++]=239,e[i++]=191,e[i++]=189,r=null);n<128?e[i++]=n:(n<2048?e[i++]=n>>6|192:(n<65536?e[i++]=n>>12|224:(e[i++]=n>>18|240,e[i++]=n>>12&63|128),e[i++]=n>>6&63|128),e[i++]=63&n|128)}return i}(this.buf,e,this.pos);var i=this.pos-t;i>=128&&Kx(t,i,this),this.pos=t-1,this.writeVarint(i),this.pos+=i},writeFloat:function(e){this.realloc(4),Gx.write(this.buf,e,this.pos,!0,23,4),this.pos+=4},writeDouble:function(e){this.realloc(8),Gx.write(this.buf,e,this.pos,!0,52,8),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var i=0;i<t;i++)this.buf[this.pos++]=e[i]},writeRawMessage:function(e,t){this.pos++;var i=this.pos;e(t,this);var n=this.pos-i;n>=128&&Kx(i,n,this),this.pos=i-1,this.writeVarint(n),this.pos+=n},writeMessage:function(e,t,i){this.writeTag(e,Wx.Bytes),this.writeRawMessage(t,i)},writePackedVarint:function(e,t){t.length&&this.writeMessage(e,Qx,t)},writePackedSVarint:function(e,t){t.length&&this.writeMessage(e,ew,t)},writePackedBoolean:function(e,t){t.length&&this.writeMessage(e,nw,t)},writePackedFloat:function(e,t){t.length&&this.writeMessage(e,tw,t)},writePackedDouble:function(e,t){t.length&&this.writeMessage(e,iw,t)},writePackedFixed32:function(e,t){t.length&&this.writeMessage(e,rw,t)},writePackedSFixed32:function(e,t){t.length&&this.writeMessage(e,sw,t)},writePackedFixed64:function(e,t){t.length&&this.writeMessage(e,aw,t)},writePackedSFixed64:function(e,t){t.length&&this.writeMessage(e,ow,t)},writeBytesField:function(e,t){this.writeTag(e,Wx.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,Wx.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,Wx.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,Wx.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,Wx.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,Wx.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,Wx.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,Wx.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,Wx.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,Wx.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}};class gw extends nf{constructor(e){super(),this._geometry=e}get geometry(){return this._geometry}fire(e,t){super.fire(e,t)}getCoreImages(e){return Promise.reject(new Pu("Not implemented"))}getCluster(e,t){return Promise.reject(new Pu("Not implemented"))}getSpatialImages(e){return Promise.reject(new Pu("Not implemented"))}getImages(e){return Promise.reject(new Pu("Not implemented"))}getImageBuffer(e,t){return Promise.reject(new Pu("Not implemented"))}getImageTiles(e){return Promise.reject(new Pu("Not implemented"))}getMesh(e,t){return Promise.reject(new Pu("Not implemented"))}getSequence(e){return Promise.reject(new Pu("Not implemented"))}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}setAccessToken(e){throw new Pu("Not implemented")}}class _w{constructor(){}bboxToCellIds(e,t){throw new Pu("Not implemented")}getAdjacent(e){throw new Pu("Not implemented")}getVertices(e){throw new Pu("Not implemented")}lngLatToCellId(e){throw new Pu("Not implemented")}_approxBboxToCellIds(e,t){if(t.lat<=e.lat||t.lng<=e.lng)throw new Pu("North east needs to be top right of south west");const i=(e.lat+t.lat)/2,n=(e.lng+t.lng)/2,r=_u(t.lng,t.lat,0,n,i,0),s=Math.max(r[0],r[1]);return this._lngLatToCellIds({lat:i,lng:n},s)}_enuToGeodetic(e,t){const[i,n]=vu(e[0],e[1],e[2],t.lng,t.lat,0);return{lat:n,lng:i}}_getLngLatBoundingBoxCorners(e,t){return[[-t,t,0],[t,t,0],[t,-t,0],[-t,-t,0]].map((t=>this._enuToGeodetic(t,e)))}_lngLatToCellIds(e,t){const i=this.lngLatToCellId(e),n=this._getLngLatBoundingBoxCorners(e,t);for(const e of n){if(this.lngLatToCellId(e)!==i)return[i,...this.getAdjacent(i)]}return[i]}}var vw={exports:{}},yw={exports:{}};!function(e){
 /**
- * @class Viewer
- *
- * @classdesc The Viewer object represents the navigable image viewer.
- * Create a Viewer by specifying a container, client ID, image key and
- * other options. The viewer exposes methods and events for programmatic
- * interaction.
- *
- * In the case of asynchronous methods, MapillaryJS returns promises to
- * the results. Notifications are always emitted through JavaScript events.
- *
- * The viewer works with a few different coordinate systems.
- *
- * Container pixel coordinates
- *
- * Pixel coordinates are coordinates on the viewer container. The origin is
- * in the top left corner of the container. The axes are
- * directed according to the following for a viewer container with a width
- * of 640 pixels and height of 480 pixels.
- *
- * ```
- * (0,0)                          (640, 0)
- *      +------------------------>
- *      |
- *      |
- *      |
- *      v                        +
- * (0, 480)                       (640, 480)
- * ```
- *
- * Basic image coordinates
- *
- * Basic image coordinates represents points in the original image adjusted for
- * orientation. They range from 0 to 1 on both axes. The origin is in the top left
- * corner of the image and the axes are directed
- * according to the following for all image types.
- *
- * ```
- * (0,0)                          (1, 0)
- *      +------------------------>
- *      |
- *      |
- *      |
- *      v                        +
- * (0, 1)                         (1, 1)
- * ```
- *
- * For every camera viewing direction it is possible to convert between these
- * two coordinate systems for the current node. The image can be panned and
- * zoomed independently of the size of the viewer container resulting in
- * different conversion results for different viewing directions.
- */
-var Viewer = /** @class */ (function (_super) {
-    __extends(Viewer, _super);
-    /**
-     * Create a new viewer instance.
-     *
-     * @description It is possible to initialize the viewer with or
-     * without a key.
-     *
-     * When you want to show a specific image in the viewer from
-     * the start you should initialize it with a key.
-     *
-     * When you do not know the first image key at implementation
-     * time, e.g. in a map-viewer application you should initialize
-     * the viewer without a key and call `moveToKey` instead.
-     *
-     * When initializing with a key the viewer is bound to that key
-     * until the node for that key has been successfully loaded.
-     * Also, a cover with the image of the key will be shown.
-     * If the data for that key can not be loaded because the key is
-     * faulty or other errors occur it is not possible to navigate
-     * to another key because the viewer is not navigable. The viewer
-     * becomes navigable when the data for the key has been loaded and
-     * the image is shown in the viewer. This way of initializing
-     * the viewer is mostly for embedding in blog posts and similar
-     * where one wants to show a specific image initially.
-     *
-     * If the viewer is initialized without a key (with null or
-     * undefined) it is not bound to any particular key and it is
-     * possible to move to any key with `viewer.moveToKey("<my-image-key>")`.
-     * If the first move to a key fails it is possible to move to another
-     * key. The viewer will show a black background until a move
-     * succeeds. This way of intitializing is suited for a map-viewer
-     * application when the initial key is not known at implementation
-     * time.
-     *
-     * @param {string} id - Required `id` of a DOM element which will
-     * be transformed into the viewer.
-     * @param {string} clientId - Required `Mapillary API ClientID`. Can
-     * be obtained from https://www.mapillary.com/app/settings/developers.
-     * @param {string} key - Optional `image-key` to start from. The key
-     * can be any Mapillary image. If a key is provided the viewer is
-     * bound to that key until it has been fully loaded. If null is provided
-     * no image is loaded at viewer initialization and the viewer is not
-     * bound to any particular key. Any image can then be navigated to
-     * with e.g. `viewer.moveToKey("<my-image-key>")`.
-     * @param {IViewerOptions} options - Optional configuration object
-     * specifing Viewer's and the components' initial setup.
-     * @param {string} token - Optional bearer token for API requests of
-     * protected resources.
-     *
-     * @example
-     * ```
-     * var viewer = new Mapillary.Viewer("<element-id>", "<client-id>", "<image-key>");
-     * ```
-     */
-    function Viewer(id, clientId, key, options, token) {
-        var _this = _super.call(this) || this;
-        options = options != null ? options : {};
-        Utils_1.Settings.setOptions(options);
-        Utils_1.Urls.setOptions(options.url);
-        _this._navigator = new Viewer_1.Navigator(clientId, options, token);
-        _this._container = new Viewer_1.Container(id, _this._navigator.stateService, options);
-        _this._observer = new Viewer_1.Observer(_this, _this._navigator, _this._container);
-        _this._componentController = new Viewer_1.ComponentController(_this._container, _this._navigator, _this._observer, key, options.component);
-        return _this;
-    }
-    Object.defineProperty(Viewer.prototype, "isNavigable", {
-        /**
-         * Return a boolean indicating if the viewer is in a navigable state.
-         *
-         * @description The navigable state indicates if the viewer supports
-         * moving, i.e. calling the {@link moveToKey}, {@link moveDir}
-         * and {@link moveCloseTo} methods or changing the authentication state,
-         * i.e. calling {@link setAuthToken}. The viewer will not be in a navigable
-         * state if the cover is activated and the viewer has been supplied a key.
-         * When the cover is deactivated or the viewer is activated without being
-         * supplied a key it will be navigable.
-         *
-         * @returns {boolean} Boolean indicating whether the viewer is navigable.
-         */
-        get: function () {
-            return this._componentController.navigable;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    /**
-     * Activate the combined panning functionality.
-     *
-     * @description The combined panning functionality is active by default.
-     */
-    Viewer.prototype.activateCombinedPanning = function () {
-        this._navigator.panService.enable();
-    };
-    /**
-     * Activate a component.
-     *
-     * @param {string} name - Name of the component which will become active.
-     *
-     * @example
-     * ```
-     * viewer.activateComponent("marker");
-     * ```
-     */
-    Viewer.prototype.activateComponent = function (name) {
-        this._componentController.activate(name);
-    };
-    /**
-     * Activate the cover (deactivates all other components).
-     */
-    Viewer.prototype.activateCover = function () {
-        this._componentController.activateCover();
-    };
-    /**
-     * Deactivate the combined panning functionality.
-     *
-     * @description Deactivating the combined panning functionality
-     * could be needed in scenarios involving sequence only navigation.
-     */
-    Viewer.prototype.deactivateCombinedPanning = function () {
-        this._navigator.panService.disable();
-    };
-    /**
-     * Deactivate a component.
-     *
-     * @param {string} name - Name of component which become inactive.
-     *
-     * @example
-     * ```
-     * viewer.deactivateComponent("mouse");
-     * ```
-     */
-    Viewer.prototype.deactivateComponent = function (name) {
-        this._componentController.deactivate(name);
-    };
-    /**
-     * Deactivate the cover (activates all components marked as active).
-     */
-    Viewer.prototype.deactivateCover = function () {
-        this._componentController.deactivateCover();
-    };
-    /**
-     * Get the bearing of the current viewer camera.
-     *
-     * @description The bearing depends on how the camera
-     * is currently rotated and does not correspond
-     * to the compass angle of the current node if the view
-     * has been panned.
-     *
-     * Bearing is measured in degrees clockwise with respect to
-     * north.
-     *
-     * @returns {Promise<number>} Promise to the bearing
-     * of the current viewer camera.
-     *
-     * @example
-     * ```
-     * viewer.getBearing().then((b) => { console.log(b); });
-     * ```
-     */
-    Viewer.prototype.getBearing = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._container.renderService.bearing$.pipe(operators_1.first())
-                .subscribe(function (bearing) {
-                resolve(bearing);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Get the basic coordinates of the current image that is
-     * at the center of the viewport.
-     *
-     * @description Basic coordinates are 2D coordinates on the [0, 1] interval
-     * and have the origin point, (0, 0), at the top left corner and the
-     * maximum value, (1, 1), at the bottom right corner of the original
-     * image.
-     *
-     * @returns {Promise<number[]>} Promise to the basic coordinates
-     * of the current image at the center for the viewport.
-     *
-     * @example
-     * ```
-     * viewer.getCenter().then((c) => { console.log(c); });
-     * ```
-     */
-    Viewer.prototype.getCenter = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.stateService.getCenter()
-                .subscribe(function (center) {
-                resolve(center);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Get a component.
-     *
-     * @param {string} name - Name of component.
-     * @returns {Component} The requested component.
-     *
-     * @example
-     * ```
-     * var mouseComponent = viewer.getComponent("mouse");
-     * ```
+     * @license long.js (c) 2013 Daniel Wirtz <dcode@dcode.io>
+     * Released under the Apache License, Version 2.0
+     * see: https://github.com/dcodeIO/long.js for details
      */
-    Viewer.prototype.getComponent = function (name) {
-        return this._componentController.get(name);
-    };
-    /**
-     * Returns the viewer's containing HTML element.
-     *
-     * @returns {HTMLElement} The viewer's container.
-     */
-    Viewer.prototype.getContainer = function () {
-        return this._container.element;
-    };
-    /**
-     * Get the image's current zoom level.
-     *
-     * @returns {Promise<number>} Promise to the viewers's current
-     * zoom level.
-     *
-     * @example
-     * ```
-     * viewer.getZoom().then((z) => { console.log(z); });
-     * ```
-     */
-    Viewer.prototype.getZoom = function () {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.stateService.getZoom()
-                .subscribe(function (zoom) {
-                resolve(zoom);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Move close to given latitude and longitude.
-     *
-     * @description Because the method propagates IO errors, these potential errors
-     * need to be handled by the method caller (see example).
-     *
-     * @param {Number} lat - Latitude, in degrees.
-     * @param {Number} lon - Longitude, in degrees.
-     * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} If no nodes exist close to provided latitude
-     * longitude.
-     * @throws {Error} Propagates any IO errors to the caller.
-     * @throws {Error} When viewer is not navigable.
-     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
-     * before the move close to call has completed.
-     *
-     * @example
-     * ```
-     * viewer.moveCloseTo(0, 0).then(
-     *     (n) => { console.log(n); },
-     *     (e) => { console.error(e); });
-     * ```
-     */
-    Viewer.prototype.moveCloseTo = function (lat, lon) {
-        var moveCloseTo$ = this.isNavigable ?
-            this._navigator.moveCloseTo$(lat, lon) :
-            rxjs_1.throwError(new Error("Calling moveCloseTo is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            moveCloseTo$.subscribe(function (node) {
-                resolve(node);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Navigate in a given direction.
-     *
-     * @description This method has to be called through EdgeDirection enumeration as in the example.
-     *
-     * @param {EdgeDirection} dir - Direction in which which to move.
-     * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} If the current node does not have the edge direction
-     * or the edges has not yet been cached.
-     * @throws {Error} Propagates any IO errors to the caller.
-     * @throws {Error} When viewer is not navigable.
-     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
-     * before the move dir call has completed.
-     *
-     * @example
-     * ```
-     * viewer.moveDir(Mapillary.EdgeDirection.Next).then(
-     *     (n) => { console.log(n); },
-     *     (e) => { console.error(e); });
-     * ```
-     */
-    Viewer.prototype.moveDir = function (dir) {
-        var moveDir$ = this.isNavigable ?
-            this._navigator.moveDir$(dir) :
-            rxjs_1.throwError(new Error("Calling moveDir is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            moveDir$.subscribe(function (node) {
-                resolve(node);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Navigate to a given image key.
-     *
-     * @param {string} key - A valid Mapillary image key.
-     * @returns {Promise<Node>} Promise to the node that was navigated to.
-     * @throws {Error} Propagates any IO errors to the caller.
-     * @throws {Error} When viewer is not navigable.
-     * @throws  {@link AbortMapillaryError} When a subsequent move request is made
-     * before the move to key call has completed.
-     *
-     * @example
-     * ```
-     * viewer.moveToKey("<my key>").then(
-     *     (n) => { console.log(n); },
-     *     (e) => { console.error(e); });
-     * ```
-     */
-    Viewer.prototype.moveToKey = function (key) {
-        var moveToKey$ = this.isNavigable ?
-            this._navigator.moveToKey$(key) :
-            rxjs_1.throwError(new Error("Calling moveToKey is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            moveToKey$.subscribe(function (node) {
-                resolve(node);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Project basic image coordinates for the current node to canvas pixel
-     * coordinates.
-     *
-     * @description The basic image coordinates may not always correspond to a
-     * pixel point that lies in the visible area of the viewer container.
-     *
-     * @param {Array<number>} basicPoint - Basic images coordinates to project.
-     * @returns {Promise<Array<number>>} Promise to the pixel coordinates corresponding
-     * to the basic image point.
-     *
-     * @example
-     * ```
-     * viewer.projectFromBasic([0.3, 0.7])
-     *     .then((pixelPoint) => { console.log(pixelPoint); });
-     * ```
-     */
-    Viewer.prototype.projectFromBasic = function (basicPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._observer.projectBasic$(basicPoint)
-                .subscribe(function (pixelPoint) {
-                resolve(pixelPoint);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Detect the viewer's new width and height and resize it.
-     *
-     * @description The components will also detect the viewer's
-     * new size and resize their rendered elements if needed.
-     *
-     * @example
-     * ```
-     * viewer.resize();
-     * ```
-     */
-    Viewer.prototype.resize = function () {
-        this._container.renderService.resize$.next(null);
-    };
-    /**
-     * Set a bearer token for authenticated API requests of
-     * protected resources.
-     *
-     * @description When the supplied token is null or undefined,
-     * any previously set bearer token will be cleared and the
-     * viewer will make unauthenticated requests.
-     *
-     * Calling setAuthToken aborts all outstanding move requests.
-     * The promises of those move requests will be rejected with a
-     * {@link AbortMapillaryError} the rejections need to be caught.
-     *
-     * Calling setAuthToken also resets the complete viewer cache
-     * so it should not be called repeatedly.
-     *
-     * @param {string} [token] token - Bearer token.
-     * @returns {Promise<void>} Promise that resolves after token
-     * is set.
-     *
-     * @throws {Error} When viewer is not navigable.
-     *
-     * @example
-     * ```
-     * viewer.setAuthToken("<my token>")
-     *     .then(() => { console.log("token set"); });
-     * ```
-     */
-    Viewer.prototype.setAuthToken = function (token) {
-        var setToken$ = this.isNavigable ?
-            this._navigator.setToken$(token) :
-            rxjs_1.throwError(new Error("Calling setAuthToken is not supported when viewer is not navigable."));
-        return when.promise(function (resolve, reject) {
-            setToken$
-                .subscribe(function () {
-                resolve(undefined);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Set the basic coordinates of the current image to be in the
-     * center of the viewport.
-     *
-     * @description Basic coordinates are 2D coordinates on the [0, 1] interval
-     * and has the origin point, (0, 0), at the top left corner and the
-     * maximum value, (1, 1), at the bottom right corner of the original
-     * image.
-     *
-     * @param {number[]} The basic coordinates of the current
-     * image to be at the center for the viewport.
-     *
-     * @example
-     * ```
-     * viewer.setCenter([0.5, 0.5]);
-     * ```
-     */
-    Viewer.prototype.setCenter = function (center) {
-        this._navigator.stateService.setCenter(center);
-    };
-    /**
-     * Set the filter selecting nodes to use when calculating
-     * the spatial edges.
-     *
-     * @description The following filter types are supported:
-     *
-     * Comparison
-     *
-     * `["==", key, value]` equality: `node[key] = value`
-     *
-     * `["!=", key, value]` inequality: `node[key] â‰  value`
-     *
-     * `["<", key, value]` less than: `node[key] < value`
-     *
-     * `["<=", key, value]` less than or equal: `node[key] â‰¤ value`
-     *
-     * `[">", key, value]` greater than: `node[key] > value`
-     *
-     * `[">=", key, value]` greater than or equal: `node[key] â‰¥ value`
-     *
-     * Set membership
-     *
-     * `["in", key, v0, ..., vn]` set inclusion: `node[key] âˆˆ {v0, ..., vn}`
-     *
-     * `["!in", key, v0, ..., vn]` set exclusion: `node[key] âˆ‰ {v0, ..., vn}`
-     *
-     * Combining
-     *
-     * `["all", f0, ..., fn]` logical `AND`: `f0 âˆ§ ... âˆ§ fn`
-     *
-     * A key must be a string that identifies a property name of a
-     * simple {@link Node} property. A value must be a string, number, or
-     * boolean. Strictly-typed comparisons are used. The values
-     * `f0, ..., fn` of the combining filter must be filter expressions.
-     *
-     * Clear the filter by setting it to null or empty array.
-     *
-     * @param {FilterExpression} filter - The filter expression.
-     * @returns {Promise<void>} Promise that resolves after filter is applied.
-     *
-     * @example
-     * ```
-     * viewer.setFilter(["==", "sequenceKey", "<my sequence key>"]);
-     * ```
-     */
-    Viewer.prototype.setFilter = function (filter) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._navigator.setFilter$(filter)
-                .subscribe(function () {
-                resolve(undefined);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Set the viewer's render mode.
-     *
-     * @param {RenderMode} renderMode - Render mode.
-     *
-     * @example
-     * ```
-     * viewer.setRenderMode(Mapillary.RenderMode.Letterbox);
-     * ```
-     */
-    Viewer.prototype.setRenderMode = function (renderMode) {
-        this._container.renderService.renderMode$.next(renderMode);
-    };
-    /**
-     * Set the viewer's transition mode.
-     *
-     * @param {TransitionMode} transitionMode - Transition mode.
-     *
-     * @example
-     * ```
-     * viewer.setTransitionMode(Mapillary.TransitionMode.Instantaneous);
-     * ```
-     */
-    Viewer.prototype.setTransitionMode = function (transitionMode) {
-        this._navigator.stateService.setTransitionMode(transitionMode);
-    };
-    /**
-     * Set the image's current zoom level.
-     *
-     * @description Possible zoom level values are on the [0, 3] interval.
-     * Zero means zooming out to fit the image to the view whereas three
-     * shows the highest level of detail.
-     *
-     * @param {number} The image's current zoom level.
-     *
-     * @example
-     * ```
-     * viewer.setZoom(2);
-     * ```
-     */
-    Viewer.prototype.setZoom = function (zoom) {
-        this._navigator.stateService.setZoom(zoom);
-    };
-    /**
-     * Unproject canvas pixel coordinates to an ILatLon representing geographical
-     * coordinates.
-     *
-     * @description The pixel point may not always correspond to geographical
-     * coordinates. In the case of no correspondence the returned value will
-     * be `null`.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
-     * @returns {Promise<ILatLon>} Promise to the latLon corresponding to the pixel point.
-     *
-     * @example
-     * ```
-     * viewer.unproject([100, 100])
-     *     .then((latLon) => { console.log(latLon); });
-     * ```
-     */
-    Viewer.prototype.unproject = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._observer.unproject$(pixelPoint)
-                .subscribe(function (latLon) {
-                resolve(latLon);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Unproject canvas pixel coordinates to basic image coordinates for the
-     * current node.
-     *
-     * @description The pixel point may not always correspond to basic image
-     * coordinates. In the case of no correspondence the returned value will
-     * be `null`.
-     *
-     * @param {Array<number>} pixelPoint - Pixel coordinates to unproject.
-     * @returns {Promise<ILatLon>} Promise to the basic coordinates corresponding
-     * to the pixel point.
-     *
-     * @example
-     * ```
-     * viewer.unprojectToBasic([100, 100])
-     *     .then((basicPoint) => { console.log(basicPoint); });
-     * ```
-     */
-    Viewer.prototype.unprojectToBasic = function (pixelPoint) {
-        var _this = this;
-        return when.promise(function (resolve, reject) {
-            _this._observer.unprojectBasic$(pixelPoint)
-                .subscribe(function (basicPoint) {
-                resolve(basicPoint);
-            }, function (error) {
-                reject(error);
-            });
-        });
-    };
-    /**
-     * Fired when the viewing direction of the camera changes.
-     *
-     * @description Related to the computed compass angle
-     * ({@link Node.computedCA}) from SfM, not the original EXIF compass
-     * angle.
-     *
-     * @event
-     * @type {number} bearing - Value indicating the current bearing
-     * measured in degrees clockwise with respect to north.
-     */
-    Viewer.bearingchanged = "bearingchanged";
-    /**
-     * Fired when a pointing device (usually a mouse) is pressed and released at
-     * the same point in the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.click = "click";
-    /**
-     * Fired when the right button of the mouse is clicked within the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.contextmenu = "contextmenu";
-    /**
-     * Fired when a pointing device (usually a mouse) is clicked twice at
-     * the same point in the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.dblclick = "dblclick";
-    /**
-     * Fired when the viewer is loading more data.
-     * @event
-     * @type {boolean} loading - Boolean indicating whether the viewer is loading.
-     */
-    Viewer.loadingchanged = "loadingchanged";
-    /**
-     * Fired when a pointing device (usually a mouse) is pressed within the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mousedown = "mousedown";
-    /**
-     * Fired when a pointing device (usually a mouse) is moved within the viewer.
-     * @description Will not fire when the mouse is actively used, e.g. for drag pan.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mousemove = "mousemove";
-    /**
-     * Fired when a pointing device (usually a mouse) leaves the viewer's canvas.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mouseout = "mouseout";
-    /**
-     * Fired when a pointing device (usually a mouse) is moved onto the viewer's canvas.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mouseover = "mouseover";
-    /**
-     * Fired when a pointing device (usually a mouse) is released within the viewer.
-     * @event
-     * @type  {@link IViewerMouseEvent} event - Viewer mouse event data.
-     */
-    Viewer.mouseup = "mouseup";
-    /**
-     * Fired when the viewer motion stops and it is in a fixed
-     * position with a fixed point of view.
-     * @event
-     */
-    Viewer.moveend = "moveend";
-    /**
-     * Fired when the motion from one view to another start,
-     * either by changing the position (e.g. when changing node) or
-     * when changing point of view (e.g. by interaction such as pan and zoom).
-     * @event
-     */
-    Viewer.movestart = "movestart";
-    /**
-     * Fired when the navigable state of the viewer changes.
-     *
-     * @description The navigable state indicates if the viewer supports
-     * moving, i.e. calling the `moveToKey`, `moveDir` and `moveCloseTo`
-     * methods. The viewer will not be in a navigable state if the cover
-     * is activated and the viewer has been supplied a key. When the cover
-     * is deactivated or activated without being supplied a key it will
-     * be navigable.
-     *
-     * @event
-     * @type {boolean} navigable - Boolean indicating whether the viewer is navigable.
-     */
-    Viewer.navigablechanged = "navigablechanged";
-    /**
-     * Fired every time the viewer navigates to a new node.
-     * @event
-     * @type  {@link Node} node - Current node.
-     */
-    Viewer.nodechanged = "nodechanged";
-    /**
-     * Fired every time the sequence edges of the current node changes.
-     * @event
-     * @type  {@link IEdgeStatus} status - The edge status object.
-     */
-    Viewer.sequenceedgeschanged = "sequenceedgeschanged";
-    /**
-     * Fired every time the spatial edges of the current node changes.
-     * @event
-     * @type  {@link IEdgeStatus} status - The edge status object.
-     */
-    Viewer.spatialedgeschanged = "spatialedgeschanged";
-    return Viewer;
-}(Utils_1.EventEmitter));
-exports.Viewer = Viewer;
-
-},{"../Utils":285,"../Viewer":286,"rxjs":27,"rxjs/operators":225,"when":272}]},{},[280])(280)
-});
+!function(t,i){e&&e.exports?e.exports=i():(t.dcodeIO=t.dcodeIO||{}).Long=i()}(hd,(function(){function e(e,t,i){this.low=0|e,this.high=0|t,this.unsigned=!!i}function t(e){return!0===(e&&e.__isLong__)}e.prototype.__isLong__,Object.defineProperty(e.prototype,"__isLong__",{value:!0,enumerable:!1,configurable:!1}),e.isLong=t;var i={},n={};function r(e,t){var r,s,o;return t?(o=0<=(e>>>=0)&&e<256)&&(s=n[e])?s:(r=a(e,(0|e)<0?-1:0,!0),o&&(n[e]=r),r):(o=-128<=(e|=0)&&e<128)&&(s=i[e])?s:(r=a(e,e<0?-1:0,!1),o&&(i[e]=r),r)}function s(e,t){if(isNaN(e)||!isFinite(e))return t?f:m;if(t){if(e<0)return f;if(e>=u)return b}else{if(e<=-d)return x;if(e+1>=d)return y}return e<0?s(-e,t).neg():a(e%l|0,e/l|0,t)}function a(t,i,n){return new e(t,i,n)}e.fromInt=r,e.fromNumber=s,e.fromBits=a;var o=Math.pow;function h(e,t,i){if(0===e.length)throw Error("empty string");if("NaN"===e||"Infinity"===e||"+Infinity"===e||"-Infinity"===e)return m;if("number"==typeof t?(i=t,t=!1):t=!!t,(i=i||10)<2||36<i)throw RangeError("radix");var n;if((n=e.indexOf("-"))>0)throw Error("interior hyphen");if(0===n)return h(e.substring(1),t,i).neg();for(var r=s(o(i,8)),a=m,c=0;c<e.length;c+=8){var l=Math.min(8,e.length-c),u=parseInt(e.substring(c,c+l),i);if(l<8){var d=s(o(i,l));a=a.mul(d).add(s(u))}else a=(a=a.mul(r)).add(s(u))}return a.unsigned=t,a}function c(t){return t instanceof e?t:"number"==typeof t?s(t):"string"==typeof t?h(t):a(t.low,t.high,t.unsigned)}e.fromString=h,e.fromValue=c;var l=4294967296,u=l*l,d=u/2,p=r(1<<24),m=r(0);e.ZERO=m;var f=r(0,!0);e.UZERO=f;var g=r(1);e.ONE=g;var _=r(1,!0);e.UONE=_;var v=r(-1);e.NEG_ONE=v;var y=a(-1,2147483647,!1);e.MAX_VALUE=y;var b=a(-1,-1,!0);e.MAX_UNSIGNED_VALUE=b;var x=a(0,-2147483648,!1);e.MIN_VALUE=x;var w=e.prototype;return w.toInt=function(){return this.unsigned?this.low>>>0:this.low},w.toNumber=function(){return this.unsigned?(this.high>>>0)*l+(this.low>>>0):this.high*l+(this.low>>>0)},w.toString=function(e){if((e=e||10)<2||36<e)throw RangeError("radix");if(this.isZero())return"0";if(this.isNegative()){if(this.eq(x)){var t=s(e),i=this.div(t),n=i.mul(t).sub(this);return i.toString(e)+n.toInt().toString(e)}return"-"+this.neg().toString(e)}for(var r=s(o(e,6),this.unsigned),a=this,h="";;){var c=a.div(r),l=(a.sub(c.mul(r)).toInt()>>>0).toString(e);if((a=c).isZero())return l+h;for(;l.length<6;)l="0"+l;h=""+l+h}},w.getHighBits=function(){return this.high},w.getHighBitsUnsigned=function(){return this.high>>>0},w.getLowBits=function(){return this.low},w.getLowBitsUnsigned=function(){return this.low>>>0},w.getNumBitsAbs=function(){if(this.isNegative())return this.eq(x)?64:this.neg().getNumBitsAbs();for(var e=0!=this.high?this.high:this.low,t=31;t>0&&0==(e&1<<t);t--);return 0!=this.high?t+33:t+1},w.isZero=function(){return 0===this.high&&0===this.low},w.isNegative=function(){return!this.unsigned&&this.high<0},w.isPositive=function(){return this.unsigned||this.high>=0},w.isOdd=function(){return 1==(1&this.low)},w.isEven=function(){return 0==(1&this.low)},w.equals=function(e){return t(e)||(e=c(e)),(this.unsigned===e.unsigned||this.high>>>31!=1||e.high>>>31!=1)&&(this.high===e.high&&this.low===e.low)},w.eq=w.equals,w.notEquals=function(e){return!this.eq(e)},w.neq=w.notEquals,w.lessThan=function(e){return this.comp(e)<0},w.lt=w.lessThan,w.lessThanOrEqual=function(e){return this.comp(e)<=0},w.lte=w.lessThanOrEqual,w.greaterThan=function(e){return this.comp(e)>0},w.gt=w.greaterThan,w.greaterThanOrEqual=function(e){return this.comp(e)>=0},w.gte=w.greaterThanOrEqual,w.compare=function(e){if(t(e)||(e=c(e)),this.eq(e))return 0;var i=this.isNegative(),n=e.isNegative();return i&&!n?-1:!i&&n?1:this.unsigned?e.high>>>0>this.high>>>0||e.high===this.high&&e.low>>>0>this.low>>>0?-1:1:this.sub(e).isNegative()?-1:1},w.comp=w.compare,w.negate=function(){return!this.unsigned&&this.eq(x)?x:this.not().add(g)},w.neg=w.negate,w.add=function(e){t(e)||(e=c(e));var i=this.high>>>16,n=65535&this.high,r=this.low>>>16,s=65535&this.low,o=e.high>>>16,h=65535&e.high,l=e.low>>>16,u=0,d=0,p=0,m=0;return p+=(m+=s+(65535&e.low))>>>16,d+=(p+=r+l)>>>16,u+=(d+=n+h)>>>16,u+=i+o,a((p&=65535)<<16|(m&=65535),(u&=65535)<<16|(d&=65535),this.unsigned)},w.subtract=function(e){return t(e)||(e=c(e)),this.add(e.neg())},w.sub=w.subtract,w.multiply=function(e){if(this.isZero())return m;if(t(e)||(e=c(e)),e.isZero())return m;if(this.eq(x))return e.isOdd()?x:m;if(e.eq(x))return this.isOdd()?x:m;if(this.isNegative())return e.isNegative()?this.neg().mul(e.neg()):this.neg().mul(e).neg();if(e.isNegative())return this.mul(e.neg()).neg();if(this.lt(p)&&e.lt(p))return s(this.toNumber()*e.toNumber(),this.unsigned);var i=this.high>>>16,n=65535&this.high,r=this.low>>>16,o=65535&this.low,h=e.high>>>16,l=65535&e.high,u=e.low>>>16,d=65535&e.low,f=0,g=0,_=0,v=0;return _+=(v+=o*d)>>>16,g+=(_+=r*d)>>>16,_&=65535,g+=(_+=o*u)>>>16,f+=(g+=n*d)>>>16,g&=65535,f+=(g+=r*u)>>>16,g&=65535,f+=(g+=o*l)>>>16,f+=i*d+n*u+r*l+o*h,a((_&=65535)<<16|(v&=65535),(f&=65535)<<16|(g&=65535),this.unsigned)},w.mul=w.multiply,w.divide=function(e){if(t(e)||(e=c(e)),e.isZero())throw Error("division by zero");if(this.isZero())return this.unsigned?f:m;var i,n,r;if(this.unsigned){if(e.unsigned||(e=e.toUnsigned()),e.gt(this))return f;if(e.gt(this.shru(1)))return _;r=f}else{if(this.eq(x))return e.eq(g)||e.eq(v)?x:e.eq(x)?g:(i=this.shr(1).div(e).shl(1)).eq(m)?e.isNegative()?g:v:(n=this.sub(e.mul(i)),r=i.add(n.div(e)));if(e.eq(x))return this.unsigned?f:m;if(this.isNegative())return e.isNegative()?this.neg().div(e.neg()):this.neg().div(e).neg();if(e.isNegative())return this.div(e.neg()).neg();r=m}for(n=this;n.gte(e);){i=Math.max(1,Math.floor(n.toNumber()/e.toNumber()));for(var a=Math.ceil(Math.log(i)/Math.LN2),h=a<=48?1:o(2,a-48),l=s(i),u=l.mul(e);u.isNegative()||u.gt(n);)u=(l=s(i-=h,this.unsigned)).mul(e);l.isZero()&&(l=g),r=r.add(l),n=n.sub(u)}return r},w.div=w.divide,w.modulo=function(e){return t(e)||(e=c(e)),this.sub(this.div(e).mul(e))},w.mod=w.modulo,w.not=function(){return a(~this.low,~this.high,this.unsigned)},w.and=function(e){return t(e)||(e=c(e)),a(this.low&e.low,this.high&e.high,this.unsigned)},w.or=function(e){return t(e)||(e=c(e)),a(this.low|e.low,this.high|e.high,this.unsigned)},w.xor=function(e){return t(e)||(e=c(e)),a(this.low^e.low,this.high^e.high,this.unsigned)},w.shiftLeft=function(e){return t(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?a(this.low<<e,this.high<<e|this.low>>>32-e,this.unsigned):a(0,this.low<<e-32,this.unsigned)},w.shl=w.shiftLeft,w.shiftRight=function(e){return t(e)&&(e=e.toInt()),0==(e&=63)?this:e<32?a(this.low>>>e|this.high<<32-e,this.high>>e,this.unsigned):a(this.high>>e-32,this.high>=0?0:-1,this.unsigned)},w.shr=w.shiftRight,w.shiftRightUnsigned=function(e){if(t(e)&&(e=e.toInt()),0===(e&=63))return this;var i=this.high;return e<32?a(this.low>>>e|i<<32-e,i>>>e,this.unsigned):a(32===e?i:i>>>e-32,0,this.unsigned)},w.shru=w.shiftRightUnsigned,w.toSigned=function(){return this.unsigned?a(this.low,this.high,!1):this},w.toUnsigned=function(){return this.unsigned?this:a(this.low,this.high,!0)},w.toBytes=function(e){return e?this.toBytesLE():this.toBytesBE()},w.toBytesLE=function(){var e=this.high,t=this.low;return[255&t,t>>>8&255,t>>>16&255,t>>>24&255,255&e,e>>>8&255,e>>>16&255,e>>>24&255]},w.toBytesBE=function(){var e=this.high,t=this.low;return[e>>>24&255,e>>>16&255,e>>>8&255,255&e,t>>>24&255,t>>>16&255,t>>>8&255,255&t]},e}))}(yw),function(e){!function(e){var t=e.S2={L:{}};t.L.LatLng=function(e,t,i){var n=parseFloat(e,10),r=parseFloat(t,10);if(isNaN(n)||isNaN(r))throw new Error("Invalid LatLng object: ("+e+", "+t+")");return!0!==i&&(n=Math.max(Math.min(n,90),-90),r=(r+180)%360+(r<-180||180===r?180:-180)),{lat:n,lng:r}},t.L.LatLng.DEG_TO_RAD=Math.PI/180,t.L.LatLng.RAD_TO_DEG=180/Math.PI,t.LatLngToXYZ=function(e){var i=t.L.LatLng.DEG_TO_RAD,n=e.lat*i,r=e.lng*i,s=Math.cos(n);return[Math.cos(r)*s,Math.sin(r)*s,Math.sin(n)]},t.XYZToLatLng=function(e){var i=t.L.LatLng.RAD_TO_DEG,n=Math.atan2(e[2],Math.sqrt(e[0]*e[0]+e[1]*e[1])),r=Math.atan2(e[1],e[0]);return t.L.LatLng(n*i,r*i)};t.XYZToFaceUV=function(e){var t=function(e){var t=[Math.abs(e[0]),Math.abs(e[1]),Math.abs(e[2])];return t[0]>t[1]?t[0]>t[2]?0:2:t[1]>t[2]?1:2}(e);return e[t]<0&&(t+=3),[t,function(e,t){var i,n;switch(e){case 0:i=t[1]/t[0],n=t[2]/t[0];break;case 1:i=-t[0]/t[1],n=t[2]/t[1];break;case 2:i=-t[0]/t[2],n=-t[1]/t[2];break;case 3:i=t[2]/t[0],n=t[1]/t[0];break;case 4:i=t[2]/t[1],n=-t[0]/t[1];break;case 5:i=-t[1]/t[2],n=-t[0]/t[2];break;default:throw{error:"Invalid face"}}return[i,n]}(t,e)]},t.FaceUVToXYZ=function(e,t){var i=t[0],n=t[1];switch(e){case 0:return[1,i,n];case 1:return[-i,1,n];case 2:return[-i,-n,1];case 3:return[-1,-n,-i];case 4:return[n,-1,-i];case 5:return[n,i,-1];default:throw{error:"Invalid face"}}};var i=function(e){return e>=.5?1/3*(4*e*e-1):1/3*(1-4*(1-e)*(1-e))};t.STToUV=function(e){return[i(e[0]),i(e[1])]};var n=function(e){return e>=0?.5*Math.sqrt(1+3*e):1-.5*Math.sqrt(1-3*e)};t.UVToST=function(e){return[n(e[0]),n(e[1])]},t.STToIJ=function(e,t){var i=1<<t,n=function(e){var t=Math.floor(e*i);return Math.max(0,Math.min(i-1,t))};return[n(e[0]),n(e[1])]},t.IJToST=function(e,t,i){var n=1<<t;return[(e[0]+i[0])/n,(e[1]+i[1])/n]};var r=function(e,t,i,n){if(0==n){1==i&&(t.x=e-1-t.x,t.y=e-1-t.y);var r=t.x;t.x=t.y,t.y=r}},s=function(e,t,i,n){var r={a:[[0,"d"],[1,"a"],[3,"b"],[2,"a"]],b:[[2,"b"],[1,"b"],[3,"a"],[0,"c"]],c:[[2,"c"],[3,"d"],[1,"c"],[0,"b"]],d:[[0,"a"],[3,"c"],[1,"d"],[2,"d"]]};"number"!=typeof n&&console.warn(new Error("called pointToHilbertQuadList without face value, defaulting to '0'").stack);for(var s=n%2?"d":"a",a=[],o=i-1;o>=0;o--){var h=1<<o,c=r[s][2*(e&h?1:0)+(t&h?1:0)];a.push(c[0]),s=c[1]}return a};t.S2Cell=function(){},t.S2Cell.FromHilbertQuadKey=function(e){var i,n,s,a,o,h,c=e.split("/"),l=parseInt(c[0]),u=c[1],d=u.length,p={x:0,y:0};for(i=d-1;i>=0;i--)n=d-i,a=0,o=0,"1"===(s=u[i])?o=1:"2"===s?(a=1,o=1):"3"===s&&(a=1),h=Math.pow(2,n-1),r(h,p,a,o),p.x+=h*a,p.y+=h*o;if(l%2==1){var m=p.x;p.x=p.y,p.y=m}return t.S2Cell.FromFaceIJ(parseInt(l),[p.x,p.y],n)},t.S2Cell.FromLatLng=function(e,i){if(!e.lat&&0!==e.lat||!e.lng&&0!==e.lng)throw new Error("Pass { lat: lat, lng: lng } to S2.S2Cell.FromLatLng");var n=t.LatLngToXYZ(e),r=t.XYZToFaceUV(n),s=t.UVToST(r[1]),a=t.STToIJ(s,i);return t.S2Cell.FromFaceIJ(r[0],a,i)},t.S2Cell.FromFaceIJ=function(e,i,n){var r=new t.S2Cell;return r.face=e,r.ij=i,r.level=n,r},t.S2Cell.prototype.toString=function(){return"F"+this.face+"ij["+this.ij[0]+","+this.ij[1]+"]@"+this.level},t.S2Cell.prototype.getLatLng=function(){var e=t.IJToST(this.ij,this.level,[.5,.5]),i=t.STToUV(e),n=t.FaceUVToXYZ(this.face,i);return t.XYZToLatLng(n)},t.S2Cell.prototype.getCornerLatLngs=function(){for(var e=[],i=[[0,0],[0,1],[1,1],[1,0]],n=0;n<4;n++){var r=t.IJToST(this.ij,this.level,i[n]),s=t.STToUV(r),a=t.FaceUVToXYZ(this.face,s);e.push(t.XYZToLatLng(a))}return e},t.S2Cell.prototype.getFaceAndQuads=function(){var e=s(this.ij[0],this.ij[1],this.level,this.face);return[this.face,e]},t.S2Cell.prototype.toHilbertQuadkey=function(){var e=s(this.ij[0],this.ij[1],this.level,this.face);return this.face.toString(10)+"/"+e.join("")},t.latLngToNeighborKeys=t.S2Cell.latLngToNeighborKeys=function(e,i,n){return t.S2Cell.FromLatLng({lat:e,lng:i},n).getNeighbors().map((function(e){return e.toHilbertQuadkey()}))},t.S2Cell.prototype.getNeighbors=function(){var e=function(e,i,n){var r=1<<n;if(i[0]>=0&&i[1]>=0&&i[0]<r&&i[1]<r)return t.S2Cell.FromFaceIJ(e,i,n);var s=t.IJToST(i,n,[.5,.5]),a=t.STToUV(s),o=t.FaceUVToXYZ(e,a),h=t.XYZToFaceUV(o);return e=h[0],a=h[1],s=t.UVToST(a),i=t.STToIJ(s,n),t.S2Cell.FromFaceIJ(e,i,n)},i=this.face,n=this.ij[0],r=this.ij[1],s=this.level;return[e(i,[n-1,r],s),e(i,[n,r-1],s),e(i,[n+1,r],s),e(i,[n,r+1],s)]},t.FACE_BITS=3,t.MAX_LEVEL=30,t.POS_BITS=2*t.MAX_LEVEL+1,t.facePosLevelToId=t.S2Cell.facePosLevelToId=t.fromFacePosLevel=function(i,n,r){var s,a,o,h=e.dcodeIO&&e.dcodeIO.Long||yw.exports;for(r||(r=n.length),n.length>r&&(n=n.substr(0,r)),s=h.fromString(i.toString(10),!0,10).toString(2);s.length<t.FACE_BITS;)s="0"+s;for(a=h.fromString(n,!0,4).toString(2);a.length<2*r;)a="0"+a;for(o=s+a,o+="1";o.length<t.FACE_BITS+t.POS_BITS;)o+="0";return h.fromString(o,!0,2).toString(10)},t.keyToId=t.S2Cell.keyToId=t.toId=t.toCellId=t.fromKey=function(e){var i=e.split("/");return t.fromFacePosLevel(i[0],i[1],i[1].length)},t.idToKey=t.S2Cell.idToKey=t.S2Cell.toKey=t.toKey=t.fromId=t.fromCellId=t.S2Cell.toHilbertQuadkey=t.toHilbertQuadkey=function(i){for(var n=e.dcodeIO&&e.dcodeIO.Long||yw.exports,r=n.fromString(i,!0,10).toString(2);r.length<t.FACE_BITS+t.POS_BITS;)r="0"+r;for(var s=r.lastIndexOf("1"),a=r.substring(0,3),o=r.substring(3,s),h=o.length/2,c=n.fromString(a,!0,2).toString(10),l=n.fromString(o,!0,2).toString(4);l.length<h;)l="0"+l;return c+"/"+l},t.keyToLatLng=t.S2Cell.keyToLatLng=function(e){return t.S2Cell.FromHilbertQuadKey(e).getLatLng()},t.idToLatLng=t.S2Cell.idToLatLng=function(e){var i=t.idToKey(e);return t.keyToLatLng(i)},t.S2Cell.latLngToKey=t.latLngToKey=t.latLngToQuadkey=function(e,i,n){if(isNaN(n)||n<1||n>30)throw new Error("'level' is not a number between 1 and 30 (but it should be)");return t.S2Cell.FromLatLng({lat:e,lng:i},n).toHilbertQuadkey()},t.stepKey=function(t,i){var n,r=e.dcodeIO&&e.dcodeIO.Long||yw.exports,s=t.split("/"),a=s[0],o=s[1],h=s[1].length,c=r.fromString(o,!0,4);i>0?n=c.add(Math.abs(i)):i<0&&(n=c.subtract(Math.abs(i)));var l=n.toString(4);for("0"===l&&console.warning(new Error("face/position wrapping is not yet supported"));l.length<h;)l="0"+l;return a+"/"+l},t.S2Cell.prevKey=t.prevKey=function(e){return t.stepKey(e,-1)},t.S2Cell.nextKey=t.nextKey=function(e){return t.stepKey(e,1)}}(e.exports)}(vw);class bw extends _w{constructor(e=17){super(),this._level=e}bboxToCellIds(e,t){return this._approxBboxToCellIds(e,t)}getAdjacent(e){const t=vw.exports.S2.idToKey(e),i=t.split("/")[1].length,[n,r,s,a]=this._getNeighbors(t,i),o=[t,n,r,s,a],h=Array.from(new Set([...this._getNeighbors(n,i),...this._getNeighbors(r,i),...this._getNeighbors(s,i),...this._getNeighbors(a,i)].filter((e=>!o.includes(e))))),c=[n,r,s,a];for(const e of h){let t=0;for(const n of this._getNeighbors(e,i))o.includes(n)&&t++;2===t&&c.push(e)}return c.map((e=>vw.exports.S2.keyToId(e)))}getVertices(e){const t=vw.exports.S2.idToKey(e);return vw.exports.S2.S2Cell.FromHilbertQuadKey(t).getCornerLatLngs().map((e=>({lat:e.lat,lng:e.lng})))}lngLatToCellId(e){return this._lngLatToId(e,this._level)}_getNeighbors(e,t){const i=vw.exports.S2.keyToLatLng(e);return vw.exports.S2.latLngToNeighborKeys(i.lat,i.lng,t)}_lngLatToId(e,t){const i=vw.exports.S2.latLngToKey(e.lat,e.lng,t);return vw.exports.S2.keyToId(i)}}class xw{clusterReconstruction(e){const t=e.points,i=1/255;for(const e in t){if(!t.hasOwnProperty(e))continue;const n=t[e].color;n[0]*=i,n[1]*=i,n[2]*=i}const n=e.reference_lla;return{id:null,points:t,reference:{alt:n.altitude,lat:n.latitude,lng:n.longitude}}}coreImage(e){const t=this._geometry(e.geometry),i=this._geometry(e.computed_geometry),n={id:e.sequence};return{computed_geometry:i,geometry:t,id:e.id,sequence:n}}spatialImage(e){var t,i,n,r,s;e.camera_type=function(e){switch(e){case"equirectangular":case"spherical":return"spherical";case"fisheye":return"fisheye";default:return"perspective"}}(e.camera_type),e.merge_id=e.merge_cc?e.merge_cc.toString():null,e.private=null;const a="spherical"===e.camera_type?e.thumb_2048_url:e.thumb_1024_url;return e.thumb=null!==(t=e.thumb)&&void 0!==t?t:{id:null,url:a},e.cluster=null!==(i=e.sfm_cluster)&&void 0!==i?i:{id:null,url:null},e.creator=null!==(n=e.creator)&&void 0!==n?n:{id:null,username:null},e.owner=null!==(r=e.organization)&&void 0!==r?r:{id:null},e.mesh=null!==(s=e.mesh)&&void 0!==s?s:{id:null,url:null},e}_geometry(e){const t=null==e?void 0:e.coordinates;return t?{lat:t[1],lng:t[0]}:null}}class ww{constructor(){this.imagesPath="images",this.sequencePath="image_ids",this._imageTilesPath="tiles",this.coreFields=["computed_geometry","geometry","sequence"],this.idFields=["id"],this.spatialFields=["altitude","atomic_scale","camera_parameters","camera_type","captured_at","compass_angle","computed_altitude","computed_compass_angle","computed_rotation","creator","exif_orientation","height","merge_cc","mesh","organization","quality_score","sfm_cluster","thumb_1024_url","thumb_2048_url","width"],this.imageTileFields=["url","z","x","y"]}images(e,t){return`image_ids=${e.join(",")}&fields=${t.join(",")}`}imagesS2(e,t){return`s2=${e}&fields=${t.join(",")}`}imageTiles(e,t){return`z=${e}&fields=${t.join(",")}`}imageTilesPath(e){return`${e}/${this._imageTilesPath}`}sequence(e){return`sequence_id=${e}`}}class Mw extends gw{constructor(e,t,i,n){var r;super(null!=t?t:new bw),this._convert=null!=i?i:new xw,this._query=null!=n?n:new ww,this._method="GET";const s=null!=e?e:{};this._endpoint=null!==(r=s.endpoint)&&void 0!==r?r:"https://graph.mapillary.com",this._accessToken=s.accessToken}getCluster(e,t){return dw(e,t).then((e=>{const t=uw(e);if(t.length<1)throw new Error("Cluster reconstruction empty");return this._convert.clusterReconstruction(t[0])}))}getCoreImages(e){const t=[...this._query.idFields,...this._query.coreFields],i=this._query.imagesS2(e,t),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((t=>{const i={cell_id:e,images:[]},n=t.data;for(const e of n){const t=this._convert.coreImage(e);i.images.push(t)}return i}))}getImageBuffer(e,t){return dw(e,t)}getImages(e){const t=[...this._query.idFields,...this._query.coreFields,...this._query.spatialFields],i=this._query.images(e,t),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((e=>{const t=[],i=e.data;for(const e of i){const i=this._convert.coreImage(e),n=this._convert.spatialImage(e),r={node:Object.assign({},n,i),node_id:e.id};t.push(r)}return t}))}getImageTiles(e){const t=[...this._query.imageTileFields],i=this._query.imageTiles(e.z,t),n=new URL(this._query.imageTilesPath(e.imageId),this._endpoint).href;return this._fetchGraphContract(i,n).then((t=>({node:t.data,node_id:e.imageId})))}getMesh(e,t){return dw(e,t).then((e=>mw(e)))}getSequence(e){const t=this._query.sequence(e),i=new URL(this._query.sequencePath,this._endpoint).href;return this._fetchGraphContract(t,i).then((t=>({id:e,image_ids:t.data.map((e=>e.id))})))}getSpatialImages(e){const t=[...this._query.idFields,...this._query.coreFields,...this._query.spatialFields],i=this._query.images(e,t),n=new URL(this._query.imagesPath,this._endpoint).href;return this._fetchGraphContract(i,n).then((e=>{const t=[],i=e.data;for(const e of i){const i={node:this._convert.spatialImage(e),node_id:e.id};t.push(i)}return t}))}setAccessToken(e){this._accessToken=e}_createHeaders(){const e=[{name:"Accept",value:"application/json"},{name:"Content-Type",value:"application/x-www-form-urlencoded"}];return this._accessToken&&e.push({name:"Authorization",value:`OAuth ${this._accessToken}`}),e}_fetchGraphContract(e,t){return pw(`${t}?${e}`,this._method,"json",this._createHeaders(),null,null).catch((e=>{const t=this._makeErrorMessage(e);throw new Pu(t)}))}_makeErrorMessage(e){const t=e.error;return t?`${t.code} (${t.type}, ${t.fbtrace_id}): ${t.message}`:"Failed to fetch data"}}class Sw{constructor(e,t){this._id=e,this._lngLat=t}get id(){return this._id}get geometry(){return this._geometry}get lngLat(){return this._lngLat}createGeometry(e){this._geometry||(this._createGeometry(e),this._geometry.updateMatrixWorld(!0))}disposeGeometry(){this._geometry&&(this._disposeGeometry(),this._geometry=void 0)}getInteractiveObjects(){return this._geometry?this._getInteractiveObjects():[]}lerpAltitude(e,t){this._geometry&&(this._geometry.position.z=(1-t)*this._geometry.position.z+t*e)}updatePosition(e,t){t&&(this._lngLat.lat=t.lat,this._lngLat.lng=t.lng),this._geometry&&(this._geometry.position.fromArray(e),this._geometry.updateMatrixWorld(!0))}}let Tw;function Cw(){return void 0===Tw&&(Tw=function(){const e={alpha:!1,antialias:!1,depth:!0,failIfMajorPerformanceCaveat:!1,premultipliedAlpha:!0,preserveDrawingBuffer:!1,stencil:!0},t=document.createElement("canvas");if(t.getContext("webgl2",e))return!0;const i=t.getContext("webgl",e)||t.getContext("experimental-webgl",e);if(!i)return!1;const n=["OES_standard_derivatives"],r=i.getSupportedExtensions();for(const e of n)if(-1===r.indexOf(e))return!1;return!0}()),Tw}function Ew(){return"undefined"!=typeof window&&"undefined"!=typeof document&&!!(Array.prototype&&Array.prototype.concat&&Array.prototype.filter&&Array.prototype.includes&&Array.prototype.indexOf&&Array.prototype.join&&Array.prototype.map&&Array.prototype.push&&Array.prototype.pop&&Array.prototype.reverse&&Array.prototype.shift&&Array.prototype.slice&&Array.prototype.splice&&Array.prototype.sort&&Array.prototype.unshift)&&"Blob"in window&&"URL"in window&&!!(Function.prototype&&Function.prototype.apply&&Function.prototype.bind)&&"JSON"in window&&"parse"in JSON&&"stringify"in JSON&&"Map"in window&&!!(Object.assign&&Object.keys&&Object.values)&&!!("Promise"in window&&Promise.resolve&&Promise.reject&&Promise.prototype&&Promise.prototype.catch&&Promise.prototype.then)&&"Set"in window}var Aw,Iw,Rw;e.CameraControls=void 0,(Aw=e.CameraControls||(e.CameraControls={}))[Aw.Custom=0]="Custom",Aw[Aw.Earth=1]="Earth",Aw[Aw.Street=2]="Street",e.RenderMode=void 0,(Iw=e.RenderMode||(e.RenderMode={}))[Iw.Letterbox=0]="Letterbox",Iw[Iw.Fill=1]="Fill",e.RenderPass=void 0,function(e){e[e.Opaque=0]="Opaque"}(e.RenderPass||(e.RenderPass={})),e.TransitionMode=void 0,(Rw=e.TransitionMode||(e.TransitionMode={}))[Rw.Default=0]="Default",Rw[Rw.Instantaneous=1]="Instantaneous";class Pw{constructor(e,t,i,n,r,s){this._container=e,this._observer=i,this._navigator=t,this._options=null!=r?r:{},this._key=n,this._navigable=null==n,this._componentService=s||new od(this._container,this._navigator),this._coverComponent=this._componentService.getCover(),this._initializeComponents(),n?(this._initilizeCoverComponent(),this._subscribeCoverComponent()):this._navigator.movedToId$.pipe(St((e=>null!=e))).subscribe((e=>{this._key=e,this._componentService.deactivateCover(),this._coverComponent.configure({id:this._key,state:Qm.Hidden}),this._subscribeCoverComponent(),this._navigator.stateService.start(),this._navigator.cacheService.start(),this._navigator.panService.start(),this._observer.startEmit()}))}get navigable(){return this._navigable}get(e){return this._componentService.get(e)}activate(e){this._componentService.activate(e)}activateCover(){this._coverComponent.configure({state:Qm.Visible})}deactivate(e){this._componentService.deactivate(e)}deactivateCover(){this._coverComponent.configure({state:Qm.Loading})}remove(){this._componentService.remove(),null!=this._configurationSubscription&&this._configurationSubscription.unsubscribe()}_initializeComponents(){var e,t;const i=this._options;this._uFalse(null===(e=i.fallback)||void 0===e?void 0:e.image,"imagefallback"),this._uFalse(null===(t=i.fallback)||void 0===t?void 0:t.navigation,"navigationfallback"),this._uFalse(i.marker,"marker"),this._uFalse(i.popup,"popup"),this._uFalse(i.slider,"slider"),this._uFalse(i.spatial,"spatial"),this._uFalse(i.tag,"tag"),this._uTrue(i.attribution,"attribution"),this._uTrue(i.bearing,"bearing"),this._uTrue(i.cache,"cache"),this._uTrue(i.direction,"direction"),this._uTrue(i.image,"image"),this._uTrue(i.keyboard,"keyboard"),this._uTrue(i.pointer,"pointer"),this._uTrue(i.sequence,"sequence"),this._uTrue(i.zoom,"zoom")}_initilizeCoverComponent(){let e=this._options;this._coverComponent.configure({id:this._key}),void 0===e.cover||e.cover?this.activateCover():this.deactivateCover()}_setNavigable(e){this._navigable!==e&&(this._navigable=e,this._observer.navigable$.next(e))}_subscribeCoverComponent(){this._configurationSubscription=this._coverComponent.configuration$.pipe(vt(void 0,(e=>e.state))).subscribe((e=>{e.state===Qm.Loading?this._navigator.stateService.currentId$.pipe(St(),zt((t=>{const i=null==t||t!==e.id;return i&&this._setNavigable(!1),i?this._navigator.moveTo$(e.id):this._navigator.stateService.currentImage$.pipe(St())}))).subscribe((()=>{this._navigator.stateService.start(),this._navigator.cacheService.start(),this._navigator.panService.start(),this._observer.startEmit(),this._coverComponent.configure({state:Qm.Hidden}),this._componentService.deactivateCover(),this._setNavigable(!0)}),(e=>{console.error("Failed to deactivate cover.",e),this._coverComponent.configure({state:Qm.Visible})})):e.state===Qm.Visible&&(this._observer.stopEmit(),this._navigator.stateService.stop(),this._navigator.cacheService.stop(),this._navigator.playService.stop(),this._navigator.panService.stop(),this._componentService.activateCover(),this._setNavigable(null==e.id))}))}_uFalse(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.deactivate(t)}_uTrue(e,t){void 0!==e?"boolean"!=typeof e?(this._componentService.configure(t,e),this._componentService.activate(t)):e?this._componentService.activate(t):this._componentService.deactivate(t):this._componentService.activate(t)}}class Lw{constructor(t,i,n){this._adaptiveOperation$=new j,this._render$=new j,this._renderAdaptive$=new j,this._subscriptions=new rf,this._renderService=i,this._currentFrame$=n;const r=this._subscriptions,s=tf.create(tf.h("div.mapillary-dom-renderer",[]));t.appendChild(s),this._offset$=this._adaptiveOperation$.pipe(Lt(((e,t)=>t(e)),{elementHeight:t.offsetHeight,elementWidth:t.offsetWidth,imageAspect:0,renderMode:e.RenderMode.Fill}),st((e=>e.imageAspect>0&&e.elementWidth>0&&e.elementHeight>0)),De((t=>{const i=t.elementWidth/t.elementHeight,n=t.imageAspect/i;let r=0,s=0;return t.renderMode===e.RenderMode.Letterbox?t.imageAspect>i?r=t.elementHeight*(1-1/n)/2:s=t.elementWidth*(1-n)/2:t.imageAspect>i?s=-t.elementWidth*(n-1)/2:r=-t.elementHeight*(1/n-1)/2,{bottom:r,left:s,right:s,top:r}})));const a=this._currentFrame$.pipe(st((e=>null!=e.state.currentImage)),vt(((e,t)=>e===t),(e=>e.state.currentImage.id)),De((e=>e.state.currentTransform.basicAspect)),De((e=>t=>(t.imageAspect=e,t)))).subscribe(this._adaptiveOperation$),o=Ve(this._renderAdaptive$.pipe(Lt(((e,t)=>(null==t.vNode?delete e[t.name]:e[t.name]=t.vNode,e)),{})),this._offset$).pipe(De((e=>{const t=[],i=e[0];for(const e in i)i.hasOwnProperty(e)&&t.push(i[e]);const n=e[1],r={style:{bottom:n.bottom+"px",left:n.left+"px","pointer-events":"none",position:"absolute",right:n.right+"px",top:n.top+"px"}};return{name:"mapillary-dom-adaptive-renderer",vNode:tf.h("div.mapillary-dom-adaptive-renderer",r,t)}}))).subscribe(this._render$);this._vNode$=this._render$.pipe(Lt(((e,t)=>(null==t.vNode?delete e[t.name]:e[t.name]=t.vNode,e)),{}),De((e=>{const t=[];for(const i in e)e.hasOwnProperty(i)&&t.push(e[i]);return tf.h("div.mapillary-dom-renderer",t)}))),this._vPatch$=this._vNode$.pipe(Lt(((e,t)=>(e.vpatch=tf.diff(e.vNode,t),e.vNode=t,e)),{vNode:tf.h("div.mapillary-dom-renderer",[]),vpatch:null}),function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var i=e.length;if(0===i)throw new Error("list of properties cannot be empty.");return De((function(t){for(var n=t,r=0;r<i;r++){var s=null==n?void 0:n[e[r]];if(void 0===s)return;n=s}return n}))}("vpatch")),this._element$=this._vPatch$.pipe(Lt(((e,t)=>tf.patch(e,t)),s),Rt(1),U()),r.push(a),r.push(o),r.push(this._element$.subscribe((()=>{}))),r.push(this._renderService.size$.pipe(De((e=>t=>(t.elementWidth=e.width,t.elementHeight=e.height,t)))).subscribe(this._adaptiveOperation$)),r.push(this._renderService.renderMode$.pipe(De((e=>t=>(t.renderMode=e,t)))).subscribe(this._adaptiveOperation$))}get element$(){return this._element$}get render$(){return this._render$}get renderAdaptive$(){return this._renderAdaptive$}clear(e){this._renderAdaptive$.next({name:e,vNode:null}),this._render$.next({name:e,vNode:null})}remove(){this._subscriptions.unsubscribe()}}class Dw{constructor(e,t,i){this._renderFrame$=new j,this._renderCameraOperation$=new j,this._render$=new j,this._clear$=new j,this._renderOperation$=new j,this._rendererOperation$=new j,this._eraserOperation$=new j,this._triggerOperation$=new j,this._subscriptions=new rf,this._opaqueRender$=new j,this._renderService=i;const n=this._subscriptions;this._renderer$=this._rendererOperation$.pipe(Lt(((e,t)=>t(e)),{needsRender:!1,renderer:null}),st((e=>!!e.renderer))),this._renderCollection$=this._renderOperation$.pipe(Lt(((e,t)=>t(e)),{}),Dt()),this._renderCamera$=this._renderCameraOperation$.pipe(Lt(((e,t)=>t(e)),{frameId:-1,needsRender:!1,perspective:null})),this._eraser$=this._eraserOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),{needsRender:!1}));const r=this._triggerOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),{needsRender:!1})),s=new xr(986895),a=Ve(this._renderer$,this._renderCollection$,this._renderCamera$,this._eraser$,r).pipe(De((([e,t,i,n,r])=>({camera:i,eraser:n,trigger:r,renderer:e,renders:Object.keys(t).map((e=>t[e]))}))),st((e=>{let t=e.renderer.needsRender||e.camera.needsRender||e.eraser.needsRender||e.trigger.needsRender;const i=e.camera.frameId;for(const n of e.renders){if(n.frameId!==i)return!1;t=t||n.needsRender}return t})),vt(((e,t)=>e===t),(e=>e.eraser.needsRender||e.trigger.needsRender?-e.camera.frameId:e.camera.frameId))).subscribe((e=>{e.renderer.needsRender=!1,e.camera.needsRender=!1,e.eraser.needsRender=!1,e.trigger.needsRender=!1;const t=e.camera.perspective,i=[],n=[];for(const t of e.renders)t.pass===yf.Background?i.push(t.render):t.pass===yf.Opaque&&n.push(t.render);const r=e.renderer.renderer;r.resetState(),r.setClearColor(s,1),r.clear();for(const e of i)e(t,r);r.clearDepth();for(const e of n)e(t,r);r.resetState(),this._opaqueRender$.next()}));n.push(a),n.push(this._renderFrame$.pipe(De((e=>t=>(t.frameId=e.frameId,t.perspective=e.perspective,!0===e.changed&&(t.needsRender=!0),t)))).subscribe(this._renderCameraOperation$)),this._renderFrameSubscribe();const o=this._render$.pipe(De((e=>t=>(t[e.name]=e.renderer,t)))),h=this._clear$.pipe(De((e=>t=>(delete t[e],t))));n.push(it(o,h).subscribe(this._renderOperation$)),this._webGLRenderer$=this._render$.pipe(St(),De((()=>{t.appendChild(e);const n=i.element,r=new hh({canvas:e});return r.setPixelRatio(window.devicePixelRatio),r.setSize(n.offsetWidth,n.offsetHeight),r.autoClear=!1,r})),Rt(1),U()),n.push(this._webGLRenderer$.subscribe((()=>{})));const c=this._webGLRenderer$.pipe(St(),De((e=>t=>(t.needsRender=!0,t.renderer=e,t)))),l=this._renderService.size$.pipe(De((e=>t=>(null==t.renderer||(t.renderer.setSize(e.width,e.height),t.needsRender=!0),t)))),u=this._clear$.pipe(De((()=>e=>(null==e.renderer||(e.needsRender=!0),e))));n.push(it(c,l,u).subscribe(this._rendererOperation$));const d=this._renderCollection$.pipe(st((e=>0===Object.keys(e).length)),Dt());n.push(d.subscribe((()=>{null!=this._renderFrameSubscription&&(this._renderFrameSubscription.unsubscribe(),this._renderFrameSubscription=null,this._renderFrameSubscribe())}))),n.push(d.pipe(De((()=>e=>(e.needsRender=!0,e)))).subscribe(this._eraserOperation$))}get render$(){return this._render$}get opaqueRender$(){return this._opaqueRender$}get webGLRenderer$(){return this._webGLRenderer$}clear(e){this._clear$.next(e)}remove(){this._rendererOperation$.next((e=>{if(null!=e.renderer){const t=e.renderer.getContext().getExtension("WEBGL_lose_context");t&&t.loseContext(),e.renderer=null}return e})),null!=this._renderFrameSubscription&&this._renderFrameSubscription.unsubscribe(),this._subscriptions.unsubscribe()}triggerRerender(){this._renderService.renderCameraFrame$.pipe($t(1),St()).subscribe((()=>{this._triggerOperation$.next((e=>(e.needsRender=!0,e)))}))}_renderFrameSubscribe(){this._render$.pipe(St(),De((()=>e=>(e.needsRender=!0,e)))).subscribe((e=>{this._renderCameraOperation$.next(e)})),this._renderFrameSubscription=this._render$.pipe(St(),We((()=>this._renderService.renderCameraFrame$))).subscribe(this._renderFrame$)}}class Nw{constructor(e){null!=e?(this._position=(new Ki).fromArray(e.unprojectSfM([0,0],0)),this._lookat=(new Ki).fromArray(e.unprojectSfM([0,0],10)),this._up=e.upVector(),this._focal=this._getFocal(e)):(this._position=new Ki(0,0,0),this._lookat=new Ki(1,0,0),this._up=new Ki(0,0,1),this._focal=1)}get position(){return this._position}get lookat(){return this._lookat}get up(){return this._up}get focal(){return this._focal}set focal(e){this._focal=e}lerpCameras(e,t,i){this._position.subVectors(t.position,e.position).multiplyScalar(i).add(e.position),this._lookat.subVectors(t.lookat,e.lookat).multiplyScalar(i).add(e.lookat),this._up.subVectors(t.up,e.up).multiplyScalar(i).add(e.up),this._focal=(1-i)*e.focal+i*t.focal}copy(e){this._position.copy(e.position),this._lookat.copy(e.lookat),this._up.copy(e.up),this._focal=e.focal}clone(){let e=new Nw;return e.position.copy(this._position),e.lookat.copy(this._lookat),e.up.copy(this._up),e.focal=this._focal,e}diff(e){let t=this._position.distanceToSquared(e.position),i=this._lookat.distanceToSquared(e.lookat),n=this._up.distanceToSquared(e.up),r=100*Math.abs(this._focal-e.focal);return Math.max(t,i,n,r)}_getFocal(e){return $u(e.cameraType)?.5/Math.tan(Math.PI/2):e.focal}}class $w{constructor(e,t,i){this._spatial=new Du,this._viewportCoords=new hf,this._size={width:e,height:t},this._initialFov=60,this._alpha=-1,this._stateTransitionAlpha=-1,this._stateTransitionFov=-1,this._renderMode=i,this._zoom=0,this._frameId=-1,this._changed=!1,this._changedForFrame=-1,this._currentImageId=null,this._previousImageId=null,this._currentSpherical=!1,this._previousSpherical=!1,this._state=null,this._currentProjectedPoints=[],this._previousProjectedPoints=[],this._currentFov=this._initialFov,this._previousFov=this._initialFov,this._camera=new Nw,this._perspective=new hs(this._initialFov,this._computeAspect(e,t),.1,1e4),this._perspective.position.copy(this._camera.position),this._perspective.up.copy(this._camera.up),this._perspective.lookAt(this._camera.lookat),this._perspective.updateMatrixWorld(!0),this._perspective.matrixAutoUpdate=!1,this._rotation={phi:0,theta:0}}get alpha(){return this._alpha}get camera(){return this._camera}get changed(){return this._frameId===this._changedForFrame}get frameId(){return this._frameId}get perspective(){return this._perspective}get renderMode(){return this._renderMode}get rotation(){return this._rotation}get zoom(){return this._zoom}get size(){return this._size}getTilt(){return 90-this._spatial.radToDeg(this._rotation.theta)}fovToZoom(e){e=Math.min(90,Math.max(0,e));const t=this._computeCurrentFov(0),i=1===this._alpha?t:this._interpolateFov(t,this._computePreviousFov(0),this._alpha),n=Math.tan(i/2*Math.PI/180),r=Math.tan(e/2*Math.PI/180);return Math.log(n/r)/Math.log(2)}setFrame(e){const t=e.state;if(t.state!==this._state){if(this._state=t.state,this._state!==Df.Custom&&(this.setRenderMode(this._renderMode),this.setSize(this._size)),this._state===Df.Earth){const e=this._fovToY(this._perspective.fov,this._zoom);this._stateTransitionFov=this._yToFov(e,0)}this._changed=!0}const i=t.currentImage.id,n=t.previousImage?t.previousImage.id:null;i!==this._currentImageId&&(this._currentImageId=i,this._currentSpherical=$u(t.currentTransform.cameraType),this._currentProjectedPoints=this._computeProjectedPoints(t.currentTransform),this._changed=!0),n!==this._previousImageId&&(this._previousImageId=n,this._previousSpherical=$u(t.previousTransform.cameraType),this._previousProjectedPoints=this._computeProjectedPoints(t.previousTransform),this._changed=!0);const r=t.zoom;r!==this._zoom&&(this._changed=!0),this._changed&&(this._currentFov=this._computeCurrentFov(r),this._previousFov=this._computePreviousFov(r));const s=t.alpha,a=t.stateTransitionAlpha;if(this._changed||s!==this._alpha||a!==this._stateTransitionAlpha){switch(this._alpha=s,this._stateTransitionAlpha=a,this._state){case Df.Earth:{const e=this._stateTransitionFov,i=this._focalToFov(t.camera.focal),n=Oi.lerp(e,i,a),s=this._fovToY(n,0);this._perspective.fov=this._yToFov(s,r);break}case Df.Custom:break;default:this._perspective.fov=this._interpolateFov(this._currentFov,this._previousFov,this._alpha),this._changed=!0}this._zoom=r,this._state!==Df.Custom&&this._perspective.updateProjectionMatrix()}const o=t.camera;this._camera.diff(o)>1e-9&&(this._camera.copy(o),this._rotation=this._computeRotation(o),this._perspective.up.copy(o.up),this._perspective.position.copy(o.position),this._perspective.matrixAutoUpdate=!0,this._perspective.lookAt(o.lookat),this._perspective.matrixAutoUpdate=!1,this._perspective.updateMatrix(),this._perspective.updateMatrixWorld(!1),this._changed=!0),this._setFrameId(e.id)}setProjectionMatrix(e){this._perspective.fov=this._focalToFov(e[5]/2),this._perspective.projectionMatrix.fromArray(e),this._perspective.projectionMatrixInverse.copy(this._perspective.projectionMatrix).invert(),this._changed=!0}setRenderMode(e){this._renderMode=e,this._state!==Df.Custom&&(this._perspective.fov=this._computeFov(),this._perspective.updateProjectionMatrix(),this._changed=!0)}setSize(e){this._size=e,this._state!==Df.Custom&&(this._perspective.aspect=this._computeAspect(e.width,e.height),this._perspective.fov=this._computeFov(),this._perspective.updateProjectionMatrix(),this._changed=!0)}_computeAspect(e,t){return 0===e?0:e/t}_computeCurrentFov(e){return 0===this._perspective.aspect?0:this._currentImageId?this._currentSpherical?this._yToFov(1,e):this._computeVerticalFov(this._currentProjectedPoints,this._renderMode,e,this.perspective.aspect):this._initialFov}_computeFov(){return this._currentFov=this._computeCurrentFov(this._zoom),this._previousFov=this._computePreviousFov(this._zoom),this._interpolateFov(this._currentFov,this._previousFov,this._alpha)}_computePreviousFov(e){return 0===this._perspective.aspect?0:this._currentImageId?this._previousImageId?this._previousSpherical?this._yToFov(1,e):this._computeVerticalFov(this._previousProjectedPoints,this._renderMode,e,this.perspective.aspect):this._currentFov:this._initialFov}_computeProjectedPoints(e){return zu(e,[[.5,0],[1,0]],[[.5,0],[0,.5]],100,this._viewportCoords)}_computeRequiredVerticalFov(e,t,i){const n=Math.max(e[0]/i,e[1]);return this._yToFov(n,t)}_computeRotation(e){let t=e.lookat.clone().sub(e.position),i=e.up.clone();return{phi:this._spatial.azimuthal(t.toArray(),i.toArray()),theta:Math.PI/2-this._spatial.angleToPlane(t.toArray(),[0,0,1])}}_computeVerticalFov(t,i,n,r){const s=t.map((e=>this._computeRequiredVerticalFov(e,n,r)));return i===e.RenderMode.Fill?.995*Math.min(...s):Math.max(...s)}_yToFov(e,t){return 2*Math.atan(e/Math.pow(2,t))*180/Math.PI}_focalToFov(e){return 2*Math.atan2(1,2*e)*180/Math.PI}_fovToY(e,t){return Math.pow(2,t)*Math.tan(Math.PI*e/360)}_interpolateFov(e,t,i){return i*e+(1-i)*t}_setFrameId(e){this._frameId=e,this._changed&&(this._changed=!1,this._changedForFrame=e)}}class kw{constructor(t,i,n,r){this._subscriptions=new rf,this._element=t,this._currentFrame$=i,this._spatial=new Du,n=null!=n?n:e.RenderMode.Fill,this._resize$=new j,this._projectionMatrix$=new j,this._renderCameraOperation$=new j,this._size$=new W({height:this._element.offsetHeight,width:this._element.offsetWidth});const s=this._subscriptions;s.push(this._resize$.pipe(De((()=>({height:this._element.offsetHeight,width:this._element.offsetWidth})))).subscribe(this._size$)),this._renderMode$=new W(n),this._renderCameraHolder$=this._renderCameraOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),null!=r?r:new $w(this._element.offsetWidth,this._element.offsetHeight,n)),Rt(1),U()),this._renderCameraFrame$=this._currentFrame$.pipe(Vt(this._renderCameraHolder$),Ut((([e,t])=>{t.setFrame(e)})),De((e=>e[1])),Rt(1),U()),this._renderCamera$=this._renderCameraFrame$.pipe(st((e=>e.changed)),Rt(1),U()),this._bearing$=this._renderCamera$.pipe(De((e=>{let t=this._spatial.radToDeg(this._spatial.azimuthalToBearing(e.rotation.phi));return this._spatial.wrap(t,0,360)})),Rt(1),U()),s.push(this._size$.pipe($t(1),De((e=>t=>(t.setSize(e),t)))).subscribe(this._renderCameraOperation$)),s.push(this._renderMode$.pipe($t(1),De((e=>t=>(t.setRenderMode(e),t)))).subscribe(this._renderCameraOperation$)),s.push(this._projectionMatrix$.pipe(De((e=>t=>(t.setProjectionMatrix(e),t)))).subscribe(this._renderCameraOperation$)),s.push(this._bearing$.subscribe((()=>{}))),s.push(this._renderCameraHolder$.subscribe((()=>{}))),s.push(this._size$.subscribe((()=>{}))),s.push(this._renderMode$.subscribe((()=>{}))),s.push(this._renderCamera$.subscribe((()=>{}))),s.push(this._renderCameraFrame$.subscribe((()=>{})))}get bearing$(){return this._bearing$}get element(){return this._element}get projectionMatrix$(){return this._projectionMatrix$}get renderCamera$(){return this._renderCamera$}get renderCameraFrame$(){return this._renderCameraFrame$}get renderMode$(){return this._renderMode$}get resize$(){return this._resize$}get size$(){return this._size$}dispose(){this._subscriptions.unsubscribe()}}class Ow{constructor(e){this._keyDown$=Qe(e,"keydown"),this._keyUp$=Qe(e,"keyup")}get keyDown$(){return this._keyDown$}get keyUp$(){return this._keyUp$}}const zw={0:1,2:2};class Fw{constructor(e,t,i,n){this._subscriptions=new rf;const r=this._subscriptions;this._activeSubject$=new W(!1),this._active$=this._activeSubject$.pipe(vt(),Rt(1),U()),this._claimMouse$=new j,this._claimWheel$=new j,this._deferPixelClaims$=new j,this._deferPixels$=this._deferPixelClaims$.pipe(Lt(((e,t)=>(null==t.deferPixels?delete e[t.name]:e[t.name]=t.deferPixels,e)),{}),De((e=>{let t=-1;for(const i in e){if(!e.hasOwnProperty(i))continue;const n=e[i];n>t&&(t=n)}return t})),Ot(-1),Rt(1),U()),r.push(this._deferPixels$.subscribe((()=>{}))),this._documentMouseMove$=Qe(n,"pointermove").pipe(st(this._isMousePen)),this._documentMouseUp$=Qe(n,"pointerup").pipe(st(this._isMousePen)),this._mouseDown$=Qe(t,"pointerdown").pipe(st(this._isMousePen)),this._mouseEnter$=Qe(t,"pointerenter").pipe(st(this._isMousePen)),this._mouseLeave$=Qe(t,"pointerleave").pipe(st(this._isMousePen)),this._mouseMove$=Qe(t,"pointermove").pipe(st(this._isMousePen)),this._mouseUp$=Qe(t,"pointerup").pipe(st(this._isMousePen)),this._mouseOut$=Qe(t,"pointerout").pipe(st(this._isMousePen)),this._mouseOver$=Qe(t,"pointerover").pipe(st(this._isMousePen)),this._domMouseDown$=Qe(i,"pointerdown").pipe(st(this._isMousePen)),this._domMouseMove$=Qe(i,"pointermove").pipe(st(this._isMousePen)),this._click$=Qe(t,"click"),this._contextMenu$=Qe(t,"contextmenu"),this._windowBlur$=Qe(window,"blur"),this._dblClick$=it(Qe(e,"click"),Qe(t,"dblclick")).pipe(ht(3,1),st((e=>{const i=e[0],n=e[1],r=e[2];return"click"===i.type&&"click"===n.type&&"dblclick"===r.type&&i.target.parentNode===t&&n.target.parentNode===t})),De((e=>e[2])),Dt()),r.push(it(this._domMouseDown$,this._domMouseMove$,this._dblClick$,this._contextMenu$).subscribe((e=>{e.preventDefault()}))),this._mouseWheel$=it(Qe(t,"wheel"),Qe(i,"wheel")).pipe(Dt()),this._consistentContextMenu$=it(this._mouseDown$,this._mouseMove$,this._mouseOut$,this._mouseUp$,this._contextMenu$).pipe(ht(3,1),st((e=>"pointerdown"===e[0].type&&"contextmenu"===e[1].type&&"pointerup"===e[2].type)),De((e=>e[1])),Dt());const s=it(this._windowBlur$,this._documentMouseMove$.pipe(st((e=>this._buttonReleased(e,0)))),this._documentMouseUp$.pipe(st((e=>0===this._mouseButton(e))))).pipe(Dt()),a=this._createMouseDragInitiate$(0,this._mouseDown$,s,!0).pipe(Dt());this._mouseDragStart$=this._createMouseDragStart$(a).pipe(Dt()),this._mouseDrag$=this._createMouseDrag$(a,s).pipe(Dt()),this._mouseDragEnd$=this._createMouseDragEnd$(this._mouseDragStart$,s).pipe(Dt());const o=this._createMouseDragInitiate$(0,this._domMouseDown$,s,!1).pipe(Dt());this._domMouseDragStart$=this._createMouseDragStart$(o).pipe(Dt()),this._domMouseDrag$=this._createMouseDrag$(o,s).pipe(Dt()),this._domMouseDragEnd$=this._createMouseDragEnd$(this._domMouseDragStart$,s).pipe(Dt());const h=it(this._windowBlur$,this._documentMouseMove$.pipe(st((e=>this._buttonReleased(e,2)))),this._documentMouseUp$.pipe(st((e=>2===this._mouseButton(e))))).pipe(Dt()),c=this._createMouseDragInitiate$(2,this._mouseDown$,h,!0).pipe(Dt());this._mouseRightDragStart$=this._createMouseDragStart$(c).pipe(Dt()),this._mouseRightDrag$=this._createMouseDrag$(c,h).pipe(Dt()),this._mouseRightDragEnd$=this._createMouseDragEnd$(this._mouseRightDragStart$,h).pipe(Dt()),this._proximateClick$=this._mouseDown$.pipe(zt((e=>this._click$.pipe(Ft(this._createDeferredMouseMove$(e,this._documentMouseMove$)),_t(1)))),Dt()),this._staticClick$=this._mouseDown$.pipe(zt((()=>this._click$.pipe(Ft(this._documentMouseMove$),_t(1)))),Dt()),r.push(this._mouseDragStart$.subscribe()),r.push(this._mouseDrag$.subscribe()),r.push(this._mouseDragEnd$.subscribe()),r.push(this._domMouseDragStart$.subscribe()),r.push(this._domMouseDrag$.subscribe()),r.push(this._domMouseDragEnd$.subscribe()),r.push(this._mouseRightDragStart$.subscribe()),r.push(this._mouseRightDrag$.subscribe()),r.push(this._mouseRightDragEnd$.subscribe()),r.push(this._staticClick$.subscribe()),this._mouseOwner$=this._createOwner$(this._claimMouse$).pipe(Rt(1),U()),this._wheelOwner$=this._createOwner$(this._claimWheel$).pipe(Rt(1),U()),r.push(this._mouseOwner$.subscribe((()=>{}))),r.push(this._wheelOwner$.subscribe((()=>{})))}get active$(){return this._active$}get activate$(){return this._activeSubject$}get documentMouseMove$(){return this._documentMouseMove$}get documentMouseUp$(){return this._documentMouseUp$}get domMouseDragStart$(){return this._domMouseDragStart$}get domMouseDrag$(){return this._domMouseDrag$}get domMouseDragEnd$(){return this._domMouseDragEnd$}get domMouseDown$(){return this._domMouseDown$}get domMouseMove$(){return this._domMouseMove$}get mouseOwner$(){return this._mouseOwner$}get mouseDown$(){return this._mouseDown$}get mouseEnter$(){return this._mouseEnter$}get mouseMove$(){return this._mouseMove$}get mouseLeave$(){return this._mouseLeave$}get mouseOut$(){return this._mouseOut$}get mouseOver$(){return this._mouseOver$}get mouseUp$(){return this._mouseUp$}get click$(){return this._click$}get dblClick$(){return this._dblClick$}get contextMenu$(){return this._consistentContextMenu$}get mouseWheel$(){return this._mouseWheel$}get mouseDragStart$(){return this._mouseDragStart$}get mouseDrag$(){return this._mouseDrag$}get mouseDragEnd$(){return this._mouseDragEnd$}get mouseRightDragStart$(){return this._mouseRightDragStart$}get mouseRightDrag$(){return this._mouseRightDrag$}get mouseRightDragEnd$(){return this._mouseRightDragEnd$}get proximateClick$(){return this._proximateClick$}get staticClick$(){return this._staticClick$}get windowBlur$(){return this._windowBlur$}dispose(){this._subscriptions.unsubscribe()}claimMouse(e,t){this._claimMouse$.next({name:e,zindex:t})}unclaimMouse(e){this._claimMouse$.next({name:e,zindex:null})}deferPixels(e,t){this._deferPixelClaims$.next({name:e,deferPixels:t})}undeferPixels(e){this._deferPixelClaims$.next({name:e,deferPixels:null})}claimWheel(e,t){this._claimWheel$.next({name:e,zindex:t})}unclaimWheel(e){this._claimWheel$.next({name:e,zindex:null})}filtered$(e,t){return this._filtered(e,t,this._mouseOwner$)}filteredWheel$(e,t){return this._filtered(e,t,this._wheelOwner$)}_createDeferredMouseMove$(e,t){return t.pipe(De((t=>{const i=t.clientX-e.clientX,n=t.clientY-e.clientY;return[t,Math.sqrt(i*i+n*n)]})),Vt(this._deferPixels$),st((([[,e],t])=>e>t)),De((([[e]])=>e)))}_createMouseDrag$(e,t){return e.pipe(De((([,e])=>e)),zt((e=>Ze(Ce(e),this._documentMouseMove$).pipe(Ft(t)))))}_createMouseDragEnd$(e,t){return e.pipe(zt((()=>t.pipe(St()))))}_createMouseDragStart$(e){return e.pipe(De((([e])=>e)))}_createMouseDragInitiate$(e,t,i,n){return t.pipe(st((t=>this._mouseButton(t)===e)),zt((e=>Ve(Ce(e),n?this._createDeferredMouseMove$(e,this._documentMouseMove$):this._documentMouseMove$).pipe(Ft(i),_t(1)))))}_createOwner$(e){return e.pipe(Lt(((e,t)=>(null==t.zindex?delete e[t.name]:e[t.name]=t.zindex,e)),{}),De((e=>{let t=null,i=-1;for(const n in e)e.hasOwnProperty(n)&&e[n]>i&&(i=e[n],t=n);return t})),Ot(null))}_filtered(e,t,i){return t.pipe(Vt(i),st((([,t])=>t===e)),De((([e])=>e)))}_mouseButton(e){const t="pointerdown"===e.type||"pointerup"===e.type,i=window.InstallTrigger;return t&&void 0!==i&&2===e.button&&e.ctrlKey&&window.navigator.platform.toUpperCase().indexOf("MAC")>=0?0:e.button}_buttonReleased(e,t){const i=zw[t];return void 0===e.buttons||(e.buttons&i)!==i}_isMousePen(e){const t=e.pointerType;return"mouse"===t||"pen"===t}}class Bw{set json(e){this._json=e}set image(e){this._image=e,this._texture=new Wi(this._image),this._texture.minFilter=Jt}get loaded(){return!(!this._image||!this._json)}getGLSprite(e){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");let t=this._json[e];if(!t)return console.warn("Sprite with key"+e+"does not exist in sprite definition."),new tr;let i=this._texture.clone();i.needsUpdate=!0;let n=this._image.width,r=this._image.height;i.offset.x=t.x/n,i.offset.y=(r-t.y-t.height)/r,i.repeat.x=t.width/n,i.repeat.y=t.height/r;let s=new ph({map:i});return new Eh(s)}getDOMSprite(t,i){if(!this.loaded)throw new Error("Sprites cannot be retrieved before the atlas is loaded.");null==i&&(i=e.Alignment.Center);let n=this._json[t];if(!n)return console.warn("Sprite with key"+t+"does not exist in sprite definition."),tf.h("div",{},[]);let r=n.y,s=n.x+n.width,a=n.y+n.height,o=n.x,h=-n.x,c=-n.y,l=this._image.height,u=this._image.width;switch(i){case e.Alignment.Bottom:case e.Alignment.Center:case e.Alignment.Top:h-=n.width/2;break;case e.Alignment.BottomLeft:case e.Alignment.Left:case e.Alignment.TopLeft:h-=n.width;break;case e.Alignment.BottomRight:case e.Alignment.Right:case e.Alignment.TopRight:}switch(i){case e.Alignment.Center:case e.Alignment.Left:case e.Alignment.Right:c-=n.height/2;break;case e.Alignment.Top:case e.Alignment.TopLeft:case e.Alignment.TopRight:c-=n.height;break;case e.Alignment.Bottom:case e.Alignment.BottomLeft:case e.Alignment.BottomRight:}let d=1/n.pixelRatio;r*=d,s*=d,a*=d,o*=d,h*=d,c*=d,l*=d,u*=d;let p={src:this._image.src,style:{clip:`rect(${r}px, ${s}px, ${a}px, ${o}px)`,height:`${l}px`,left:`${h}px`,position:"absolute",top:`${c}px`,width:`${u}px`}};return tf.h("img",p,[])}}class Uw{constructor(e){if(this._retina=window.devicePixelRatio>1,this._spriteAtlasOperation$=new j,this._spriteAtlas$=this._spriteAtlasOperation$.pipe(Ot((e=>e)),Lt(((e,t)=>t(e)),new Bw),Rt(1),U()),this._atlasSubscription=this._spriteAtlas$.subscribe((()=>{})),null==e)return;let t=this._retina?"@2x":"",i=new XMLHttpRequest;i.open("GET",e+t+".png",!0),i.responseType="arraybuffer",i.onload=()=>{let e=new Image;e.onload=()=>{this._spriteAtlasOperation$.next((t=>(t.image=e,t)))};let t=new Blob([i.response]);e.src=window.URL.createObjectURL(t)},i.onerror=i=>{console.error(new Error(`Failed to fetch sprite sheet (${e}${t}.png)`))},i.send();let n=new XMLHttpRequest;n.open("GET",e+t+".json",!0),n.responseType="text",n.onload=()=>{let e=JSON.parse(n.response);this._spriteAtlasOperation$.next((t=>(t.json=e,t)))},n.onerror=i=>{console.error(new Error(`Failed to fetch sheet (${e}${t}.json)`))},n.send()}get spriteAtlas$(){return this._spriteAtlas$}dispose(){this._atlasSubscription.unsubscribe()}}class Vw{constructor(e,t){this._subscriptions=new rf;const i=this._subscriptions;this._activeSubject$=new W(!1),this._active$=this._activeSubject$.pipe(vt(),Rt(1),U()),i.push(Qe(t,"touchmove").subscribe((e=>{e.preventDefault()}))),this._touchStart$=Qe(e,"touchstart"),this._touchMove$=Qe(e,"touchmove"),this._touchEnd$=Qe(e,"touchend"),this._touchCancel$=Qe(e,"touchcancel");const n=this._touchStart$.pipe(st((e=>1===e.touches.length&&1===e.targetTouches.length)),Dt());var r;this._doubleTap$=n.pipe((r=()=>n.pipe(St(),zt((()=>it(tt(300),n).pipe(_t(1))))),F((function(e,t){var i=null,n=null,s=function(){null==n||n.unsubscribe();var e=i;i=[],e&&t.next(e),_e(r()).subscribe(n=new B(t,s,w))};s(),e.subscribe(new B(t,(function(e){return null==i?void 0:i.push(e)}),(function(){i&&t.next(i),t.complete()}),void 0,(function(){return i=n=null})))}))),st((e=>2===e.length)),De((e=>e[e.length-1])),Dt()),i.push(this._doubleTap$.subscribe((e=>{e.preventDefault()}))),this._singleTouchMove$=this._touchMove$.pipe(st((e=>1===e.touches.length&&1===e.targetTouches.length)),Dt());let s=it(this._touchStart$,this._touchEnd$,this._touchCancel$).pipe(st((e=>1===e.touches.length&&1===e.targetTouches.length))),a=it(this._touchStart$,this._touchEnd$,this._touchCancel$).pipe(st((e=>e.touches.length>=1))),o=it(this._touchEnd$,this._touchCancel$).pipe(st((e=>0===e.touches.length)));this._singleTouchDragStart$=s.pipe(We((()=>this._singleTouchMove$.pipe(Ft(it(o,a)),_t(1))))),this._singleTouchDragEnd$=s.pipe(We((()=>it(o,a).pipe(St())))),this._singleTouchDrag$=s.pipe(zt((()=>this._singleTouchMove$.pipe($t(1),Ft(it(a,o))))));let h=it(this._touchStart$,this._touchEnd$,this._touchCancel$);this._pinchStart$=h.pipe(st((e=>2===e.touches.length&&2===e.targetTouches.length))),this._pinchEnd$=h.pipe(st((e=>2!==e.touches.length||2!==e.targetTouches.length))),this._pinchOperation$=new j,this._pinch$=this._pinchOperation$.pipe(Lt(((e,t)=>t(e)),{changeX:0,changeY:0,clientX:0,clientY:0,distance:0,distanceChange:0,distanceX:0,distanceY:0,originalEvent:null,pageX:0,pageY:0,screenX:0,screenY:0,touch1:null,touch2:null}));const c=this._touchMove$.pipe(st((e=>2===e.touches.length&&2===e.targetTouches.length)),De((e=>t=>{let i=e.touches[0],n=e.touches[1],r=Math.min(i.clientX,n.clientX),s=Math.max(i.clientX,n.clientX),a=Math.min(i.clientY,n.clientY),o=r+(s-r)/2,h=a+(Math.max(i.clientY,n.clientY)-a)/2,c=o+i.pageX-i.clientX,l=h+i.pageY-i.clientY,u=o+i.screenX-i.clientX,d=h+i.screenY-i.clientY,p=Math.abs(i.clientX-n.clientX),m=Math.abs(i.clientY-n.clientY),f=Math.sqrt(p*p+m*m),g=f-t.distance;return{changeX:p-t.distanceX,changeY:m-t.distanceY,clientX:o,clientY:h,distance:f,distanceChange:g,distanceX:p,distanceY:m,originalEvent:e,pageX:c,pageY:l,screenX:u,screenY:d,touch1:i,touch2:n}}))).subscribe(this._pinchOperation$);i.push(c),this._pinchChange$=this._pinchStart$.pipe(zt((()=>this._pinch$.pipe($t(1),Ft(this._pinchEnd$)))))}get active$(){return this._active$}get activate$(){return this._activeSubject$}get doubleTap$(){return this._doubleTap$}get touchStart$(){return this._touchStart$}get touchMove$(){return this._touchMove$}get touchEnd$(){return this._touchEnd$}get touchCancel$(){return this._touchCancel$}get singleTouchDragStart$(){return this._singleTouchDragStart$}get singleTouchDrag$(){return this._singleTouchDrag$}get singleTouchDragEnd$(){return this._singleTouchDragEnd$}get pinch$(){return this._pinchChange$}get pinchStart$(){return this._pinchStart$}get pinchEnd$(){return this._pinchEnd$}dispose(){this._subscriptions.unsubscribe()}}class Hw{constructor(e){var t,i,n,r;const s=null!==(i=null===(t=null==e?void 0:e.url)||void 0===t?void 0:t.exploreHost)&&void 0!==i?i:"www.mapillary.com",a=`${null!==(r=null===(n=null==e?void 0:e.url)||void 0===n?void 0:n.scheme)&&void 0!==r?r:"https"}://${s}`;this._exploreUrl$=Ce(a);const o=!1!==(null==e?void 0:e.imageTiling);this._imageTiling$=Ce(o)}get exploreUrl$(){return this._exploreUrl$}get imageTiling$(){return this._imageTiling$}}class jw{constructor(e,t,i){var n;if(this._onWindowResize=()=>{this._trackResize&&this.renderService.resize$.next()},this._dom=null!=i?i:new og,"string"==typeof e.container){if(this._container=this._dom.document.getElementById(e.container),!this._container)throw new Error(`Container "${e.container}" not found.`)}else{if(!(e.container instanceof HTMLElement))throw new Error('Invalid type: "container" must be a String or HTMLElement.');this._container=e.container}this._trackResize=!1!==e.trackResize,this.id=null!==(n=this._container.id)&&void 0!==n?n:"mapillary-fallback-container-id",this._container.classList.add("mapillary-viewer"),this._canvasContainer=this._dom.createElement("div","mapillary-interactive",this._container),this._canvas=this._dom.createElement("canvas","mapillary-canvas"),this._canvas.style.position="absolute",this._canvas.setAttribute("tabindex","0"),this._domContainer=this._dom.createElement("div","mapillary-dom",this._container),this.configurationService=new Hw(e),this.renderService=new kw(this._container,t.currentState$,e.renderMode),this.glRenderer=new Dw(this._canvas,this._canvasContainer,this.renderService),this.domRenderer=new Lw(this._domContainer,this.renderService,t.currentState$),this.keyboardService=new Ow(this._canvasContainer),this.mouseService=new Fw(this._container,this._canvasContainer,this._domContainer,document),this.touchService=new Vw(this._canvasContainer,this._domContainer),this.spriteService=new Uw(e.sprite),window.addEventListener("resize",this._onWindowResize,!1)}get canvas(){return this._canvas.parentNode?this._canvas:null}get canvasContainer(){return this._canvasContainer}get container(){return this._container}get domContainer(){return this._domContainer}remove(){window.removeEventListener("resize",this._onWindowResize,!1),this.spriteService.dispose(),this.touchService.dispose(),this.mouseService.dispose(),this.glRenderer.remove(),this.domRenderer.remove(),this.renderService.dispose(),this._removeNode(this._canvasContainer),this._removeNode(this._domContainer),this._container.classList.remove("mapillary-viewer")}_removeNode(e){e.parentNode&&e.parentNode.removeChild(e)}}class Gw{constructor(e,t,i){this._graphService=e,this._stateService=t,this._api=i,this._subscriptions=new rf,this._started=!1,this._cellDepth=1}get started(){return this._started}configure(e){this._cellDepth=e?Math.max(1,Math.min(3,e.cellDepth)):1}start(){if(this._started)return;const e=this._subscriptions;e.push(this._stateService.currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id)),De((e=>{const t=e.state,i=t.trajectory,n=i.map((e=>e.id)),r=i[i.length-1].sequenceId;return[n,t.currentImage.originalLngLat,r]})),ht(1,5),Vt(this._graphService.graphMode$),zt((([e,t])=>{const i=e[0][0],n=e[0][1],r=this._api.data.geometry,s=kg(r.lngLatToCellId(n),this._cellDepth,r),a=t===Nf.Sequence?e[0][2]:void 0;return this._graphService.uncache$(i,s,a)}))).subscribe((()=>{}))),e.push(this._graphService.graphMode$.pipe($t(1),Vt(this._stateService.currentState$),zt((([e,t])=>e===Nf.Sequence?this._keyToEdges(t.state.currentImage.id,(e=>e.sequenceEdges$)):ge(t.state.trajectory.map((e=>e.id)).slice(t.state.currentIndex)).pipe(We((e=>this._keyToEdges(e,(e=>e.spatialEdges$))),6))))).subscribe((()=>{}))),e.push(this._graphService.dataAdded$.pipe(Vt(this._stateService.currentId$),zt((([e,t])=>this._graphService.cacheImage$(t)))).subscribe((()=>{}))),this._started=!0}stop(){this._started&&(this._subscriptions.unsubscribe(),this._started=!1)}_keyToEdges(e,t){return this._graphService.cacheImage$(e).pipe(zt(t),St((e=>e.cached)),Pe(15e3),ct((t=>(console.error(`Failed to cache edges (${e}).`,t),ie()))))}}class Ww{constructor(){this._loadersSubject$=new j,this._loaders$=this._loadersSubject$.pipe(Lt(((e,t)=>(void 0!==t.task&&(e[t.task]=t.loading),e)),{}),Ot({}),Rt(1),U())}get loading$(){return this._loaders$.pipe(De((e=>{for(const t in e)if(e.hasOwnProperty(t)&&e[t])return!0;return!1})),ft(100),vt())}taskLoading$(e){return this._loaders$.pipe(De((t=>!!t[e])),ft(100),vt())}startLoading(e){this._loadersSubject$.next({loading:!0,task:e})}stopLoading(e){this._loadersSubject$.next({loading:!1,task:e})}}var qw;!function(e){e[e.Disabled=0]="Disabled",e[e.Enabled=1]="Enabled",e[e.Started=2]="Started"}(qw||(qw={}));class Xw{constructor(e,t,i,n,r,s){this._subscriptions=new rf,this._graphService=e,this._stateService=t,this._graphCalculator=null!=n?n:new Mu,this._spatial=null!=r?r:new Du,this._viewportCoords=null!=s?s:new hf,this._mode=!1!==i?qw.Enabled:qw.Disabled,this._panImagesSubject$=new j,this._panImages$=this._panImagesSubject$.pipe(Ot([]),Rt(1),U()),this._subscriptions.push(this._panImages$.subscribe())}get panImages$(){return this._panImages$}dispose(){this.stop(),null!=this._panImagesSubscription&&this._panImagesSubscription.unsubscribe(),this._subscriptions.unsubscribe()}enable(){this._mode===qw.Disabled&&(this._mode=qw.Enabled,this.start())}disable(){this._mode!==qw.Disabled&&(this.stop(),this._mode=qw.Disabled)}start(){if(this._mode!==qw.Enabled)return;const e=this._stateService.currentImage$.pipe(zt((e=>{if(!e.merged||$u(e.cameraType))return Ce([]);const t=Ce(e),i=this._graphCalculator.boundingBoxCorners(e.lngLat,20);return Ve(t,this._graphService.cacheBoundingBox$(i[0],i[1]).pipe(ct((t=>(console.error(`Failed to cache periphery bounding box (${e.id})`,t),ie()))),De((t=>{if($u(e.cameraType))return[];const i=[];for(const n of t)n.id!==e.id&&n.mergeId===e.mergeId&&($u(n.cameraType)||this._distance(n,e)>4||i.push(n));return i})))).pipe(Vt(this._stateService.reference$),De((([[e,t],i])=>{const n=this._spatial.viewingDirection(e.rotation),r=Ou({lat:e.lngLat.lat,lng:e.lngLat.lng,alt:e.computedAltitude},e.rotation,i),s=this._createTransform(e,r),a=this._spatial.wrap(this._spatial.azimuthal(n.toArray(),s.upVector().toArray()),0,2*Math.PI),o=this._computeProjectedPoints(s),h=this._computeHorizontalFov(o)/180*Math.PI,c=Math.PI/8;let l,u;for(const r of t){const t=Ou({lat:r.lngLat.lat,lng:r.lngLat.lng,alt:r.computedAltitude},r.rotation,i),s=this._createTransform(r,t),o=this._computeProjectedPoints(s),d=this._computeHorizontalFov(o)/180*Math.PI,p=this._spatial.viewingDirection(r.rotation),m=this._spatial.wrap(this._spatial.azimuthal(p.toArray(),s.upVector().toArray()),0,2*Math.PI),f=this._spatial.angleBetweenVector2(n.x,n.y,p.x,p.y);let g=Number.NEGATIVE_INFINITY;g=f>0?a>m?a-2*Math.PI+h/2-(m-d/2):a+h/2-(m-d/2):a<m?m+d/2-(a+2*Math.PI-h/2):m+d/2-(a-h/2);const _=Math.abs(d-g),v=this._distance(r,e)+Math.min(this._timeDifference(r,e),4)+20*Math.abs(g-c)+Math.min(5,1/Math.min(d/h,1))+(g>0?-2*_:0);g>0&&g<.5*h&&g<.5*d&&_>.5*h&&(f>0?l?v<l[0]&&(l=[v,r,s,d]):l=[v,r,s,d]:u?v<u[0]&&(u=[v,r,s,d]):u=[v,r,s,d])}const d=[];return l&&d.push([l[1],l[2],l[3]]),u&&d.push([u[1],u[2],u[3]]),d})),Ot([]))})));this._panImagesSubscription=this._stateService.currentState$.pipe(De((e=>e.state.imagesAhead>0)),vt(),zt((t=>t?Ce([]):e))).subscribe((e=>{this._panImagesSubject$.next(e)})),this._mode=qw.Started}stop(){this._mode===qw.Started&&(this._panImagesSubscription.unsubscribe(),this._panImagesSubject$.next([]),this._mode=qw.Enabled)}_distance(e,t){const[i,n,r]=_u(e.lngLat.lng,e.lngLat.lat,e.computedAltitude,t.lngLat.lng,t.lngLat.lat,t.computedAltitude);return Math.sqrt(i*i+n*n+r*r)}_timeDifference(e,t){return Math.abs(e.capturedAt-t.capturedAt)/2592e6}_createTransform(e,t){return new ug(e.exifOrientation,e.width,e.height,e.scale,e.rotation,t,e.assetsCached?e.image:void 0,void 0,e.cameraParameters,e.cameraType)}_computeProjectedPoints(e){return zu(e,[[1,0]],[[0,.5]],20,this._viewportCoords)}_computeHorizontalFov(e){const t=e.map((e=>this._coordToFov(e[0])));return Math.min(...t)}_coordToFov(e){return 2*Math.atan(e)*180/Math.PI}}class Zw{constructor(e){this._data=e}get data(){return this._data}getCoreImages$(e){return this._wrap$(this._data.getCoreImages(e))}getImages$(e){return this._wrap$(this._data.getImages(e))}getImageTiles$(e){return this._wrap$(this._data.getImageTiles(e))}getSequence$(e){return this._wrap$(this._data.getSequence(e))}getSpatialImages$(e){return this._wrap$(this._data.getSpatialImages(e))}setAccessToken(e){this._data.setAccessToken(e)}_wrap$(e){return k.create((t=>{e.then((e=>{t.next(e),t.complete()}),(e=>{t.error(e)}))}))}}class Yw{constructor(e){this._dataAdded$=new j,this._subscriptions=new rf,this._onDataAdded=e=>{this._graph$.pipe(St(),We((t=>t.updateCells$(e.cellIds).pipe(Ut((()=>{t.resetSpatialEdges()})))))).subscribe((e=>{this._dataAdded$.next(e)}))};const t=this._subscriptions;this._graph$=Ze(Ce(e),e.changed$).pipe(Rt(1),U()),t.push(this._graph$.subscribe((()=>{}))),this._graphMode=Nf.Spatial,this._graphModeSubject$=new j,this._graphMode$=this._graphModeSubject$.pipe(Ot(this._graphMode),Rt(1),U()),t.push(this._graphMode$.subscribe((()=>{}))),this._firstGraphSubjects$=[],this._initializeCacheSubscriptions=[],this._sequenceSubscriptions=[],this._spatialSubscriptions=[],e.api.data.on("datacreate",this._onDataAdded)}get dataAdded$(){return this._dataAdded$}get filter$(){return this._graph$.pipe(St(),We((e=>e.filter$)))}get graphMode$(){return this._graphMode$}cacheBoundingBox$(e,t){return this._graph$.pipe(St(),We((i=>i.cacheBoundingBox$(e,t))))}cacheCell$(e){return this._graph$.pipe(St(),We((t=>t.cacheCell$(e))))}cacheImage$(e){const t=new j;this._firstGraphSubjects$.push(t);const i=t.pipe(Rt(1),U()),n=i.pipe(De((t=>t.getNode(e))),We((e=>e.assetsCached?Ce(e):e.cacheAssets$())),Rt(1),U());let r;n.subscribe(void 0,(t=>{console.error(`Failed to cache image (${e}).`,t)})),r=this._graph$.pipe(St(),We((t=>t.isCachingFull(e)||!t.hasNode(e)?t.cacheFull$(e):t.isCachingFill(e)||!t.getNode(e).complete?t.cacheFill$(e):Ce(t))),Ut((t=>{if(!t.hasNode(e))throw new Bu(`Failed to cache image (${e})`);t.hasInitializedCache(e)||t.initializeCache(e)})),Mt((()=>{null!=r&&(this._removeFromArray(r,this._initializeCacheSubscriptions),this._removeFromArray(t,this._firstGraphSubjects$))}))).subscribe((e=>{t.next(e),t.complete()}),(e=>{t.error(e)})),r.closed||this._initializeCacheSubscriptions.push(r);const s=i.pipe(ct((()=>ie())),We((t=>t.isCachingNodeSequence(e)||!t.hasNodeSequence(e)?t.cacheNodeSequence$(e):Ce(t))),Rt(1),U());let a;if(a=s.pipe(Ut((t=>{t.getNode(e).sequenceEdges.cached||t.cacheSequenceEdges(e)})),Mt((()=>{null!=a&&this._removeFromArray(a,this._sequenceSubscriptions)}))).subscribe((()=>{}),(t=>{console.error(`Failed to cache sequence edges (${e}).`,t)})),a.closed||this._sequenceSubscriptions.push(a),this._graphMode===Nf.Spatial){let t;t=i.pipe(ct((()=>ie())),wt((t=>t.hasTiles(e)?ie():ge(t.cacheTiles$(e)).pipe(We((t=>t.pipe(We((t=>t.isCachingTiles(e)?ie():Ce(t))),ct((t=>(console.error(`Failed to cache tile data (${e}).`,t),ie()))))))))),Tt(1),We((t=>t.hasSpatialArea(e)?Ce(t):ge(t.cacheSpatialArea$(e)).pipe(We((t=>t.pipe(ct((t=>(console.error(`Failed to cache spatial images (${e}).`,t),ie()))))))))),Tt(1),We((t=>t.hasNodeSequence(e)?Ce(t):t.cacheNodeSequence$(e))),Ut((t=>{t.getNode(e).spatialEdges.cached||t.cacheSpatialEdges(e)})),Mt((()=>{null!=t&&this._removeFromArray(t,this._spatialSubscriptions)}))).subscribe((()=>{}),(t=>{const i=`Failed to cache spatial edges (${e}).`;console.error(i,t)})),t.closed||this._spatialSubscriptions.push(t)}return n.pipe(St((e=>e.assetsCached)))}cacheSequence$(e){return this._graph$.pipe(St(),We((t=>t.isCachingSequence(e)||!t.hasSequence(e)?t.cacheSequence$(e):Ce(t))),De((t=>t.getSequence(e))))}cacheSequenceImages$(e,t){return this._graph$.pipe(St(),We((t=>t.isCachingSequence(e)||!t.hasSequence(e)?t.cacheSequence$(e):Ce(t))),We((i=>i.isCachingSequenceNodes(e)||!i.hasSequenceNodes(e)?i.cacheSequenceNodes$(e,t):Ce(i))),De((t=>t.getSequence(e))))}dispose(){this._graph$.pipe(St()).subscribe((e=>{e.unsubscribe()})),this._subscriptions.unsubscribe()}setFilter$(e){return this._resetSubscriptions(this._spatialSubscriptions),this._graph$.pipe(St(),Ut((t=>{t.resetSpatialEdges(),t.setFilter(e)})),De((()=>{})))}setGraphMode(e){this._graphMode!==e&&(e===Nf.Sequence&&this._resetSubscriptions(this._spatialSubscriptions),this._graphMode=e,this._graphModeSubject$.next(this._graphMode))}reset$(e){return this._abortSubjects(this._firstGraphSubjects$),this._resetSubscriptions(this._initializeCacheSubscriptions),this._resetSubscriptions(this._sequenceSubscriptions),this._resetSubscriptions(this._spatialSubscriptions),this._graph$.pipe(St(),Ut((t=>{t.reset(e)})),De((()=>{})))}uncache$(e,t,i){return this._graph$.pipe(St(),Ut((n=>{n.uncache(e,t,i)})),De((()=>{})))}_abortSubjects(e){for(const t of e.slice())this._removeFromArray(t,e),t.error(new Error("Cache image request was aborted."))}_removeFromArray(e,t){const i=t.indexOf(e);-1!==i&&t.splice(i,1)}_resetSubscriptions(e){for(const t of e.slice())this._removeFromArray(t,e),t.closed||t.unsubscribe()}}class Jw{constructor(e){e.requestAnimationFrame?(this._cancelAnimationFrame=e.cancelAnimationFrame.bind(e),this._requestAnimationFrame=e.requestAnimationFrame.bind(e)):e.mozRequestAnimationFrame?(this._cancelAnimationFrame=e.mozCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.mozRequestAnimationFrame.bind(e)):e.webkitRequestAnimationFrame?(this._cancelAnimationFrame=e.webkitCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.webkitRequestAnimationFrame.bind(e)):e.msRequestAnimationFrame?(this._cancelAnimationFrame=e.msCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.msRequestAnimationFrame.bind(e)):e.oRequestAnimationFrame?(this._cancelAnimationFrame=e.oCancelAnimationFrame.bind(e),this._requestAnimationFrame=e.oRequestAnimationFrame.bind(e)):(this._cancelAnimationFrame=e.clearTimeout.bind(e),this._requestAnimationFrame=t=>e.setTimeout(t,1e3/60))}get cancelAnimationFrame(){return this._cancelAnimationFrame}get requestAnimationFrame(){return this._requestAnimationFrame}}class Kw{constructor(e){this._spatial=new Du,this._referenceThreshold=.01,this._transitionMode=e.transitionMode,this._reference=e.reference,this._alpha=e.alpha,this._stateTransitionAlpha=0,this._camera=e.camera.clone(),this._zoom=e.zoom,this._currentIndex=e.currentIndex,this._trajectory=e.trajectory.slice(),this._trajectoryTransforms=[],this._trajectoryCameras=[];for(let e of this._trajectory){let t=this._imageToTranslation(e,this._reference),i=new ug(e.exifOrientation,e.width,e.height,e.scale,e.rotation,t,e.image,void 0,e.cameraParameters,e.cameraType);this._trajectoryTransforms.push(i),this._trajectoryCameras.push(new Nw(i))}this._currentImage=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousImage=this._trajectory.length>1&&this.currentIndex>0?this._trajectory[this._currentIndex-1]:null,this._currentCamera=this._trajectoryCameras.length>0?this._trajectoryCameras[this._currentIndex].clone():new Nw,this._previousCamera=this._trajectoryCameras.length>1&&this.currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()}get reference(){return this._reference}get alpha(){return this._getAlpha()}get stateTransitionAlpha(){return this._getStateTransitionAlpha()}get camera(){return this._camera}get zoom(){return this._zoom}get trajectory(){return this._trajectory}get currentIndex(){return this._currentIndex}get currentImage(){return this._currentImage}get previousImage(){return this._previousImage}get currentCamera(){return this._currentCamera}get currentTransform(){return this._trajectoryTransforms.length>0?this._trajectoryTransforms[this.currentIndex]:null}get previousTransform(){return this._trajectoryTransforms.length>1&&this.currentIndex>0?this._trajectoryTransforms[this.currentIndex-1]:null}get motionless(){return this._motionless}get transitionMode(){return this._transitionMode}move(e){}moveTo(e){}rotate(e){}rotateUnbounded(e){}rotateWithoutInertia(e){}rotateBasic(e){}rotateBasicUnbounded(e){}rotateBasicWithoutInertia(e){}rotateToBasic(e){}setSpeed(e){}zoomIn(e,t){}update(e){}setCenter(e){}setZoom(e){}dolly(e){}orbit(e){}setViewMatrix(e){}truck(e){}append(e){if(e.length<1)throw Error("Trajectory can not be empty");this._currentIndex<0?this.set(e):(this._trajectory=this._trajectory.concat(e),this._appendToTrajectories(e))}prepend(e){if(e.length<1)throw Error("Trajectory can not be empty");this._trajectory=e.slice().concat(this._trajectory),this._currentIndex+=e.length,this._setCurrentImage(),this._setReference(this._currentImage)?this._setTrajectories():this._prependToTrajectories(e),this._setCurrentCamera()}remove(e){if(e<0)throw Error("n must be a positive integer");if(this._currentIndex-1<e)throw Error("Current and previous images can not be removed");for(let t=0;t<e;t++)this._trajectory.shift(),this._trajectoryTransforms.shift(),this._trajectoryCameras.shift(),this._currentIndex--;this._setCurrentImage()}clearPrior(){this._currentIndex>0&&this.remove(this._currentIndex-1)}clear(){this.cut(),this._currentIndex>0&&this.remove(this._currentIndex-1)}cut(){for(;this._trajectory.length-1>this._currentIndex;)this._trajectory.pop(),this._trajectoryTransforms.pop(),this._trajectoryCameras.pop()}set(e){this._setTrajectory(e),this._setCurrentImage(),this._setReference(this._currentImage),this._setTrajectories(),this._setCurrentCamera()}getCenter(){return null!=this._currentImage?this.currentTransform.projectBasic(this._camera.lookat.toArray()):[.5,.5]}setTransitionMode(e){this._transitionMode=e}_getAlpha(){return 1}_getStateTransitionAlpha(){return 1}_setCurrent(){this._setCurrentImage(),this._setReference(this._currentImage)&&this._setTrajectories(),this._setCurrentCamera()}_setCurrentCamera(){this._currentCamera=this._trajectoryCameras[this._currentIndex].clone(),this._previousCamera=this._currentIndex>0?this._trajectoryCameras[this._currentIndex-1].clone():this._currentCamera.clone()}_motionlessTransition(){return null!=this._currentImage&&null!=this._previousImage&&(this._transitionMode===e.TransitionMode.Instantaneous||!(this._currentImage.merged&&this._previousImage.merged&&this._withinOriginalDistance()&&this._sameConnectedComponent()))}_setReference(e){return!(Math.abs(e.lngLat.lat-this.reference.lat)<this._referenceThreshold&&Math.abs(e.lngLat.lng-this.reference.lng)<this._referenceThreshold)&&(!(null!=this._previousImage&&!this._motionlessTransition())&&(this._reference.lat=e.lngLat.lat,this._reference.lng=e.lngLat.lng,this._reference.alt=e.computedAltitude,!0))}_setCurrentImage(){this._currentImage=this._trajectory.length>0?this._trajectory[this._currentIndex]:null,this._previousImage=this._currentIndex>0?this._trajectory[this._currentIndex-1]:null}_setTrajectory(e){if(e.length<1)throw new Lu("Trajectory can not be empty");null!=this._currentImage?(this._trajectory=[this._currentImage].concat(e),this._currentIndex=1):(this._trajectory=e.slice(),this._currentIndex=0)}_setTrajectories(){this._trajectoryTransforms.length=0,this._trajectoryCameras.length=0,this._appendToTrajectories(this._trajectory)}_appendToTrajectories(e){for(let t of e){if(!t.assetsCached)throw new Lu("Assets must be cached when image is added to trajectory");let e=this._imageToTranslation(t,this.reference),i=new ug(t.exifOrientation,t.width,t.height,t.scale,t.rotation,e,t.image,void 0,t.cameraParameters,t.cameraType);this._trajectoryTransforms.push(i),this._trajectoryCameras.push(new Nw(i))}}_prependToTrajectories(e){for(let t of e.reverse()){if(!t.assetsCached)throw new Lu("Assets must be cached when added to trajectory");let e=this._imageToTranslation(t,this.reference),i=new ug(t.exifOrientation,t.width,t.height,t.scale,t.rotation,e,t.image,void 0,t.cameraParameters,t.cameraType);this._trajectoryTransforms.unshift(i),this._trajectoryCameras.unshift(new Nw(i))}}_imageToTranslation(e,t){return Ou({alt:e.computedAltitude,lat:e.lngLat.lat,lng:e.lngLat.lng},e.rotation,t)}_sameConnectedComponent(){let e=this._currentImage,t=this._previousImage;return!!e&&!!t&&e.mergeId===t.mergeId}_withinOriginalDistance(){let e=this._currentImage,t=this._previousImage;return!e||!t||this._spatial.distanceFromLngLat(e.originalLngLat.lng,e.originalLngLat.lat,t.originalLngLat.lng,t.originalLngLat.lat)<25}}class Qw extends Kw{constructor(e){super(e)}setViewMatrix(e){const t=(new Rn).fromArray(e).invert().elements,i=new Ki(t[12],t[13],t[14]),n=new Ki(-t[8],-t[9],-t[10]),r=new Ki(t[4],t[5],t[6]),s=this._camera;s.position.copy(i),s.lookat.copy(i.clone().add(n)),s.up.copy(r);const a=.5/Math.tan(Math.PI/3);s.focal=a}}class eM extends Kw{constructor(e){super(e),this._transition=0;const t=this._camera.position.clone(),i=this._camera.lookat.clone().sub(t).normalize(),n=Math.sqrt(i.x*i.x+i.y*i.y),r=Math.atan2(i.z,n),s=new Ki;if(r>-Math.PI/45)s.copy(t),t.add(new Ki(i.x,i.y,0).multiplyScalar(-50)),t.z=30;else{const e=t.clone(),n=new Ki(0,0,1),r=new Ki(0,0,-2),a=(new Ki).subVectors(r,e).dot(n)/i.dot(n),o=1e4,h=e.clone().add(i.clone().multiplyScalar(Math.min(o,a)));s.copy(h);const c=t.clone().sub(h).normalize();t.copy(h.add(c.multiplyScalar(Math.max(50,c.length()))))}const a=this._camera.position.clone(),o=a.clone().add(i.clone().normalize().multiplyScalar(10)),h=this._camera.up.clone(),c=o.clone(),l=c.clone().add(i.clone().normalize().multiplyScalar(10)),u=h.clone(),d=t.clone(),p=s.clone(),m=new Ki(0,0,1),f=t.clone().add(p.clone().sub(d).normalize().multiplyScalar(-10)),g=p.clone(),_=m.clone();this._curveE=new dc([c,a,d,f]),this._curveL=new dc([l,o,p,g]),this._curveU=new dc([u,h,m,_]),this._zoom0=this._zoom,this._zoom1=0,this._camera.focal=.5/Math.tan(Math.PI/4)}get _isTransitioning(){return this._transition<1}dolly(e){if(this._isTransitioning)return;const t=this._camera,i=t.position.clone().sub(t.lookat),n=i.length()*Math.pow(2,-e),r=Math.max(1,Math.min(n,4e3));i.normalize(),i.multiplyScalar(r),t.position.copy(t.lookat).add(i)}orbit(e){if(this._isTransitioning)return;const t=this._camera,i=(new Ji).setFromUnitVectors(t.up,new Ki(0,0,1)),n=i.clone().invert(),r=t.position.clone().sub(t.lookat);r.applyQuaternion(i);const s=r.length();let a=Math.atan2(r.y,r.x);a+=e.phi;let o=Math.atan2(Math.sqrt(r.x*r.x+r.y*r.y),r.z);o+=e.theta;const h=Math.PI/36;o=Math.max(h,Math.min(Math.PI/2-h,o)),r.x=Math.sin(o)*Math.cos(a),r.y=Math.sin(o)*Math.sin(a),r.z=Math.cos(o),r.applyQuaternion(n),t.position.copy(t.lookat).add(r.multiplyScalar(s))}truck(e){if(this._isTransitioning)return;const t=this._camera;t.position.add((new Ki).fromArray(e)),t.lookat.add((new Ki).fromArray(e))}update(e){if(!this._isTransitioning)return;this._transition=Math.min(this._transition+2*e/3,1);const t=Oi.smootherstep(this._transition,0,1),i=(t+1)/3,n=this._curveE.getPoint(i),r=this._curveL.getPoint(i),s=this._curveU.getPoint(i);this._camera.position.copy(n),this._camera.lookat.copy(r),this._camera.up.copy(s),this._zoom=Oi.lerp(this._zoom0,this._zoom1,t),this._stateTransitionAlpha=t}_getStateTransitionAlpha(){return this._stateTransitionAlpha}}class tM{constructor(e,t){this._phi=e,this._theta=t}get phi(){return this._phi}set phi(e){this._phi=e}get theta(){return this._theta}set theta(e){this._theta=e}get isZero(){return 0===this._phi&&0===this._theta}copy(e){this._phi=e.phi,this._theta=e.theta}lerp(e,t){this._phi=(1-t)*this._phi+t*e.phi,this._theta=(1-t)*this._theta+t*e.theta}multiply(e){this._phi*=e,this._theta*=e}threshold(e){this._phi=Math.abs(this._phi)>e?this._phi:0,this._theta=Math.abs(this._theta)>e?this._theta:0}lengthSquared(){return this._phi*this._phi+this._theta*this._theta}reset(){this._phi=0,this._theta=0}}class iM extends Kw{constructor(e){super(e),this._animationSpeed=1/40,this._rotationDelta=new tM(0,0),this._requestedRotationDelta=null,this._basicRotation=[0,0],this._requestedBasicRotation=null,this._requestedBasicRotationUnbounded=null,this._rotationAcceleration=.86,this._rotationIncreaseAlpha=.97,this._rotationDecreaseAlpha=.9,this._rotationThreshold=.001,this._unboundedRotationAlpha=.8,this._desiredZoom=e.zoom,this._minZoom=0,this._maxZoom=3,this._lookatDepth=10,this._desiredLookat=null,this._desiredCenter=null}rotate(e){null!=this._currentImage&&(0===e.phi&&0===e.theta||(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,null!=this._requestedRotationDelta?(this._requestedRotationDelta.phi=this._requestedRotationDelta.phi+e.phi,this._requestedRotationDelta.theta=this._requestedRotationDelta.theta+e.theta):this._requestedRotationDelta=new tM(e.phi,e.theta)))}rotateUnbounded(e){if(null==this._currentImage)return;if(this._requestedBasicRotation=null,this._requestedRotationDelta=null,this._applyRotation(e,this._currentCamera),this._applyRotation(e,this._previousCamera),!this._desiredLookat)return;const t=(new Ji).setFromUnitVectors(this._currentCamera.up,new Ki(0,0,1)),i=t.clone().invert(),n=(new Ki).copy(this._desiredLookat).sub(this._camera.position).applyQuaternion(t),r=n.length();let s=Math.atan2(n.y,n.x);s+=e.phi;let a=Math.atan2(Math.sqrt(n.x*n.x+n.y*n.y),n.z);a+=e.theta,a=Math.max(.1,Math.min(Math.PI-.1,a)),n.x=Math.sin(a)*Math.cos(s),n.y=Math.sin(a)*Math.sin(s),n.z=Math.cos(a),n.applyQuaternion(i),this._desiredLookat.copy(this._camera.position).add(n.multiplyScalar(r))}rotateWithoutInertia(e){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedBasicRotation=null,this._requestedRotationDelta=null;const t=Math.PI/(10*Math.pow(2,this._zoom)),i={phi:this._spatial.clamp(e.phi,-t,t),theta:this._spatial.clamp(e.theta,-t,t)};this._applyRotation(i,this._currentCamera),this._applyRotation(i,this._previousCamera)}rotateBasic(e){if(null!=this._currentImage)if(this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,null!=this._requestedBasicRotation){this._requestedBasicRotation[0]+=e[0],this._requestedBasicRotation[1]+=e[1];let t=.05/Math.pow(2,this._zoom);this._requestedBasicRotation[0]=this._spatial.clamp(this._requestedBasicRotation[0],-t,t),this._requestedBasicRotation[1]=this._spatial.clamp(this._requestedBasicRotation[1],-t,t)}else this._requestedBasicRotation=e.slice()}rotateBasicUnbounded(e){null!=this._currentImage&&(null!=this._requestedBasicRotationUnbounded?(this._requestedBasicRotationUnbounded[0]+=e[0],this._requestedBasicRotationUnbounded[1]+=e[1]):this._requestedBasicRotationUnbounded=e.slice())}rotateBasicWithoutInertia(e){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null;const t=.05/Math.pow(2,this._zoom),i=e.slice();i[0]=this._spatial.clamp(i[0],-t,t),i[1]=this._spatial.clamp(i[1],-t,t),this._applyRotationBasic(i)}rotateToBasic(e){if(null==this._currentImage)return;this._desiredZoom=this._zoom,this._desiredLookat=null,e[0]=this._spatial.clamp(e[0],0,1),e[1]=this._spatial.clamp(e[1],0,1);let t=this.currentTransform.unprojectBasic(e,this._lookatDepth);this._currentCamera.lookat.fromArray(t)}zoomIn(e,t){if(null==this._currentImage)return;this._desiredZoom=Math.max(this._minZoom,Math.min(this._maxZoom,this._desiredZoom+e));let i=this.currentTransform.projectBasic(this._currentCamera.lookat.toArray()),n=i[0],r=i[1],s=Math.pow(2,this._zoom),a=Math.pow(2,this._desiredZoom),o=t[0],h=t[1];$u(this.currentTransform.cameraType)&&(o-n>.5?o-=1:n-o>.5&&(o=1+o));let c=o-s/a*(o-n),l=h-s/a*(h-r);$u(this._currentImage.cameraType)?(c=this._spatial.wrap(c+this._basicRotation[0],0,1),l=this._spatial.clamp(l+this._basicRotation[1],.05,.95)):(c=this._spatial.clamp(c,0,1),l=this._spatial.clamp(l,0,1)),this._desiredLookat=(new Ki).fromArray(this.currentTransform.unprojectBasic([c,l],this._lookatDepth))}setCenter(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._desiredZoom=this._zoom;let t=[this._spatial.clamp(e[0],0,1),this._spatial.clamp(e[1],0,1)];if(null==this._currentImage)return void(this._desiredCenter=t);this._desiredCenter=null;let i=(new Ki).fromArray(this.currentTransform.unprojectBasic(t,this._lookatDepth)),n=null!=this.previousTransform?this.previousTransform:this.currentTransform,r=(new Ki).fromArray(n.unprojectBasic(t,this._lookatDepth));this._currentCamera.lookat.copy(i),this._previousCamera.lookat.copy(r)}setZoom(e){this._desiredLookat=null,this._requestedRotationDelta=null,this._requestedBasicRotation=null,this._zoom=this._spatial.clamp(e,this._minZoom,this._maxZoom),this._desiredZoom=this._zoom}_applyRotation(e,t){if(null==t)return;let i=(new Ji).setFromUnitVectors(t.up,new Ki(0,0,1)),n=i.clone().invert(),r=new Ki;r.copy(t.lookat).sub(t.position),r.applyQuaternion(i);let s=r.length(),a=Math.atan2(r.y,r.x);a+=e.phi;let o=Math.atan2(Math.sqrt(r.x*r.x+r.y*r.y),r.z);o+=e.theta,o=Math.max(.1,Math.min(Math.PI-.1,o)),r.x=Math.sin(o)*Math.cos(a),r.y=Math.sin(o)*Math.sin(a),r.z=Math.cos(o),r.applyQuaternion(n),t.lookat.copy(t.position).add(r.multiplyScalar(s))}_applyRotationBasic(e){let t=this._currentImage,i=null!=this._previousImage?this.previousImage:this.currentImage,n=this._currentCamera,r=this._previousCamera,s=this.currentTransform,a=null!=this.previousTransform?this.previousTransform:this.currentTransform,o=s.projectBasic(n.lookat.toArray()),h=a.projectBasic(r.lookat.toArray());$u(t.cameraType)?(o[0]=this._spatial.wrap(o[0]+e[0],0,1),o[1]=this._spatial.clamp(o[1]+e[1],.05,.95)):(o[0]=this._spatial.clamp(o[0]+e[0],0,1),o[1]=this._spatial.clamp(o[1]+e[1],0,1)),$u(i.cameraType)?(h[0]=this._spatial.wrap(h[0]+e[0],0,1),h[1]=this._spatial.clamp(h[1]+e[1],.05,.95)):(h[0]=this._spatial.clamp(h[0]+e[0],0,1),h[1]=this._spatial.clamp(o[1]+e[1],0,1));let c=s.unprojectBasic(o,this._lookatDepth);n.lookat.fromArray(c);let l=a.unprojectBasic(h,this._lookatDepth);r.lookat.fromArray(l)}_updateZoom(e){let t=this._desiredZoom-this._zoom,i=t>0?1:t<0?-1:0;0!==t&&(Math.abs(t)<.002?(this._zoom=this._desiredZoom,null!=this._desiredLookat&&(this._desiredLookat=null)):this._zoom+=i*Math.max(Math.abs(5*e*t),.002))}_updateLookat(e){if(null===this._desiredLookat)return;let t=this._desiredLookat.distanceToSquared(this._currentCamera.lookat);Math.abs(t)<1e-6?(this._currentCamera.lookat.copy(this._desiredLookat),this._desiredLookat=null):this._currentCamera.lookat.lerp(this._desiredLookat,5*e)}_updateRotation(){if(null!=this._requestedRotationDelta){let e=this._rotationDelta.lengthSquared();return this._requestedRotationDelta.lengthSquared()>e?this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationIncreaseAlpha):this._rotationDelta.lerp(this._requestedRotationDelta,this._rotationDecreaseAlpha),void(this._requestedRotationDelta=null)}if(this._rotationDelta.isZero)return;const e=$u(this.currentImage.cameraType)?1:this._alpha;this._rotationDelta.multiply(this._rotationAcceleration*e),this._rotationDelta.threshold(this._rotationThreshold)}_updateRotationBasic(){if(null!=this._requestedBasicRotation){let e=this._basicRotation[0],t=this._basicRotation[1],i=this._requestedBasicRotation[0],n=this._requestedBasicRotation[1];return Math.abs(i)>Math.abs(e)?this._basicRotation[0]=(1-this._rotationIncreaseAlpha)*e+this._rotationIncreaseAlpha*i:this._basicRotation[0]=(1-this._rotationDecreaseAlpha)*e+this._rotationDecreaseAlpha*i,Math.abs(n)>Math.abs(t)?this._basicRotation[1]=(1-this._rotationIncreaseAlpha)*t+this._rotationIncreaseAlpha*n:this._basicRotation[1]=(1-this._rotationDecreaseAlpha)*t+this._rotationDecreaseAlpha*n,void(this._requestedBasicRotation=null)}if(null!=this._requestedBasicRotationUnbounded){let e=this._requestedBasicRotationUnbounded[0],t=this._requestedBasicRotationUnbounded[1];if(Math.abs(e)>0&&(this._basicRotation[0]=(1-this._unboundedRotationAlpha)*this._basicRotation[0]+this._unboundedRotationAlpha*e),Math.abs(t)>0&&(this._basicRotation[1]=(1-this._unboundedRotationAlpha)*this._basicRotation[1]+this._unboundedRotationAlpha*t),null!=this._desiredLookat){let i=this.currentTransform.projectBasic(this._desiredLookat.toArray());i[0]+=e,i[1]+=t,this._desiredLookat=(new Ki).fromArray(this.currentTransform.unprojectBasic(i,this._lookatDepth))}this._requestedBasicRotationUnbounded=null}0===this._basicRotation[0]&&0===this._basicRotation[1]||(this._basicRotation[0]=this._rotationAcceleration*this._basicRotation[0],this._basicRotation[1]=this._rotationAcceleration*this._basicRotation[1],Math.abs(this._basicRotation[0])<this._rotationThreshold/Math.pow(2,this._zoom)&&Math.abs(this._basicRotation[1])<this._rotationThreshold/Math.pow(2,this._zoom)&&(this._basicRotation=[0,0]))}_clearRotation(){$u(this._currentImage.cameraType)||(null!=this._requestedRotationDelta&&(this._requestedRotationDelta=null),this._rotationDelta.isZero||this._rotationDelta.reset(),null!=this._requestedBasicRotation&&(this._requestedBasicRotation=null),(this._basicRotation[0]>0||this._basicRotation[1]>0)&&(this._basicRotation=[0,0]))}_setDesiredCenter(){if(null==this._desiredCenter)return;let e=(new Ki).fromArray(this.currentTransform.unprojectBasic(this._desiredCenter,this._lookatDepth)).sub(this._currentCamera.position);this._currentCamera.lookat.copy(this._currentCamera.position.clone().add(e)),this._previousCamera.lookat.copy(this._previousCamera.position.clone().add(e)),this._desiredCenter=null}_setDesiredZoom(){this._desiredZoom=$u(this._currentImage.cameraType)||null==this._previousImage?this._zoom:0}}class nM extends iM{constructor(e){super(e),this._adjustCameras(),this._motionless=this._motionlessTransition()}prepend(e){super.prepend(e),this._motionless=this._motionlessTransition()}set(e){super.set(e),this._motionless=this._motionlessTransition()}move(e){this._alpha=Math.max(0,Math.min(1,this._alpha+e))}moveTo(e){this._alpha=Math.max(0,Math.min(1,e))}update(e){this._updateRotation(),this._rotationDelta.isZero||(this._applyRotation(this._rotationDelta,this._previousCamera),this._applyRotation(this._rotationDelta,this._currentCamera)),this._updateRotationBasic(),0===this._basicRotation[0]&&0===this._basicRotation[1]||this._applyRotationBasic(this._basicRotation);let t=this._animationSpeed*e/.1*6;this._updateZoom(t),this._updateLookat(t),this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)}_getAlpha(){return this._motionless?Math.round(this._alpha):this._alpha}_setCurrentCamera(){super._setCurrentCamera(),this._adjustCameras()}_adjustCameras(){if(null!=this._previousImage){if($u(this._currentImage.cameraType)){let e=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}if($u(this._previousImage.cameraType)){let e=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position))}}}}class rM extends iM{constructor(e){super(e),this._adjustCameras(),this._motionless=this._motionlessTransition(),this._baseAlpha=this._alpha,this._speedCoefficient=1,this._smoothing=!1}append(e){let t=0===this._trajectory.length;t&&this._resetTransition(),super.append(e),t&&(this._setDesiredCenter(),this._setDesiredZoom())}prepend(e){let t=0===this._trajectory.length;t&&this._resetTransition(),super.prepend(e),t&&(this._setDesiredCenter(),this._setDesiredZoom())}set(e){super.set(e),this._desiredLookat=null,this._resetTransition(),this._clearRotation(),this._setDesiredCenter(),this._setDesiredZoom(),this._trajectory.length<3&&(this._smoothing=!0)}setSpeed(e){this._speedCoefficient=this._spatial.clamp(e,0,10)}update(e){1===this._alpha&&this._currentIndex+this._alpha<this._trajectory.length&&(this._currentIndex+=1,this._smoothing=this._trajectory.length<3&&this._currentIndex+1===this._trajectory.length,this._setCurrent(),this._resetTransition(),this._clearRotation(),this._desiredZoom=$u(this._currentImage.cameraType)?this._zoom:0,this._desiredLookat=null);let t=this._animationSpeed*e/.1*6;this._baseAlpha=Math.min(1,this._baseAlpha+this._speedCoefficient*t),this._smoothing?this._alpha=Oi.smootherstep(this._baseAlpha,0,1):this._alpha=this._baseAlpha,this._updateRotation(),this._rotationDelta.isZero||(this._applyRotation(this._rotationDelta,this._previousCamera),this._applyRotation(this._rotationDelta,this._currentCamera)),this._updateRotationBasic(),0===this._basicRotation[0]&&0===this._basicRotation[1]||this._applyRotationBasic(this._basicRotation),this._updateZoom(t),this._updateLookat(t),this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)}_getAlpha(){return this._motionless?Math.ceil(this._alpha):this._alpha}_setCurrentCamera(){super._setCurrentCamera(),this._adjustCameras()}_adjustCameras(){if(null==this._previousImage)return;let e=this._camera.lookat.clone().sub(this._camera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position)),$u(this._currentImage.cameraType)&&this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}_resetTransition(){this._alpha=0,this._baseAlpha=0,this._motionless=this._motionlessTransition()}}class sM extends Kw{constructor(e){super(e),this._zoom=0,this._adjustCameras(),this._motionless=this._motionlessTransition()}prepend(e){super.prepend(e),this._motionless=this._motionlessTransition()}set(e){super.set(e),this._motionless=this._motionlessTransition()}move(e){this._alpha=Math.max(0,Math.min(1,this._alpha+e))}moveTo(e){this._alpha=Math.max(0,Math.min(1,e))}update(){this._camera.lerpCameras(this._previousCamera,this._currentCamera,this.alpha)}_getAlpha(){return this._motionless?Math.round(this._alpha):this._alpha}_setCurrentCamera(){super._setCurrentCamera(),this._adjustCameras()}_adjustCameras(){if(null!=this._previousImage){if($u(this._currentImage.cameraType)){let e=this._camera.lookat.clone().sub(this._camera.position);this._currentCamera.lookat.copy(e.clone().add(this._currentCamera.position))}if($u(this._previousImage.cameraType)){let e=this._currentCamera.lookat.clone().sub(this._currentCamera.position);this._previousCamera.lookat.copy(e.clone().add(this._previousCamera.position))}}}}class aM{constructor(){const e=Df[Df.Custom],t=Df[Df.Earth],i=Df[Df.Traversing],n=Df[Df.Waiting],r=Df[Df.WaitingInteractively];this._creators=new Map;const s=this._creators;s.set(e,Qw),s.set(t,eM),s.set(i,rM),s.set(n,sM),s.set(r,nM),this._transitions=new Map;const a=this._transitions;a.set(e,[t,i]),a.set(t,[e,i]),a.set(i,[e,t,n,r]),a.set(n,[i,r]),a.set(r,[i,n])}getState(e){if(e instanceof Qw)return Df.Custom;if(e instanceof eM)return Df.Earth;if(e instanceof rM)return Df.Traversing;if(e instanceof sM)return Df.Waiting;if(e instanceof nM)return Df.WaitingInteractively;throw new Error("Invalid state instance")}generate(e,t){return new(this._creators.get(Df[e]))(t)}transition(e,t){if(!this.validate(e,t))throw new Error("Invalid transition");return this.generate(t,e)}validate(e,t){const i=Df[this.getState(e)],n=Df[t],r=this._transitions;return r.has(i)&&r.get(i).includes(n)}}class oM{constructor(t,i){this._transitions=new aM,this._state=this._transitions.generate(t,{alpha:1,camera:new Nw,currentIndex:-1,reference:{alt:0,lat:0,lng:0},trajectory:[],transitionMode:null==i?e.TransitionMode.Default:i,zoom:0})}get state(){return this._transitions.getState(this._state)}get reference(){return this._state.reference}get alpha(){return this._state.alpha}get stateTransitionAlpha(){return this._state.stateTransitionAlpha}get camera(){return this._state.camera}get zoom(){return this._state.zoom}get currentImage(){return this._state.currentImage}get previousImage(){return this._state.previousImage}get currentCamera(){return this._state.currentCamera}get currentTransform(){return this._state.currentTransform}get previousTransform(){return this._state.previousTransform}get trajectory(){return this._state.trajectory}get currentIndex(){return this._state.currentIndex}get lastImage(){return this._state.trajectory[this._state.trajectory.length-1]}get imagesAhead(){return this._state.trajectory.length-1-this._state.currentIndex}get motionless(){return this._state.motionless}custom(){this._transition(Df.Custom)}earth(){this._transition(Df.Earth)}traverse(){this._transition(Df.Traversing)}wait(){this._transition(Df.Waiting)}waitInteractively(){this._transition(Df.WaitingInteractively)}getCenter(){return this._state.getCenter()}setCenter(e){this._state.setCenter(e)}setZoom(e){this._state.setZoom(e)}update(e){this._state.update(e)}append(e){this._state.append(e)}prepend(e){this._state.prepend(e)}remove(e){this._state.remove(e)}clear(){this._state.clear()}clearPrior(){this._state.clearPrior()}cut(){this._state.cut()}set(e){this._state.set(e)}setViewMatrix(e){this._state.setViewMatrix(e)}rotate(e){this._state.rotate(e)}rotateUnbounded(e){this._state.rotateUnbounded(e)}rotateWithoutInertia(e){this._state.rotateWithoutInertia(e)}rotateBasic(e){this._state.rotateBasic(e)}rotateBasicUnbounded(e){this._state.rotateBasicUnbounded(e)}rotateBasicWithoutInertia(e){this._state.rotateBasicWithoutInertia(e)}rotateToBasic(e){this._state.rotateToBasic(e)}move(e){this._state.move(e)}moveTo(e){this._state.moveTo(e)}zoomIn(e,t){this._state.zoomIn(e,t)}setSpeed(e){this._state.setSpeed(e)}setTransitionMode(e){this._state.setTransitionMode(e)}dolly(e){this._state.dolly(e)}orbit(e){this._state.orbit(e)}truck(e){this._state.truck(e)}_transition(e){if(!this._transitions.validate(this._state,e)){const t=this._transitions.getState(this._state);return void console.warn(`Transition not valid (${Df[t]} - ${Df[e]})`)}const t=this._transitions.transition(this._state,e);this._state=t}}class hM{constructor(e,t){this._appendImage$=new j,this._clock=new jl,this._subscriptions=new rf;const i=this._subscriptions;this._start$=new j,this._frame$=new j,this._contextOperation$=new W((e=>e)),this._context$=this._contextOperation$.pipe(Lt(((e,t)=>t(e)),new oM(e,t)),Rt(1),U()),this._state$=this._context$.pipe(De((e=>e.state)),vt(),Rt(1),U()),this._currentState$=this._frame$.pipe(Vt(this._context$,((e,t)=>[e,t])),st((e=>null!=e[1].currentImage)),Ut((e=>{e[1].update(this._clock.getDelta())})),De((e=>({fps:60,id:e[0],state:e[1]}))),Dt()),this._lastState$=this._currentState$.pipe(Rt(1),U());let n=this._currentState$.pipe(vt(void 0,(e=>e.state.currentImage.id)),Rt(1),U()),r=new j;i.push(n.subscribe(r)),this._currentId$=new W(null),i.push(r.pipe(De((e=>e.state.currentImage.id))).subscribe(this._currentId$)),this._currentImage$=r.pipe(De((e=>e.state.currentImage)),Rt(1),U()),this._currentCamera$=r.pipe(De((e=>e.state.currentCamera)),Rt(1),U()),this._currentTransform$=r.pipe(De((e=>e.state.currentTransform)),Rt(1),U()),this._reference$=r.pipe(De((e=>e.state.reference)),vt(((e,t)=>e.lat===t.lat&&e.lng===t.lng),(e=>({lat:e.lat,lng:e.lng}))),Rt(1),U()),this._currentImageExternal$=n.pipe(De((e=>e.state.currentImage)),Rt(1),U()),i.push(this._appendImage$.pipe(De((e=>t=>(t.append([e]),t)))).subscribe(this._contextOperation$)),this._inMotionOperation$=new j,i.push(n.pipe(De((()=>!0))).subscribe(this._inMotionOperation$)),i.push(this._inMotionOperation$.pipe(vt(),st((e=>e)),zt((()=>this._currentState$.pipe(st((e=>0===e.state.imagesAhead)),De((e=>[e.state.camera.clone(),e.state.zoom])),At(),De((e=>{let t=e[0][0],i=e[1][0],n=e[0][1],r=e[1][1];return t.diff(i)>1e-5||Math.abs(n-r)>1e-5})),St((e=>!e)))))).subscribe(this._inMotionOperation$)),this._inMotion$=this._inMotionOperation$.pipe(vt(),Rt(1),U()),this._inTranslationOperation$=new j,i.push(n.pipe(De((()=>!0))).subscribe(this._inTranslationOperation$)),i.push(this._inTranslationOperation$.pipe(vt(),st((e=>e)),zt((()=>this._currentState$.pipe(st((e=>0===e.state.imagesAhead)),De((e=>e.state.camera.position.clone())),At(),De((e=>0!==e[0].distanceToSquared(e[1]))),St((e=>!e)))))).subscribe(this._inTranslationOperation$)),this._inTranslation$=this._inTranslationOperation$.pipe(vt(),Rt(1),U()),i.push(this._state$.subscribe((()=>{}))),i.push(this._currentImage$.subscribe((()=>{}))),i.push(this._currentCamera$.subscribe((()=>{}))),i.push(this._currentTransform$.subscribe((()=>{}))),i.push(this._reference$.subscribe((()=>{}))),i.push(this._currentImageExternal$.subscribe((()=>{}))),i.push(this._lastState$.subscribe((()=>{}))),i.push(this._inMotion$.subscribe((()=>{}))),i.push(this._inTranslation$.subscribe((()=>{}))),this._frameId=null,this._frameGenerator=new Jw(window)}get currentState$(){return this._currentState$}get currentImage$(){return this._currentImage$}get currentId$(){return this._currentId$}get currentImageExternal$(){return this._currentImageExternal$}get currentCamera$(){return this._currentCamera$}get currentTransform$(){return this._currentTransform$}get state$(){return this._state$}get reference$(){return this._reference$}get inMotion$(){return this._inMotion$}get inTranslation$(){return this._inTranslation$}get appendImage$(){return this._appendImage$}dispose(){this.stop(),this._subscriptions.unsubscribe()}custom(){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.custom()}))}earth(){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.earth()}))}traverse(){this._inMotionOperation$.next(!0),this._invokeContextOperation((e=>{e.traverse()}))}wait(){this._invokeContextOperation((e=>{e.wait()}))}waitInteractively(){this._invokeContextOperation((e=>{e.waitInteractively()}))}appendImagess(e){this._invokeContextOperation((t=>{t.append(e)}))}prependImages(e){this._invokeContextOperation((t=>{t.prepend(e)}))}removeImages(e){this._invokeContextOperation((t=>{t.remove(e)}))}clearImages(){this._invokeContextOperation((e=>{e.clear()}))}clearPriorImages(){this._invokeContextOperation((e=>{e.clearPrior()}))}cutImages(){this._invokeContextOperation((e=>{e.cut()}))}setImages(e){this._invokeContextOperation((t=>{t.set(e)}))}setViewMatrix(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.setViewMatrix(e)}))}rotate(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotate(e)}))}rotateUnbounded(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateUnbounded(e)}))}rotateWithoutInertia(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateWithoutInertia(e)}))}rotateBasic(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateBasic(e)}))}rotateBasicUnbounded(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateBasicUnbounded(e)}))}rotateBasicWithoutInertia(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateBasicWithoutInertia(e)}))}rotateToBasic(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.rotateToBasic(e)}))}move(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.move(e)}))}moveTo(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.moveTo(e)}))}dolly(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.dolly(e)}))}orbit(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.orbit(e)}))}truck(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.truck(e)}))}zoomIn(e,t){this._inMotionOperation$.next(!0),this._invokeContextOperation((i=>{i.zoomIn(e,t)}))}getCenter(){return this._lastState$.pipe(St(),De((e=>e.state.getCenter())))}getZoom(){return this._lastState$.pipe(St(),De((e=>e.state.zoom)))}setCenter(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.setCenter(e)}))}setSpeed(e){this._invokeContextOperation((t=>{t.setSpeed(e)}))}setTransitionMode(e){this._invokeContextOperation((t=>{t.setTransitionMode(e)}))}setZoom(e){this._inMotionOperation$.next(!0),this._invokeContextOperation((t=>{t.setZoom(e)}))}start(){this._clock.start(),null==this._frameId&&(this._start$.next(null),this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId))}stop(){this._clock.stop(),null!=this._frameId&&(this._frameGenerator.cancelAnimationFrame(this._frameId),this._frameId=null)}_invokeContextOperation(e){this._contextOperation$.next((t=>(e(t),t)))}_frame(){this._frameId=this._frameGenerator.requestAnimationFrame(this._frame.bind(this)),this._frame$.next(this._frameId)}}function cM(t){switch(t){case e.CameraControls.Custom:return Df.Custom;case e.CameraControls.Earth:return Df.Earth;case e.CameraControls.Street:return Df.Traversing;default:return null}}class lM{constructor(t,i,n,r,s,a,o,h){var c;i?this._api=i:t.dataProvider?this._api=new Zw(t.dataProvider):this._api=new Zw(new Mw({accessToken:t.accessToken})),this._graphService=null!=n?n:new Yw(new Uu(this.api)),this._loadingName="navigator",this._loadingService=null!=r?r:new Ww;const l=null!==(c=t.cameraControls)&&void 0!==c?c:e.CameraControls.Street;this._stateService=null!=s?s:new hM(cM(l),t.transitionMode),this._cacheService=null!=a?a:new Gw(this._graphService,this._stateService,this._api),this._playService=null!=o?o:new fg(this._graphService,this._stateService),this._panService=null!=h?h:new Xw(this._graphService,this._stateService,t.combinedPanning),this._idRequested$=new W(null),this._movedToId$=new W(null),this._request$=null,this._requestSubscription=null,this._imageRequestSubscription=null}get api(){return this._api}get cacheService(){return this._cacheService}get graphService(){return this._graphService}get loadingService(){return this._loadingService}get movedToId$(){return this._movedToId$}get panService(){return this._panService}get playService(){return this._playService}get stateService(){return this._stateService}dispose(){this._abortRequest("viewer removed"),this._cacheService.stop(),this._graphService.dispose(),this._panService.dispose(),this._playService.dispose(),this._stateService.dispose()}moveTo$(e){this._abortRequest(`to id ${e}`),this._loadingService.startLoading(this._loadingName);const t=this._moveTo$(e);return this._makeRequest$(t)}moveDir$(t){this._abortRequest(`in dir ${e.NavigationDirection[t]}`),this._loadingService.startLoading(this._loadingName);const i=this.stateService.currentImage$.pipe(St(),We((i=>([e.NavigationDirection.Next,e.NavigationDirection.Prev].indexOf(t)>-1?i.sequenceEdges$:i.spatialEdges$).pipe(St(),De((e=>{for(let i of e.edges)if(i.data.direction===t)return i.target;return null}))))),We((e=>null==e?(this._loadingService.stopLoading(this._loadingName),Ee(new Error(`Direction (${t}) does not exist for current image.`))):this._moveTo$(e))));return this._makeRequest$(i)}setFilter$(e){return this._stateService.clearImages(),this._movedToId$.pipe(St(),We((t=>null!=t?this._trajectoryIds$().pipe(We((t=>this._graphService.setFilter$(e).pipe(We((()=>this._cacheIds$(t)))))),Ct()):this._idRequested$.pipe(St(),We((t=>null!=t?this._graphService.setFilter$(e).pipe(We((()=>this._graphService.cacheImage$(t)))):this._graphService.setFilter$(e).pipe(De((()=>{})))))))),De((()=>{})))}setAccessToken$(e){return this._abortRequest("to set user token"),this._stateService.clearImages(),this._movedToId$.pipe(St(),Ut((()=>{this._api.setAccessToken(e)})),We((e=>null==e?this._graphService.reset$([]):this._trajectoryIds$().pipe(We((e=>this._graphService.reset$(e).pipe(We((()=>this._cacheIds$(e)))))),Ct(),De((()=>{}))))))}_cacheIds$(e){return ge(e.map((e=>this._graphService.cacheImage$(e)))).pipe(qe())}_abortRequest(e){null!=this._requestSubscription&&(this._requestSubscription.unsubscribe(),this._requestSubscription=null),null!=this._imageRequestSubscription&&(this._imageRequestSubscription.unsubscribe(),this._imageRequestSubscription=null),null!=this._request$&&(this._request$.isStopped||this._request$.hasError||this._request$.error(new uf(`Request aborted by a subsequent request ${e}.`)),this._request$=null)}_makeRequest$(e){const t=new X(1);return this._requestSubscription=t.subscribe(void 0,(()=>{})),this._request$=t,this._imageRequestSubscription=e.subscribe((e=>{this._request$=null,t.next(e),t.complete()}),(e=>{this._request$=null,t.error(e)})),t}_moveTo$(e){return this._idRequested$.next(e),this._graphService.cacheImage$(e).pipe(Ut((e=>{this._stateService.setImages([e]),this._movedToId$.next(e.id)})),Mt((()=>{this._loadingService.stopLoading(this._loadingName)})))}_trajectoryIds$(){return this._stateService.currentState$.pipe(St(),De((e=>e.state.trajectory.map((e=>e.id)))))}}class uM{constructor(e,t){this._spatial=null!=t?t:new Du,this._viewportCoords=null!=e?e:new hf}basicToCanvas(e,t,i,n){return this._viewportCoords.basicToCanvasSafe(e[0],e[1],t,n,i.perspective)}canvasToBasic(e,t,i,n){let r=this._viewportCoords.canvasToBasic(e[0],e[1],t,n,i.perspective);return(r[0]<0||r[0]>1||r[1]<0||r[1]>1)&&(r=null),r}eventToUnprojection(e,t,i,n,r){const s=this._viewportCoords.canvasPosition(e,t);return this.canvasToUnprojection(s,t,i,n,r)}canvasToUnprojection(e,t,i,n,r){const s=e[0],a=e[1],[o,h]=this._viewportCoords.canvasToViewport(s,a,t),c=new Ki(o,h,1).unproject(i.perspective);let l=r.projectBasic(c.toArray());(l[0]<0||l[0]>1||l[1]<0||l[1]>1)&&(l=null);const u=c.clone().sub(i.camera.position).normalize(),d=-2/u.z;let p=null;if(d>0&&d<100&&l){const e=u.clone().multiplyScalar(d).add(i.camera.position),[t,r]=vu(e.x,e.y,e.z,n.lng,n.lat,n.alt);p={lat:r,lng:t}}return{basicPoint:l,lngLat:p,pixelPoint:[s,a]}}cameraToLngLat(e,t){const i=e.camera.position,[n,r]=vu(i.x,i.y,i.z,t.lng,t.lat,t.alt);return{lat:r,lng:n}}lngLatToCanvas(e,t,i,n){const r=_u(e.lng,e.lat,0,n.lng,n.lat,n.alt);return this._viewportCoords.projectToCanvasSafe(r,t,i.perspective)}distanceBetweenLngLats(e,t){return this._spatial.distanceFromLngLat(e.lng,e.lat,t.lng,t.lat)}}class dM{constructor(e,t,i){this._subscriptions=new rf,this._emitSubscriptions=new rf,this._container=i,this._viewer=e,this._navigator=t,this._projection=new uM,this._started=!1,this._navigable$=new j;const n=this._subscriptions;n.push(this._navigable$.subscribe((e=>{const t="navigable",i={navigable:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),n.push(this._navigator.loadingService.loading$.subscribe((e=>{const t="dataloading",i={loading:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),n.push(this._container.glRenderer.opaqueRender$.pipe(St()).subscribe((()=>{const e="load",t={target:this._viewer,type:e};this._viewer.fire(e,t)})))}get started(){return this._started}get navigable$(){return this._navigable$}get projection(){return this._projection}dispose(){this.stopEmit(),this._subscriptions.unsubscribe()}project$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentImage$,this._navigator.stateService.reference$).pipe(St(),De((([t,i,n])=>{if(this._projection.distanceBetweenLngLats(e,i.lngLat)>1e3)return null;const r=this._projection.lngLatToCanvas(e,this._container.container,t,n);return r?[Math.round(r[0]),Math.round(r[1])]:null})))}projectBasic$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(St(),De((([t,i])=>{const n=this._projection.basicToCanvas(e,this._container.container,t,i);return n?[Math.round(n[0]),Math.round(n[1])]:null})))}startEmit(){if(this._started)return;this._started=!0;const e=this._emitSubscriptions;e.push(this._navigator.stateService.currentImageExternal$.subscribe((e=>{const t="image",i={image:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._navigator.stateService.currentImageExternal$.pipe(zt((e=>e.sequenceEdges$))).subscribe((e=>{const t="sequenceedges",i={status:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._navigator.stateService.currentImageExternal$.pipe(zt((e=>e.spatialEdges$))).subscribe((e=>{const t="spatialedges",i={status:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._navigator.stateService.reference$.subscribe((e=>{const t="reference",i={reference:e,target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(Ve(this._navigator.stateService.inMotion$,this._container.mouseService.active$,this._container.touchService.active$).pipe(De((e=>e[0]||e[1]||e[2])),vt()).subscribe((e=>{const t=e?"movestart":"moveend",i={target:this._viewer,type:t};this._viewer.fire(t,i)}))),e.push(this._container.renderService.bearing$.pipe(ot(100),vt(((e,t)=>Math.abs(t-e)<1))).subscribe((e=>{const t="bearing",i={bearing:e,target:this._viewer,type:t};this._viewer.fire(t,i)})));const t=this._container.mouseService.active$.pipe(zt((e=>e?ie():this._container.mouseService.mouseMove$)));e.push(it(this._mapMouseEvent$("click",this._container.mouseService.staticClick$),this._mapMouseEvent$("contextmenu",this._container.mouseService.contextMenu$),this._mapMouseEvent$("dblclick",this._container.mouseService.dblClick$),this._mapMouseEvent$("mousedown",this._container.mouseService.mouseDown$),this._mapMouseEvent$("mousemove",t),this._mapMouseEvent$("mouseout",this._container.mouseService.mouseOut$),this._mapMouseEvent$("mouseover",this._container.mouseService.mouseOver$),this._mapMouseEvent$("mouseup",this._container.mouseService.mouseUp$)).pipe(Vt(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$,this._navigator.stateService.state$),De((([[e,t],i,n,r,s])=>{const a=this._projection.eventToUnprojection(t,this._container.container,i,n,r);return{basicPoint:s===Df.Traversing?a.basicPoint:null,lngLat:a.lngLat,originalEvent:t,pixelPoint:a.pixelPoint,target:this._viewer,type:e}}))).subscribe((e=>{this._viewer.fire(e.type,e)}))),e.push(this._container.renderService.renderCamera$.pipe(vt((([e,t],[i,n])=>this._closeTo(e,i,.01)&&this._closeTo(t,n,.01)),(e=>e.camera.position.toArray()))).subscribe((()=>{const e="position",t={target:this._viewer,type:e};this._viewer.fire(e,t)}))),e.push(this._container.renderService.renderCamera$.pipe(vt((([e,t],[i,n])=>this._closeTo(e,i,.001)&&this._closeTo(t,n,.001)),(e=>[e.rotation.phi,e.rotation.theta]))).subscribe((()=>{const e={target:this._viewer,type:"pov"};this._viewer.fire("pov",e)}))),e.push(this._container.renderService.renderCamera$.pipe(vt(((e,t)=>this._closeTo(e,t,.01)),(e=>e.perspective.fov))).subscribe((()=>{const e={target:this._viewer,type:"fov"};this._viewer.fire("fov",e)})))}stopEmit(){this.started&&(this._emitSubscriptions.unsubscribe(),this._started=!1)}unproject$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.currentTransform$).pipe(St(),De((([t,i,n])=>this._projection.canvasToUnprojection(e,this._container.container,t,i,n).lngLat)))}unprojectBasic$(e){return Ve(this._container.renderService.renderCamera$,this._navigator.stateService.currentTransform$).pipe(St(),De((([t,i])=>this._projection.canvasToBasic(e,this._container.container,t,i))))}_closeTo(e,t,i){return Math.abs(e-t)<=i}_mapMouseEvent$(e,t){return t.pipe(De((t=>[e,t])))}}class pM{constructor(e,t){this._container=e,this._navigator=t,this._renderers={}}add(e,t){const i=new rf;this._renderers[e.id]={subs:i,renderer:e},i.push(Ve([this._container.glRenderer.webGLRenderer$,this._navigator.stateService.reference$]).pipe(_t(1)).subscribe((([i,n])=>{e.onAdd(t,n,i.getContext())}))),i.push(this._container.glRenderer.opaqueRender$.pipe(Vt(this._container.renderService.renderCamera$,this._container.glRenderer.webGLRenderer$)).subscribe((([,t,i])=>{const n=i.getContext(),r=t.perspective.matrixWorldInverse,s=t.perspective.projectionMatrix;e.render(n,r.toArray(),s.toArray())}))),i.push(this._navigator.stateService.reference$.pipe($t(1)).subscribe((i=>{e.onReference(t,i)})))}dispose(e){for(const t of Object.keys(this._renderers))this.remove(t,e)}has(e){return e in this._renderers}remove(e,t){this._renderers[e].subs.unsubscribe();const i=this._renderers[e].renderer;delete this._renderers[e],this._container.glRenderer.webGLRenderer$.subscribe((e=>{i.onRemove(t,e.getContext())}))}}class mM{constructor(e,t){this._container=e,this._navigator=t,this._controls=null,this._subscriptions=new rf}attach(e,t){if(this._controls)throw new Pu("Custom camera controls already attached");this._controls=e;const i=new j,n=i.pipe(zt((()=>this._navigator.stateService.state$)),De((e=>e===Df.Custom)),vt()),r=this._subscriptions;r.push(n.pipe(Ot(!1),At(),Vt(this._navigator.stateService.reference$,this._container.renderService.renderCamera$)).subscribe((([[i,n],r,s])=>{n?e.onActivate(t,s.perspective.matrixWorldInverse.toArray(),s.perspective.projectionMatrix.toArray(),r):i&&e.onDeactivate(t)}))),r.push(n.pipe(zt((e=>e?this._navigator.stateService.currentState$.pipe($t(1)):ie()))).subscribe((i=>{e.onAnimationFrame(t,i.id)}))),r.push(n.pipe(zt((e=>e?this._navigator.stateService.reference$.pipe($t(1)):ie()))).subscribe((i=>e.onReference(t,i)))),r.push(n.pipe(zt((e=>e?this._container.renderService.size$.pipe($t(1)):ie()))).subscribe((()=>e.onResize(t)))),r.push(Ve([this._container.glRenderer.webGLRenderer$,this._container.renderService.renderCamera$,this._navigator.stateService.reference$,this._navigator.stateService.state$]).pipe(St()).subscribe((()=>{e.onAttach(t,(t=>{this._controls&&e===this._controls&&this._updateViewMatrix(t)}),(t=>{this._controls&&e===this._controls&&this._updateProjectionMatrix(t)})),i.next(),i.complete()})))}detach(e){const t=this._controls;return this._controls=null,this._subscriptions.unsubscribe(),new Promise((i=>{this._navigator.stateService.state$.pipe(_t(1)).subscribe((n=>{t?(n===Df.Custom&&t.onDeactivate(e),t.onDetach(e),i(t)):i(null)}))}))}dispose(e){this.detach(e)}has(e){return!!this._controls&&e===this._controls}_updateProjectionMatrix(e){this._navigator.stateService.state$.pipe(St()).subscribe((t=>{if(t===Df.Custom)this._container.renderService.projectionMatrix$.next(e);else{const e="Incorrect camera control mode for projection matrix update";console.warn(e)}}))}_updateViewMatrix(e){this._navigator.stateService.state$.pipe(St()).subscribe((t=>{if(t===Df.Custom)this._navigator.stateService.setViewMatrix(e);else{const e="Incorrect camera control mode for view matrix update";console.warn(e)}}))}}Uu.register(ad),Vu.register(ad),od.registerCover(af),od.register(of),od.register(cf),od.register(lf),od.register(mf),od.register(Of),od.register(Hf),od.register(Gf),od.register(ag),od.register(hg),od.register(lg),od.register(mg),od.register(zg),od.register(Uv),od.register(Vv),od.register(Hv),od.register(jv),e.ArgumentMapillaryError=Lu,e.BearingComponent=cf,e.CacheComponent=lf,e.CancelMapillaryError=uf,e.CircleMarker=class extends Sw{constructor(e,t,i){super(e,t),i=i||{},this._color=null!=i.color?i.color:16777215,this._opacity=null!=i.opacity?i.opacity:.4,this._radius=null!=i.radius?i.radius:1}_createGeometry(e){const t=new es(new nc(this._radius,16),new wr({color:this._color,opacity:this._opacity,transparent:!0}));t.up.fromArray([0,0,1]),t.renderOrder=-1;const i=new tr;i.add(t),i.position.fromArray(e),this._geometry=i}_disposeGeometry(){for(let e of this._geometry.children)e.geometry.dispose(),e.material.dispose()}_getInteractiveObjects(){return[]}},e.Component=sf,e.DataProviderBase=gw,e.DirectionComponent=mf,e.DragPanHandler=ig,e.EventEmitter=nf,e.ExtremePointTag=Tv,e.Geometry=Fg,e.GeometryProviderBase=_w,e.GeometryTagError=Bg,e.GraphDataProvider=Mw,e.GraphMapillaryError=Bu,e.Image=Su,e.KeyPlayHandler=Vf,e.KeySequenceNavigationHandler=Ff,e.KeySpatialNavigationHandler=Bf,e.KeyZoomHandler=Uf,e.KeyboardComponent=Hf,e.MapillaryError=Pu,e.Marker=Sw,e.MarkerComponent=Gf,e.OutlineTag=Ev,e.PointGeometry=Pv,e.PointerComponent=ag,e.PointsGeometry=Ug,e.PolygonGeometry=dv,e.Popup=class{constructor(e,t,i){this._options={},e=e||{},this._options.capturePointer=!1!==e.capturePointer||e.capturePointer,this._options.clean=e.clean,this._options.float=e.float,this._options.offset=e.offset,this._options.opacity=e.opacity,this._options.position=e.position,this._dom=i||new og,this._viewportCoords=t||new hf,this._notifyChanged$=new j}get changed$(){return this._notifyChanged$}remove(){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content),this._container&&(this._container.parentNode.removeChild(this._container),delete this._container),this._parentContainer&&delete this._parentContainer}setBasicPoint(e){this._point=e.slice(),this._rect=null,this._notifyChanged$.next(this)}setBasicRect(e){this._rect=e.slice(),this._point=null,this._notifyChanged$.next(this)}setDOMContent(e){this._content&&this._content.parentNode&&this._content.parentNode.removeChild(this._content);const t="mapillary-popup-content"+(!0===this._options.clean?"-clean":"")+(!0===this._options.capturePointer?" mapillary-popup-capture-pointer":"");this._content=this._dom.createElement("div",t,this._container),this._content.appendChild(e),this._notifyChanged$.next(this)}setHTML(e){const t=this._dom.document.createDocumentFragment(),i=this._dom.createElement("body");let n;for(i.innerHTML=e;n=i.firstChild,n;)t.appendChild(n);this.setDOMContent(t)}setText(e){this.setDOMContent(this._dom.document.createTextNode(e))}setParentContainer(e){this._parentContainer=e}update(t,i,n){if(!this._parentContainer||!this._content)return;if(!this._point&&!this._rect)return;if(!this._container){this._container=this._dom.createElement("div","mapillary-popup",this._parentContainer);if(!0!==this._options.clean&&this._options.float!==e.Alignment.Center){const e="mapillary-popup-tip"+(!0===this._options.capturePointer?" mapillary-popup-capture-pointer":"");this._tip=this._dom.createElement("div",e,this._container),this._dom.createElement("div","mapillary-popup-tip-inner",this._tip)}this._container.appendChild(this._content),this._parentContainer.appendChild(this._container),null!=this._options.opacity&&(this._container.style.opacity=this._options.opacity.toString())}let r=null,s=this._alignmentToPopupAligment(this._options.position),a=this._alignmentToPopupAligment(this._options.float);const o=this._container.classList;if(null!=this._point)r=this._viewportCoords.basicToCanvasSafe(this._point[0],this._point[1],{offsetHeight:i.height,offsetWidth:i.width},n,t.perspective);else{const e=["center","top","bottom","left","right","top-left","top-right","bottom-left","bottom-right"];let h=null;for(const t of e)if(o.contains(`mapillary-popup-float-${t}`)){h=t;break}[r,s]=this._rectToPixel(this._rect,s,h,t,i,n),a||(a=s)}if(null==r)return void(this._container.style.display="none");if(this._container.style.display="",!a){const e=this._container.offsetWidth,t=this._container.offsetHeight,n=this._pixelToFloats(r,i,e,t);a=0===n.length?"top":n.join("-")}const h=this._normalizeOffset(this._options.offset);r=[r[0]+h[a][0],r[1]+h[a][1]],r=[Math.round(r[0]),Math.round(r[1])];const c={bottom:"translate(-50%,0)","bottom-left":"translate(-100%,0)","bottom-right":"translate(0,0)",center:"translate(-50%,-50%)",left:"translate(-100%,-50%)",right:"translate(0,-50%)",top:"translate(-50%,-100%)","top-left":"translate(-100%,-100%)","top-right":"translate(0,-100%)"};for(const e in c)c.hasOwnProperty(e)&&o.remove(`mapillary-popup-float-${e}`);o.add(`mapillary-popup-float-${a}`),this._container.style.transform=`${c[a]} translate(${r[0]}px,${r[1]}px)`}_rectToPixel(e,t,i,n,r,s){if(!t){const t=this._container.offsetWidth,a=this._container.offsetHeight,o={bottom:[0,a/2],"bottom-left":[-t/2,a/2],"bottom-right":[t/2,a/2],left:[-t/2,0],right:[t/2,0],top:[0,-a/2],"top-left":[-t/2,-a/2],"top-right":[t/2,-a/2]},h=["top","bottom","left","right"];let c=[0,null,null];for(const l of h){const h=this._pointFromRectPosition(e,l),u=this._viewportCoords.basicToCanvasSafe(h[0],h[1],{offsetHeight:r.height,offsetWidth:r.width},s,n.perspective);if(null==u)continue;const d=o[l],p=[u[0]+d[0],u[1]+d[1]],m=null!=i&&i===l?1:.7;if(0===this._pixelToFloats(p,r,t/m,a/(2*m)).length&&u[0]>0&&u[0]<r.width&&u[1]>0&&u[1]<r.height)return[u,l];const f=Math.max(p[0]-t/2,0),g=Math.min(p[0]+t/2,r.width),_=Math.max(p[1]-a/2,0),v=Math.min(p[1]+a/2,r.height),y=m*Math.max(0,g-f)*Math.max(0,v-_);y>c[0]&&(c[0]=y,c[1]=u,c[2]=l)}if(c[0]>0)return[c[1],c[2]]}const a=this._pointFromRectPosition(e,t);return[this._viewportCoords.basicToCanvasSafe(a[0],a[1],{offsetHeight:r.height,offsetWidth:r.width},s,n.perspective),null!=t?t:"top"]}_alignmentToPopupAligment(t){switch(t){case e.Alignment.Bottom:return"bottom";case e.Alignment.BottomLeft:return"bottom-left";case e.Alignment.BottomRight:return"bottom-right";case e.Alignment.Center:return"center";case e.Alignment.Left:return"left";case e.Alignment.Right:return"right";case e.Alignment.Top:return"top";case e.Alignment.TopLeft:return"top-left";case e.Alignment.TopRight:return"top-right";default:return null}}_normalizeOffset(e){if(null==e)return this._normalizeOffset(0);if("number"==typeof e){const t=e,i=(t>=0?1:-1)*Math.round(Math.sqrt(.5*Math.pow(t,2)));return{bottom:[0,t],"bottom-left":[-i,i],"bottom-right":[i,i],center:[0,0],left:[-t,0],right:[t,0],top:[0,-t],"top-left":[-i,-i],"top-right":[i,-i]}}return{bottom:e.bottom||[0,0],"bottom-left":e.bottomLeft||[0,0],"bottom-right":e.bottomRight||[0,0],center:e.center||[0,0],left:e.left||[0,0],right:e.right||[0,0],top:e.top||[0,0],"top-left":e.topLeft||[0,0],"top-right":e.topRight||[0,0]}}_pixelToFloats(e,t,i,n){const r=[];return e[1]<n?r.push("bottom"):e[1]>t.height-n&&r.push("top"),e[0]<i/2?r.push("right"):e[0]>t.width-i/2&&r.push("left"),r}_pointFromRectPosition(e,t){const i=e[0],n=e[0]<e[2]?e[2]:e[2]+1,r=e[1],s=e[3];switch(t){case"bottom":return[(i+n)/2,s];case"bottom-left":return[i,s];case"bottom-right":return[n,s];case"center":return[(i+n)/2,(r+s)/2];case"left":return[i,(r+s)/2];case"right":return[n,(r+s)/2];case"top":return[(i+n)/2,r];case"top-left":return[i,r];case"top-right":return[n,r];default:return[(i+n)/2,s]}}},e.PopupComponent=hg,e.RectGeometry=lv,e.S2GeometryProvider=bw,e.ScrollZoomHandler=rg,e.SequenceComponent=lg,e.SimpleMarker=class extends Sw{constructor(e,t,i){super(e,t),i=i||{},this._ballColor=null!=i.ballColor?i.ballColor:16711680,this._ballOpacity=null!=i.ballOpacity?i.ballOpacity:.8,this._circleToRayAngle=2,this._color=null!=i.color?i.color:16711680,this._interactive=!!i.interactive,this._opacity=null!=i.opacity?i.opacity:.4,this._radius=null!=i.radius?i.radius:1}_createGeometry(e){const t=this._radius,i=this._markerHeight(t),n=new wr({color:this._color,opacity:this._opacity,transparent:!0,depthWrite:!1}),r=new es(this._createMarkerGeometry(t,8,8),n),s=new es(new nl(t/2,8,8),new wr({color:this._ballColor,opacity:this._ballOpacity,transparent:!0}));s.position.z=i,s.renderOrder=1;const a=new tr;a.add(s),a.add(r),a.position.fromArray(e),this._geometry=a}_disposeGeometry(){for(const e of this._geometry.children)e.geometry.dispose(),e.material.dispose()}_getInteractiveObjects(){return this._interactive?[this._geometry.children[0]]:[]}_markerHeight(e){const t=Math.tan(Math.PI-this._circleToRayAngle);return e*Math.sqrt(1+t*t)}_createMarkerGeometry(e,t,i){const n=this._markerHeight(e),r=this._circleToRayAngle,s=[],a=new Float32Array(3*(t+1)*(i+1));let o=0;for(let h=0;h<=i;++h){const c=[];for(let s=0;s<=t;++s){const l=s/t*Math.PI*2,u=h/i*Math.PI;let d=e;if(u>r){const t=Math.tan(u-r);d=e*Math.sqrt(1+t*t)}const p=3*o,m=Math.sin(u);a[p+0]=d*Math.cos(l)*m,a[p+1]=d*Math.sin(l)*m,a[p+2]=d*Math.cos(u)+n,c.push(o++)}s.push(c)}const h=new Uint16Array(6*t*i);let c=0;for(let e=0;e<i;++e)for(let i=0;i<t;++i){const t=s[e][i+1],n=s[e][i],r=s[e+1][i],a=s[e+1][i+1];h[c++]=t,h[c++]=n,h[c++]=a,h[c++]=n,h[c++]=r,h[c++]=a}const l=new kr,u=new Tr(a,3);return l.setAttribute("position",u),l.setIndex(new Tr(h,1)),l}},e.SliderComponent=mg,e.SpatialComponent=zg,e.SpotTag=Iv,e.Tag=Sv,e.TagComponent=Uv,e.TouchZoomHandler=sg,e.VertexGeometry=cv,e.Viewer=class extends nf{constructor(e){super(),this._navigator=new lM(e),this._container=new jw(e,this._navigator.stateService),this._observer=new dM(this,this._navigator,this._container),this._componentController=new Pw(this._container,this._navigator,this._observer,e.imageId,e.component),this._customRenderer=new pM(this._container,this._navigator),this._customCameraControls=new mM(this._container,this._navigator)}get dataProvider(){return this._navigator.api.data}get isNavigable(){return this._componentController.navigable}activateCombinedPanning(){this._navigator.panService.enable()}activateComponent(e){this._componentController.activate(e)}activateCover(){this._componentController.activateCover()}addCustomRenderer(e){this._customRenderer.add(e,this)}attachCustomCameraControls(e){this._customCameraControls.attach(e,this)}deactivateCombinedPanning(){this._navigator.panService.disable()}deactivateComponent(e){this._componentController.deactivate(e)}deactivateCover(){this._componentController.deactivateCover()}detachCustomCameraControls(){return this._customCameraControls.detach(this)}fire(e,t){super.fire(e,t)}getBearing(){return new Promise(((e,t)=>{this._container.renderService.bearing$.pipe(St()).subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getCameraControls(){return new Promise(((t,i)=>{this._navigator.stateService.state$.pipe(St()).subscribe((i=>{switch(i){case Df.Custom:t(e.CameraControls.Custom);break;case Df.Earth:t(e.CameraControls.Earth);break;default:t(e.CameraControls.Street)}}),(e=>{i(e)}))}))}getCanvas(){return this._container.canvas}getCanvasContainer(){return this._container.canvasContainer}getCenter(){return new Promise(((e,t)=>{this._navigator.stateService.getCenter().subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getComponent(e){return this._componentController.get(e)}getContainer(){return this._container.container}getFieldOfView(){return new Promise(((e,t)=>{this._container.renderService.renderCamera$.pipe(St()).subscribe((t=>{e(t.perspective.fov)}),(e=>{t(e)}))}))}getImage(){return new Promise(((e,t)=>{this._navigator.stateService.currentImage$.pipe(St()).subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getPointOfView(){return new Promise(((e,t)=>{Ve(this._container.renderService.renderCamera$,this._container.renderService.bearing$).pipe(St()).subscribe((([t,i])=>{e({bearing:i,tilt:t.getTilt()})}),(e=>{t(e)}))}))}getPosition(){return new Promise(((e,t)=>{Ve(this._container.renderService.renderCamera$,this._navigator.stateService.reference$).pipe(St()).subscribe((([t,i])=>{e(this._observer.projection.cameraToLngLat(t,i))}),(e=>{t(e)}))}))}getReference(){return new Promise(((e,t)=>{this._navigator.stateService.reference$.pipe(St()).subscribe((t=>{e(t)}),(e=>{t(e)}))}))}getZoom(){return new Promise(((e,t)=>{this._navigator.stateService.getZoom().subscribe((t=>{e(t)}),(e=>{t(e)}))}))}hasCustomCameraControls(e){return this._customCameraControls.has(e)}hasCustomRenderer(e){return this._customRenderer.has(e)}moveDir(e){const t=this.isNavigable?this._navigator.moveDir$(e):Ee(new Error("Calling moveDir is not supported when viewer is not navigable."));return new Promise(((e,i)=>{t.subscribe((t=>{e(t)}),(e=>{i(e)}))}))}moveTo(e){const t=this.isNavigable?this._navigator.moveTo$(e):Ee(new Error("Calling moveTo is not supported when viewer is not navigable."));return new Promise(((e,i)=>{t.subscribe((t=>{e(t)}),(e=>{i(e)}))}))}off(e,t){super.off(e,t)}on(e,t){super.on(e,t)}project(e){return new Promise(((t,i)=>{this._observer.project$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}projectFromBasic(e){return new Promise(((t,i)=>{this._observer.projectBasic$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}remove(){this._customRenderer.dispose(this),this._customCameraControls.dispose(this),this._observer.dispose(),this._componentController.remove(),this._navigator.dispose(),this._container.remove();const e="remove",t={target:this,type:e};this.fire(e,t)}removeCustomRenderer(e){this._customRenderer.remove(e,this)}resize(){this._container.renderService.resize$.next()}setCameraControls(e){const t=cM(e);t===Df.Traversing?this._navigator.stateService.traverse():t===Df.Earth?this._navigator.stateService.earth():t===Df.Custom?this._navigator.stateService.custom():console.warn(`Unsupported camera control transition (${e})`)}setCenter(e){this._navigator.stateService.setCenter(e)}setFieldOfView(e){this._container.renderService.renderCamera$.pipe(St()).subscribe((t=>{const i=t.fovToZoom(e);this._navigator.stateService.setZoom(i)}))}setFilter(e){return new Promise(((t,i)=>{this._navigator.setFilter$(e).subscribe((()=>{t(void 0)}),(e=>{i(e)}))}))}setRenderMode(e){this._container.renderService.renderMode$.next(e)}setTransitionMode(e){this._navigator.stateService.setTransitionMode(e)}setAccessToken(e){const t=this.isNavigable?this._navigator.setAccessToken$(e):Ee(new Error("Calling setAccessToken is not supported when viewer is not navigable."));return new Promise(((e,i)=>{t.subscribe((()=>{e(void 0)}),(e=>{i(e)}))}))}setZoom(e){this._navigator.stateService.setZoom(e)}triggerRerender(){this._container.glRenderer.triggerRerender()}unproject(e){return new Promise(((t,i)=>{this._observer.unproject$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}unprojectToBasic(e){return new Promise(((t,i)=>{this._observer.unprojectBasic$(e).subscribe((e=>{t(e)}),(e=>{i(e)}))}))}},e.ZoomComponent=Vv,e.decompress=uw,e.ecefToEnu=yu,e.ecefToGeodetic=wu,e.enuToEcef=bu,e.enuToGeodetic=vu,e.fetchArrayBuffer=dw,e.geodeticToEcef=xu,e.geodeticToEnu=_u,e.isFallbackSupported=Ew,e.isSupported=function(){return Ew()&&Cw()},e.readMeshPbf=mw,Object.defineProperty(e,"__esModule",{value:!0})}));
 //# sourceMappingURL=mapillary.js.map