imtiler
Version:
Modern Image Tiler
1 lines • 5.71 MB
JavaScript
exports.id=736,exports.ids=[736],exports.modules={9174:module=>{"use strict";eval("\n\nvar d2r = Math.PI / 180,\n r2d = 180 / Math.PI;\n/**\n * Get the bbox of a tile\n *\n * @name tileToBBOX\n * @param {Array<number>} tile\n * @returns {Array<number>} bbox\n * @example\n * var bbox = tileToBBOX([5, 10, 10])\n * //=bbox\n */\n\nfunction tileToBBOX(tile) {\n var e = tile2lon(tile[0] + 1, tile[2]);\n var w = tile2lon(tile[0], tile[2]);\n var s = tile2lat(tile[1] + 1, tile[2]);\n var n = tile2lat(tile[1], tile[2]);\n return [w, s, e, n];\n}\n/**\n * Get a geojson representation of a tile\n *\n * @name tileToGeoJSON\n * @param {Array<number>} tile\n * @returns {Feature<Polygon>}\n * @example\n * var poly = tileToGeoJSON([5, 10, 10])\n * //=poly\n */\n\n\nfunction tileToGeoJSON(tile) {\n var bbox = tileToBBOX(tile);\n var poly = {\n type: 'Polygon',\n coordinates: [[[bbox[0], bbox[3]], [bbox[0], bbox[1]], [bbox[2], bbox[1]], [bbox[2], bbox[3]], [bbox[0], bbox[3]]]]\n };\n return poly;\n}\n\nfunction tile2lon(x, z) {\n return x / Math.pow(2, z) * 360 - 180;\n}\n\nfunction tile2lat(y, z) {\n var n = Math.PI - 2 * Math.PI * y / Math.pow(2, z);\n return r2d * Math.atan(0.5 * (Math.exp(n) - Math.exp(-n)));\n}\n/**\n * Get the tile for a point at a specified zoom level\n *\n * @name pointToTile\n * @param {number} lon\n * @param {number} lat\n * @param {number} z\n * @returns {Array<number>} tile\n * @example\n * var tile = pointToTile(1, 1, 20)\n * //=tile\n */\n\n\nfunction pointToTile(lon, lat, z) {\n var tile = pointToTileFraction(lon, lat, z);\n tile[0] = Math.floor(tile[0]);\n tile[1] = Math.floor(tile[1]);\n return tile;\n}\n/**\n * Get the 4 tiles one zoom level higher\n *\n * @name getChildren\n * @param {Array<number>} tile\n * @returns {Array<Array<number>>} tiles\n * @example\n * var tiles = getChildren([5, 10, 10])\n * //=tiles\n */\n\n\nfunction getChildren(tile) {\n return [[tile[0] * 2, tile[1] * 2, tile[2] + 1], [tile[0] * 2 + 1, tile[1] * 2, tile[2] + 1], [tile[0] * 2 + 1, tile[1] * 2 + 1, tile[2] + 1], [tile[0] * 2, tile[1] * 2 + 1, tile[2] + 1]];\n}\n/**\n * Get the tile one zoom level lower\n *\n * @name getParent\n * @param {Array<number>} tile\n * @returns {Array<number>} tile\n * @example\n * var tile = getParent([5, 10, 10])\n * //=tile\n */\n\n\nfunction getParent(tile) {\n return [tile[0] >> 1, tile[1] >> 1, tile[2] - 1];\n}\n\nfunction getSiblings(tile) {\n return getChildren(getParent(tile));\n}\n/**\n * Get the 3 sibling tiles for a tile\n *\n * @name getSiblings\n * @param {Array<number>} tile\n * @returns {Array<Array<number>>} tiles\n * @example\n * var tiles = getSiblings([5, 10, 10])\n * //=tiles\n */\n\n\nfunction hasSiblings(tile, tiles) {\n var siblings = getSiblings(tile);\n\n for (var i = 0; i < siblings.length; i++) {\n if (!hasTile(tiles, siblings[i])) return false;\n }\n\n return true;\n}\n/**\n * Check to see if an array of tiles contains a particular tile\n *\n * @name hasTile\n * @param {Array<Array<number>>} tiles\n * @param {Array<number>} tile\n * @returns {boolean}\n * @example\n * var tiles = [\n * [0, 0, 5],\n * [0, 1, 5],\n * [1, 1, 5],\n * [1, 0, 5]\n * ]\n * hasTile(tiles, [0, 0, 5])\n * //=boolean\n */\n\n\nfunction hasTile(tiles, tile) {\n for (var i = 0; i < tiles.length; i++) {\n if (tilesEqual(tiles[i], tile)) return true;\n }\n\n return false;\n}\n/**\n * Check to see if two tiles are the same\n *\n * @name tilesEqual\n * @param {Array<number>} tile1\n * @param {Array<number>} tile2\n * @returns {boolean}\n * @example\n * tilesEqual([0, 1, 5], [0, 0, 5])\n * //=boolean\n */\n\n\nfunction tilesEqual(tile1, tile2) {\n return tile1[0] === tile2[0] && tile1[1] === tile2[1] && tile1[2] === tile2[2];\n}\n/**\n * Get the quadkey for a tile\n *\n * @name tileToQuadkey\n * @param {Array<number>} tile\n * @returns {string} quadkey\n * @example\n * var quadkey = tileToQuadkey([0, 1, 5])\n * //=quadkey\n */\n\n\nfunction tileToQuadkey(tile) {\n var index = '';\n\n for (var z = tile[2]; z > 0; z--) {\n var b = 0;\n var mask = 1 << z - 1;\n if ((tile[0] & mask) !== 0) b++;\n if ((tile[1] & mask) !== 0) b += 2;\n index += b.toString();\n }\n\n return index;\n}\n/**\n * Get the tile for a quadkey\n *\n * @name quadkeyToTile\n * @param {string} quadkey\n * @returns {Array<number>} tile\n * @example\n * var tile = quadkeyToTile('00001033')\n * //=tile\n */\n\n\nfunction quadkeyToTile(quadkey) {\n var x = 0;\n var y = 0;\n var z = quadkey.length;\n\n for (var i = z; i > 0; i--) {\n var mask = 1 << i - 1;\n var q = +quadkey[z - i];\n if (q === 1) x |= mask;\n if (q === 2) y |= mask;\n\n if (q === 3) {\n x |= mask;\n y |= mask;\n }\n }\n\n return [x, y, z];\n}\n/**\n * Get the smallest tile to cover a bbox\n *\n * @name bboxToTile\n * @param {Array<number>} bbox\n * @returns {Array<number>} tile\n * @example\n * var tile = bboxToTile([ -178, 84, -177, 85 ])\n * //=tile\n */\n\n\nfunction bboxToTile(bboxCoords) {\n var min = pointToTile(bboxCoords[0], bboxCoords[1], 32);\n var max = pointToTile(bboxCoords[2], bboxCoords[3], 32);\n var bbox = [min[0], min[1], max[0], max[1]];\n var z = getBboxZoom(bbox);\n if (z === 0) return [0, 0, 0];\n var x = bbox[0] >>> 32 - z;\n var y = bbox[1] >>> 32 - z;\n return [x, y, z];\n}\n\nfunction getBboxZoom(bbox) {\n var MAX_ZOOM = 28;\n\n for (var z = 0; z < MAX_ZOOM; z++) {\n var mask = 1 << 32 - (z + 1);\n\n if ((bbox[0] & mask) !== (bbox[2] & mask) || (bbox[1] & mask) !== (bbox[3] & mask)) {\n return z;\n }\n }\n\n return MAX_ZOOM;\n}\n/**\n * Get the precise fractional tile location for a point at a zoom level\n *\n * @name pointToTileFraction\n * @param {number} lon\n * @param {number} lat\n * @param {number} z\n * @returns {Array<number>} tile fraction\n * var tile = pointToTileFraction(30.5, 50.5, 15)\n * //=tile\n */\n\n\nfunction pointToTileFraction(lon, lat, z) {\n var sin = Math.sin(lat * d2r),\n z2 = Math.pow(2, z),\n x = z2 * (lon / 360 + 0.5),\n y = z2 * (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI); // Wrap Tile X\n\n x = x % z2;\n if (x < 0) x = x + z2;\n return [x, y, z];\n}\n\nmodule.exports = {\n tileToGeoJSON: tileToGeoJSON,\n tileToBBOX: tileToBBOX,\n getChildren: getChildren,\n getParent: getParent,\n getSiblings: getSiblings,\n hasTile: hasTile,\n hasSiblings: hasSiblings,\n tilesEqual: tilesEqual,\n tileToQuadkey: tileToQuadkey,\n quadkeyToTile: quadkeyToTile,\n pointToTile: pointToTile,\n bboxToTile: bboxToTile,\n pointToTileFraction: pointToTileFraction\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QWEsRUFBRUEsYUFWRjtBQVdidEIsRUFBQUEsV0FBVyxFQUFFQSxXQVhBO0FBWWJ5QixFQUFBQSxVQUFVLEVBQUVBLFVBWkM7QUFhYnRCLEVBQUFBLG1CQUFtQixFQUFFQTtBQWJSLENBQWpCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaW10aWxlci8uL25vZGVfbW9kdWxlcy8ucG5wbS9AbWFwYm94K3RpbGViZWx0QDEuMC4yL25vZGVfbW9kdWxlcy9AbWFwYm94L3RpbGViZWx0L2luZGV4LmpzPzQ1ZDEiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZDJyID0gTWF0aC5QSSAvIDE4MCxcbiAgICByMmQgPSAxODAgLyBNYXRoLlBJO1xuXG4vKipcbiAqIEdldCB0aGUgYmJveCBvZiBhIHRpbGVcbiAqXG4gKiBAbmFtZSB0aWxlVG9CQk9YXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbGVcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSBiYm94XG4gKiBAZXhhbXBsZVxuICogdmFyIGJib3ggPSB0aWxlVG9CQk9YKFs1LCAxMCwgMTBdKVxuICogLy89YmJveFxuICovXG5mdW5jdGlvbiB0aWxlVG9CQk9YKHRpbGUpIHtcbiAgICB2YXIgZSA9IHRpbGUybG9uKHRpbGVbMF0gKyAxLCB0aWxlWzJdKTtcbiAgICB2YXIgdyA9IHRpbGUybG9uKHRpbGVbMF0sIHRpbGVbMl0pO1xuICAgIHZhciBzID0gdGlsZTJsYXQodGlsZVsxXSArIDEsIHRpbGVbMl0pO1xuICAgIHZhciBuID0gdGlsZTJsYXQodGlsZVsxXSwgdGlsZVsyXSk7XG4gICAgcmV0dXJuIFt3LCBzLCBlLCBuXTtcbn1cblxuLyoqXG4gKiBHZXQgYSBnZW9qc29uIHJlcHJlc2VudGF0aW9uIG9mIGEgdGlsZVxuICpcbiAqIEBuYW1lIHRpbGVUb0dlb0pTT05cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGlsZVxuICogQHJldHVybnMge0ZlYXR1cmU8UG9seWdvbj59XG4gKiBAZXhhbXBsZVxuICogdmFyIHBvbHkgPSB0aWxlVG9HZW9KU09OKFs1LCAxMCwgMTBdKVxuICogLy89cG9seVxuICovXG5mdW5jdGlvbiB0aWxlVG9HZW9KU09OKHRpbGUpIHtcbiAgICB2YXIgYmJveCA9IHRpbGVUb0JCT1godGlsZSk7XG4gICAgdmFyIHBvbHkgPSB7XG4gICAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IFtbXG4gICAgICAgICAgICBbYmJveFswXSwgYmJveFszXV0sXG4gICAgICAgICAgICBbYmJveFswXSwgYmJveFsxXV0sXG4gICAgICAgICAgICBbYmJveFsyXSwgYmJveFsxXV0sXG4gICAgICAgICAgICBbYmJveFsyXSwgYmJveFszXV0sXG4gICAgICAgICAgICBbYmJveFswXSwgYmJveFszXV1cbiAgICAgICAgXV1cbiAgICB9O1xuICAgIHJldHVybiBwb2x5O1xufVxuXG5mdW5jdGlvbiB0aWxlMmxvbih4LCB6KSB7XG4gICAgcmV0dXJuIHggLyBNYXRoLnBvdygyLCB6KSAqIDM2MCAtIDE4MDtcbn1cblxuZnVuY3Rpb24gdGlsZTJsYXQoeSwgeikge1xuICAgIHZhciBuID0gTWF0aC5QSSAtIDIgKiBNYXRoLlBJICogeSAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiByMmQgKiBNYXRoLmF0YW4oMC41ICogKE1hdGguZXhwKG4pIC0gTWF0aC5leHAoLW4pKSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB0aWxlIGZvciBhIHBvaW50IGF0IGEgc3BlY2lmaWVkIHpvb20gbGV2ZWxcbiAqXG4gKiBAbmFtZSBwb2ludFRvVGlsZVxuICogQHBhcmFtIHtudW1iZXJ9IGxvblxuICogQHBhcmFtIHtudW1iZXJ9IGxhdFxuICogQHBhcmFtIHtudW1iZXJ9IHpcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSB0aWxlXG4gKiBAZXhhbXBsZVxuICogdmFyIHRpbGUgPSBwb2ludFRvVGlsZSgxLCAxLCAyMClcbiAqIC8vPXRpbGVcbiAqL1xuZnVuY3Rpb24gcG9pbnRUb1RpbGUobG9uLCBsYXQsIHopIHtcbiAgICB2YXIgdGlsZSA9IHBvaW50VG9UaWxlRnJhY3Rpb24obG9uLCBsYXQsIHopO1xuICAgIHRpbGVbMF0gPSBNYXRoLmZsb29yKHRpbGVbMF0pO1xuICAgIHRpbGVbMV0gPSBNYXRoLmZsb29yKHRpbGVbMV0pO1xuICAgIHJldHVybiB0aWxlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgNCB0aWxlcyBvbmUgem9vbSBsZXZlbCBoaWdoZXJcbiAqXG4gKiBAbmFtZSBnZXRDaGlsZHJlblxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aWxlXG4gKiBAcmV0dXJucyB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IHRpbGVzXG4gKiBAZXhhbXBsZVxuICogdmFyIHRpbGVzID0gZ2V0Q2hpbGRyZW4oWzUsIDEwLCAxMF0pXG4gKiAvLz10aWxlc1xuICovXG5mdW5jdGlvbiBnZXRDaGlsZHJlbih0aWxlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgW3RpbGVbMF0gKiAyLCB0aWxlWzFdICogMiwgdGlsZVsyXSArIDFdLFxuICAgICAgICBbdGlsZVswXSAqIDIgKyAxLCB0aWxlWzFdICogMiwgdGlsZVsyIF0gKyAxXSxcbiAgICAgICAgW3RpbGVbMF0gKiAyICsgMSwgdGlsZVsxXSAqIDIgKyAxLCB0aWxlWzJdICsgMV0sXG4gICAgICAgIFt0aWxlWzBdICogMiwgdGlsZVsxXSAqIDIgKyAxLCB0aWxlWzJdICsgMV1cbiAgICBdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdGlsZSBvbmUgem9vbSBsZXZlbCBsb3dlclxuICpcbiAqIEBuYW1lIGdldFBhcmVudFxuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aWxlXG4gKiBAcmV0dXJucyB7QXJyYXk8bnVtYmVyPn0gdGlsZVxuICogQGV4YW1wbGVcbiAqIHZhciB0aWxlID0gZ2V0UGFyZW50KFs1LCAxMCwgMTBdKVxuICogLy89dGlsZVxuICovXG5mdW5jdGlvbiBnZXRQYXJlbnQodGlsZSkge1xuICAgIHJldHVybiBbdGlsZVswXSA+PiAxLCB0aWxlWzFdID4+IDEsIHRpbGVbMl0gLSAxXTtcbn1cblxuZnVuY3Rpb24gZ2V0U2libGluZ3ModGlsZSkge1xuICAgIHJldHVybiBnZXRDaGlsZHJlbihnZXRQYXJlbnQodGlsZSkpO1xufVxuXG4vKipcbiAqIEdldCB0aGUgMyBzaWJsaW5nIHRpbGVzIGZvciBhIHRpbGVcbiAqXG4gKiBAbmFtZSBnZXRTaWJsaW5nc1xuICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSB0aWxlXG4gKiBAcmV0dXJucyB7QXJyYXk8QXJyYXk8bnVtYmVyPj59IHRpbGVzXG4gKiBAZXhhbXBsZVxuICogdmFyIHRpbGVzID0gZ2V0U2libGluZ3MoWzUsIDEwLCAxMF0pXG4gKiAvLz10aWxlc1xuICovXG5mdW5jdGlvbiBoYXNTaWJsaW5ncyh0aWxlLCB0aWxlcykge1xuICAgIHZhciBzaWJsaW5ncyA9IGdldFNpYmxpbmdzKHRpbGUpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2libGluZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKCFoYXNUaWxlKHRpbGVzLCBzaWJsaW5nc1tpXSkpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIGFuIGFycmF5IG9mIHRpbGVzIGNvbnRhaW5zIGEgcGFydGljdWxhciB0aWxlXG4gKlxuICogQG5hbWUgaGFzVGlsZVxuICogQHBhcmFtIHtBcnJheTxBcnJheTxudW1iZXI+Pn0gdGlsZXNcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGlsZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKiBAZXhhbXBsZVxuICogdmFyIHRpbGVzID0gW1xuICogICAgIFswLCAwLCA1XSxcbiAqICAgICBbMCwgMSwgNV0sXG4gKiAgICAgWzEsIDEsIDVdLFxuICogICAgIFsxLCAwLCA1XVxuICogXVxuICogaGFzVGlsZSh0aWxlcywgWzAsIDAsIDVdKVxuICogLy89Ym9vbGVhblxuICovXG5mdW5jdGlvbiBoYXNUaWxlKHRpbGVzLCB0aWxlKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAodGlsZXNFcXVhbCh0aWxlc1tpXSwgdGlsZSkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2sgdG8gc2VlIGlmIHR3byB0aWxlcyBhcmUgdGhlIHNhbWVcbiAqXG4gKiBAbmFtZSB0aWxlc0VxdWFsXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbGUxXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IHRpbGUyXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqIEBleGFtcGxlXG4gKiB0aWxlc0VxdWFsKFswLCAxLCA1XSwgWzAsIDAsIDVdKVxuICogLy89Ym9vbGVhblxuICovXG5mdW5jdGlvbiB0aWxlc0VxdWFsKHRpbGUxLCB0aWxlMikge1xuICAgIHJldHVybiAoXG4gICAgICAgIHRpbGUxWzBdID09PSB0aWxlMlswXSAmJlxuICAgICAgICB0aWxlMVsxXSA9PT0gdGlsZTJbMV0gJiZcbiAgICAgICAgdGlsZTFbMl0gPT09IHRpbGUyWzJdXG4gICAgKTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIHF1YWRrZXkgZm9yIGEgdGlsZVxuICpcbiAqIEBuYW1lIHRpbGVUb1F1YWRrZXlcbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyPn0gdGlsZVxuICogQHJldHVybnMge3N0cmluZ30gcXVhZGtleVxuICogQGV4YW1wbGVcbiAqIHZhciBxdWFka2V5ID0gdGlsZVRvUXVhZGtleShbMCwgMSwgNV0pXG4gKiAvLz1xdWFka2V5XG4gKi9cbmZ1bmN0aW9uIHRpbGVUb1F1YWRrZXkodGlsZSkge1xuICAgIHZhciBpbmRleCA9ICcnO1xuICAgIGZvciAodmFyIHogPSB0aWxlWzJdOyB6ID4gMDsgei0tKSB7XG4gICAgICAgIHZhciBiID0gMDtcbiAgICAgICAgdmFyIG1hc2sgPSAxIDw8ICh6IC0gMSk7XG4gICAgICAgIGlmICgodGlsZVswXSAmIG1hc2spICE9PSAwKSBiKys7XG4gICAgICAgIGlmICgodGlsZVsxXSAmIG1hc2spICE9PSAwKSBiICs9IDI7XG4gICAgICAgIGluZGV4ICs9IGIudG9TdHJpbmcoKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xufVxuXG4vKipcbiAqIEdldCB0aGUgdGlsZSBmb3IgYSBxdWFka2V5XG4gKlxuICogQG5hbWUgcXVhZGtleVRvVGlsZVxuICogQHBhcmFtIHtzdHJpbmd9IHF1YWRrZXlcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSB0aWxlXG4gKiBAZXhhbXBsZVxuICogdmFyIHRpbGUgPSBxdWFka2V5VG9UaWxlKCcwMDAwMTAzMycpXG4gKiAvLz10aWxlXG4gKi9cbmZ1bmN0aW9uIHF1YWRrZXlUb1RpbGUocXVhZGtleSkge1xuICAgIHZhciB4ID0gMDtcbiAgICB2YXIgeSA9IDA7XG4gICAgdmFyIHogPSBxdWFka2V5Lmxlbmd0aDtcblxuICAgIGZvciAodmFyIGkgPSB6OyBpID4gMDsgaS0tKSB7XG4gICAgICAgIHZhciBtYXNrID0gMSA8PCAoaSAtIDEpO1xuICAgICAgICB2YXIgcSA9ICtxdWFka2V5W3ogLSBpXTtcbiAgICAgICAgaWYgKHEgPT09IDEpIHggfD0gbWFzaztcbiAgICAgICAgaWYgKHEgPT09IDIpIHkgfD0gbWFzaztcbiAgICAgICAgaWYgKHEgPT09IDMpIHtcbiAgICAgICAgICAgIHggfD0gbWFzaztcbiAgICAgICAgICAgIHkgfD0gbWFzaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3gsIHksIHpdO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc21hbGxlc3QgdGlsZSB0byBjb3ZlciBhIGJib3hcbiAqXG4gKiBAbmFtZSBiYm94VG9UaWxlXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcj59IGJib3hcbiAqIEByZXR1cm5zIHtBcnJheTxudW1iZXI+fSB0aWxlXG4gKiBAZXhhbXBsZVxuICogdmFyIHRpbGUgPSBiYm94VG9UaWxlKFsgLTE3OCwgODQsIC0xNzcsIDg1IF0pXG4gKiAvLz10aWxlXG4gKi9cbmZ1bmN0aW9uIGJib3hUb1RpbGUoYmJveENvb3Jkcykge1xuICAgIHZhciBtaW4gPSBwb2ludFRvVGlsZShiYm94Q29vcmRzWzBdLCBiYm94Q29vcmRzWzFdLCAzMik7XG4gICAgdmFyIG1heCA9IHBvaW50VG9UaWxlKGJib3hDb29yZHNbMl0sIGJib3hDb29yZHNbM10sIDMyKTtcbiAgICB2YXIgYmJveCA9IFttaW5bMF0sIG1pblsxXSwgbWF4WzBdLCBtYXhbMV1dO1xuXG4gICAgdmFyIHogPSBnZXRCYm94Wm9vbShiYm94KTtcbiAgICBpZiAoeiA9PT0gMCkgcmV0dXJuIFswLCAwLCAwXTtcbiAgICB2YXIgeCA9IGJib3hbMF0gPj4+ICgzMiAtIHopO1xuICAgIHZhciB5ID0gYmJveFsxXSA+Pj4gKDMyIC0geik7XG4gICAgcmV0dXJuIFt4LCB5LCB6XTtcbn1cblxuZnVuY3Rpb24gZ2V0QmJveFpvb20oYmJveCkge1xuICAgIHZhciBNQVhfWk9PTSA9IDI4O1xuICAgIGZvciAodmFyIHogPSAwOyB6IDwgTUFYX1pPT007IHorKykge1xuICAgICAgICB2YXIgbWFzayA9IDEgPDwgKDMyIC0gKHogKyAxKSk7XG4gICAgICAgIGlmICgoKGJib3hbMF0gJiBtYXNrKSAhPT0gKGJib3hbMl0gJiBtYXNrKSkgfHxcbiAgICAgICAgICAgICgoYmJveFsxXSAmIG1hc2spICE9PSAoYmJveFszXSAmIG1hc2spKSkge1xuICAgICAgICAgICAgcmV0dXJuIHo7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gTUFYX1pPT007XG59XG5cbi8qKlxuICogR2V0IHRoZSBwcmVjaXNlIGZyYWN0aW9uYWwgdGlsZSBsb2NhdGlvbiBmb3IgYSBwb2ludCBhdCBhIHpvb20gbGV2ZWxcbiAqXG4gKiBAbmFtZSBwb2ludFRvVGlsZUZyYWN0aW9uXG4gKiBAcGFyYW0ge251bWJlcn0gbG9uXG4gKiBAcGFyYW0ge251bWJlcn0gbGF0XG4gKiBAcGFyYW0ge251bWJlcn0gelxuICogQHJldHVybnMge0FycmF5PG51bWJlcj59IHRpbGUgZnJhY3Rpb25cbiAqIHZhciB0aWxlID0gcG9pbnRUb1RpbGVGcmFjdGlvbigzMC41LCA1MC41LCAxNSlcbiAqIC8vPXRpbGVcbiAqL1xuZnVuY3Rpb24gcG9pbnRUb1RpbGVGcmFjdGlvbihsb24sIGxhdCwgeikge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbihsYXQgKiBkMnIpLFxuICAgICAgICB6MiA9IE1hdGgucG93KDIsIHopLFxuICAgICAgICB4ID0gejIgKiAobG9uIC8gMzYwICsgMC41KSxcbiAgICAgICAgeSA9IHoyICogKDAuNSAtIDAuMjUgKiBNYXRoLmxvZygoMSArIHNpbikgLyAoMSAtIHNpbikpIC8gTWF0aC5QSSk7XG5cbiAgICAvLyBXcmFwIFRpbGUgWFxuICAgIHggPSB4ICUgejI7XG4gICAgaWYgKHggPCAwKSB4ID0geCArIHoyO1xuICAgIHJldHVybiBbeCwgeSwgel07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHRpbGVUb0dlb0pTT046IHRpbGVUb0dlb0pTT04sXG4gICAgdGlsZVRvQkJPWDogdGlsZVRvQkJPWCxcbiAgICBnZXRDaGlsZHJlbjogZ2V0Q2hpbGRyZW4sXG4gICAgZ2V0UGFyZW50OiBnZXRQYXJlbnQsXG4gICAgZ2V0U2libGluZ3M6IGdldFNpYmxpbmdzLFxuICAgIGhhc1RpbGU6IGhhc1RpbGUsXG4gICAgaGFzU2libGluZ3M6IGhhc1NpYmxpbmdzLFxuICAgIHRpbGVzRXF1YWw6IHRpbGVzRXF1YWwsXG4gICAgdGlsZVRvUXVhZGtleTogdGlsZVRvUXVhZGtleSxcbiAgICBxdWFka2V5VG9UaWxlOiBxdWFka2V5VG9UaWxlLFxuICAgIHBvaW50VG9UaWxlOiBwb2ludFRvVGlsZSxcbiAgICBiYm94VG9UaWxlOiBiYm94VG9UaWxlLFxuICAgIHBvaW50VG9UaWxlRnJhY3Rpb246IHBvaW50VG9UaWxlRnJhY3Rpb25cbn07XG4iXSwibmFtZXMiOlsiZDJyIiwiTWF0aCIsIlBJIiwicjJkIiwidGlsZVRvQkJPWCIsInRpbGUiLCJlIiwidGlsZTJsb24iLCJ3IiwicyIsInRpbGUybGF0IiwibiIsInRpbGVUb0dlb0pTT04iLCJiYm94IiwicG9seSIsInR5cGUiLCJjb29yZGluYXRlcyIsIngiLCJ6IiwicG93IiwieSIsImF0YW4iLCJleHAiLCJwb2ludFRvVGlsZSIsImxvbiIsImxhdCIsInBvaW50VG9UaWxlRnJhY3Rpb24iLCJmbG9vciIsImdldENoaWxkcmVuIiwiZ2V0UGFyZW50IiwiZ2V0U2libGluZ3MiLCJoYXNTaWJsaW5ncyIsInRpbGVzIiwic2libGluZ3MiLCJpIiwibGVuZ3RoIiwiaGFzVGlsZSIsInRpbGVzRXF1YWwiLCJ0aWxlMSIsInRpbGUyIiwidGlsZVRvUXVhZGtleSIsImluZGV4IiwiYiIsIm1hc2siLCJ0b1N0cmluZyIsInF1YWRrZXlUb1RpbGUiLCJxdWFka2V5IiwicSIsImJib3hUb1RpbGUiLCJiYm94Q29vcmRzIiwibWluIiwibWF4IiwiZ2V0QmJveFpvb20iLCJNQVhfWk9PTSIsInNpbiIsInoyIiwibG9nIiwibW9kdWxlIiwiZXhwb3J0cyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///9174\n")},9525:module=>{"use strict";eval('\n\nconst callsites = () => {\n const _prepareStackTrace = Error.prepareStackTrace;\n\n Error.prepareStackTrace = (_, stack) => stack;\n\n const stack = new Error().stack.slice(1);\n Error.prepareStackTrace = _prepareStackTrace;\n return stack;\n};\n\nmodule.exports = callsites; // TODO: Remove this for the next major release\n\nmodule.exports["default"] = callsites;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiOTUyNS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYixNQUFNQSxTQUFTLEdBQUcsTUFBTTtBQUN2QixRQUFNQyxrQkFBa0IsR0FBR0MsS0FBSyxDQUFDQyxpQkFBakM7O0FBQ0FELEVBQUFBLEtBQUssQ0FBQ0MsaUJBQU4sR0FBMEIsQ0FBQ0MsQ0FBRCxFQUFJQyxLQUFKLEtBQWNBLEtBQXhDOztBQUNBLFFBQU1BLEtBQUssR0FBRyxJQUFJSCxLQUFKLEdBQVlHLEtBQVosQ0FBa0JDLEtBQWxCLENBQXdCLENBQXhCLENBQWQ7QUFDQUosRUFBQUEsS0FBSyxDQUFDQyxpQkFBTixHQUEwQkYsa0JBQTFCO0FBQ0EsU0FBT0ksS0FBUDtBQUNBLENBTkQ7O0FBUUFFLE1BQU0sQ0FBQ0MsT0FBUCxHQUFpQlIsU0FBakIsQyxDQUNBOztBQUNBTyx5QkFBQSxHQUF5QlAsU0FBekIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9pbXRpbGVyLy4vbm9kZV9tb2R1bGVzLy5wbnBtL2NhbGxzaXRlc0AzLjEuMC9ub2RlX21vZHVsZXMvY2FsbHNpdGVzL2luZGV4LmpzP2VmOGQiXSwic291cmNlc0NvbnRlbnQiOlsiJ3VzZSBzdHJpY3QnO1xuXG5jb25zdCBjYWxsc2l0ZXMgPSAoKSA9PiB7XG5cdGNvbnN0IF9wcmVwYXJlU3RhY2tUcmFjZSA9IEVycm9yLnByZXBhcmVTdGFja1RyYWNlO1xuXHRFcnJvci5wcmVwYXJlU3RhY2tUcmFjZSA9IChfLCBzdGFjaykgPT4gc3RhY2s7XG5cdGNvbnN0IHN0YWNrID0gbmV3IEVycm9yKCkuc3RhY2suc2xpY2UoMSk7XG5cdEVycm9yLnByZXBhcmVTdGFja1RyYWNlID0gX3ByZXBhcmVTdGFja1RyYWNlO1xuXHRyZXR1cm4gc3RhY2s7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGNhbGxzaXRlcztcbi8vIFRPRE86IFJlbW92ZSB0aGlzIGZvciB0aGUgbmV4dCBtYWpvciByZWxlYXNlXG5tb2R1bGUuZXhwb3J0cy5kZWZhdWx0ID0gY2FsbHNpdGVzO1xuIl0sIm5hbWVzIjpbImNhbGxzaXRlcyIsIl9wcmVwYXJlU3RhY2tUcmFjZSIsIkVycm9yIiwicHJlcGFyZVN0YWNrVHJhY2UiLCJfIiwic3RhY2siLCJzbGljZSIsIm1vZHVsZSIsImV4cG9ydHMiLCJkZWZhdWx0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///9525\n')},1460:(module,exports,__webpack_require__)=>{eval("const nodeFetch = __webpack_require__(2762);\n\nconst realFetch = nodeFetch.default || nodeFetch;\n\nconst fetch = function (url, options) {\n // Support schemaless URIs on the server for parity with the browser.\n // Ex: //github.com/ -> https://github.com/\n if (/^\\/\\//.test(url)) {\n url = 'https:' + url;\n }\n\n return realFetch.call(this, url, options);\n};\n\nfetch.ponyfill = true;\nmodule.exports = exports = fetch;\nexports.fetch = fetch;\nexports.Headers = nodeFetch.Headers;\nexports.Request = nodeFetch.Request;\nexports.Response = nodeFetch.Response; // Needed for TypeScript consumers without esModuleInterop.\n\nexports[\"default\"] = fetch;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQ2MC5qcyIsIm1hcHBpbmdzIjoiQUFBQSxNQUFNQSxTQUFTLEdBQUdDLG1CQUFPLENBQUMsSUFBRCxDQUF6Qjs7QUFDQSxNQUFNQyxTQUFTLEdBQUdGLFNBQVMsQ0FBQ0csT0FBVixJQUFxQkgsU0FBdkM7O0FBRUEsTUFBTUksS0FBSyxHQUFHLFVBQVVDLEdBQVYsRUFBZUMsT0FBZixFQUF3QjtBQUNwQztBQUNBO0FBQ0EsTUFBSSxRQUFRQyxJQUFSLENBQWFGLEdBQWIsQ0FBSixFQUF1QjtBQUNyQkEsSUFBQUEsR0FBRyxHQUFHLFdBQVdBLEdBQWpCO0FBQ0Q7O0FBQ0QsU0FBT0gsU0FBUyxDQUFDTSxJQUFWLENBQWUsSUFBZixFQUFxQkgsR0FBckIsRUFBMEJDLE9BQTFCLENBQVA7QUFDRCxDQVBEOztBQVNBRixLQUFLLENBQUNLLFFBQU4sR0FBaUIsSUFBakI7QUFFQUMsTUFBTSxDQUFDQyxPQUFQLEdBQWlCQSxPQUFPLEdBQUdQLEtBQTNCO0FBQ0FPLGFBQUEsR0FBZ0JQLEtBQWhCO0FBQ0FPLGVBQUEsR0FBa0JYLFNBQVMsQ0FBQ1ksT0FBNUI7QUFDQUQsZUFBQSxHQUFrQlgsU0FBUyxDQUFDYSxPQUE1QjtBQUNBRixnQkFBQSxHQUFtQlgsU0FBUyxDQUFDYyxRQUE3QixDLENBRUE7O0FBQ0FILGtCQUFBLEdBQWtCUCxLQUFsQiIsInNvdXJjZXMiOlsid2VicGFjazovL2ltdGlsZXIvLi9ub2RlX21vZHVsZXMvLnBucG0vY3Jvc3MtZmV0Y2hAMy4xLjQvbm9kZV9tb2R1bGVzL2Nyb3NzLWZldGNoL2Rpc3Qvbm9kZS1wb255ZmlsbC5qcz9kNmE5Il0sInNvdXJjZXNDb250ZW50IjpbImNvbnN0IG5vZGVGZXRjaCA9IHJlcXVpcmUoJ25vZGUtZmV0Y2gnKVxuY29uc3QgcmVhbEZldGNoID0gbm9kZUZldGNoLmRlZmF1bHQgfHwgbm9kZUZldGNoXG5cbmNvbnN0IGZldGNoID0gZnVuY3Rpb24gKHVybCwgb3B0aW9ucykge1xuICAvLyBTdXBwb3J0IHNjaGVtYWxlc3MgVVJJcyBvbiB0aGUgc2VydmVyIGZvciBwYXJpdHkgd2l0aCB0aGUgYnJvd3Nlci5cbiAgLy8gRXg6IC8vZ2l0aHViLmNvbS8gLT4gaHR0cHM6Ly9naXRodWIuY29tL1xuICBpZiAoL15cXC9cXC8vLnRlc3QodXJsKSkge1xuICAgIHVybCA9ICdodHRwczonICsgdXJsXG4gIH1cbiAgcmV0dXJuIHJlYWxGZXRjaC5jYWxsKHRoaXMsIHVybCwgb3B0aW9ucylcbn1cblxuZmV0Y2gucG9ueWZpbGwgPSB0cnVlXG5cbm1vZHVsZS5leHBvcnRzID0gZXhwb3J0cyA9IGZldGNoXG5leHBvcnRzLmZldGNoID0gZmV0Y2hcbmV4cG9ydHMuSGVhZGVycyA9IG5vZGVGZXRjaC5IZWFkZXJzXG5leHBvcnRzLlJlcXVlc3QgPSBub2RlRmV0Y2guUmVxdWVzdFxuZXhwb3J0cy5SZXNwb25zZSA9IG5vZGVGZXRjaC5SZXNwb25zZVxuXG4vLyBOZWVkZWQgZm9yIFR5cGVTY3JpcHQgY29uc3VtZXJzIHdpdGhvdXQgZXNNb2R1bGVJbnRlcm9wLlxuZXhwb3J0cy5kZWZhdWx0ID0gZmV0Y2hcbiJdLCJuYW1lcyI6WyJub2RlRmV0Y2giLCJyZXF1aXJlIiwicmVhbEZldGNoIiwiZGVmYXVsdCIsImZldGNoIiwidXJsIiwib3B0aW9ucyIsInRlc3QiLCJjYWxsIiwicG9ueWZpbGwiLCJtb2R1bGUiLCJleHBvcnRzIiwiSGVhZGVycyIsIlJlcXVlc3QiLCJSZXNwb25zZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///1460\n")},3466:(module,exports,__webpack_require__)=>{eval("/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\n\nexports.destroy = (() => {\n let warned = false;\n return () => {\n if (!warned) {\n warned = true;\n console.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n }\n };\n})();\n/**\n * Colors.\n */\n\n\nexports.colors = ['#0000CC', '#0000FF', '#0033CC', '#0033FF', '#0066CC', '#0066FF', '#0099CC', '#0099FF', '#00CC00', '#00CC33', '#00CC66', '#00CC99', '#00CCCC', '#00CCFF', '#3300CC', '#3300FF', '#3333CC', '#3333FF', '#3366CC', '#3366FF', '#3399CC', '#3399FF', '#33CC00', '#33CC33', '#33CC66', '#33CC99', '#33CCCC', '#33CCFF', '#6600CC', '#6600FF', '#6633CC', '#6633FF', '#66CC00', '#66CC33', '#9900CC', '#9900FF', '#9933CC', '#9933FF', '#99CC00', '#99CC33', '#CC0000', '#CC0033', '#CC0066', '#CC0099', '#CC00CC', '#CC00FF', '#CC3300', '#CC3333', '#CC3366', '#CC3399', '#CC33CC', '#CC33FF', '#CC6600', '#CC6633', '#CC9900', '#CC9933', '#CCCC00', '#CCCC33', '#FF0000', '#FF0033', '#FF0066', '#FF0099', '#FF00CC', '#FF00FF', '#FF3300', '#FF3333', '#FF3366', '#FF3399', '#FF33CC', '#FF33FF', '#FF6600', '#FF6633', '#FF9900', '#FF9933', '#FFCC00', '#FFCC33'];\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n// eslint-disable-next-line complexity\n\nfunction useColors() {\n // NB: In an Electron preload script, document will be defined but not fully\n // initialized. Since we know we're in Chrome, we'll just detect this case\n // explicitly\n if (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n return true;\n } // Internet Explorer and Edge do not support colors.\n\n\n if (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n return false;\n } // Is webkit? http://stackoverflow.com/a/16459606/376773\n // document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\n\n return typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance || // Is firebug? http://stackoverflow.com/a/398120/376773\n typeof window !== 'undefined' && window.console && (window.console.firebug || window.console.exception && window.console.table) || // Is firefox >= v31?\n // https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/) && parseInt(RegExp.$1, 10) >= 31 || // Double check webkit in userAgent just in case we are in a worker\n typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/);\n}\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\n\nfunction formatArgs(args) {\n args[0] = (this.useColors ? '%c' : '') + this.namespace + (this.useColors ? ' %c' : ' ') + args[0] + (this.useColors ? '%c ' : ' ') + '+' + module.exports.humanize(this.diff);\n\n if (!this.useColors) {\n return;\n }\n\n const c = 'color: ' + this.color;\n args.splice(1, 0, c, 'color: inherit'); // The final \"%c\" is somewhat tricky, because there could be other\n // arguments passed either before or after the %c, so we need to\n // figure out the correct index to insert the CSS into\n\n let index = 0;\n let lastC = 0;\n args[0].replace(/%[a-zA-Z%]/g, match => {\n if (match === '%%') {\n return;\n }\n\n index++;\n\n if (match === '%c') {\n // We only are interested in the *last* %c\n // (the user may have provided their own)\n lastC = index;\n }\n });\n args.splice(lastC, 0, c);\n}\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\n\n\nexports.log = console.debug || console.log || (() => {});\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\n\n\nfunction save(namespaces) {\n try {\n if (namespaces) {\n exports.storage.setItem('debug', namespaces);\n } else {\n exports.storage.removeItem('debug');\n }\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\n\nfunction load() {\n let r;\n\n try {\n r = exports.storage.getItem('debug');\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n } // If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\n\n if (!r && typeof process !== 'undefined' && 'env' in process) {\n r = process.env.DEBUG;\n }\n\n return r;\n}\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\n\nfunction localstorage() {\n try {\n // TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n // The Browser also has localStorage in the global context.\n return localStorage;\n } catch (error) {// Swallow\n // XXX (@Qix-) should we be logging these?\n }\n}\n\nmodule.exports = __webpack_require__(3831)(exports);\nconst {\n formatters\n} = module.exports;\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n try {\n return JSON.stringify(v);\n } catch (error) {\n return '[UnexpectedJSONParseError]: ' + error.message;\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxDQUFYLEdBQWUsVUFBVUMsQ0FBVixFQUFhO0FBQzNCLE1BQUk7QUFDSCxXQUFPQyxJQUFJLENBQUNDLFNBQUwsQ0FBZUYsQ0FBZixDQUFQO0FBQ0EsR0FGRCxDQUVFLE9BQU9ULEtBQVAsRUFBYztBQUNmLFdBQU8saUNBQWlDQSxLQUFLLENBQUNZLE9BQTlDO0FBQ0E7QUFDRCxDQU5EIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaW10aWxlci8uL25vZGVfbW9kdWxlcy8ucG5wbS9kZWJ1Z0A0LjMuMi9ub2RlX21vZHVsZXMvZGVidWcvc3JjL2Jyb3dzZXIuanM/NDlkZiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZW52IGJyb3dzZXIgKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSB3ZWIgYnJvd3NlciBpbXBsZW1lbnRhdGlvbiBvZiBgZGVidWcoKWAuXG4gKi9cblxuZXhwb3J0cy5mb3JtYXRBcmdzID0gZm9ybWF0QXJncztcbmV4cG9ydHMuc2F2ZSA9IHNhdmU7XG5leHBvcnRzLmxvYWQgPSBsb2FkO1xuZXhwb3J0cy51c2VDb2xvcnMgPSB1c2VDb2xvcnM7XG5leHBvcnRzLnN0b3JhZ2UgPSBsb2NhbHN0b3JhZ2UoKTtcbmV4cG9ydHMuZGVzdHJveSA9ICgoKSA9PiB7XG5cdGxldCB3YXJuZWQgPSBmYWxzZTtcblxuXHRyZXR1cm4gKCkgPT4ge1xuXHRcdGlmICghd2FybmVkKSB7XG5cdFx0XHR3YXJuZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS53YXJuKCdJbnN0YW5jZSBtZXRob2QgYGRlYnVnLmRlc3Ryb3koKWAgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIGRvZXMgYW55dGhpbmcuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBtYWpvciB2ZXJzaW9uIG9mIGBkZWJ1Z2AuJyk7XG5cdFx0fVxuXHR9O1xufSkoKTtcblxuLyoqXG4gKiBDb2xvcnMuXG4gKi9cblxuZXhwb3J0cy5jb2xvcnMgPSBbXG5cdCcjMDAwMENDJyxcblx0JyMwMDAwRkYnLFxuXHQnIzAwMzNDQycsXG5cdCcjMDAzM0ZGJyxcblx0JyMwMDY2Q0MnLFxuXHQnIzAwNjZGRicsXG5cdCcjMDA5OUNDJyxcblx0JyMwMDk5RkYnLFxuXHQnIzAwQ0MwMCcsXG5cdCcjMDBDQzMzJyxcblx0JyMwMENDNjYnLFxuXHQnIzAwQ0M5OScsXG5cdCcjMDBDQ0NDJyxcblx0JyMwMENDRkYnLFxuXHQnIzMzMDBDQycsXG5cdCcjMzMwMEZGJyxcblx0JyMzMzMzQ0MnLFxuXHQnIzMzMzNGRicsXG5cdCcjMzM2NkNDJyxcblx0JyMzMzY2RkYnLFxuXHQnIzMzOTlDQycsXG5cdCcjMzM5OUZGJyxcblx0JyMzM0NDMDAnLFxuXHQnIzMzQ0MzMycsXG5cdCcjMzNDQzY2Jyxcblx0JyMzM0NDOTknLFxuXHQnIzMzQ0NDQycsXG5cdCcjMzNDQ0ZGJyxcblx0JyM2NjAwQ0MnLFxuXHQnIzY2MDBGRicsXG5cdCcjNjYzM0NDJyxcblx0JyM2NjMzRkYnLFxuXHQnIzY2Q0MwMCcsXG5cdCcjNjZDQzMzJyxcblx0JyM5OTAwQ0MnLFxuXHQnIzk5MDBGRicsXG5cdCcjOTkzM0NDJyxcblx0JyM5OTMzRkYnLFxuXHQnIzk5Q0MwMCcsXG5cdCcjOTlDQzMzJyxcblx0JyNDQzAwMDAnLFxuXHQnI0NDMDAzMycsXG5cdCcjQ0MwMDY2Jyxcblx0JyNDQzAwOTknLFxuXHQnI0NDMDBDQycsXG5cdCcjQ0MwMEZGJyxcblx0JyNDQzMzMDAnLFxuXHQnI0NDMzMzMycsXG5cdCcjQ0MzMzY2Jyxcblx0JyNDQzMzOTknLFxuXHQnI0NDMzNDQycsXG5cdCcjQ0MzM0ZGJyxcblx0JyNDQzY2MDAnLFxuXHQnI0NDNjYzMycsXG5cdCcjQ0M5OTAwJyxcblx0JyNDQzk5MzMnLFxuXHQnI0NDQ0MwMCcsXG5cdCcjQ0NDQzMzJyxcblx0JyNGRjAwMDAnLFxuXHQnI0ZGMDAzMycsXG5cdCcjRkYwMDY2Jyxcblx0JyNGRjAwOTknLFxuXHQnI0ZGMDBDQycsXG5cdCcjRkYwMEZGJyxcblx0JyNGRjMzMDAnLFxuXHQnI0ZGMzMzMycsXG5cdCcjRkYzMzY2Jyxcblx0JyNGRjMzOTknLFxuXHQnI0ZGMzNDQycsXG5cdCcjRkYzM0ZGJyxcblx0JyNGRjY2MDAnLFxuXHQnI0ZGNjYzMycsXG5cdCcjRkY5OTAwJyxcblx0JyNGRjk5MzMnLFxuXHQnI0ZGQ0MwMCcsXG5cdCcjRkZDQzMzJ1xuXTtcblxuLyoqXG4gKiBDdXJyZW50bHkgb25seSBXZWJLaXQtYmFzZWQgV2ViIEluc3BlY3RvcnMsIEZpcmVmb3ggPj0gdjMxLFxuICogYW5kIHRoZSBGaXJlYnVnIGV4dGVuc2lvbiAoYW55IEZpcmVmb3ggdmVyc2lvbikgYXJlIGtub3duXG4gKiB0byBzdXBwb3J0IFwiJWNcIiBDU1MgY3VzdG9taXphdGlvbnMuXG4gKlxuICogVE9ETzogYWRkIGEgYGxvY2FsU3RvcmFnZWAgdmFyaWFibGUgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSBjb2xvcnNcbiAqL1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZnVuY3Rpb24gdXNlQ29sb3JzKCkge1xuXHQvLyBOQjogSW4gYW4gRWxlY3Ryb24gcHJlbG9hZCBzY3JpcHQsIGRvY3VtZW50IHdpbGwgYmUgZGVmaW5lZCBidXQgbm90IGZ1bGx5XG5cdC8vIGluaXRpYWxpemVkLiBTaW5jZSB3ZSBrbm93IHdlJ3JlIGluIENocm9tZSwgd2UnbGwganVzdCBkZXRlY3QgdGhpcyBjYXNlXG5cdC8vIGV4cGxpY2l0bHlcblx0aWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5wcm9jZXNzICYmICh3aW5kb3cucHJvY2Vzcy50eXBlID09PSAncmVuZGVyZXInIHx8IHdpbmRvdy5wcm9jZXNzLl9fbndqcykpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdC8vIEludGVybmV0IEV4cGxvcmVyIGFuZCBFZGdlIGRvIG5vdCBzdXBwb3J0IGNvbG9ycy5cblx0aWYgKHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC8oZWRnZXx0cmlkZW50KVxcLyhcXGQrKS8pKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gSXMgd2Via2l0PyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjQ1OTYwNi8zNzY3NzNcblx0Ly8gZG9jdW1lbnQgaXMgdW5kZWZpbmVkIGluIHJlYWN0LW5hdGl2ZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0LW5hdGl2ZS9wdWxsLzE2MzJcblx0cmV0dXJuICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLldlYmtpdEFwcGVhcmFuY2UpIHx8XG5cdFx0Ly8gSXMgZmlyZWJ1Zz8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzk4MTIwLzM3Njc3M1xuXHRcdCh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuY29uc29sZSAmJiAod2luZG93LmNvbnNvbGUuZmlyZWJ1ZyB8fCAod2luZG93LmNvbnNvbGUuZXhjZXB0aW9uICYmIHdpbmRvdy5jb25zb2xlLnRhYmxlKSkpIHx8XG5cdFx0Ly8gSXMgZmlyZWZveCA+PSB2MzE/XG5cdFx0Ly8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9Ub29scy9XZWJfQ29uc29sZSNTdHlsaW5nX21lc3NhZ2VzXG5cdFx0KHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvci51c2VyQWdlbnQgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykgJiYgcGFyc2VJbnQoUmVnRXhwLiQxLCAxMCkgPj0gMzEpIHx8XG5cdFx0Ly8gRG91YmxlIGNoZWNrIHdlYmtpdCBpbiB1c2VyQWdlbnQganVzdCBpbiBjYXNlIHdlIGFyZSBpbiBhIHdvcmtlclxuXHRcdCh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJyAmJiBuYXZpZ2F0b3IudXNlckFnZW50ICYmIG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5tYXRjaCgvYXBwbGV3ZWJraXRcXC8oXFxkKykvKSk7XG59XG5cbi8qKlxuICogQ29sb3JpemUgbG9nIGFyZ3VtZW50cyBpZiBlbmFibGVkLlxuICpcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZm9ybWF0QXJncyhhcmdzKSB7XG5cdGFyZ3NbMF0gPSAodGhpcy51c2VDb2xvcnMgPyAnJWMnIDogJycpICtcblx0XHR0aGlzLm5hbWVzcGFjZSArXG5cdFx0KHRoaXMudXNlQ29sb3JzID8gJyAlYycgOiAnICcpICtcblx0XHRhcmdzWzBdICtcblx0XHQodGhpcy51c2VDb2xvcnMgPyAnJWMgJyA6ICcgJykgK1xuXHRcdCcrJyArIG1vZHVsZS5leHBvcnRzLmh1bWFuaXplKHRoaXMuZGlmZik7XG5cblx0aWYgKCF0aGlzLnVzZUNvbG9ycykge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdGNvbnN0IGMgPSAnY29sb3I6ICcgKyB0aGlzLmNvbG9yO1xuXHRhcmdzLnNwbGljZSgxLCAwLCBjLCAnY29sb3I6IGluaGVyaXQnKTtcblxuXHQvLyBUaGUgZmluYWwgXCIlY1wiIGlzIHNvbWV3aGF0IHRyaWNreSwgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBvdGhlclxuXHQvLyBhcmd1bWVudHMgcGFzc2VkIGVpdGhlciBiZWZvcmUgb3IgYWZ0ZXIgdGhlICVjLCBzbyB3ZSBuZWVkIHRvXG5cdC8vIGZpZ3VyZSBvdXQgdGhlIGNvcnJlY3QgaW5kZXggdG8gaW5zZXJ0IHRoZSBDU1MgaW50b1xuXHRsZXQgaW5kZXggPSAwO1xuXHRsZXQgbGFzdEMgPSAwO1xuXHRhcmdzWzBdLnJlcGxhY2UoLyVbYS16QS1aJV0vZywgbWF0Y2ggPT4ge1xuXHRcdGlmIChtYXRjaCA9PT0gJyUlJykge1x