Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

viewport-mercator-project

Package Overview
Dependencies
Maintainers
4
Versions
48
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

viewport-mercator-project - npm Package Compare versions

Comparing version 4.2.0-alpha.2 to 5.0.0-alpha.1

dist-es6/math-utils.js

22

dist-es6/index.js
// Classic web-mercator-project
export { default } from './flat-mercator-viewport';
export { default as FlatMercatorViewport } from './flat-mercator-viewport';
export { default as PerspectiveMercatorViewport } from './perspective-mercator-viewport';
export { default } from './web-mercator-viewport';
export { default as WebMercatorViewport } from './web-mercator-viewport';
// Legacy class name
export { default as PerspectiveMercatorViewport } from './web-mercator-viewport';
export { projectFlat } from './web-mercator-utils';
export { unprojectFlat } from './web-mercator-utils';
export { getMercatorMeterZoom } from './web-mercator-utils';
export { getMercatorDistanceScales } from './web-mercator-utils';
export { getMercatorWorldPosition } from './web-mercator-utils';
export { makeViewMatricesFromMercatorParams } from './web-mercator-utils';
export { makeUncenteredViewMatrixFromMercatorParams } from './web-mercator-utils';
export { makeProjectionMatrixFromMercatorParams } from './web-mercator-utils';
export { getFov } from './web-mercator-utils';
export { getClippingPlanes } from './web-mercator-utils';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwiRmxhdE1lcmNhdG9yVmlld3BvcnQiLCJQZXJzcGVjdGl2ZU1lcmNhdG9yVmlld3BvcnQiLCJwcm9qZWN0RmxhdCIsInVucHJvamVjdEZsYXQiLCJnZXRNZXJjYXRvck1ldGVyWm9vbSIsImdldE1lcmNhdG9yRGlzdGFuY2VTY2FsZXMiLCJnZXRNZXJjYXRvcldvcmxkUG9zaXRpb24iLCJtYWtlVmlld01hdHJpY2VzRnJvbU1lcmNhdG9yUGFyYW1zIiwibWFrZVVuY2VudGVyZWRWaWV3TWF0cml4RnJvbU1lcmNhdG9yUGFyYW1zIiwibWFrZVByb2plY3Rpb25NYXRyaXhGcm9tTWVyY2F0b3JQYXJhbXMiLCJnZXRGb3YiLCJnZXRDbGlwcGluZ1BsYW5lcyJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQSxTQUFRQSxPQUFSLFFBQWlDLDBCQUFqQztBQUNBLFNBQVFBLFdBQVdDLG9CQUFuQixRQUE4QywwQkFBOUM7QUFDQSxTQUFRRCxXQUFXRSwyQkFBbkIsUUFBcUQsaUNBQXJEOztBQUVBLFNBQVFDLFdBQVIsUUFBMEIsc0JBQTFCO0FBQ0EsU0FBUUMsYUFBUixRQUE0QixzQkFBNUI7QUFDQSxTQUFRQyxvQkFBUixRQUFtQyxzQkFBbkM7QUFDQSxTQUFRQyx5QkFBUixRQUF3QyxzQkFBeEM7QUFDQSxTQUFRQyx3QkFBUixRQUF1QyxzQkFBdkM7QUFDQSxTQUFRQyxrQ0FBUixRQUFpRCxzQkFBakQ7QUFDQSxTQUFRQywwQ0FBUixRQUF5RCxzQkFBekQ7QUFDQSxTQUFRQyxzQ0FBUixRQUFxRCxzQkFBckQ7QUFDQSxTQUFRQyxNQUFSLFFBQXFCLHNCQUFyQjtBQUNBLFNBQVFDLGlCQUFSLFFBQWdDLHNCQUFoQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENsYXNzaWMgd2ViLW1lcmNhdG9yLXByb2plY3RcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZWZhdWx0fSBmcm9tICcuL2ZsYXQtbWVyY2F0b3Itdmlld3BvcnQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIEZsYXRNZXJjYXRvclZpZXdwb3J0fSBmcm9tICcuL2ZsYXQtbWVyY2F0b3Itdmlld3BvcnQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFBlcnNwZWN0aXZlTWVyY2F0b3JWaWV3cG9ydH0gZnJvbSAnLi9wZXJzcGVjdGl2ZS1tZXJjYXRvci12aWV3cG9ydCc7XG5cbmV4cG9ydCB7cHJvamVjdEZsYXR9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmV4cG9ydCB7dW5wcm9qZWN0RmxhdH0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHtnZXRNZXJjYXRvck1ldGVyWm9vbX0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHtnZXRNZXJjYXRvckRpc3RhbmNlU2NhbGVzfSBmcm9tICcuL3dlYi1tZXJjYXRvci11dGlscyc7XG5leHBvcnQge2dldE1lcmNhdG9yV29ybGRQb3NpdGlvbn0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHttYWtlVmlld01hdHJpY2VzRnJvbU1lcmNhdG9yUGFyYW1zfSBmcm9tICcuL3dlYi1tZXJjYXRvci11dGlscyc7XG5leHBvcnQge21ha2VVbmNlbnRlcmVkVmlld01hdHJpeEZyb21NZXJjYXRvclBhcmFtc30gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHttYWtlUHJvamVjdGlvbk1hdHJpeEZyb21NZXJjYXRvclBhcmFtc30gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHtnZXRGb3Z9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmV4cG9ydCB7Z2V0Q2xpcHBpbmdQbGFuZXN9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbiJdfQ==
export { fitBounds } from './web-mercator-viewport';
export { projectFlat, unprojectFlat, getMeterZoom, getDistanceScales, getWorldPosition, getViewMatrix, getUncenteredViewMatrix, getProjectionMatrix } from './web-mercator-utils';
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwiV2ViTWVyY2F0b3JWaWV3cG9ydCIsIlBlcnNwZWN0aXZlTWVyY2F0b3JWaWV3cG9ydCIsImZpdEJvdW5kcyIsInByb2plY3RGbGF0IiwidW5wcm9qZWN0RmxhdCIsImdldE1ldGVyWm9vbSIsImdldERpc3RhbmNlU2NhbGVzIiwiZ2V0V29ybGRQb3NpdGlvbiIsImdldFZpZXdNYXRyaXgiLCJnZXRVbmNlbnRlcmVkVmlld01hdHJpeCIsImdldFByb2plY3Rpb25NYXRyaXgiXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsU0FBUUEsT0FBUixRQUFpQyx5QkFBakM7QUFDQSxTQUFRQSxXQUFXQyxtQkFBbkIsUUFBNkMseUJBQTdDO0FBQ0E7QUFDQSxTQUFRRCxXQUFXRSwyQkFBbkIsUUFBcUQseUJBQXJEOztBQUVBLFNBQVFDLFNBQVIsUUFBd0IseUJBQXhCOztBQUVBLFNBQ0VDLFdBREYsRUFFRUMsYUFGRixFQUdFQyxZQUhGLEVBSUVDLGlCQUpGLEVBS0VDLGdCQUxGLEVBTUVDLGFBTkYsRUFPRUMsdUJBUEYsRUFRRUMsbUJBUkYsUUFTTyxzQkFUUCIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENsYXNzaWMgd2ViLW1lcmNhdG9yLXByb2plY3RcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZWZhdWx0fSBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5leHBvcnQge2RlZmF1bHQgYXMgV2ViTWVyY2F0b3JWaWV3cG9ydH0gZnJvbSAnLi93ZWItbWVyY2F0b3Itdmlld3BvcnQnO1xuLy8gTGVnYWN5IGNsYXNzIG5hbWVcbmV4cG9ydCB7ZGVmYXVsdCBhcyBQZXJzcGVjdGl2ZU1lcmNhdG9yVmlld3BvcnR9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXZpZXdwb3J0JztcblxuZXhwb3J0IHtmaXRCb3VuZHN9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXZpZXdwb3J0JztcblxuZXhwb3J0IHtcbiAgcHJvamVjdEZsYXQsXG4gIHVucHJvamVjdEZsYXQsXG4gIGdldE1ldGVyWm9vbSxcbiAgZ2V0RGlzdGFuY2VTY2FsZXMsXG4gIGdldFdvcmxkUG9zaXRpb24sXG4gIGdldFZpZXdNYXRyaXgsXG4gIGdldFVuY2VudGVyZWRWaWV3TWF0cml4LFxuICBnZXRQcm9qZWN0aW9uTWF0cml4XG59IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbiJdfQ==

@@ -6,2 +6,4 @@ var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();

import { Vector3 } from 'math.gl';
import { createMat4 } from './math-utils';
import mat4_perspective from 'gl-mat4/perspective';

@@ -22,10 +24,5 @@ import mat4_scale from 'gl-mat4/scale';

var WORLD_SCALE = TILE_SIZE;
var EARTH_CIRCUMFERENCE = 40.075e6;
// const METERS_PER_DEGREE_AT_EQUATOR = 111000; // Approximately 111km per degree at equator
// Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()
function createMat4() {
return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
}
/**

@@ -76,7 +73,6 @@ * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.

// S=C*cos(y)/2^(z+8)
export function getMercatorMeterZoom(_ref5) {
export function getMeterZoom(_ref5) {
var latitude = _ref5.latitude;
assert(latitude);
var EARTH_CIRCUMFERENCE = 40.075e6;
var radians = function radians(degrees) {

@@ -94,3 +90,3 @@ return degrees / 180 * Math.PI;

*/
export function getMercatorDistanceScales(_ref6) {
export function getDistanceScales(_ref6) {
var latitude = _ref6.latitude,

@@ -139,3 +135,3 @@ longitude = _ref6.longitude,

*/
export function getMercatorWorldPosition(_ref7) {
export function getWorldPosition(_ref7) {
var longitude = _ref7.longitude,

@@ -150,5 +146,2 @@ latitude = _ref7.latitude,

// Calculate distance scales if lng/lat/zoom are provided
distanceScales = distanceScales || getMercatorDistanceScales({ latitude: latitude, longitude: longitude, scale: scale });
// Make a centered version of the matrix for projection modes without an offset

@@ -159,2 +152,5 @@ var center2d = projectFlat([longitude, latitude], scale);

if (meterOffset) {
// Calculate distance scales if lng/lat/zoom are provided
distanceScales = distanceScales || getDistanceScales({ latitude: latitude, longitude: longitude, scale: scale });
var pixelPosition = new Vector3(meterOffset)

@@ -178,3 +174,3 @@ // Convert to pixels in current zoom

// Variable fov (in radians)
export function getFov(_ref8) {
function getFov(_ref8) {
var height = _ref8.height,

@@ -186,3 +182,3 @@ altitude = _ref8.altitude;

export function getClippingPlanes(_ref9) {
function getClippingPlanes(_ref9) {
var altitude = _ref9.altitude,

@@ -204,12 +200,7 @@ pitch = _ref9.pitch;

// TODO - rename this matrix
export function makeUncenteredViewMatrixFromMercatorParams(_ref10) {
var width = _ref10.width,
height = _ref10.height,
longitude = _ref10.longitude,
latitude = _ref10.latitude,
zoom = _ref10.zoom,
export function getUncenteredViewMatrix(_ref10) {
var height = _ref10.height,
pitch = _ref10.pitch,
bearing = _ref10.bearing,
altitude = _ref10.altitude,
center = _ref10.center;
altitude = _ref10.altitude;

@@ -237,3 +228,3 @@ // VIEW MATRIX: PROJECTS MERCATOR WORLD COORDINATES

export function makeViewMatricesFromMercatorParams(_ref11) {
export function getViewMatrix(_ref11) {
var width = _ref11.width,

@@ -247,7 +238,16 @@ height = _ref11.height,

altitude = _ref11.altitude,
centerLngLat = _ref11.centerLngLat,
_ref11$distanceScales = _ref11.distanceScales,
distanceScales = _ref11$distanceScales === undefined ? null : _ref11$distanceScales,
_ref11$center = _ref11.center,
center = _ref11$center === undefined ? null : _ref11$center,
_ref11$viewMatrixUnce = _ref11.viewMatrixUncentered,
viewMatrixUncentered = _ref11$viewMatrixUnce === undefined ? null : _ref11$viewMatrixUnce,
_ref11$meterOffset = _ref11.meterOffset,
meterOffset = _ref11$meterOffset === undefined ? null : _ref11$meterOffset;
meterOffset = _ref11$meterOffset === undefined ? null : _ref11$meterOffset,
_ref11$flipY = _ref11.flipY,
flipY = _ref11$flipY === undefined ? true : _ref11$flipY;
var center = getMercatorWorldPosition({ longitude: longitude, latitude: latitude, zoom: zoom, meterOffset: meterOffset });
if (!center) {
center = getWorldPosition({ longitude: longitude, latitude: latitude, zoom: zoom, distanceScales: distanceScales, meterOffset: meterOffset });
}

@@ -257,22 +257,15 @@ // VIEW MATRIX: PROJECTS FROM VIRTUAL PIXELS TO CAMERA SPACE

// since vectors will be multiplied from the right during transformation
var viewMatrixUncentered = makeUncenteredViewMatrixFromMercatorParams({
width: width,
height: height,
longitude: longitude,
latitude: latitude,
zoom: zoom,
pitch: pitch,
bearing: bearing,
altitude: altitude
});
if (!viewMatrixUncentered) {
viewMatrixUncentered = getUncenteredViewMatrix({ height: height, pitch: pitch, bearing: bearing, altitude: altitude });
}
var vm = createMat4();
mat4_scale(vm, viewMatrixUncentered, [1, -1, 1]);
if (flipY) {
mat4_scale(vm, viewMatrixUncentered, [1, -1, 1]);
}
var viewMatrixCentered = mat4_translate(vm, vm, new Vector3(center).negate());
return {
viewMatrixCentered: viewMatrixCentered,
viewMatrixUncentered: viewMatrixUncentered,
center: center
};
return viewMatrixCentered;
}

@@ -282,3 +275,3 @@

// This is a "Mapbox" projection matrix - matches mapbox exactly if farZMultiplier === 1
export function makeProjectionMatrixFromMercatorParams(_ref12) {
export function getProjectionMatrix(_ref12) {
var width = _ref12.width,

@@ -297,3 +290,3 @@ height = _ref12.height,

var projectionMatrix = mat4_perspective(createMat4(), fov, // fov in radians
var projectionMatrix = mat4_perspective([], fov, // fov in radians
width / height, // aspect ratio

@@ -306,2 +299,2 @@ nearZ, // near plane

}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItbWVyY2F0b3ItdXRpbHMuanMiXSwibmFtZXMiOlsiVmVjdG9yMyIsIm1hdDRfcGVyc3BlY3RpdmUiLCJtYXQ0X3NjYWxlIiwibWF0NF90cmFuc2xhdGUiLCJtYXQ0X3JvdGF0ZVgiLCJtYXQ0X3JvdGF0ZVoiLCJ2ZWMyX2Rpc3RhbmNlIiwiYXNzZXJ0IiwiUEkiLCJNYXRoIiwiUElfNCIsIkRFR1JFRVNfVE9fUkFESUFOUyIsIlJBRElBTlNfVE9fREVHUkVFUyIsIlRJTEVfU0laRSIsIldPUkxEX1NDQUxFIiwiY3JlYXRlTWF0NCIsInByb2plY3RGbGF0Iiwic2NhbGUiLCJsbmciLCJsYXQiLCJsYW1iZGEyIiwicGhpMiIsIngiLCJ5IiwibG9nIiwidGFuIiwidW5wcm9qZWN0RmxhdCIsImF0YW4iLCJleHAiLCJnZXRNZXJjYXRvck1ldGVyWm9vbSIsImxhdGl0dWRlIiwiRUFSVEhfQ0lSQ1VNRkVSRU5DRSIsInJhZGlhbnMiLCJkZWdyZWVzIiwibG9nMiIsImNvcyIsImdldE1lcmNhdG9yRGlzdGFuY2VTY2FsZXMiLCJsb25naXR1ZGUiLCJ6b29tIiwidW5kZWZpbmVkIiwicG93IiwiaXNOYU4iLCJsYXRDb3NpbmUiLCJwaXhlbHNQZXJEZWdyZWVYIiwicGl4ZWxzUGVyRGVncmVlWSIsIndvcmxkU2l6ZSIsImFsdFBpeGVsc1Blck1ldGVyIiwicGl4ZWxzUGVyTWV0ZXIiLCJtZXRlcnNQZXJQaXhlbCIsInBpeGVsc1BlckRlZ3JlZSIsImRlZ3JlZXNQZXJQaXhlbCIsImdldE1lcmNhdG9yV29ybGRQb3NpdGlvbiIsIm1ldGVyT2Zmc2V0IiwiZGlzdGFuY2VTY2FsZXMiLCJjZW50ZXIyZCIsImNlbnRlciIsInBpeGVsUG9zaXRpb24iLCJhZGQiLCJnZXRGb3YiLCJoZWlnaHQiLCJhbHRpdHVkZSIsImdldENsaXBwaW5nUGxhbmVzIiwicGl0Y2giLCJwaXRjaFJhZGlhbnMiLCJoYWxmRm92IiwidG9wSGFsZlN1cmZhY2VEaXN0YW5jZSIsInNpbiIsImZhcloiLCJuZWFyWiIsIm1ha2VVbmNlbnRlcmVkVmlld01hdHJpeEZyb21NZXJjYXRvclBhcmFtcyIsIndpZHRoIiwiYmVhcmluZyIsInZtIiwibWFrZVZpZXdNYXRyaWNlc0Zyb21NZXJjYXRvclBhcmFtcyIsImNlbnRlckxuZ0xhdCIsInZpZXdNYXRyaXhVbmNlbnRlcmVkIiwidmlld01hdHJpeENlbnRlcmVkIiwibmVnYXRlIiwibWFrZVByb2plY3Rpb25NYXRyaXhGcm9tTWVyY2F0b3JQYXJhbXMiLCJmYXJaTXVsdGlwbGllciIsImZvdiIsInByb2plY3Rpb25NYXRyaXgiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBRUEsU0FBUUEsT0FBUixRQUFzQixTQUF0QjtBQUNBLE9BQU9DLGdCQUFQLE1BQTZCLHFCQUE3QjtBQUNBLE9BQU9DLFVBQVAsTUFBdUIsZUFBdkI7QUFDQSxPQUFPQyxjQUFQLE1BQTJCLG1CQUEzQjtBQUNBLE9BQU9DLFlBQVAsTUFBeUIsaUJBQXpCO0FBQ0EsT0FBT0MsWUFBUCxNQUF5QixpQkFBekI7QUFDQSxPQUFPQyxhQUFQLE1BQTBCLGtCQUExQjtBQUNBLE9BQU9DLE1BQVAsTUFBbUIsUUFBbkI7O0FBRUE7QUFDQSxJQUFNQyxLQUFLQyxLQUFLRCxFQUFoQjtBQUNBLElBQU1FLE9BQU9GLEtBQUssQ0FBbEI7QUFDQSxJQUFNRyxxQkFBcUJILEtBQUssR0FBaEM7QUFDQSxJQUFNSSxxQkFBcUIsTUFBTUosRUFBakM7QUFDQSxJQUFNSyxZQUFZLEdBQWxCO0FBQ0EsSUFBTUMsY0FBY0QsU0FBcEI7O0FBRUE7O0FBRUE7QUFDQSxTQUFTRSxVQUFULEdBQXNCO0FBQ3BCLFNBQU8sQ0FBQyxDQUFELEVBQUksQ0FBSixFQUFPLENBQVAsRUFBVSxDQUFWLEVBQWEsQ0FBYixFQUFnQixDQUFoQixFQUFtQixDQUFuQixFQUFzQixDQUF0QixFQUF5QixDQUF6QixFQUE0QixDQUE1QixFQUErQixDQUEvQixFQUFrQyxDQUFsQyxFQUFxQyxDQUFyQyxFQUF3QyxDQUF4QyxF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QUEsTUFDTU0sS0FETixzQkFDTUEsS0FETjtBQUFBLE1BQ2FELElBRGIsc0JBQ2FBLElBRGI7O0FBRUQsTUFBTWEsTUFBTXRCLE9BQU8sRUFBQ0MsY0FBRCxFQUFTQyxrQkFBVCxFQUFQLENBQVo7O0FBRUEsTUFBTXFCLG1CQUFtQmhGLGlCQUN2QmMsWUFEdUIsRUFFdkJpRSxHQUZ1QixFQUVMO0FBQ2xCVixVQUFRWCxNQUhlLEVBR0w7QUFDbEJTLE9BSnVCLEVBSUw7QUFDbEJELFNBQU9ZLGNBTGdCLENBS0Q7QUFMQyxHQUF6Qjs7QUFRQSxTQUFPRSxnQkFBUDtBQUNEIiwiZmlsZSI6IndlYi1tZXJjYXRvci11dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE8gLSBUSEUgVVRJTElUSUVTIElOIFRISVMgRklMRSBTSE9VTEQgQkUgSU1QT1JURUQgRlJPTSBXRUItTUVSQ0FUT1ItVklFV1BPUlQgTU9EVUxFXG5cbmltcG9ydCB7VmVjdG9yM30gZnJvbSAnbWF0aC5nbCc7XG5pbXBvcnQgbWF0NF9wZXJzcGVjdGl2ZSBmcm9tICdnbC1tYXQ0L3BlcnNwZWN0aXZlJztcbmltcG9ydCBtYXQ0X3NjYWxlIGZyb20gJ2dsLW1hdDQvc2NhbGUnO1xuaW1wb3J0IG1hdDRfdHJhbnNsYXRlIGZyb20gJ2dsLW1hdDQvdHJhbnNsYXRlJztcbmltcG9ydCBtYXQ0X3JvdGF0ZVggZnJvbSAnZ2wtbWF0NC9yb3RhdGVYJztcbmltcG9ydCBtYXQ0X3JvdGF0ZVogZnJvbSAnZ2wtbWF0NC9yb3RhdGVaJztcbmltcG9ydCB2ZWMyX2Rpc3RhbmNlIGZyb20gJ2dsLXZlYzIvZGlzdGFuY2UnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG4vLyBDT05TVEFOVFNcbmNvbnN0IFBJID0gTWF0aC5QSTtcbmNvbnN0IFBJXzQgPSBQSSAvIDQ7XG5jb25zdCBERUdSRUVTX1RPX1JBRElBTlMgPSBQSSAvIDE4MDtcbmNvbnN0IFJBRElBTlNfVE9fREVHUkVFUyA9IDE4MCAvIFBJO1xuY29uc3QgVElMRV9TSVpFID0gNTEyO1xuY29uc3QgV09STERfU0NBTEUgPSBUSUxFX1NJWkU7XG5cbi8vIGNvbnN0IE1FVEVSU19QRVJfREVHUkVFX0FUX0VRVUFUT1IgPSAxMTEwMDA7IC8vIEFwcHJveGltYXRlbHkgMTExa20gcGVyIGRlZ3JlZSBhdCBlcXVhdG9yXG5cbi8vIEhlbHBlciwgYXZvaWRzIGxvdy1wcmVjaXNpb24gMzIgYml0IG1hdHJpY2VzIGZyb20gZ2wtbWF0cml4IG1hdDQuY3JlYXRlKClcbmZ1bmN0aW9uIGNyZWF0ZU1hdDQoKSB7XG4gIHJldHVybiBbMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMV07XG59XG5cbi8qKlxuICogUHJvamVjdCBbbG5nLGxhdF0gb24gc3BoZXJlIG9udG8gW3gseV0gb24gNTEyKjUxMiBNZXJjYXRvciBab29tIDAgdGlsZS5cbiAqIFBlcmZvcm1zIHRoZSBub25saW5lYXIgcGFydCBvZiB0aGUgd2ViIG1lcmNhdG9yIHByb2plY3Rpb24uXG4gKiBSZW1haW5pbmcgcHJvamVjdGlvbiBpcyBkb25lIHdpdGggNHg0IG1hdHJpY2VzIHdoaWNoIGFsc28gaGFuZGxlc1xuICogcGVyc3BlY3RpdmUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gbG5nTGF0IC0gW2xuZywgbGF0XSBjb29yZGluYXRlc1xuICogICBTcGVjaWZpZXMgYSBwb2ludCBvbiB0aGUgc3BoZXJlIHRvIHByb2plY3Qgb250byB0aGUgbWFwLlxuICogQHJldHVybiB7QXJyYXl9IFt4LHldIGNvb3JkaW5hdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdEZsYXQoW2xuZywgbGF0XSwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSAqIFdPUkxEX1NDQUxFO1xuICBjb25zdCBsYW1iZGEyID0gbG5nICogREVHUkVFU19UT19SQURJQU5TO1xuICBjb25zdCBwaGkyID0gbGF0ICogREVHUkVFU19UT19SQURJQU5TO1xuICBjb25zdCB4ID0gc2NhbGUgKiAobGFtYmRhMiArIFBJKSAvICgyICogUEkpO1xuICBjb25zdCB5ID0gc2NhbGUgKiAoUEkgLSBNYXRoLmxvZyhNYXRoLnRhbihQSV80ICsgcGhpMiAqIDAuNSkpKSAvICgyICogUEkpO1xuICByZXR1cm4gW3gsIHldO1xufVxuXG4vKipcbiAqIFVucHJvamVjdCB3b3JsZCBwb2ludCBbeCx5XSBvbiBtYXAgb250byB7bGF0LCBsb259IG9uIHNwaGVyZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fFZlY3Rvcn0geHkgLSBvYmplY3Qgd2l0aCB7eCx5fSBtZW1iZXJzXG4gKiAgcmVwcmVzZW50aW5nIHBvaW50IG9uIHByb2plY3RlZCBtYXAgcGxhbmVcbiAqIEByZXR1cm4ge0dlb0Nvb3JkaW5hdGVzfSAtIG9iamVjdCB3aXRoIHtsYXQsbG9ufSBvZiBwb2ludCBvbiBzcGhlcmUuXG4gKiAgIEhhcyB0b0FycmF5IG1ldGhvZCBpZiB5b3UgbmVlZCBhIEdlb0pTT04gQXJyYXkuXG4gKiAgIFBlciBjYXJ0b2dyYXBoaWMgdHJhZGl0aW9uLCBsYXQgYW5kIGxvbiBhcmUgc3BlY2lmaWVkIGFzIGRlZ3JlZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnByb2plY3RGbGF0KFt4LCB5XSwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSAqIFdPUkxEX1NDQUxFO1xuICBjb25zdCBsYW1iZGEyID0gKHggLyBzY2FsZSkgKiAoMiAqIFBJKSAtIFBJO1xuICBjb25zdCBwaGkyID0gMiAqIChNYXRoLmF0YW4oTWF0aC5leHAoUEkgLSAoeSAvIHNjYWxlKSAqICgyICogUEkpKSkgLSBQSV80KTtcbiAgcmV0dXJuIFtsYW1iZGEyICogUkFESUFOU19UT19ERUdSRUVTLCBwaGkyICogUkFESUFOU19UT19ERUdSRUVTXTtcbn1cblxuLy8gUmV0dXJucyB0aGUgem9vbSBsZXZlbCB0aGF0IGdpdmVzIGEgMSBtZXRlciBwaXhlbCBhdCBhIGNlcnRhaW4gbGF0aXR1ZGVcbi8vIFM9Qypjb3MoeSkvMl4oeis4KVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1lcmNhdG9yTWV0ZXJab29tKHtsYXRpdHVkZX0pIHtcbiAgYXNzZXJ0KGxhdGl0dWRlKTtcbiAgY29uc3QgRUFSVEhfQ0lSQ1VNRkVSRU5DRSA9IDQwLjA3NWU2O1xuICBjb25zdCByYWRpYW5zID0gZGVncmVlcyA9PiBkZWdyZWVzIC8gMTgwICogTWF0aC5QSTtcbiAgcmV0dXJuIE1hdGgubG9nMihFQVJUSF9DSVJDVU1GRVJFTkNFICogTWF0aC5jb3MocmFkaWFucyhsYXRpdHVkZSkpKSAtIDg7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRpc3RhbmNlIHNjYWxlcyBpbiBtZXRlcnMgYXJvdW5kIGN1cnJlbnQgbGF0L2xvbiwgYm90aCBmb3JcbiAqIGRlZ3JlZXMgYW5kIHBpeGVscy5cbiAqIEluIG1lcmNhdG9yIHByb2plY3Rpb24gbW9kZSwgdGhlIGRpc3RhbmNlIHNjYWxlcyB2YXJ5IHNpZ25pZmljYW50bHlcbiAqIHdpdGggbGF0aXR1ZGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXJjYXRvckRpc3RhbmNlU2NhbGVzKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCB6b29tLCBzY2FsZX0pIHtcbiAgLy8gQ2FsY3VsYXRlIHNjYWxlIGZyb20gem9vbSBpZiBub3QgcHJvdmlkZWRcbiAgc2NhbGUgPSBzY2FsZSAhPT0gdW5kZWZpbmVkID8gc2NhbGUgOiBNYXRoLnBvdygyLCB6b29tKTtcblxuICBhc3NlcnQoIWlzTmFOKGxhdGl0dWRlKSAmJiAhaXNOYU4obG9uZ2l0dWRlKSAmJiAhaXNOYU4oc2NhbGUpKTtcblxuICBjb25zdCBsYXRDb3NpbmUgPSBNYXRoLmNvcyhsYXRpdHVkZSAqIE1hdGguUEkgLyAxODApO1xuXG4gIC8vIGNvbnN0IG1ldGVyc1BlckRlZ3JlZVggPSBNRVRFUlNfUEVSX0RFR1JFRV9BVF9FUVVBVE9SICogbGF0Q29zaW5lO1xuICAvLyBjb25zdCBtZXRlcnNQZXJEZWdyZWVZID0gTUVURVJTX1BFUl9ERUdSRUVfQVRfRVFVQVRPUjtcblxuICAvLyBDYWxjdWxhdGUgbnVtYmVyIG9mIHBpeGVscyBvY2N1cGllZCBieSBvbmUgZGVncmVlIGxvbmdpdHVkZVxuICAvLyBhcm91bmQgY3VycmVudCBsYXQvbG9uXG4gIGNvbnN0IHBpeGVsc1BlckRlZ3JlZVggPSB2ZWMyX2Rpc3RhbmNlKFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUgKyAwLjUsIGxhdGl0dWRlXSwgc2NhbGUpLFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUgLSAwLjUsIGxhdGl0dWRlXSwgc2NhbGUpXG4gICk7XG4gIC8vIENhbGN1bGF0ZSBudW1iZXIgb2YgcGl4ZWxzIG9jY3VwaWVkIGJ5IG9uZSBkZWdyZWUgbGF0aXR1ZGVcbiAgLy8gYXJvdW5kIGN1cnJlbnQgbGF0L2xvblxuICBjb25zdCBwaXhlbHNQZXJEZWdyZWVZID0gdmVjMl9kaXN0YW5jZShcbiAgICBwcm9qZWN0RmxhdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSArIDAuNV0sIHNjYWxlKSxcbiAgICBwcm9qZWN0RmxhdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSAtIDAuNV0sIHNjYWxlKVxuICApO1xuXG4gIGNvbnN0IHdvcmxkU2l6ZSA9IFRJTEVfU0laRSAqIHNjYWxlO1xuICBjb25zdCBhbHRQaXhlbHNQZXJNZXRlciA9IHdvcmxkU2l6ZSAvICg0ZTcgKiBsYXRDb3NpbmUpO1xuICBjb25zdCBwaXhlbHNQZXJNZXRlciA9IFthbHRQaXhlbHNQZXJNZXRlciwgYWx0UGl4ZWxzUGVyTWV0ZXIsIGFsdFBpeGVsc1Blck1ldGVyXTtcbiAgY29uc3QgbWV0ZXJzUGVyUGl4ZWwgPSBbMSAvIGFsdFBpeGVsc1Blck1ldGVyLCAxIC8gYWx0UGl4ZWxzUGVyTWV0ZXIsIDEgLyBhbHRQaXhlbHNQZXJNZXRlcl07XG5cbiAgY29uc3QgcGl4ZWxzUGVyRGVncmVlID0gW3BpeGVsc1BlckRlZ3JlZVgsIHBpeGVsc1BlckRlZ3JlZVksIGFsdFBpeGVsc1Blck1ldGVyXTtcbiAgY29uc3QgZGVncmVlc1BlclBpeGVsID0gWzEgLyBwaXhlbHNQZXJEZWdyZWVYLCAxIC8gcGl4ZWxzUGVyRGVncmVlWSwgMSAvIGFsdFBpeGVsc1Blck1ldGVyXTtcblxuICAvLyBNYWluIHJlc3VsdHMsIHVzZWQgZm9yIGNvbnZlcnRpbmcgbWV0ZXJzIHRvIGxhdGxuZyBkZWx0YXMgYW5kIHNjYWxpbmcgb2Zmc2V0c1xuICByZXR1cm4ge1xuICAgIHBpeGVsc1Blck1ldGVyLFxuICAgIG1ldGVyc1BlclBpeGVsLFxuICAgIHBpeGVsc1BlckRlZ3JlZSxcbiAgICBkZWdyZWVzUGVyUGl4ZWxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgbWVyY2F0b3Igd29ybGQgcG9zaXRpb24gKFwicGl4ZWxzXCIgaW4gZ2l2ZW4gem9vbSBsZXZlbClcbiAqIGZyb20gYSBsbmcvbGF0IGFuZCBtZXRlck9mZnNldFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVyY2F0b3JXb3JsZFBvc2l0aW9uKHtcbiAgbG9uZ2l0dWRlLFxuICBsYXRpdHVkZSxcbiAgem9vbSxcbiAgbWV0ZXJPZmZzZXQsXG4gIGRpc3RhbmNlU2NhbGVzID0gbnVsbFxufSkge1xuICBjb25zdCBzY2FsZSA9IE1hdGgucG93KDIsIHpvb20pO1xuXG4gIC8vIENhbGN1bGF0ZSBkaXN0YW5jZSBzY2FsZXMgaWYgbG5nL2xhdC96b29tIGFyZSBwcm92aWRlZFxuICBkaXN0YW5jZVNjYWxlcyA9IGRpc3RhbmNlU2NhbGVzIHx8IGdldE1lcmNhdG9yRGlzdGFuY2VTY2FsZXMoe2xhdGl0dWRlLCBsb25naXR1ZGUsIHNjYWxlfSk7XG5cbiAgLy8gTWFrZSBhIGNlbnRlcmVkIHZlcnNpb24gb2YgdGhlIG1hdHJpeCBmb3IgcHJvamVjdGlvbiBtb2RlcyB3aXRob3V0IGFuIG9mZnNldFxuICBjb25zdCBjZW50ZXIyZCA9IHByb2plY3RGbGF0KFtsb25naXR1ZGUsIGxhdGl0dWRlXSwgc2NhbGUpO1xuICBjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMyhjZW50ZXIyZFswXSwgY2VudGVyMmRbMV0sIDApO1xuXG4gIGlmIChtZXRlck9mZnNldCkge1xuICAgIGNvbnN0IHBpeGVsUG9zaXRpb24gPSBuZXcgVmVjdG9yMyhtZXRlck9mZnNldClcbiAgICAgIC8vIENvbnZlcnQgdG8gcGl4ZWxzIGluIGN1cnJlbnQgem9vbVxuICAgICAgLnNjYWxlKGRpc3RhbmNlU2NhbGVzLnBpeGVsc1Blck1ldGVyKVxuICAgICAgLy8gV2Ugd2FudCBwb3NpdGl2ZSBZIHRvIHJlcHJlc2VudCBhbiBvZmZzZXQgdG93YXJkcyBub3J0aCxcbiAgICAgIC8vIGJ1dCB3ZWIgbWVyY2F0b3Igd29ybGQgY29vcmRpbmF0ZXMgaXMgdG9wLWxlZnRcbiAgICAgIC5zY2FsZShbMSwgLTEsIDFdKTtcbiAgICBjZW50ZXIuYWRkKHBpeGVsUG9zaXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIGNlbnRlcjtcbn1cblxuLy8gQVRUUklCVVRJT046XG4vLyB2aWV3IGFuZCBwcm9qZWN0aW9uIG1hdHJpeCBjcmVhdGlvbiBpcyBpbnRlbnRpb25hbGx5IGtlcHQgY29tcGF0aWJsZSB3aXRoXG4vLyBtYXBib3gtZ2wncyBpbXBsZW1lbnRhdGlvbiB0byBlbnN1cmUgdGhhdCBzZWFtbGVzcyBpbnRlcm9wZXJhdGlvblxuLy8gd2l0aCBtYXBib3ggYW5kIHJlYWN0LW1hcC1nbC4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qc1xuXG4vLyBWYXJpYWJsZSBmb3YgKGluIHJhZGlhbnMpXG5leHBvcnQgZnVuY3Rpb24gZ2V0Rm92KHtoZWlnaHQsIGFsdGl0dWRlfSkge1xuICByZXR1cm4gMiAqIE1hdGguYXRhbigoaGVpZ2h0IC8gMikgLyBhbHRpdHVkZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDbGlwcGluZ1BsYW5lcyh7YWx0aXR1ZGUsIHBpdGNofSkge1xuICAvLyBGaW5kIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgcG9pbnQgdG8gdGhlIGNlbnRlciB0b3BcbiAgLy8gaW4gYWx0aXR1ZGUgdW5pdHMgdXNpbmcgbGF3IG9mIHNpbmVzLlxuICBjb25zdCBwaXRjaFJhZGlhbnMgPSBwaXRjaCAqIERFR1JFRVNfVE9fUkFESUFOUztcbiAgY29uc3QgaGFsZkZvdiA9IE1hdGguYXRhbigwLjUgLyBhbHRpdHVkZSk7XG4gIGNvbnN0IHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgPVxuICAgIE1hdGguc2luKGhhbGZGb3YpICogYWx0aXR1ZGUgLyBNYXRoLnNpbihNYXRoLlBJIC8gMiAtIHBpdGNoUmFkaWFucyAtIGhhbGZGb3YpO1xuXG4gIC8vIENhbGN1bGF0ZSB6IHZhbHVlIG9mIHRoZSBmYXJ0aGVzdCBmcmFnbWVudCB0aGF0IHNob3VsZCBiZSByZW5kZXJlZC5cbiAgY29uc3QgZmFyWiA9IE1hdGguY29zKE1hdGguUEkgLyAyIC0gcGl0Y2hSYWRpYW5zKSAqIHRvcEhhbGZTdXJmYWNlRGlzdGFuY2UgKyBhbHRpdHVkZTtcblxuICByZXR1cm4ge2ZhclosIG5lYXJaOiAwLjF9O1xufVxuXG4vLyBUT0RPIC0gcmVuYW1lIHRoaXMgbWF0cml4XG5leHBvcnQgZnVuY3Rpb24gbWFrZVVuY2VudGVyZWRWaWV3TWF0cml4RnJvbU1lcmNhdG9yUGFyYW1zKHtcbiAgd2lkdGgsXG4gIGhlaWdodCxcbiAgbG9uZ2l0dWRlLFxuICBsYXRpdHVkZSxcbiAgem9vbSxcbiAgcGl0Y2gsXG4gIGJlYXJpbmcsXG4gIGFsdGl0dWRlLFxuICBjZW50ZXJcbn0pIHtcbiAgLy8gVklFVyBNQVRSSVg6IFBST0pFQ1RTIE1FUkNBVE9SIFdPUkxEIENPT1JESU5BVEVTXG4gIC8vIE5vdGUgdGhhdCBtZXJjYXRvciB3b3JsZCBjb29yZGluYXRlcyB0eXBpY2FsbHkgbmVlZCB0byBiZSBmbGlwcGVkXG4gIC8vXG4gIC8vIE5vdGU6IEFzIHVzdWFsLCBtYXRyaXggb3BlcmF0aW9uIG9yZGVycyBzaG91bGQgYmUgcmVhZCBpbiByZXZlcnNlXG4gIC8vIHNpbmNlIHZlY3RvcnMgd2lsbCBiZSBtdWx0aXBsaWVkIGZyb20gdGhlIHJpZ2h0IGR1cmluZyB0cmFuc2Zvcm1hdGlvblxuICBjb25zdCB2bSA9IGNyZWF0ZU1hdDQoKTtcblxuICAvLyBNb3ZlIGNhbWVyYSB0byBhbHRpdHVkZSAoYWxvbmcgdGhlIHBpdGNoICYgYmVhcmluZyBkaXJlY3Rpb24pXG4gIG1hdDRfdHJhbnNsYXRlKHZtLCB2bSwgWzAsIDAsIC1hbHRpdHVkZV0pO1xuXG4gIC8vIEFmdGVyIHRoZSByb3RhdGVYLCB6IHZhbHVlcyBhcmUgaW4gcGl4ZWwgdW5pdHMuIENvbnZlcnQgdGhlbSB0b1xuICAvLyBhbHRpdHVkZSB1bml0cy4gMSBhbHRpdHVkZSB1bml0ID0gdGhlIHNjcmVlbiBoZWlnaHQuXG4gIG1hdDRfc2NhbGUodm0sIHZtLCBbMSwgMSwgMSAvIGhlaWdodF0pO1xuXG4gIC8vIFJvdGF0ZSBieSBiZWFyaW5nLCBhbmQgdGhlbiBieSBwaXRjaCAod2hpY2ggdGlsdHMgdGhlIHZpZXcpXG4gIG1hdDRfcm90YXRlWCh2bSwgdm0sIC1waXRjaCAqIERFR1JFRVNfVE9fUkFESUFOUyk7XG4gIG1hdDRfcm90YXRlWih2bSwgdm0sIGJlYXJpbmcgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuXG4gIHJldHVybiB2bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1ha2VWaWV3TWF0cmljZXNGcm9tTWVyY2F0b3JQYXJhbXMoe1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBsb25naXR1ZGUsXG4gIGxhdGl0dWRlLFxuICB6b29tLFxuICBwaXRjaCxcbiAgYmVhcmluZyxcbiAgYWx0aXR1ZGUsXG4gIGNlbnRlckxuZ0xhdCxcbiAgbWV0ZXJPZmZzZXQgPSBudWxsXG59KSB7XG4gIGNvbnN0IGNlbnRlciA9IGdldE1lcmNhdG9yV29ybGRQb3NpdGlvbih7bG9uZ2l0dWRlLCBsYXRpdHVkZSwgem9vbSwgbWV0ZXJPZmZzZXR9KTtcblxuICAvLyBWSUVXIE1BVFJJWDogUFJPSkVDVFMgRlJPTSBWSVJUVUFMIFBJWEVMUyBUTyBDQU1FUkEgU1BBQ0VcbiAgLy8gTm90ZTogQXMgdXN1YWwsIG1hdHJpeCBvcGVyYXRpb24gb3JkZXJzIHNob3VsZCBiZSByZWFkIGluIHJldmVyc2VcbiAgLy8gc2luY2UgdmVjdG9ycyB3aWxsIGJlIG11bHRpcGxpZWQgZnJvbSB0aGUgcmlnaHQgZHVyaW5nIHRyYW5zZm9ybWF0aW9uXG4gIGNvbnN0IHZpZXdNYXRyaXhVbmNlbnRlcmVkID0gbWFrZVVuY2VudGVyZWRWaWV3TWF0cml4RnJvbU1lcmNhdG9yUGFyYW1zKHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgbG9uZ2l0dWRlLFxuICAgIGxhdGl0dWRlLFxuICAgIHpvb20sXG4gICAgcGl0Y2gsXG4gICAgYmVhcmluZyxcbiAgICBhbHRpdHVkZVxuICB9KTtcblxuICBjb25zdCB2bSA9IGNyZWF0ZU1hdDQoKTtcbiAgbWF0NF9zY2FsZSh2bSwgdmlld01hdHJpeFVuY2VudGVyZWQsIFsxLCAtMSwgMV0pO1xuICBjb25zdCB2aWV3TWF0cml4Q2VudGVyZWQgPSBtYXQ0X3RyYW5zbGF0ZSh2bSwgdm0sIG5ldyBWZWN0b3IzKGNlbnRlcikubmVnYXRlKCkpO1xuXG4gIHJldHVybiB7XG4gICAgdmlld01hdHJpeENlbnRlcmVkLFxuICAgIHZpZXdNYXRyaXhVbmNlbnRlcmVkLFxuICAgIGNlbnRlclxuICB9O1xufVxuXG4vLyBQUk9KRUNUSU9OIE1BVFJJWDogUFJPSkVDVFMgRlJPTSBDQU1FUkEgKFZJRVcpIFNQQUNFIFRPIENMSVBTUEFDRVxuLy8gVGhpcyBpcyBhIFwiTWFwYm94XCIgcHJvamVjdGlvbiBtYXRyaXggLSBtYXRjaGVzIG1hcGJveCBleGFjdGx5IGlmIGZhclpNdWx0aXBsaWVyID09PSAxXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb2plY3Rpb25NYXRyaXhGcm9tTWVyY2F0b3JQYXJhbXMoe1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBwaXRjaCxcbiAgYWx0aXR1ZGUsXG4gIGZhclpNdWx0aXBsaWVyID0gMTBcbn0pIHtcbiAgY29uc3Qge25lYXJaLCBmYXJafSA9IGdldENsaXBwaW5nUGxhbmVzKHthbHRpdHVkZSwgcGl0Y2h9KTtcbiAgY29uc3QgZm92ID0gZ2V0Rm92KHtoZWlnaHQsIGFsdGl0dWRlfSk7XG5cbiAgY29uc3QgcHJvamVjdGlvbk1hdHJpeCA9IG1hdDRfcGVyc3BlY3RpdmUoXG4gICAgY3JlYXRlTWF0NCgpLFxuICAgIGZvdiwgICAgICAgICAgICAgIC8vIGZvdiBpbiByYWRpYW5zXG4gICAgd2lkdGggLyBoZWlnaHQsICAgLy8gYXNwZWN0IHJhdGlvXG4gICAgbmVhclosICAgICAgICAgICAgLy8gbmVhciBwbGFuZVxuICAgIGZhclogKiBmYXJaTXVsdGlwbGllciAvLyBmYXIgcGxhbmVcbiAgKTtcblxuICByZXR1cm4gcHJvamVjdGlvbk1hdHJpeDtcbn1cbiJdfQ==
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItbWVyY2F0b3ItdXRpbHMuanMiXSwibmFtZXMiOlsiVmVjdG9yMyIsImNyZWF0ZU1hdDQiLCJtYXQ0X3BlcnNwZWN0aXZlIiwibWF0NF9zY2FsZSIsIm1hdDRfdHJhbnNsYXRlIiwibWF0NF9yb3RhdGVYIiwibWF0NF9yb3RhdGVaIiwidmVjMl9kaXN0YW5jZSIsImFzc2VydCIsIlBJIiwiTWF0aCIsIlBJXzQiLCJERUdSRUVTX1RPX1JBRElBTlMiLCJSQURJQU5TX1RPX0RFR1JFRVMiLCJUSUxFX1NJWkUiLCJXT1JMRF9TQ0FMRSIsIkVBUlRIX0NJUkNVTUZFUkVOQ0UiLCJwcm9qZWN0RmxhdCIsInNjYWxlIiwibG5nIiwibGF0IiwibGFtYmRhMiIsInBoaTIiLCJ4IiwieSIsImxvZyIsInRhbiIsInVucHJvamVjdEZsYXQiLCJhdGFuIiwiZXhwIiwiZ2V0TWV0ZXJab29tIiwibGF0aXR1ZGUiLCJyYWRpYW5zIiwiZGVncmVlcyIsImxvZzIiLCJjb3MiLCJnZXREaXN0YW5jZVNjYWxlcyIsImxvbmdpdHVkZSIsInpvb20iLCJ1bmRlZmluZWQiLCJwb3ciLCJpc05hTiIsImxhdENvc2luZSIsInBpeGVsc1BlckRlZ3JlZVgiLCJwaXhlbHNQZXJEZWdyZWVZIiwid29ybGRTaXplIiwiYWx0UGl4ZWxzUGVyTWV0ZXIiLCJwaXhlbHNQZXJNZXRlciIsIm1ldGVyc1BlclBpeGVsIiwicGl4ZWxzUGVyRGVncmVlIiwiZGVncmVlc1BlclBpeGVsIiwiZ2V0V29ybGRQb3NpdGlvbiIsIm1ldGVyT2Zmc2V0IiwiZGlzdGFuY2VTY2FsZXMiLCJjZW50ZXIyZCIsImNlbnRlciIsInBpeGVsUG9zaXRpb24iLCJhZGQiLCJnZXRGb3YiLCJoZWlnaHQiLCJhbHRpdHVkZSIsImdldENsaXBwaW5nUGxhbmVzIiwicGl0Y2giLCJwaXRjaFJhZGlhbnMiLCJoYWxmRm92IiwidG9wSGFsZlN1cmZhY2VEaXN0YW5jZSIsInNpbiIsImZhcloiLCJuZWFyWiIsImdldFVuY2VudGVyZWRWaWV3TWF0cml4IiwiYmVhcmluZyIsInZtIiwiZ2V0Vmlld01hdHJpeCIsIndpZHRoIiwidmlld01hdHJpeFVuY2VudGVyZWQiLCJmbGlwWSIsInZpZXdNYXRyaXhDZW50ZXJlZCIsIm5lZ2F0ZSIsImdldFByb2plY3Rpb25NYXRyaXgiLCJmYXJaTXVsdGlwbGllciIsImZvdiIsInByb2plY3Rpb25NYXRyaXgiXSwibWFwcGluZ3MiOiI7O0FBQUE7O0FBRUEsU0FBUUEsT0FBUixRQUFzQixTQUF0QjtBQUNBLFNBQVFDLFVBQVIsUUFBeUIsY0FBekI7O0FBRUEsT0FBT0MsZ0JBQVAsTUFBNkIscUJBQTdCO0FBQ0EsT0FBT0MsVUFBUCxNQUF1QixlQUF2QjtBQUNBLE9BQU9DLGNBQVAsTUFBMkIsbUJBQTNCO0FBQ0EsT0FBT0MsWUFBUCxNQUF5QixpQkFBekI7QUFDQSxPQUFPQyxZQUFQLE1BQXlCLGlCQUF6QjtBQUNBLE9BQU9DLGFBQVAsTUFBMEIsa0JBQTFCO0FBQ0EsT0FBT0MsTUFBUCxNQUFtQixRQUFuQjs7QUFFQTtBQUNBLElBQU1DLEtBQUtDLEtBQUtELEVBQWhCO0FBQ0EsSUFBTUUsT0FBT0YsS0FBSyxDQUFsQjtBQUNBLElBQU1HLHFCQUFxQkgsS0FBSyxHQUFoQztBQUNBLElBQU1JLHFCQUFxQixNQUFNSixFQUFqQztBQUNBLElBQU1LLFlBQVksR0FBbEI7QUFDQSxJQUFNQyxjQUFjRCxTQUFwQjtBQUNBLElBQU1FLHNCQUFzQixRQUE1QjtBQUNBOztBQUVBOzs7Ozs7Ozs7O0FBVUEsT0FBTyxTQUFTQyxXQUFULE9BQWlDQyxLQUFqQyxFQUF3QztBQUFBO0FBQUEsTUFBbEJDLEdBQWtCO0FBQUEsTUFBYkMsR0FBYTs7QUFDN0NGLFVBQVFBLFFBQVFILFdBQWhCO0FBQ0EsTUFBTU0sVUFBVUYsTUFBTVAsa0JBQXRCO0FBQ0EsTUFBTVUsT0FBT0YsTUFBTVIsa0JBQW5CO0FBQ0EsTUFBTVcsSUFBSUwsU0FBU0csVUFBVVosRUFBbkIsS0FBMEIsSUFBSUEsRUFBOUIsQ0FB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YXRvci11dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE8gLSBUSEUgVVRJTElUSUVTIElOIFRISVMgRklMRSBTSE9VTEQgQkUgSU1QT1JURUQgRlJPTSBXRUItTUVSQ0FUT1ItVklFV1BPUlQgTU9EVUxFXG5cbmltcG9ydCB7VmVjdG9yM30gZnJvbSAnbWF0aC5nbCc7XG5pbXBvcnQge2NyZWF0ZU1hdDR9IGZyb20gJy4vbWF0aC11dGlscyc7XG5cbmltcG9ydCBtYXQ0X3BlcnNwZWN0aXZlIGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IG1hdDRfc2NhbGUgZnJvbSAnZ2wtbWF0NC9zY2FsZSc7XG5pbXBvcnQgbWF0NF90cmFuc2xhdGUgZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IG1hdDRfcm90YXRlWCBmcm9tICdnbC1tYXQ0L3JvdGF0ZVgnO1xuaW1wb3J0IG1hdDRfcm90YXRlWiBmcm9tICdnbC1tYXQ0L3JvdGF0ZVonO1xuaW1wb3J0IHZlYzJfZGlzdGFuY2UgZnJvbSAnZ2wtdmVjMi9kaXN0YW5jZSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8vIENPTlNUQU5UU1xuY29uc3QgUEkgPSBNYXRoLlBJO1xuY29uc3QgUElfNCA9IFBJIC8gNDtcbmNvbnN0IERFR1JFRVNfVE9fUkFESUFOUyA9IFBJIC8gMTgwO1xuY29uc3QgUkFESUFOU19UT19ERUdSRUVTID0gMTgwIC8gUEk7XG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7XG5jb25zdCBXT1JMRF9TQ0FMRSA9IFRJTEVfU0laRTtcbmNvbnN0IEVBUlRIX0NJUkNVTUZFUkVOQ0UgPSA0MC4wNzVlNjtcbi8vIGNvbnN0IE1FVEVSU19QRVJfREVHUkVFX0FUX0VRVUFUT1IgPSAxMTEwMDA7IC8vIEFwcHJveGltYXRlbHkgMTExa20gcGVyIGRlZ3JlZSBhdCBlcXVhdG9yXG5cbi8qKlxuICogUHJvamVjdCBbbG5nLGxhdF0gb24gc3BoZXJlIG9udG8gW3gseV0gb24gNTEyKjUxMiBNZXJjYXRvciBab29tIDAgdGlsZS5cbiAqIFBlcmZvcm1zIHRoZSBub25saW5lYXIgcGFydCBvZiB0aGUgd2ViIG1lcmNhdG9yIHByb2plY3Rpb24uXG4gKiBSZW1haW5pbmcgcHJvamVjdGlvbiBpcyBkb25lIHdpdGggNHg0IG1hdHJpY2VzIHdoaWNoIGFsc28gaGFuZGxlc1xuICogcGVyc3BlY3RpdmUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gbG5nTGF0IC0gW2xuZywgbGF0XSBjb29yZGluYXRlc1xuICogICBTcGVjaWZpZXMgYSBwb2ludCBvbiB0aGUgc3BoZXJlIHRvIHByb2plY3Qgb250byB0aGUgbWFwLlxuICogQHJldHVybiB7QXJyYXl9IFt4LHldIGNvb3JkaW5hdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdEZsYXQoW2xuZywgbGF0XSwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSAqIFdPUkxEX1NDQUxFO1xuICBjb25zdCBsYW1iZGEyID0gbG5nICogREVHUkVFU19UT19SQURJQU5TO1xuICBjb25zdCBwaGkyID0gbGF0ICogREVHUkVFU19UT19SQURJQU5TO1xuICBjb25zdCB4ID0gc2NhbGUgKiAobGFtYmRhMiArIFBJKSAvICgyICogUEkpO1xuICBjb25zdCB5ID0gc2NhbGUgKiAoUEkgLSBNYXRoLmxvZyhNYXRoLnRhbihQSV80ICsgcGhpMiAqIDAuNSkpKSAvICgyICogUEkpO1xuICByZXR1cm4gW3gsIHldO1xufVxuXG4vKipcbiAqIFVucHJvamVjdCB3b3JsZCBwb2ludCBbeCx5XSBvbiBtYXAgb250byB7bGF0LCBsb259IG9uIHNwaGVyZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fFZlY3Rvcn0geHkgLSBvYmplY3Qgd2l0aCB7eCx5fSBtZW1iZXJzXG4gKiAgcmVwcmVzZW50aW5nIHBvaW50IG9uIHByb2plY3RlZCBtYXAgcGxhbmVcbiAqIEByZXR1cm4ge0dlb0Nvb3JkaW5hdGVzfSAtIG9iamVjdCB3aXRoIHtsYXQsbG9ufSBvZiBwb2ludCBvbiBzcGhlcmUuXG4gKiAgIEhhcyB0b0FycmF5IG1ldGhvZCBpZiB5b3UgbmVlZCBhIEdlb0pTT04gQXJyYXkuXG4gKiAgIFBlciBjYXJ0b2dyYXBoaWMgdHJhZGl0aW9uLCBsYXQgYW5kIGxvbiBhcmUgc3BlY2lmaWVkIGFzIGRlZ3JlZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnByb2plY3RGbGF0KFt4LCB5XSwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSAqIFdPUkxEX1NDQUxFO1xuICBjb25zdCBsYW1iZGEyID0gKHggLyBzY2FsZSkgKiAoMiAqIFBJKSAtIFBJO1xuICBjb25zdCBwaGkyID0gMiAqIChNYXRoLmF0YW4oTWF0aC5leHAoUEkgLSAoeSAvIHNjYWxlKSAqICgyICogUEkpKSkgLSBQSV80KTtcbiAgcmV0dXJuIFtsYW1iZGEyICogUkFESUFOU19UT19ERUdSRUVTLCBwaGkyICogUkFESUFOU19UT19ERUdSRUVTXTtcbn1cblxuLy8gUmV0dXJucyB0aGUgem9vbSBsZXZlbCB0aGF0IGdpdmVzIGEgMSBtZXRlciBwaXhlbCBhdCBhIGNlcnRhaW4gbGF0aXR1ZGVcbi8vIFM9Qypjb3MoeSkvMl4oeis4KVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGVyWm9vbSh7bGF0aXR1ZGV9KSB7XG4gIGFzc2VydChsYXRpdHVkZSk7XG4gIGNvbnN0IHJhZGlhbnMgPSBkZWdyZWVzID0+IGRlZ3JlZXMgLyAxODAgKiBNYXRoLlBJO1xuICByZXR1cm4gTWF0aC5sb2cyKEVBUlRIX0NJUkNVTUZFUkVOQ0UgKiBNYXRoLmNvcyhyYWRpYW5zKGxhdGl0dWRlKSkpIC0gODtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgZGlzdGFuY2Ugc2NhbGVzIGluIG1ldGVycyBhcm91bmQgY3VycmVudCBsYXQvbG9uLCBib3RoIGZvclxuICogZGVncmVlcyBhbmQgcGl4ZWxzLlxuICogSW4gbWVyY2F0b3IgcHJvamVjdGlvbiBtb2RlLCB0aGUgZGlzdGFuY2Ugc2NhbGVzIHZhcnkgc2lnbmlmaWNhbnRseVxuICogd2l0aCBsYXRpdHVkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlU2NhbGVzKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCB6b29tLCBzY2FsZX0pIHtcbiAgLy8gQ2FsY3VsYXRlIHNjYWxlIGZyb20gem9vbSBpZiBub3QgcHJvdmlkZWRcbiAgc2NhbGUgPSBzY2FsZSAhPT0gdW5kZWZpbmVkID8gc2NhbGUgOiBNYXRoLnBvdygyLCB6b29tKTtcblxuICBhc3NlcnQoIWlzTmFOKGxhdGl0dWRlKSAmJiAhaXNOYU4obG9uZ2l0dWRlKSAmJiAhaXNOYU4oc2NhbGUpKTtcblxuICBjb25zdCBsYXRDb3NpbmUgPSBNYXRoLmNvcyhsYXRpdHVkZSAqIE1hdGguUEkgLyAxODApO1xuXG4gIC8vIGNvbnN0IG1ldGVyc1BlckRlZ3JlZVggPSBNRVRFUlNfUEVSX0RFR1JFRV9BVF9FUVVBVE9SICogbGF0Q29zaW5lO1xuICAvLyBjb25zdCBtZXRlcnNQZXJEZWdyZWVZID0gTUVURVJTX1BFUl9ERUdSRUVfQVRfRVFVQVRPUjtcblxuICAvLyBDYWxjdWxhdGUgbnVtYmVyIG9mIHBpeGVscyBvY2N1cGllZCBieSBvbmUgZGVncmVlIGxvbmdpdHVkZVxuICAvLyBhcm91bmQgY3VycmVudCBsYXQvbG9uXG4gIGNvbnN0IHBpeGVsc1BlckRlZ3JlZVggPSB2ZWMyX2Rpc3RhbmNlKFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUgKyAwLjUsIGxhdGl0dWRlXSwgc2NhbGUpLFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUgLSAwLjUsIGxhdGl0dWRlXSwgc2NhbGUpXG4gICk7XG4gIC8vIENhbGN1bGF0ZSBudW1iZXIgb2YgcGl4ZWxzIG9jY3VwaWVkIGJ5IG9uZSBkZWdyZWUgbGF0aXR1ZGVcbiAgLy8gYXJvdW5kIGN1cnJlbnQgbGF0L2xvblxuICBjb25zdCBwaXhlbHNQZXJEZWdyZWVZID0gdmVjMl9kaXN0YW5jZShcbiAgICBwcm9qZWN0RmxhdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSArIDAuNV0sIHNjYWxlKSxcbiAgICBwcm9qZWN0RmxhdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSAtIDAuNV0sIHNjYWxlKVxuICApO1xuXG4gIGNvbnN0IHdvcmxkU2l6ZSA9IFRJTEVfU0laRSAqIHNjYWxlO1xuICBjb25zdCBhbHRQaXhlbHNQZXJNZXRlciA9IHdvcmxkU2l6ZSAvICg0ZTcgKiBsYXRDb3NpbmUpO1xuICBjb25zdCBwaXhlbHNQZXJNZXRlciA9IFthbHRQaXhlbHNQZXJNZXRlciwgYWx0UGl4ZWxzUGVyTWV0ZXIsIGFsdFBpeGVsc1Blck1ldGVyXTtcbiAgY29uc3QgbWV0ZXJzUGVyUGl4ZWwgPSBbMSAvIGFsdFBpeGVsc1Blck1ldGVyLCAxIC8gYWx0UGl4ZWxzUGVyTWV0ZXIsIDEgLyBhbHRQaXhlbHNQZXJNZXRlcl07XG5cbiAgY29uc3QgcGl4ZWxzUGVyRGVncmVlID0gW3BpeGVsc1BlckRlZ3JlZVgsIHBpeGVsc1BlckRlZ3JlZVksIGFsdFBpeGVsc1Blck1ldGVyXTtcbiAgY29uc3QgZGVncmVlc1BlclBpeGVsID0gWzEgLyBwaXhlbHNQZXJEZWdyZWVYLCAxIC8gcGl4ZWxzUGVyRGVncmVlWSwgMSAvIGFsdFBpeGVsc1Blck1ldGVyXTtcblxuICAvLyBNYWluIHJlc3VsdHMsIHVzZWQgZm9yIGNvbnZlcnRpbmcgbWV0ZXJzIHRvIGxhdGxuZyBkZWx0YXMgYW5kIHNjYWxpbmcgb2Zmc2V0c1xuICByZXR1cm4ge1xuICAgIHBpeGVsc1Blck1ldGVyLFxuICAgIG1ldGVyc1BlclBpeGVsLFxuICAgIHBpeGVsc1BlckRlZ3JlZSxcbiAgICBkZWdyZWVzUGVyUGl4ZWxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgbWVyY2F0b3Igd29ybGQgcG9zaXRpb24gKFwicGl4ZWxzXCIgaW4gZ2l2ZW4gem9vbSBsZXZlbClcbiAqIGZyb20gYSBsbmcvbGF0IGFuZCBtZXRlck9mZnNldFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ybGRQb3NpdGlvbih7XG4gIGxvbmdpdHVkZSxcbiAgbGF0aXR1ZGUsXG4gIHpvb20sXG4gIG1ldGVyT2Zmc2V0LFxuICBkaXN0YW5jZVNjYWxlcyA9IG51bGxcbn0pIHtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB6b29tKTtcblxuICAvLyBNYWtlIGEgY2VudGVyZWQgdmVyc2lvbiBvZiB0aGUgbWF0cml4IGZvciBwcm9qZWN0aW9uIG1vZGVzIHdpdGhvdXQgYW4gb2Zmc2V0XG4gIGNvbnN0IGNlbnRlcjJkID0gcHJvamVjdEZsYXQoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCBzY2FsZSk7XG4gIGNvbnN0IGNlbnRlciA9IG5ldyBWZWN0b3IzKGNlbnRlcjJkWzBdLCBjZW50ZXIyZFsxXSwgMCk7XG5cbiAgaWYgKG1ldGVyT2Zmc2V0KSB7XG4gICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIHNjYWxlcyBpZiBsbmcvbGF0L3pvb20gYXJlIHByb3ZpZGVkXG4gICAgZGlzdGFuY2VTY2FsZXMgPSBkaXN0YW5jZVNjYWxlcyB8fCBnZXREaXN0YW5jZVNjYWxlcyh7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgc2NhbGV9KTtcblxuICAgIGNvbnN0IHBpeGVsUG9zaXRpb24gPSBuZXcgVmVjdG9yMyhtZXRlck9mZnNldClcbiAgICAgIC8vIENvbnZlcnQgdG8gcGl4ZWxzIGluIGN1cnJlbnQgem9vbVxuICAgICAgLnNjYWxlKGRpc3RhbmNlU2NhbGVzLnBpeGVsc1Blck1ldGVyKVxuICAgICAgLy8gV2Ugd2FudCBwb3NpdGl2ZSBZIHRvIHJlcHJlc2VudCBhbiBvZmZzZXQgdG93YXJkcyBub3J0aCxcbiAgICAgIC8vIGJ1dCB3ZWIgbWVyY2F0b3Igd29ybGQgY29vcmRpbmF0ZXMgaXMgdG9wLWxlZnRcbiAgICAgIC5zY2FsZShbMSwgLTEsIDFdKTtcbiAgICBjZW50ZXIuYWRkKHBpeGVsUG9zaXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIGNlbnRlcjtcbn1cblxuLy8gQVRUUklCVVRJT046XG4vLyB2aWV3IGFuZCBwcm9qZWN0aW9uIG1hdHJpeCBjcmVhdGlvbiBpcyBpbnRlbnRpb25hbGx5IGtlcHQgY29tcGF0aWJsZSB3aXRoXG4vLyBtYXBib3gtZ2wncyBpbXBsZW1lbnRhdGlvbiB0byBlbnN1cmUgdGhhdCBzZWFtbGVzcyBpbnRlcm9wZXJhdGlvblxuLy8gd2l0aCBtYXBib3ggYW5kIHJlYWN0LW1hcC1nbC4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qc1xuXG4vLyBWYXJpYWJsZSBmb3YgKGluIHJhZGlhbnMpXG5mdW5jdGlvbiBnZXRGb3Yoe2hlaWdodCwgYWx0aXR1ZGV9KSB7XG4gIHJldHVybiAyICogTWF0aC5hdGFuKChoZWlnaHQgLyAyKSAvIGFsdGl0dWRlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQbGFuZXMoe2FsdGl0dWRlLCBwaXRjaH0pIHtcbiAgLy8gRmluZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIHBvaW50IHRvIHRoZSBjZW50ZXIgdG9wXG4gIC8vIGluIGFsdGl0dWRlIHVuaXRzIHVzaW5nIGxhdyBvZiBzaW5lcy5cbiAgY29uc3QgcGl0Y2hSYWRpYW5zID0gcGl0Y2ggKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIGNvbnN0IGhhbGZGb3YgPSBNYXRoLmF0YW4oMC41IC8gYWx0aXR1ZGUpO1xuICBjb25zdCB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID1cbiAgICBNYXRoLnNpbihoYWxmRm92KSAqIGFsdGl0dWRlIC8gTWF0aC5zaW4oTWF0aC5QSSAvIDIgLSBwaXRjaFJhZGlhbnMgLSBoYWxmRm92KTtcblxuICAvLyBDYWxjdWxhdGUgeiB2YWx1ZSBvZiB0aGUgZmFydGhlc3QgZnJhZ21lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXG4gIGNvbnN0IGZhclogPSBNYXRoLmNvcyhNYXRoLlBJIC8gMiAtIHBpdGNoUmFkaWFucykgKiB0b3BIYWxmU3VyZmFjZURpc3RhbmNlICsgYWx0aXR1ZGU7XG5cbiAgcmV0dXJuIHtmYXJaLCBuZWFyWjogMC4xfTtcbn1cblxuLy8gVE9ETyAtIHJlbmFtZSB0aGlzIG1hdHJpeFxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuY2VudGVyZWRWaWV3TWF0cml4KHtcbiAgaGVpZ2h0LFxuICBwaXRjaCxcbiAgYmVhcmluZyxcbiAgYWx0aXR1ZGVcbn0pIHtcbiAgLy8gVklFVyBNQVRSSVg6IFBST0pFQ1RTIE1FUkNBVE9SIFdPUkxEIENPT1JESU5BVEVTXG4gIC8vIE5vdGUgdGhhdCBtZXJjYXRvciB3b3JsZCBjb29yZGluYXRlcyB0eXBpY2FsbHkgbmVlZCB0byBiZSBmbGlwcGVkXG4gIC8vXG4gIC8vIE5vdGU6IEFzIHVzdWFsLCBtYXRyaXggb3BlcmF0aW9uIG9yZGVycyBzaG91bGQgYmUgcmVhZCBpbiByZXZlcnNlXG4gIC8vIHNpbmNlIHZlY3RvcnMgd2lsbCBiZSBtdWx0aXBsaWVkIGZyb20gdGhlIHJpZ2h0IGR1cmluZyB0cmFuc2Zvcm1hdGlvblxuICBjb25zdCB2bSA9IGNyZWF0ZU1hdDQoKTtcblxuICAvLyBNb3ZlIGNhbWVyYSB0byBhbHRpdHVkZSAoYWxvbmcgdGhlIHBpdGNoICYgYmVhcmluZyBkaXJlY3Rpb24pXG4gIG1hdDRfdHJhbnNsYXRlKHZtLCB2bSwgWzAsIDAsIC1hbHRpdHVkZV0pO1xuXG4gIC8vIEFmdGVyIHRoZSByb3RhdGVYLCB6IHZhbHVlcyBhcmUgaW4gcGl4ZWwgdW5pdHMuIENvbnZlcnQgdGhlbSB0b1xuICAvLyBhbHRpdHVkZSB1bml0cy4gMSBhbHRpdHVkZSB1bml0ID0gdGhlIHNjcmVlbiBoZWlnaHQuXG4gIG1hdDRfc2NhbGUodm0sIHZtLCBbMSwgMSwgMSAvIGhlaWdodF0pO1xuXG4gIC8vIFJvdGF0ZSBieSBiZWFyaW5nLCBhbmQgdGhlbiBieSBwaXRjaCAod2hpY2ggdGlsdHMgdGhlIHZpZXcpXG4gIG1hdDRfcm90YXRlWCh2bSwgdm0sIC1waXRjaCAqIERFR1JFRVNfVE9fUkFESUFOUyk7XG4gIG1hdDRfcm90YXRlWih2bSwgdm0sIGJlYXJpbmcgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuXG4gIHJldHVybiB2bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdNYXRyaXgoe1xuICAvLyBWaWV3cG9ydCBwcm9wc1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBsb25naXR1ZGUsXG4gIGxhdGl0dWRlLFxuICB6b29tLFxuICBwaXRjaCxcbiAgYmVhcmluZyxcbiAgYWx0aXR1ZGUsXG4gIC8vIFByZS1jYWxjdWxhdGVkIHBhcmFtZXRlcnNcbiAgZGlzdGFuY2VTY2FsZXMgPSBudWxsLFxuICBjZW50ZXIgPSBudWxsLFxuICB2aWV3TWF0cml4VW5jZW50ZXJlZCA9IG51bGwsXG4gIC8vIE9wdGlvbnNcbiAgbWV0ZXJPZmZzZXQgPSBudWxsLFxuICBmbGlwWSA9IHRydWVcbn0pIHtcbiAgaWYgKCFjZW50ZXIpIHtcbiAgICBjZW50ZXIgPSBnZXRXb3JsZFBvc2l0aW9uKHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tLCBkaXN0YW5jZVNjYWxlcywgbWV0ZXJPZmZzZXR9KTtcbiAgfVxuXG4gIC8vIFZJRVcgTUFUUklYOiBQUk9KRUNUUyBGUk9NIFZJUlRVQUwgUElYRUxTIFRPIENBTUVSQSBTUEFDRVxuICAvLyBOb3RlOiBBcyB1c3VhbCwgbWF0cml4IG9wZXJhdGlvbiBvcmRlcnMgc2hvdWxkIGJlIHJlYWQgaW4gcmV2ZXJzZVxuICAvLyBzaW5jZSB2ZWN0b3JzIHdpbGwgYmUgbXVsdGlwbGllZCBmcm9tIHRoZSByaWdodCBkdXJpbmcgdHJhbnNmb3JtYXRpb25cbiAgaWYgKCF2aWV3TWF0cml4VW5jZW50ZXJlZCkge1xuICAgIHZpZXdNYXRyaXhVbmNlbnRlcmVkID0gZ2V0VW5jZW50ZXJlZFZpZXdNYXRyaXgoe2hlaWdodCwgcGl0Y2gsIGJlYXJpbmcsIGFsdGl0dWRlfSk7XG4gIH1cblxuICBjb25zdCB2bSA9IGNyZWF0ZU1hdDQoKTtcblxuICBpZiAoZmxpcFkpIHtcbiAgICBtYXQ0X3NjYWxlKHZtLCB2aWV3TWF0cml4VW5jZW50ZXJlZCwgWzEsIC0xLCAxXSk7XG4gIH1cblxuICBjb25zdCB2aWV3TWF0cml4Q2VudGVyZWQgPSBtYXQ0X3RyYW5zbGF0ZSh2bSwgdm0sIG5ldyBWZWN0b3IzKGNlbnRlcikubmVnYXRlKCkpO1xuXG4gIHJldHVybiB2aWV3TWF0cml4Q2VudGVyZWQ7XG59XG5cbi8vIFBST0pFQ1RJT04gTUFUUklYOiBQUk9KRUNUUyBGUk9NIENBTUVSQSAoVklFVykgU1BBQ0UgVE8gQ0xJUFNQQUNFXG4vLyBUaGlzIGlzIGEgXCJNYXBib3hcIiBwcm9qZWN0aW9uIG1hdHJpeCAtIG1hdGNoZXMgbWFwYm94IGV4YWN0bHkgaWYgZmFyWk11bHRpcGxpZXIgPT09IDFcbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uTWF0cml4KHtcbiAgd2lkdGgsXG4gIGhlaWdodCxcbiAgcGl0Y2gsXG4gIGFsdGl0dWRlLFxuICBmYXJaTXVsdGlwbGllciA9IDEwXG59KSB7XG4gIGNvbnN0IHtuZWFyWiwgZmFyWn0gPSBnZXRDbGlwcGluZ1BsYW5lcyh7YWx0aXR1ZGUsIHBpdGNofSk7XG4gIGNvbnN0IGZvdiA9IGdldEZvdih7aGVpZ2h0LCBhbHRpdHVkZX0pO1xuXG4gIGNvbnN0IHByb2plY3Rpb25NYXRyaXggPSBtYXQ0X3BlcnNwZWN0aXZlKFxuICAgIFtdLFxuICAgIGZvdiwgICAgICAgICAgICAgIC8vIGZvdiBpbiByYWRpYW5zXG4gICAgd2lkdGggLyBoZWlnaHQsICAgLy8gYXNwZWN0IHJhdGlvXG4gICAgbmVhclosICAgICAgICAgICAgLy8gbmVhciBwbGFuZVxuICAgIGZhclogKiBmYXJaTXVsdGlwbGllciAvLyBmYXIgcGxhbmVcbiAgKTtcblxuICByZXR1cm4gcHJvamVjdGlvbk1hdHJpeDtcbn1cbiJdfQ==

@@ -7,3 +7,3 @@ 'use strict';

var _flatMercatorViewport = require('./flat-mercator-viewport');
var _webMercatorViewport = require('./web-mercator-viewport');

@@ -13,20 +13,23 @@ Object.defineProperty(exports, 'default', {

get: function get() {
return _interopRequireDefault(_flatMercatorViewport).default;
return _interopRequireDefault(_webMercatorViewport).default;
}
});
Object.defineProperty(exports, 'FlatMercatorViewport', {
Object.defineProperty(exports, 'WebMercatorViewport', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_flatMercatorViewport).default;
return _interopRequireDefault(_webMercatorViewport).default;
}
});
var _perspectiveMercatorViewport = require('./perspective-mercator-viewport');
Object.defineProperty(exports, 'PerspectiveMercatorViewport', {
enumerable: true,
get: function get() {
return _interopRequireDefault(_perspectiveMercatorViewport).default;
return _interopRequireDefault(_webMercatorViewport).default;
}
});
Object.defineProperty(exports, 'fitBounds', {
enumerable: true,
get: function get() {
return _webMercatorViewport.fitBounds;
}
});

@@ -47,52 +50,40 @@ var _webMercatorUtils = require('./web-mercator-utils');

});
Object.defineProperty(exports, 'getMercatorMeterZoom', {
Object.defineProperty(exports, 'getMeterZoom', {
enumerable: true,
get: function get() {
return _webMercatorUtils.getMercatorMeterZoom;
return _webMercatorUtils.getMeterZoom;
}
});
Object.defineProperty(exports, 'getMercatorDistanceScales', {
Object.defineProperty(exports, 'getDistanceScales', {
enumerable: true,
get: function get() {
return _webMercatorUtils.getMercatorDistanceScales;
return _webMercatorUtils.getDistanceScales;
}
});
Object.defineProperty(exports, 'getMercatorWorldPosition', {
Object.defineProperty(exports, 'getWorldPosition', {
enumerable: true,
get: function get() {
return _webMercatorUtils.getMercatorWorldPosition;
return _webMercatorUtils.getWorldPosition;
}
});
Object.defineProperty(exports, 'makeViewMatricesFromMercatorParams', {
Object.defineProperty(exports, 'getViewMatrix', {
enumerable: true,
get: function get() {
return _webMercatorUtils.makeViewMatricesFromMercatorParams;
return _webMercatorUtils.getViewMatrix;
}
});
Object.defineProperty(exports, 'makeUncenteredViewMatrixFromMercatorParams', {
Object.defineProperty(exports, 'getUncenteredViewMatrix', {
enumerable: true,
get: function get() {
return _webMercatorUtils.makeUncenteredViewMatrixFromMercatorParams;
return _webMercatorUtils.getUncenteredViewMatrix;
}
});
Object.defineProperty(exports, 'makeProjectionMatrixFromMercatorParams', {
Object.defineProperty(exports, 'getProjectionMatrix', {
enumerable: true,
get: function get() {
return _webMercatorUtils.makeProjectionMatrixFromMercatorParams;
return _webMercatorUtils.getProjectionMatrix;
}
});
Object.defineProperty(exports, 'getFov', {
enumerable: true,
get: function get() {
return _webMercatorUtils.getFov;
}
});
Object.defineProperty(exports, 'getClippingPlanes', {
enumerable: true,
get: function get() {
return _webMercatorUtils.getClippingPlanes;
}
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwicHJvamVjdEZsYXQiLCJ1bnByb2plY3RGbGF0IiwiZ2V0TWVyY2F0b3JNZXRlclpvb20iLCJnZXRNZXJjYXRvckRpc3RhbmNlU2NhbGVzIiwiZ2V0TWVyY2F0b3JXb3JsZFBvc2l0aW9uIiwibWFrZVZpZXdNYXRyaWNlc0Zyb21NZXJjYXRvclBhcmFtcyIsIm1ha2VVbmNlbnRlcmVkVmlld01hdHJpeEZyb21NZXJjYXRvclBhcmFtcyIsIm1ha2VQcm9qZWN0aW9uTWF0cml4RnJvbU1lcmNhdG9yUGFyYW1zIiwiZ2V0Rm92IiwiZ2V0Q2xpcHBpbmdQbGFuZXMiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O3lEQUNRQSxPOzs7Ozs7eURBQ0FBLE87Ozs7Ozs7OztnRUFDQUEsTzs7Ozs7Ozs7OzZCQUVBQyxXOzs7Ozs7NkJBQ0FDLGE7Ozs7Ozs2QkFDQUMsb0I7Ozs7Ozs2QkFDQUMseUI7Ozs7Ozs2QkFDQUMsd0I7Ozs7Ozs2QkFDQUMsa0M7Ozs7Ozs2QkFDQUMsMEM7Ozs7Ozs2QkFDQUMsc0M7Ozs7Ozs2QkFDQUMsTTs7Ozs7OzZCQUNBQyxpQiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENsYXNzaWMgd2ViLW1lcmNhdG9yLXByb2plY3RcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZWZhdWx0fSBmcm9tICcuL2ZsYXQtbWVyY2F0b3Itdmlld3BvcnQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIEZsYXRNZXJjYXRvclZpZXdwb3J0fSBmcm9tICcuL2ZsYXQtbWVyY2F0b3Itdmlld3BvcnQnO1xuZXhwb3J0IHtkZWZhdWx0IGFzIFBlcnNwZWN0aXZlTWVyY2F0b3JWaWV3cG9ydH0gZnJvbSAnLi9wZXJzcGVjdGl2ZS1tZXJjYXRvci12aWV3cG9ydCc7XG5cbmV4cG9ydCB7cHJvamVjdEZsYXR9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmV4cG9ydCB7dW5wcm9qZWN0RmxhdH0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHtnZXRNZXJjYXRvck1ldGVyWm9vbX0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHtnZXRNZXJjYXRvckRpc3RhbmNlU2NhbGVzfSBmcm9tICcuL3dlYi1tZXJjYXRvci11dGlscyc7XG5leHBvcnQge2dldE1lcmNhdG9yV29ybGRQb3NpdGlvbn0gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHttYWtlVmlld01hdHJpY2VzRnJvbU1lcmNhdG9yUGFyYW1zfSBmcm9tICcuL3dlYi1tZXJjYXRvci11dGlscyc7XG5leHBvcnQge21ha2VVbmNlbnRlcmVkVmlld01hdHJpeEZyb21NZXJjYXRvclBhcmFtc30gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHttYWtlUHJvamVjdGlvbk1hdHJpeEZyb21NZXJjYXRvclBhcmFtc30gZnJvbSAnLi93ZWItbWVyY2F0b3ItdXRpbHMnO1xuZXhwb3J0IHtnZXRGb3Z9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbmV4cG9ydCB7Z2V0Q2xpcHBpbmdQbGFuZXN9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbiJdfQ==
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJkZWZhdWx0IiwiZml0Qm91bmRzIiwicHJvamVjdEZsYXQiLCJ1bnByb2plY3RGbGF0IiwiZ2V0TWV0ZXJab29tIiwiZ2V0RGlzdGFuY2VTY2FsZXMiLCJnZXRXb3JsZFBvc2l0aW9uIiwiZ2V0Vmlld01hdHJpeCIsImdldFVuY2VudGVyZWRWaWV3TWF0cml4IiwiZ2V0UHJvamVjdGlvbk1hdHJpeCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7d0RBQ1FBLE87Ozs7Ozt3REFDQUEsTzs7Ozs7O3dEQUVBQSxPOzs7Ozs7Z0NBRUFDLFM7Ozs7Ozs7Ozs2QkFHTkMsVzs7Ozs7OzZCQUNBQyxhOzs7Ozs7NkJBQ0FDLFk7Ozs7Ozs2QkFDQUMsaUI7Ozs7Ozs2QkFDQUMsZ0I7Ozs7Ozs2QkFDQUMsYTs7Ozs7OzZCQUNBQyx1Qjs7Ozs7OzZCQUNBQyxtQiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIENsYXNzaWMgd2ViLW1lcmNhdG9yLXByb2plY3RcbmV4cG9ydCB7ZGVmYXVsdCBhcyBkZWZhdWx0fSBmcm9tICcuL3dlYi1tZXJjYXRvci12aWV3cG9ydCc7XG5leHBvcnQge2RlZmF1bHQgYXMgV2ViTWVyY2F0b3JWaWV3cG9ydH0gZnJvbSAnLi93ZWItbWVyY2F0b3Itdmlld3BvcnQnO1xuLy8gTGVnYWN5IGNsYXNzIG5hbWVcbmV4cG9ydCB7ZGVmYXVsdCBhcyBQZXJzcGVjdGl2ZU1lcmNhdG9yVmlld3BvcnR9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXZpZXdwb3J0JztcblxuZXhwb3J0IHtmaXRCb3VuZHN9IGZyb20gJy4vd2ViLW1lcmNhdG9yLXZpZXdwb3J0JztcblxuZXhwb3J0IHtcbiAgcHJvamVjdEZsYXQsXG4gIHVucHJvamVjdEZsYXQsXG4gIGdldE1ldGVyWm9vbSxcbiAgZ2V0RGlzdGFuY2VTY2FsZXMsXG4gIGdldFdvcmxkUG9zaXRpb24sXG4gIGdldFZpZXdNYXRyaXgsXG4gIGdldFVuY2VudGVyZWRWaWV3TWF0cml4LFxuICBnZXRQcm9qZWN0aW9uTWF0cml4XG59IGZyb20gJy4vd2ViLW1lcmNhdG9yLXV0aWxzJztcbiJdfQ==

@@ -11,13 +11,13 @@ 'use strict';

exports.unprojectFlat = unprojectFlat;
exports.getMercatorMeterZoom = getMercatorMeterZoom;
exports.getMercatorDistanceScales = getMercatorDistanceScales;
exports.getMercatorWorldPosition = getMercatorWorldPosition;
exports.getFov = getFov;
exports.getClippingPlanes = getClippingPlanes;
exports.makeUncenteredViewMatrixFromMercatorParams = makeUncenteredViewMatrixFromMercatorParams;
exports.makeViewMatricesFromMercatorParams = makeViewMatricesFromMercatorParams;
exports.makeProjectionMatrixFromMercatorParams = makeProjectionMatrixFromMercatorParams;
exports.getMeterZoom = getMeterZoom;
exports.getDistanceScales = getDistanceScales;
exports.getWorldPosition = getWorldPosition;
exports.getUncenteredViewMatrix = getUncenteredViewMatrix;
exports.getViewMatrix = getViewMatrix;
exports.getProjectionMatrix = getProjectionMatrix;
var _math = require('math.gl');
var _mathUtils = require('./math-utils');
var _perspective = require('gl-mat4/perspective');

@@ -60,10 +60,5 @@

var WORLD_SCALE = TILE_SIZE;
var EARTH_CIRCUMFERENCE = 40.075e6;
// const METERS_PER_DEGREE_AT_EQUATOR = 111000; // Approximately 111km per degree at equator
// Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()
function createMat4() {
return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
}
/**

@@ -114,7 +109,6 @@ * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.

// S=C*cos(y)/2^(z+8)
function getMercatorMeterZoom(_ref5) {
function getMeterZoom(_ref5) {
var latitude = _ref5.latitude;
(0, _assert2.default)(latitude);
var EARTH_CIRCUMFERENCE = 40.075e6;
var radians = function radians(degrees) {

@@ -132,3 +126,3 @@ return degrees / 180 * Math.PI;

*/
function getMercatorDistanceScales(_ref6) {
function getDistanceScales(_ref6) {
var latitude = _ref6.latitude,

@@ -177,3 +171,3 @@ longitude = _ref6.longitude,

*/
function getMercatorWorldPosition(_ref7) {
function getWorldPosition(_ref7) {
var longitude = _ref7.longitude,

@@ -188,5 +182,2 @@ latitude = _ref7.latitude,

// Calculate distance scales if lng/lat/zoom are provided
distanceScales = distanceScales || getMercatorDistanceScales({ latitude: latitude, longitude: longitude, scale: scale });
// Make a centered version of the matrix for projection modes without an offset

@@ -197,2 +188,5 @@ var center2d = projectFlat([longitude, latitude], scale);

if (meterOffset) {
// Calculate distance scales if lng/lat/zoom are provided
distanceScales = distanceScales || getDistanceScales({ latitude: latitude, longitude: longitude, scale: scale });
var pixelPosition = new _math.Vector3(meterOffset)

@@ -240,12 +234,7 @@ // Convert to pixels in current zoom

// TODO - rename this matrix
function makeUncenteredViewMatrixFromMercatorParams(_ref10) {
var width = _ref10.width,
height = _ref10.height,
longitude = _ref10.longitude,
latitude = _ref10.latitude,
zoom = _ref10.zoom,
function getUncenteredViewMatrix(_ref10) {
var height = _ref10.height,
pitch = _ref10.pitch,
bearing = _ref10.bearing,
altitude = _ref10.altitude,
center = _ref10.center;
altitude = _ref10.altitude;

@@ -257,3 +246,3 @@ // VIEW MATRIX: PROJECTS MERCATOR WORLD COORDINATES

// since vectors will be multiplied from the right during transformation
var vm = createMat4();
var vm = (0, _mathUtils.createMat4)();

@@ -274,3 +263,3 @@ // Move camera to altitude (along the pitch & bearing direction)

function makeViewMatricesFromMercatorParams(_ref11) {
function getViewMatrix(_ref11) {
var width = _ref11.width,

@@ -284,7 +273,16 @@ height = _ref11.height,

altitude = _ref11.altitude,
centerLngLat = _ref11.centerLngLat,
_ref11$distanceScales = _ref11.distanceScales,
distanceScales = _ref11$distanceScales === undefined ? null : _ref11$distanceScales,
_ref11$center = _ref11.center,
center = _ref11$center === undefined ? null : _ref11$center,
_ref11$viewMatrixUnce = _ref11.viewMatrixUncentered,
viewMatrixUncentered = _ref11$viewMatrixUnce === undefined ? null : _ref11$viewMatrixUnce,
_ref11$meterOffset = _ref11.meterOffset,
meterOffset = _ref11$meterOffset === undefined ? null : _ref11$meterOffset;
meterOffset = _ref11$meterOffset === undefined ? null : _ref11$meterOffset,
_ref11$flipY = _ref11.flipY,
flipY = _ref11$flipY === undefined ? true : _ref11$flipY;
var center = getMercatorWorldPosition({ longitude: longitude, latitude: latitude, zoom: zoom, meterOffset: meterOffset });
if (!center) {
center = getWorldPosition({ longitude: longitude, latitude: latitude, zoom: zoom, distanceScales: distanceScales, meterOffset: meterOffset });
}

@@ -294,22 +292,15 @@ // VIEW MATRIX: PROJECTS FROM VIRTUAL PIXELS TO CAMERA SPACE

// since vectors will be multiplied from the right during transformation
var viewMatrixUncentered = makeUncenteredViewMatrixFromMercatorParams({
width: width,
height: height,
longitude: longitude,
latitude: latitude,
zoom: zoom,
pitch: pitch,
bearing: bearing,
altitude: altitude
});
if (!viewMatrixUncentered) {
viewMatrixUncentered = getUncenteredViewMatrix({ height: height, pitch: pitch, bearing: bearing, altitude: altitude });
}
var vm = createMat4();
(0, _scale2.default)(vm, viewMatrixUncentered, [1, -1, 1]);
var vm = (0, _mathUtils.createMat4)();
if (flipY) {
(0, _scale2.default)(vm, viewMatrixUncentered, [1, -1, 1]);
}
var viewMatrixCentered = (0, _translate2.default)(vm, vm, new _math.Vector3(center).negate());
return {
viewMatrixCentered: viewMatrixCentered,
viewMatrixUncentered: viewMatrixUncentered,
center: center
};
return viewMatrixCentered;
}

@@ -319,3 +310,3 @@

// This is a "Mapbox" projection matrix - matches mapbox exactly if farZMultiplier === 1
function makeProjectionMatrixFromMercatorParams(_ref12) {
function getProjectionMatrix(_ref12) {
var width = _ref12.width,

@@ -334,3 +325,3 @@ height = _ref12.height,

var projectionMatrix = (0, _perspective2.default)(createMat4(), fov, // fov in radians
var projectionMatrix = (0, _perspective2.default)([], fov, // fov in radians
width / height, // aspect ratio

@@ -343,2 +334,2 @@ nearZ, // near plane

}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItbWVyY2F0b3ItdXRpbHMuanMiXSwibmFtZXMiOlsicHJvamVjdEZsYXQiLCJ1bnByb2plY3RGbGF0IiwiZ2V0TWVyY2F0b3JNZXRlclpvb20iLCJnZXRNZXJjYXRvckRpc3RhbmNlU2NhbGVzIiwiZ2V0TWVyY2F0b3JXb3JsZFBvc2l0aW9uIiwiZ2V0Rm92IiwiZ2V0Q2xpcHBpbmdQbGFuZXMiLCJtYWtlVW5jZW50ZXJlZFZpZXdNYXRyaXhGcm9tTWVyY2F0b3JQYXJhbXMiLCJtYWtlVmlld01hdHJpY2VzRnJvbU1lcmNhdG9yUGFyYW1zIiwibWFrZVByb2plY3Rpb25NYXRyaXhGcm9tTWVyY2F0b3JQYXJhbXMiLCJQSSIsIk1hdGgiLCJQSV80IiwiREVHUkVFU19UT19SQURJQU5TIiwiUkFESUFOU19UT19ERUdSRUVTIiwiVElMRV9TSVpFIiwiV09STERfU0NBTEUiLCJjcmVhdGVNYXQ0Iiwic2NhbGUiLCJsbmciLCJsYXQiLCJsYW1iZGEyIiwicGhpMiIsIngiLCJ5IiwibG9nIiwidGFuIiwiYXRhbiIsImV4cCIsImxhdGl0dWRlIiwiRUFSVEhfQ0lSQ1VNRkVSRU5DRSIsInJhZGlhbnMiLCJkZWdyZWVzIiwibG9nMiIsImNvcyIsImxvbmdpdHVkZSIsInpvb20iLCJ1bmRlZmluZWQiLCJwb3ciLCJpc05hTiIsImxhdENvc2luZSIsInBpeGVsc1BlckRlZ3JlZVgiLCJwaXhlbHNQZXJEZWdyZWVZIiwid29ybGRTaXplIiwiYWx0UGl4ZWxzUGVyTWV0ZXIiLCJwaXhlbHNQZXJNZXRlciIsIm1ldGVyc1BlclBpeGVsIiwicGl4ZWxzUGVyRGVncmVlIiwiZGVncmVlc1BlclBpeGVsIiwibWV0ZXJPZmZzZXQiLCJkaXN0YW5jZVNjYWxlcyIsImNlbnRlcjJkIiwiY2VudGVyIiwicGl4ZWxQb3NpdGlvbiIsImFkZCIsImhlaWdodCIsImFsdGl0dWRlIiwicGl0Y2giLCJwaXRjaFJhZGlhbnMiLCJoYWxmRm92IiwidG9wSGFsZlN1cmZhY2VEaXN0YW5jZSIsInNpbiIsImZhcloiLCJuZWFyWiIsIndpZHRoIiwiYmVhcmluZyIsInZtIiwiY2VudGVyTG5nTGF0Iiwidmlld01hdHJpeFVuY2VudGVyZWQiLCJ2aWV3TWF0cml4Q2VudGVyZWQiLCJuZWdhdGUiLCJmYXJaTXVsdGlwbGllciIsImZvdiIsInByb2plY3Rpb25NYXRyaXgiXSwibWFwcGluZ3MiOiI7Ozs7Ozt5cEJBQUE7O1FBb0NnQkEsVyxHQUFBQSxXO1FBa0JBQyxhLEdBQUFBLGE7UUFTQUMsb0IsR0FBQUEsb0I7UUFhQUMseUIsR0FBQUEseUI7UUE2Q0FDLHdCLEdBQUFBLHdCO1FBbUNBQyxNLEdBQUFBLE07UUFJQUMsaUIsR0FBQUEsaUI7UUFlQUMsMEMsR0FBQUEsMEM7UUFnQ0FDLGtDLEdBQUFBLGtDO1FBeUNBQyxzQyxHQUFBQSxzQzs7QUF0UGhCOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQTtBQUNBLElBQU1DLEtBQUtDLEtBQUtELEVBQWhCO0FBQ0EsSUFBTUUsT0FBT0YsS0FBSyxDQUFsQjtBQUNBLElBQU1HLHFCQUFxQkgsS0FBSyxHQUFoQztBQUNBLElBQU1JLHFCQUFxQixNQUFNSixFQUFqQztBQUNBLElBQU1LLFlBQVksR0FBbEI7QUFDQSxJQUFNQyxjQUFjRCxTQUFwQjs7QUFFQTs7QUFFQTtBQUNBLFNBQVNFLFVBQVQsR0FBc0I7QUFDcEIsU0FBTyxDQUFDLENBQUQsRUFBSSxDQUFKLEVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYSxDQUFiLEVBQWdCLENBQWhCLEVBQW1CLENBQW5CLEVBQXNCLENBQXRCLEVBQXlCLENBQXpCLEVBQTRCLENBQTVCLEVBQStCLENBQS9CLEVBQWtDLENBQWxDLEVBQXFDLENBQXJDLEVBQXdDLENBQXhDLEVBQTJDLENBQTNDLEVBQThDLENBQTlDLENBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7OztBQVVPLFNBQVNqQixXQUFULE9BQWlDa0IsS0FBakMsRUFBd0M7QUFBQTtB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QUFDbEJSLFVBQVFULE1BSGUsRUFHTDtBQUNsQlEsT0FKdUIsRUFJTDtBQUNsQkQsU0FBT1MsY0FMZ0IsQ0FLRDtBQUxDLEdBQXpCOztBQVFBLFNBQU9FLGdCQUFQO0FBQ0QiLCJmaWxlIjoid2ViLW1lcmNhdG9yLXV0aWxzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVE9ETyAtIFRIRSBVVElMSVRJRVMgSU4gVEhJUyBGSUxFIFNIT1VMRCBCRSBJTVBPUlRFRCBGUk9NIFdFQi1NRVJDQVRPUi1WSUVXUE9SVCBNT0RVTEVcblxuaW1wb3J0IHtWZWN0b3IzfSBmcm9tICdtYXRoLmdsJztcbmltcG9ydCBtYXQ0X3BlcnNwZWN0aXZlIGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IG1hdDRfc2NhbGUgZnJvbSAnZ2wtbWF0NC9zY2FsZSc7XG5pbXBvcnQgbWF0NF90cmFuc2xhdGUgZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IG1hdDRfcm90YXRlWCBmcm9tICdnbC1tYXQ0L3JvdGF0ZVgnO1xuaW1wb3J0IG1hdDRfcm90YXRlWiBmcm9tICdnbC1tYXQ0L3JvdGF0ZVonO1xuaW1wb3J0IHZlYzJfZGlzdGFuY2UgZnJvbSAnZ2wtdmVjMi9kaXN0YW5jZSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8vIENPTlNUQU5UU1xuY29uc3QgUEkgPSBNYXRoLlBJO1xuY29uc3QgUElfNCA9IFBJIC8gNDtcbmNvbnN0IERFR1JFRVNfVE9fUkFESUFOUyA9IFBJIC8gMTgwO1xuY29uc3QgUkFESUFOU19UT19ERUdSRUVTID0gMTgwIC8gUEk7XG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7XG5jb25zdCBXT1JMRF9TQ0FMRSA9IFRJTEVfU0laRTtcblxuLy8gY29uc3QgTUVURVJTX1BFUl9ERUdSRUVfQVRfRVFVQVRPUiA9IDExMTAwMDsgLy8gQXBwcm94aW1hdGVseSAxMTFrbSBwZXIgZGVncmVlIGF0IGVxdWF0b3JcblxuLy8gSGVscGVyLCBhdm9pZHMgbG93LXByZWNpc2lvbiAzMiBiaXQgbWF0cmljZXMgZnJvbSBnbC1tYXRyaXggbWF0NC5jcmVhdGUoKVxuZnVuY3Rpb24gY3JlYXRlTWF0NCgpIHtcbiAgcmV0dXJuIFsxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAwLCAxXTtcbn1cblxuLyoqXG4gKiBQcm9qZWN0IFtsbmcsbGF0XSBvbiBzcGhlcmUgb250byBbeCx5XSBvbiA1MTIqNTEyIE1lcmNhdG9yIFpvb20gMCB0aWxlLlxuICogUGVyZm9ybXMgdGhlIG5vbmxpbmVhciBwYXJ0IG9mIHRoZSB3ZWIgbWVyY2F0b3IgcHJvamVjdGlvbi5cbiAqIFJlbWFpbmluZyBwcm9qZWN0aW9uIGlzIGRvbmUgd2l0aCA0eDQgbWF0cmljZXMgd2hpY2ggYWxzbyBoYW5kbGVzXG4gKiBwZXJzcGVjdGl2ZS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBsbmdMYXQgLSBbbG5nLCBsYXRdIGNvb3JkaW5hdGVzXG4gKiAgIFNwZWNpZmllcyBhIHBvaW50IG9uIHRoZSBzcGhlcmUgdG8gcHJvamVjdCBvbnRvIHRoZSBtYXAuXG4gKiBAcmV0dXJuIHtBcnJheX0gW3gseV0gY29vcmRpbmF0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9qZWN0RmxhdChbbG5nLCBsYXRdLCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlICogV09STERfU0NBTEU7XG4gIGNvbnN0IGxhbWJkYTIgPSBsbmcgKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIGNvbnN0IHBoaTIgPSBsYXQgKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIGNvbnN0IHggPSBzY2FsZSAqIChsYW1iZGEyICsgUEkpIC8gKDIgKiBQSSk7XG4gIGNvbnN0IHkgPSBzY2FsZSAqIChQSSAtIE1hdGgubG9nKE1hdGgudGFuKFBJXzQgKyBwaGkyICogMC41KSkpIC8gKDIgKiBQSSk7XG4gIHJldHVybiBbeCwgeV07XG59XG5cbi8qKlxuICogVW5wcm9qZWN0IHdvcmxkIHBvaW50IFt4LHldIG9uIG1hcCBvbnRvIHtsYXQsIGxvbn0gb24gc3BoZXJlXG4gKlxuICogQHBhcmFtIHtvYmplY3R8VmVjdG9yfSB4eSAtIG9iamVjdCB3aXRoIHt4LHl9IG1lbWJlcnNcbiAqICByZXByZXNlbnRpbmcgcG9pbnQgb24gcHJvamVjdGVkIG1hcCBwbGFuZVxuICogQHJldHVybiB7R2VvQ29vcmRpbmF0ZXN9IC0gb2JqZWN0IHdpdGgge2xhdCxsb259IG9mIHBvaW50IG9uIHNwaGVyZS5cbiAqICAgSGFzIHRvQXJyYXkgbWV0aG9kIGlmIHlvdSBuZWVkIGEgR2VvSlNPTiBBcnJheS5cbiAqICAgUGVyIGNhcnRvZ3JhcGhpYyB0cmFkaXRpb24sIGxhdCBhbmQgbG9uIGFyZSBzcGVjaWZpZWQgYXMgZGVncmVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucHJvamVjdEZsYXQoW3gsIHldLCBzY2FsZSkge1xuICBzY2FsZSA9IHNjYWxlICogV09STERfU0NBTEU7XG4gIGNvbnN0IGxhbWJkYTIgPSAoeCAvIHNjYWxlKSAqICgyICogUEkpIC0gUEk7XG4gIGNvbnN0IHBoaTIgPSAyICogKE1hdGguYXRhbihNYXRoLmV4cChQSSAtICh5IC8gc2NhbGUpICogKDIgKiBQSSkpKSAtIFBJXzQpO1xuICByZXR1cm4gW2xhbWJkYTIgKiBSQURJQU5TX1RPX0RFR1JFRVMsIHBoaTIgKiBSQURJQU5TX1RPX0RFR1JFRVNdO1xufVxuXG4vLyBSZXR1cm5zIHRoZSB6b29tIGxldmVsIHRoYXQgZ2l2ZXMgYSAxIG1ldGVyIHBpeGVsIGF0IGEgY2VydGFpbiBsYXRpdHVkZVxuLy8gUz1DKmNvcyh5KS8yXih6KzgpXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWVyY2F0b3JNZXRlclpvb20oe2xhdGl0dWRlfSkge1xuICBhc3NlcnQobGF0aXR1ZGUpO1xuICBjb25zdCBFQVJUSF9DSVJDVU1GRVJFTkNFID0gNDAuMDc1ZTY7XG4gIGNvbnN0IHJhZGlhbnMgPSBkZWdyZWVzID0+IGRlZ3JlZXMgLyAxODAgKiBNYXRoLlBJO1xuICByZXR1cm4gTWF0aC5sb2cyKEVBUlRIX0NJUkNVTUZFUkVOQ0UgKiBNYXRoLmNvcyhyYWRpYW5zKGxhdGl0dWRlKSkpIC0gODtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgZGlzdGFuY2Ugc2NhbGVzIGluIG1ldGVycyBhcm91bmQgY3VycmVudCBsYXQvbG9uLCBib3RoIGZvclxuICogZGVncmVlcyBhbmQgcGl4ZWxzLlxuICogSW4gbWVyY2F0b3IgcHJvamVjdGlvbiBtb2RlLCB0aGUgZGlzdGFuY2Ugc2NhbGVzIHZhcnkgc2lnbmlmaWNhbnRseVxuICogd2l0aCBsYXRpdHVkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1lcmNhdG9yRGlzdGFuY2VTY2FsZXMoe2xhdGl0dWRlLCBsb25naXR1ZGUsIHpvb20sIHNjYWxlfSkge1xuICAvLyBDYWxjdWxhdGUgc2NhbGUgZnJvbSB6b29tIGlmIG5vdCBwcm92aWRlZFxuICBzY2FsZSA9IHNjYWxlICE9PSB1bmRlZmluZWQgPyBzY2FsZSA6IE1hdGgucG93KDIsIHpvb20pO1xuXG4gIGFzc2VydCghaXNOYU4obGF0aXR1ZGUpICYmICFpc05hTihsb25naXR1ZGUpICYmICFpc05hTihzY2FsZSkpO1xuXG4gIGNvbnN0IGxhdENvc2luZSA9IE1hdGguY29zKGxhdGl0dWRlICogTWF0aC5QSSAvIDE4MCk7XG5cbiAgLy8gY29uc3QgbWV0ZXJzUGVyRGVncmVlWCA9IE1FVEVSU19QRVJfREVHUkVFX0FUX0VRVUFUT1IgKiBsYXRDb3NpbmU7XG4gIC8vIGNvbnN0IG1ldGVyc1BlckRlZ3JlZVkgPSBNRVRFUlNfUEVSX0RFR1JFRV9BVF9FUVVBVE9SO1xuXG4gIC8vIENhbGN1bGF0ZSBudW1iZXIgb2YgcGl4ZWxzIG9jY3VwaWVkIGJ5IG9uZSBkZWdyZWUgbG9uZ2l0dWRlXG4gIC8vIGFyb3VuZCBjdXJyZW50IGxhdC9sb25cbiAgY29uc3QgcGl4ZWxzUGVyRGVncmVlWCA9IHZlYzJfZGlzdGFuY2UoXG4gICAgcHJvamVjdEZsYXQoW2xvbmdpdHVkZSArIDAuNSwgbGF0aXR1ZGVdLCBzY2FsZSksXG4gICAgcHJvamVjdEZsYXQoW2xvbmdpdHVkZSAtIDAuNSwgbGF0aXR1ZGVdLCBzY2FsZSlcbiAgKTtcbiAgLy8gQ2FsY3VsYXRlIG51bWJlciBvZiBwaXhlbHMgb2NjdXBpZWQgYnkgb25lIGRlZ3JlZSBsYXRpdHVkZVxuICAvLyBhcm91bmQgY3VycmVudCBsYXQvbG9uXG4gIGNvbnN0IHBpeGVsc1BlckRlZ3JlZVkgPSB2ZWMyX2Rpc3RhbmNlKFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUsIGxhdGl0dWRlICsgMC41XSwgc2NhbGUpLFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUsIGxhdGl0dWRlIC0gMC41XSwgc2NhbGUpXG4gICk7XG5cbiAgY29uc3Qgd29ybGRTaXplID0gVElMRV9TSVpFICogc2NhbGU7XG4gIGNvbnN0IGFsdFBpeGVsc1Blck1ldGVyID0gd29ybGRTaXplIC8gKDRlNyAqIGxhdENvc2luZSk7XG4gIGNvbnN0IHBpeGVsc1Blck1ldGVyID0gW2FsdFBpeGVsc1Blck1ldGVyLCBhbHRQaXhlbHNQZXJNZXRlciwgYWx0UGl4ZWxzUGVyTWV0ZXJdO1xuICBjb25zdCBtZXRlcnNQZXJQaXhlbCA9IFsxIC8gYWx0UGl4ZWxzUGVyTWV0ZXIsIDEgLyBhbHRQaXhlbHNQZXJNZXRlciwgMSAvIGFsdFBpeGVsc1Blck1ldGVyXTtcblxuICBjb25zdCBwaXhlbHNQZXJEZWdyZWUgPSBbcGl4ZWxzUGVyRGVncmVlWCwgcGl4ZWxzUGVyRGVncmVlWSwgYWx0UGl4ZWxzUGVyTWV0ZXJdO1xuICBjb25zdCBkZWdyZWVzUGVyUGl4ZWwgPSBbMSAvIHBpeGVsc1BlckRlZ3JlZVgsIDEgLyBwaXhlbHNQZXJEZWdyZWVZLCAxIC8gYWx0UGl4ZWxzUGVyTWV0ZXJdO1xuXG4gIC8vIE1haW4gcmVzdWx0cywgdXNlZCBmb3IgY29udmVydGluZyBtZXRlcnMgdG8gbGF0bG5nIGRlbHRhcyBhbmQgc2NhbGluZyBvZmZzZXRzXG4gIHJldHVybiB7XG4gICAgcGl4ZWxzUGVyTWV0ZXIsXG4gICAgbWV0ZXJzUGVyUGl4ZWwsXG4gICAgcGl4ZWxzUGVyRGVncmVlLFxuICAgIGRlZ3JlZXNQZXJQaXhlbFxuICB9O1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgYSBtZXJjYXRvciB3b3JsZCBwb3NpdGlvbiAoXCJwaXhlbHNcIiBpbiBnaXZlbiB6b29tIGxldmVsKVxuICogZnJvbSBhIGxuZy9sYXQgYW5kIG1ldGVyT2Zmc2V0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNZXJjYXRvcldvcmxkUG9zaXRpb24oe1xuICBsb25naXR1ZGUsXG4gIGxhdGl0dWRlLFxuICB6b29tLFxuICBtZXRlck9mZnNldCxcbiAgZGlzdGFuY2VTY2FsZXMgPSBudWxsXG59KSB7XG4gIGNvbnN0IHNjYWxlID0gTWF0aC5wb3coMiwgem9vbSk7XG5cbiAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIHNjYWxlcyBpZiBsbmcvbGF0L3pvb20gYXJlIHByb3ZpZGVkXG4gIGRpc3RhbmNlU2NhbGVzID0gZGlzdGFuY2VTY2FsZXMgfHwgZ2V0TWVyY2F0b3JEaXN0YW5jZVNjYWxlcyh7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgc2NhbGV9KTtcblxuICAvLyBNYWtlIGEgY2VudGVyZWQgdmVyc2lvbiBvZiB0aGUgbWF0cml4IGZvciBwcm9qZWN0aW9uIG1vZGVzIHdpdGhvdXQgYW4gb2Zmc2V0XG4gIGNvbnN0IGNlbnRlcjJkID0gcHJvamVjdEZsYXQoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCBzY2FsZSk7XG4gIGNvbnN0IGNlbnRlciA9IG5ldyBWZWN0b3IzKGNlbnRlcjJkWzBdLCBjZW50ZXIyZFsxXSwgMCk7XG5cbiAgaWYgKG1ldGVyT2Zmc2V0KSB7XG4gICAgY29uc3QgcGl4ZWxQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKG1ldGVyT2Zmc2V0KVxuICAgICAgLy8gQ29udmVydCB0byBwaXhlbHMgaW4gY3VycmVudCB6b29tXG4gICAgICAuc2NhbGUoZGlzdGFuY2VTY2FsZXMucGl4ZWxzUGVyTWV0ZXIpXG4gICAgICAvLyBXZSB3YW50IHBvc2l0aXZlIFkgdG8gcmVwcmVzZW50IGFuIG9mZnNldCB0b3dhcmRzIG5vcnRoLFxuICAgICAgLy8gYnV0IHdlYiBtZXJjYXRvciB3b3JsZCBjb29yZGluYXRlcyBpcyB0b3AtbGVmdFxuICAgICAgLnNjYWxlKFsxLCAtMSwgMV0pO1xuICAgIGNlbnRlci5hZGQocGl4ZWxQb3NpdGlvbik7XG4gIH1cblxuICByZXR1cm4gY2VudGVyO1xufVxuXG4vLyBBVFRSSUJVVElPTjpcbi8vIHZpZXcgYW5kIHByb2plY3Rpb24gbWF0cml4IGNyZWF0aW9uIGlzIGludGVudGlvbmFsbHkga2VwdCBjb21wYXRpYmxlIHdpdGhcbi8vIG1hcGJveC1nbCdzIGltcGxlbWVudGF0aW9uIHRvIGVuc3VyZSB0aGF0IHNlYW1sZXNzIGludGVyb3BlcmF0aW9uXG4vLyB3aXRoIG1hcGJveCBhbmQgcmVhY3QtbWFwLWdsLiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9tYXBib3gvbWFwYm94LWdsLWpzXG5cbi8vIFZhcmlhYmxlIGZvdiAoaW4gcmFkaWFucylcbmV4cG9ydCBmdW5jdGlvbiBnZXRGb3Yoe2hlaWdodCwgYWx0aXR1ZGV9KSB7XG4gIHJldHVybiAyICogTWF0aC5hdGFuKChoZWlnaHQgLyAyKSAvIGFsdGl0dWRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENsaXBwaW5nUGxhbmVzKHthbHRpdHVkZSwgcGl0Y2h9KSB7XG4gIC8vIEZpbmQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBwb2ludCB0byB0aGUgY2VudGVyIHRvcFxuICAvLyBpbiBhbHRpdHVkZSB1bml0cyB1c2luZyBsYXcgb2Ygc2luZXMuXG4gIGNvbnN0IHBpdGNoUmFkaWFucyA9IHBpdGNoICogREVHUkVFU19UT19SQURJQU5TO1xuICBjb25zdCBoYWxmRm92ID0gTWF0aC5hdGFuKDAuNSAvIGFsdGl0dWRlKTtcbiAgY29uc3QgdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSA9XG4gICAgTWF0aC5zaW4oaGFsZkZvdikgKiBhbHRpdHVkZSAvIE1hdGguc2luKE1hdGguUEkgLyAyIC0gcGl0Y2hSYWRpYW5zIC0gaGFsZkZvdik7XG5cbiAgLy8gQ2FsY3VsYXRlIHogdmFsdWUgb2YgdGhlIGZhcnRoZXN0IGZyYWdtZW50IHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkLlxuICBjb25zdCBmYXJaID0gTWF0aC5jb3MoTWF0aC5QSSAvIDIgLSBwaXRjaFJhZGlhbnMpICogdG9wSGFsZlN1cmZhY2VEaXN0YW5jZSArIGFsdGl0dWRlO1xuXG4gIHJldHVybiB7ZmFyWiwgbmVhclo6IDAuMX07XG59XG5cbi8vIFRPRE8gLSByZW5hbWUgdGhpcyBtYXRyaXhcbmV4cG9ydCBmdW5jdGlvbiBtYWtlVW5jZW50ZXJlZFZpZXdNYXRyaXhGcm9tTWVyY2F0b3JQYXJhbXMoe1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBsb25naXR1ZGUsXG4gIGxhdGl0dWRlLFxuICB6b29tLFxuICBwaXRjaCxcbiAgYmVhcmluZyxcbiAgYWx0aXR1ZGUsXG4gIGNlbnRlclxufSkge1xuICAvLyBWSUVXIE1BVFJJWDogUFJPSkVDVFMgTUVSQ0FUT1IgV09STEQgQ09PUkRJTkFURVNcbiAgLy8gTm90ZSB0aGF0IG1lcmNhdG9yIHdvcmxkIGNvb3JkaW5hdGVzIHR5cGljYWxseSBuZWVkIHRvIGJlIGZsaXBwZWRcbiAgLy9cbiAgLy8gTm90ZTogQXMgdXN1YWwsIG1hdHJpeCBvcGVyYXRpb24gb3JkZXJzIHNob3VsZCBiZSByZWFkIGluIHJldmVyc2VcbiAgLy8gc2luY2UgdmVjdG9ycyB3aWxsIGJlIG11bHRpcGxpZWQgZnJvbSB0aGUgcmlnaHQgZHVyaW5nIHRyYW5zZm9ybWF0aW9uXG4gIGNvbnN0IHZtID0gY3JlYXRlTWF0NCgpO1xuXG4gIC8vIE1vdmUgY2FtZXJhIHRvIGFsdGl0dWRlIChhbG9uZyB0aGUgcGl0Y2ggJiBiZWFyaW5nIGRpcmVjdGlvbilcbiAgbWF0NF90cmFuc2xhdGUodm0sIHZtLCBbMCwgMCwgLWFsdGl0dWRlXSk7XG5cbiAgLy8gQWZ0ZXIgdGhlIHJvdGF0ZVgsIHogdmFsdWVzIGFyZSBpbiBwaXhlbCB1bml0cy4gQ29udmVydCB0aGVtIHRvXG4gIC8vIGFsdGl0dWRlIHVuaXRzLiAxIGFsdGl0dWRlIHVuaXQgPSB0aGUgc2NyZWVuIGhlaWdodC5cbiAgbWF0NF9zY2FsZSh2bSwgdm0sIFsxLCAxLCAxIC8gaGVpZ2h0XSk7XG5cbiAgLy8gUm90YXRlIGJ5IGJlYXJpbmcsIGFuZCB0aGVuIGJ5IHBpdGNoICh3aGljaCB0aWx0cyB0aGUgdmlldylcbiAgbWF0NF9yb3RhdGVYKHZtLCB2bSwgLXBpdGNoICogREVHUkVFU19UT19SQURJQU5TKTtcbiAgbWF0NF9yb3RhdGVaKHZtLCB2bSwgYmVhcmluZyAqIERFR1JFRVNfVE9fUkFESUFOUyk7XG5cbiAgcmV0dXJuIHZtO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVZpZXdNYXRyaWNlc0Zyb21NZXJjYXRvclBhcmFtcyh7XG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIGxvbmdpdHVkZSxcbiAgbGF0aXR1ZGUsXG4gIHpvb20sXG4gIHBpdGNoLFxuICBiZWFyaW5nLFxuICBhbHRpdHVkZSxcbiAgY2VudGVyTG5nTGF0LFxuICBtZXRlck9mZnNldCA9IG51bGxcbn0pIHtcbiAgY29uc3QgY2VudGVyID0gZ2V0TWVyY2F0b3JXb3JsZFBvc2l0aW9uKHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tLCBtZXRlck9mZnNldH0pO1xuXG4gIC8vIFZJRVcgTUFUUklYOiBQUk9KRUNUUyBGUk9NIFZJUlRVQUwgUElYRUxTIFRPIENBTUVSQSBTUEFDRVxuICAvLyBOb3RlOiBBcyB1c3VhbCwgbWF0cml4IG9wZXJhdGlvbiBvcmRlcnMgc2hvdWxkIGJlIHJlYWQgaW4gcmV2ZXJzZVxuICAvLyBzaW5jZSB2ZWN0b3JzIHdpbGwgYmUgbXVsdGlwbGllZCBmcm9tIHRoZSByaWdodCBkdXJpbmcgdHJhbnNmb3JtYXRpb25cbiAgY29uc3Qgdmlld01hdHJpeFVuY2VudGVyZWQgPSBtYWtlVW5jZW50ZXJlZFZpZXdNYXRyaXhGcm9tTWVyY2F0b3JQYXJhbXMoe1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBsb25naXR1ZGUsXG4gICAgbGF0aXR1ZGUsXG4gICAgem9vbSxcbiAgICBwaXRjaCxcbiAgICBiZWFyaW5nLFxuICAgIGFsdGl0dWRlXG4gIH0pO1xuXG4gIGNvbnN0IHZtID0gY3JlYXRlTWF0NCgpO1xuICBtYXQ0X3NjYWxlKHZtLCB2aWV3TWF0cml4VW5jZW50ZXJlZCwgWzEsIC0xLCAxXSk7XG4gIGNvbnN0IHZpZXdNYXRyaXhDZW50ZXJlZCA9IG1hdDRfdHJhbnNsYXRlKHZtLCB2bSwgbmV3IFZlY3RvcjMoY2VudGVyKS5uZWdhdGUoKSk7XG5cbiAgcmV0dXJuIHtcbiAgICB2aWV3TWF0cml4Q2VudGVyZWQsXG4gICAgdmlld01hdHJpeFVuY2VudGVyZWQsXG4gICAgY2VudGVyXG4gIH07XG59XG5cbi8vIFBST0pFQ1RJT04gTUFUUklYOiBQUk9KRUNUUyBGUk9NIENBTUVSQSAoVklFVykgU1BBQ0UgVE8gQ0xJUFNQQUNFXG4vLyBUaGlzIGlzIGEgXCJNYXBib3hcIiBwcm9qZWN0aW9uIG1hdHJpeCAtIG1hdGNoZXMgbWFwYm94IGV4YWN0bHkgaWYgZmFyWk11bHRpcGxpZXIgPT09IDFcbmV4cG9ydCBmdW5jdGlvbiBtYWtlUHJvamVjdGlvbk1hdHJpeEZyb21NZXJjYXRvclBhcmFtcyh7XG4gIHdpZHRoLFxuICBoZWlnaHQsXG4gIHBpdGNoLFxuICBhbHRpdHVkZSxcbiAgZmFyWk11bHRpcGxpZXIgPSAxMFxufSkge1xuICBjb25zdCB7bmVhclosIGZhclp9ID0gZ2V0Q2xpcHBpbmdQbGFuZXMoe2FsdGl0dWRlLCBwaXRjaH0pO1xuICBjb25zdCBmb3YgPSBnZXRGb3Yoe2hlaWdodCwgYWx0aXR1ZGV9KTtcblxuICBjb25zdCBwcm9qZWN0aW9uTWF0cml4ID0gbWF0NF9wZXJzcGVjdGl2ZShcbiAgICBjcmVhdGVNYXQ0KCksXG4gICAgZm92LCAgICAgICAgICAgICAgLy8gZm92IGluIHJhZGlhbnNcbiAgICB3aWR0aCAvIGhlaWdodCwgICAvLyBhc3BlY3QgcmF0aW9cbiAgICBuZWFyWiwgICAgICAgICAgICAvLyBuZWFyIHBsYW5lXG4gICAgZmFyWiAqIGZhclpNdWx0aXBsaWVyIC8vIGZhciBwbGFuZVxuICApO1xuXG4gIHJldHVybiBwcm9qZWN0aW9uTWF0cml4O1xufVxuIl19
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItbWVyY2F0b3ItdXRpbHMuanMiXSwibmFtZXMiOlsicHJvamVjdEZsYXQiLCJ1bnByb2plY3RGbGF0IiwiZ2V0TWV0ZXJab29tIiwiZ2V0RGlzdGFuY2VTY2FsZXMiLCJnZXRXb3JsZFBvc2l0aW9uIiwiZ2V0VW5jZW50ZXJlZFZpZXdNYXRyaXgiLCJnZXRWaWV3TWF0cml4IiwiZ2V0UHJvamVjdGlvbk1hdHJpeCIsIlBJIiwiTWF0aCIsIlBJXzQiLCJERUdSRUVTX1RPX1JBRElBTlMiLCJSQURJQU5TX1RPX0RFR1JFRVMiLCJUSUxFX1NJWkUiLCJXT1JMRF9TQ0FMRSIsIkVBUlRIX0NJUkNVTUZFUkVOQ0UiLCJzY2FsZSIsImxuZyIsImxhdCIsImxhbWJkYTIiLCJwaGkyIiwieCIsInkiLCJsb2ciLCJ0YW4iLCJhdGFuIiwiZXhwIiwibGF0aXR1ZGUiLCJyYWRpYW5zIiwiZGVncmVlcyIsImxvZzIiLCJjb3MiLCJsb25naXR1ZGUiLCJ6b29tIiwidW5kZWZpbmVkIiwicG93IiwiaXNOYU4iLCJsYXRDb3NpbmUiLCJwaXhlbHNQZXJEZWdyZWVYIiwicGl4ZWxzUGVyRGVncmVlWSIsIndvcmxkU2l6ZSIsImFsdFBpeGVsc1Blck1ldGVyIiwicGl4ZWxzUGVyTWV0ZXIiLCJtZXRlcnNQZXJQaXhlbCIsInBpeGVsc1BlckRlZ3JlZSIsImRlZ3JlZXNQZXJQaXhlbCIsIm1ldGVyT2Zmc2V0IiwiZGlzdGFuY2VTY2FsZXMiLCJjZW50ZXIyZCIsImNlbnRlciIsInBpeGVsUG9zaXRpb24iLCJhZGQiLCJnZXRGb3YiLCJoZWlnaHQiLCJhbHRpdHVkZSIsImdldENsaXBwaW5nUGxhbmVzIiwicGl0Y2giLCJwaXRjaFJhZGlhbnMiLCJoYWxmRm92IiwidG9wSGFsZlN1cmZhY2VEaXN0YW5jZSIsInNpbiIsImZhcloiLCJuZWFyWiIsImJlYXJpbmciLCJ2bSIsIndpZHRoIiwidmlld01hdHJpeFVuY2VudGVyZWQiLCJmbGlwWSIsInZpZXdNYXRyaXhD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LENBQVIsQ0FBckM7QUFDRDs7QUFFRCxNQUFNRSxxQkFBcUIseUJBQWVKLEVBQWYsRUFBbUJBLEVBQW5CLEVBQXVCLGtCQUFZZixNQUFaLEVBQW9Cb0IsTUFBcEIsRUFBdkIsQ0FBM0I7O0FBRUEsU0FBT0Qsa0JBQVA7QUFDRDs7QUFFRDtBQUNBO0FBQ08sU0FBUzdELG1CQUFULFNBTUo7QUFBQSxNQUxEMEQsS0FLQyxVQUxEQSxLQUtDO0FBQUEsTUFKRFosTUFJQyxVQUpEQSxNQUlDO0FBQUEsTUFIREcsS0FHQyxVQUhEQSxLQUdDO0FBQUEsTUFGREYsUUFFQyxVQUZEQSxRQUVDO0FBQUEscUNBRERnQixjQUNDO0FBQUEsTUFEREEsY0FDQyx5Q0FEZ0IsRUFDaEI7O0FBQUEsMkJBQ3FCZixrQkFBa0IsRUFBQ0Qsa0JBQUQsRUFBV0UsWUFBWCxFQUFsQixDQURyQjtBQUFBLE1BQ01NLEtBRE4sc0JBQ01BLEtBRE47QUFBQSxNQUNhRCxJQURiLHNCQUNhQSxJQURiOztBQUVELE1BQU1VLE1BQU1uQixPQUFPLEVBQUNDLGNBQUQsRUFBU0Msa0JBQVQsRUFBUCxDQUFaOztBQUVBLE1BQU1rQixtQkFBbUIsMkJBQ3ZCLEVBRHVCLEVBRXZCRCxHQUZ1QixFQUVMO0FBQ2xCTixVQUFRWixNQUhlLEVBR0w7QUFDbEJTLE9BSnVCLEVBSUw7QUFDbEJELFNBQU9TLGNBTGdCLENBS0Q7QUFMQyxHQUF6Qjs7QUFRQSxTQUFPRSxnQkFBUDtBQUNEIiwiZmlsZSI6IndlYi1tZXJjYXRvci11dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIFRPRE8gLSBUSEUgVVRJTElUSUVTIElOIFRISVMgRklMRSBTSE9VTEQgQkUgSU1QT1JURUQgRlJPTSBXRUItTUVSQ0FUT1ItVklFV1BPUlQgTU9EVUxFXG5cbmltcG9ydCB7VmVjdG9yM30gZnJvbSAnbWF0aC5nbCc7XG5pbXBvcnQge2NyZWF0ZU1hdDR9IGZyb20gJy4vbWF0aC11dGlscyc7XG5cbmltcG9ydCBtYXQ0X3BlcnNwZWN0aXZlIGZyb20gJ2dsLW1hdDQvcGVyc3BlY3RpdmUnO1xuaW1wb3J0IG1hdDRfc2NhbGUgZnJvbSAnZ2wtbWF0NC9zY2FsZSc7XG5pbXBvcnQgbWF0NF90cmFuc2xhdGUgZnJvbSAnZ2wtbWF0NC90cmFuc2xhdGUnO1xuaW1wb3J0IG1hdDRfcm90YXRlWCBmcm9tICdnbC1tYXQ0L3JvdGF0ZVgnO1xuaW1wb3J0IG1hdDRfcm90YXRlWiBmcm9tICdnbC1tYXQ0L3JvdGF0ZVonO1xuaW1wb3J0IHZlYzJfZGlzdGFuY2UgZnJvbSAnZ2wtdmVjMi9kaXN0YW5jZSc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5cbi8vIENPTlNUQU5UU1xuY29uc3QgUEkgPSBNYXRoLlBJO1xuY29uc3QgUElfNCA9IFBJIC8gNDtcbmNvbnN0IERFR1JFRVNfVE9fUkFESUFOUyA9IFBJIC8gMTgwO1xuY29uc3QgUkFESUFOU19UT19ERUdSRUVTID0gMTgwIC8gUEk7XG5jb25zdCBUSUxFX1NJWkUgPSA1MTI7XG5jb25zdCBXT1JMRF9TQ0FMRSA9IFRJTEVfU0laRTtcbmNvbnN0IEVBUlRIX0NJUkNVTUZFUkVOQ0UgPSA0MC4wNzVlNjtcbi8vIGNvbnN0IE1FVEVSU19QRVJfREVHUkVFX0FUX0VRVUFUT1IgPSAxMTEwMDA7IC8vIEFwcHJveGltYXRlbHkgMTExa20gcGVyIGRlZ3JlZSBhdCBlcXVhdG9yXG5cbi8qKlxuICogUHJvamVjdCBbbG5nLGxhdF0gb24gc3BoZXJlIG9udG8gW3gseV0gb24gNTEyKjUxMiBNZXJjYXRvciBab29tIDAgdGlsZS5cbiAqIFBlcmZvcm1zIHRoZSBub25saW5lYXIgcGFydCBvZiB0aGUgd2ViIG1lcmNhdG9yIHByb2plY3Rpb24uXG4gKiBSZW1haW5pbmcgcHJvamVjdGlvbiBpcyBkb25lIHdpdGggNHg0IG1hdHJpY2VzIHdoaWNoIGFsc28gaGFuZGxlc1xuICogcGVyc3BlY3RpdmUuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gbG5nTGF0IC0gW2xuZywgbGF0XSBjb29yZGluYXRlc1xuICogICBTcGVjaWZpZXMgYSBwb2ludCBvbiB0aGUgc3BoZXJlIHRvIHByb2plY3Qgb250byB0aGUgbWFwLlxuICogQHJldHVybiB7QXJyYXl9IFt4LHldIGNvb3JkaW5hdGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvamVjdEZsYXQoW2xuZywgbGF0XSwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSAqIFdPUkxEX1NDQUxFO1xuICBjb25zdCBsYW1iZGEyID0gbG5nICogREVHUkVFU19UT19SQURJQU5TO1xuICBjb25zdCBwaGkyID0gbGF0ICogREVHUkVFU19UT19SQURJQU5TO1xuICBjb25zdCB4ID0gc2NhbGUgKiAobGFtYmRhMiArIFBJKSAvICgyICogUEkpO1xuICBjb25zdCB5ID0gc2NhbGUgKiAoUEkgLSBNYXRoLmxvZyhNYXRoLnRhbihQSV80ICsgcGhpMiAqIDAuNSkpKSAvICgyICogUEkpO1xuICByZXR1cm4gW3gsIHldO1xufVxuXG4vKipcbiAqIFVucHJvamVjdCB3b3JsZCBwb2ludCBbeCx5XSBvbiBtYXAgb250byB7bGF0LCBsb259IG9uIHNwaGVyZVxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fFZlY3Rvcn0geHkgLSBvYmplY3Qgd2l0aCB7eCx5fSBtZW1iZXJzXG4gKiAgcmVwcmVzZW50aW5nIHBvaW50IG9uIHByb2plY3RlZCBtYXAgcGxhbmVcbiAqIEByZXR1cm4ge0dlb0Nvb3JkaW5hdGVzfSAtIG9iamVjdCB3aXRoIHtsYXQsbG9ufSBvZiBwb2ludCBvbiBzcGhlcmUuXG4gKiAgIEhhcyB0b0FycmF5IG1ldGhvZCBpZiB5b3UgbmVlZCBhIEdlb0pTT04gQXJyYXkuXG4gKiAgIFBlciBjYXJ0b2dyYXBoaWMgdHJhZGl0aW9uLCBsYXQgYW5kIGxvbiBhcmUgc3BlY2lmaWVkIGFzIGRlZ3JlZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnByb2plY3RGbGF0KFt4LCB5XSwgc2NhbGUpIHtcbiAgc2NhbGUgPSBzY2FsZSAqIFdPUkxEX1NDQUxFO1xuICBjb25zdCBsYW1iZGEyID0gKHggLyBzY2FsZSkgKiAoMiAqIFBJKSAtIFBJO1xuICBjb25zdCBwaGkyID0gMiAqIChNYXRoLmF0YW4oTWF0aC5leHAoUEkgLSAoeSAvIHNjYWxlKSAqICgyICogUEkpKSkgLSBQSV80KTtcbiAgcmV0dXJuIFtsYW1iZGEyICogUkFESUFOU19UT19ERUdSRUVTLCBwaGkyICogUkFESUFOU19UT19ERUdSRUVTXTtcbn1cblxuLy8gUmV0dXJucyB0aGUgem9vbSBsZXZlbCB0aGF0IGdpdmVzIGEgMSBtZXRlciBwaXhlbCBhdCBhIGNlcnRhaW4gbGF0aXR1ZGVcbi8vIFM9Qypjb3MoeSkvMl4oeis4KVxuZXhwb3J0IGZ1bmN0aW9uIGdldE1ldGVyWm9vbSh7bGF0aXR1ZGV9KSB7XG4gIGFzc2VydChsYXRpdHVkZSk7XG4gIGNvbnN0IHJhZGlhbnMgPSBkZWdyZWVzID0+IGRlZ3JlZXMgLyAxODAgKiBNYXRoLlBJO1xuICByZXR1cm4gTWF0aC5sb2cyKEVBUlRIX0NJUkNVTUZFUkVOQ0UgKiBNYXRoLmNvcyhyYWRpYW5zKGxhdGl0dWRlKSkpIC0gODtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgZGlzdGFuY2Ugc2NhbGVzIGluIG1ldGVycyBhcm91bmQgY3VycmVudCBsYXQvbG9uLCBib3RoIGZvclxuICogZGVncmVlcyBhbmQgcGl4ZWxzLlxuICogSW4gbWVyY2F0b3IgcHJvamVjdGlvbiBtb2RlLCB0aGUgZGlzdGFuY2Ugc2NhbGVzIHZhcnkgc2lnbmlmaWNhbnRseVxuICogd2l0aCBsYXRpdHVkZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlU2NhbGVzKHtsYXRpdHVkZSwgbG9uZ2l0dWRlLCB6b29tLCBzY2FsZX0pIHtcbiAgLy8gQ2FsY3VsYXRlIHNjYWxlIGZyb20gem9vbSBpZiBub3QgcHJvdmlkZWRcbiAgc2NhbGUgPSBzY2FsZSAhPT0gdW5kZWZpbmVkID8gc2NhbGUgOiBNYXRoLnBvdygyLCB6b29tKTtcblxuICBhc3NlcnQoIWlzTmFOKGxhdGl0dWRlKSAmJiAhaXNOYU4obG9uZ2l0dWRlKSAmJiAhaXNOYU4oc2NhbGUpKTtcblxuICBjb25zdCBsYXRDb3NpbmUgPSBNYXRoLmNvcyhsYXRpdHVkZSAqIE1hdGguUEkgLyAxODApO1xuXG4gIC8vIGNvbnN0IG1ldGVyc1BlckRlZ3JlZVggPSBNRVRFUlNfUEVSX0RFR1JFRV9BVF9FUVVBVE9SICogbGF0Q29zaW5lO1xuICAvLyBjb25zdCBtZXRlcnNQZXJEZWdyZWVZID0gTUVURVJTX1BFUl9ERUdSRUVfQVRfRVFVQVRPUjtcblxuICAvLyBDYWxjdWxhdGUgbnVtYmVyIG9mIHBpeGVscyBvY2N1cGllZCBieSBvbmUgZGVncmVlIGxvbmdpdHVkZVxuICAvLyBhcm91bmQgY3VycmVudCBsYXQvbG9uXG4gIGNvbnN0IHBpeGVsc1BlckRlZ3JlZVggPSB2ZWMyX2Rpc3RhbmNlKFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUgKyAwLjUsIGxhdGl0dWRlXSwgc2NhbGUpLFxuICAgIHByb2plY3RGbGF0KFtsb25naXR1ZGUgLSAwLjUsIGxhdGl0dWRlXSwgc2NhbGUpXG4gICk7XG4gIC8vIENhbGN1bGF0ZSBudW1iZXIgb2YgcGl4ZWxzIG9jY3VwaWVkIGJ5IG9uZSBkZWdyZWUgbGF0aXR1ZGVcbiAgLy8gYXJvdW5kIGN1cnJlbnQgbGF0L2xvblxuICBjb25zdCBwaXhlbHNQZXJEZWdyZWVZID0gdmVjMl9kaXN0YW5jZShcbiAgICBwcm9qZWN0RmxhdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSArIDAuNV0sIHNjYWxlKSxcbiAgICBwcm9qZWN0RmxhdChbbG9uZ2l0dWRlLCBsYXRpdHVkZSAtIDAuNV0sIHNjYWxlKVxuICApO1xuXG4gIGNvbnN0IHdvcmxkU2l6ZSA9IFRJTEVfU0laRSAqIHNjYWxlO1xuICBjb25zdCBhbHRQaXhlbHNQZXJNZXRlciA9IHdvcmxkU2l6ZSAvICg0ZTcgKiBsYXRDb3NpbmUpO1xuICBjb25zdCBwaXhlbHNQZXJNZXRlciA9IFthbHRQaXhlbHNQZXJNZXRlciwgYWx0UGl4ZWxzUGVyTWV0ZXIsIGFsdFBpeGVsc1Blck1ldGVyXTtcbiAgY29uc3QgbWV0ZXJzUGVyUGl4ZWwgPSBbMSAvIGFsdFBpeGVsc1Blck1ldGVyLCAxIC8gYWx0UGl4ZWxzUGVyTWV0ZXIsIDEgLyBhbHRQaXhlbHNQZXJNZXRlcl07XG5cbiAgY29uc3QgcGl4ZWxzUGVyRGVncmVlID0gW3BpeGVsc1BlckRlZ3JlZVgsIHBpeGVsc1BlckRlZ3JlZVksIGFsdFBpeGVsc1Blck1ldGVyXTtcbiAgY29uc3QgZGVncmVlc1BlclBpeGVsID0gWzEgLyBwaXhlbHNQZXJEZWdyZWVYLCAxIC8gcGl4ZWxzUGVyRGVncmVlWSwgMSAvIGFsdFBpeGVsc1Blck1ldGVyXTtcblxuICAvLyBNYWluIHJlc3VsdHMsIHVzZWQgZm9yIGNvbnZlcnRpbmcgbWV0ZXJzIHRvIGxhdGxuZyBkZWx0YXMgYW5kIHNjYWxpbmcgb2Zmc2V0c1xuICByZXR1cm4ge1xuICAgIHBpeGVsc1Blck1ldGVyLFxuICAgIG1ldGVyc1BlclBpeGVsLFxuICAgIHBpeGVsc1BlckRlZ3JlZSxcbiAgICBkZWdyZWVzUGVyUGl4ZWxcbiAgfTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGVzIGEgbWVyY2F0b3Igd29ybGQgcG9zaXRpb24gKFwicGl4ZWxzXCIgaW4gZ2l2ZW4gem9vbSBsZXZlbClcbiAqIGZyb20gYSBsbmcvbGF0IGFuZCBtZXRlck9mZnNldFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V29ybGRQb3NpdGlvbih7XG4gIGxvbmdpdHVkZSxcbiAgbGF0aXR1ZGUsXG4gIHpvb20sXG4gIG1ldGVyT2Zmc2V0LFxuICBkaXN0YW5jZVNjYWxlcyA9IG51bGxcbn0pIHtcbiAgY29uc3Qgc2NhbGUgPSBNYXRoLnBvdygyLCB6b29tKTtcblxuICAvLyBNYWtlIGEgY2VudGVyZWQgdmVyc2lvbiBvZiB0aGUgbWF0cml4IGZvciBwcm9qZWN0aW9uIG1vZGVzIHdpdGhvdXQgYW4gb2Zmc2V0XG4gIGNvbnN0IGNlbnRlcjJkID0gcHJvamVjdEZsYXQoW2xvbmdpdHVkZSwgbGF0aXR1ZGVdLCBzY2FsZSk7XG4gIGNvbnN0IGNlbnRlciA9IG5ldyBWZWN0b3IzKGNlbnRlcjJkWzBdLCBjZW50ZXIyZFsxXSwgMCk7XG5cbiAgaWYgKG1ldGVyT2Zmc2V0KSB7XG4gICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIHNjYWxlcyBpZiBsbmcvbGF0L3pvb20gYXJlIHByb3ZpZGVkXG4gICAgZGlzdGFuY2VTY2FsZXMgPSBkaXN0YW5jZVNjYWxlcyB8fCBnZXREaXN0YW5jZVNjYWxlcyh7bGF0aXR1ZGUsIGxvbmdpdHVkZSwgc2NhbGV9KTtcblxuICAgIGNvbnN0IHBpeGVsUG9zaXRpb24gPSBuZXcgVmVjdG9yMyhtZXRlck9mZnNldClcbiAgICAgIC8vIENvbnZlcnQgdG8gcGl4ZWxzIGluIGN1cnJlbnQgem9vbVxuICAgICAgLnNjYWxlKGRpc3RhbmNlU2NhbGVzLnBpeGVsc1Blck1ldGVyKVxuICAgICAgLy8gV2Ugd2FudCBwb3NpdGl2ZSBZIHRvIHJlcHJlc2VudCBhbiBvZmZzZXQgdG93YXJkcyBub3J0aCxcbiAgICAgIC8vIGJ1dCB3ZWIgbWVyY2F0b3Igd29ybGQgY29vcmRpbmF0ZXMgaXMgdG9wLWxlZnRcbiAgICAgIC5zY2FsZShbMSwgLTEsIDFdKTtcbiAgICBjZW50ZXIuYWRkKHBpeGVsUG9zaXRpb24pO1xuICB9XG5cbiAgcmV0dXJuIGNlbnRlcjtcbn1cblxuLy8gQVRUUklCVVRJT046XG4vLyB2aWV3IGFuZCBwcm9qZWN0aW9uIG1hdHJpeCBjcmVhdGlvbiBpcyBpbnRlbnRpb25hbGx5IGtlcHQgY29tcGF0aWJsZSB3aXRoXG4vLyBtYXBib3gtZ2wncyBpbXBsZW1lbnRhdGlvbiB0byBlbnN1cmUgdGhhdCBzZWFtbGVzcyBpbnRlcm9wZXJhdGlvblxuLy8gd2l0aCBtYXBib3ggYW5kIHJlYWN0LW1hcC1nbC4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L21hcGJveC1nbC1qc1xuXG4vLyBWYXJpYWJsZSBmb3YgKGluIHJhZGlhbnMpXG5mdW5jdGlvbiBnZXRGb3Yoe2hlaWdodCwgYWx0aXR1ZGV9KSB7XG4gIHJldHVybiAyICogTWF0aC5hdGFuKChoZWlnaHQgLyAyKSAvIGFsdGl0dWRlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQbGFuZXMoe2FsdGl0dWRlLCBwaXRjaH0pIHtcbiAgLy8gRmluZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIHBvaW50IHRvIHRoZSBjZW50ZXIgdG9wXG4gIC8vIGluIGFsdGl0dWRlIHVuaXRzIHVzaW5nIGxhdyBvZiBzaW5lcy5cbiAgY29uc3QgcGl0Y2hSYWRpYW5zID0gcGl0Y2ggKiBERUdSRUVTX1RPX1JBRElBTlM7XG4gIGNvbnN0IGhhbGZGb3YgPSBNYXRoLmF0YW4oMC41IC8gYWx0aXR1ZGUpO1xuICBjb25zdCB0b3BIYWxmU3VyZmFjZURpc3RhbmNlID1cbiAgICBNYXRoLnNpbihoYWxmRm92KSAqIGFsdGl0dWRlIC8gTWF0aC5zaW4oTWF0aC5QSSAvIDIgLSBwaXRjaFJhZGlhbnMgLSBoYWxmRm92KTtcblxuICAvLyBDYWxjdWxhdGUgeiB2YWx1ZSBvZiB0aGUgZmFydGhlc3QgZnJhZ21lbnQgdGhhdCBzaG91bGQgYmUgcmVuZGVyZWQuXG4gIGNvbnN0IGZhclogPSBNYXRoLmNvcyhNYXRoLlBJIC8gMiAtIHBpdGNoUmFkaWFucykgKiB0b3BIYWxmU3VyZmFjZURpc3RhbmNlICsgYWx0aXR1ZGU7XG5cbiAgcmV0dXJuIHtmYXJaLCBuZWFyWjogMC4xfTtcbn1cblxuLy8gVE9ETyAtIHJlbmFtZSB0aGlzIG1hdHJpeFxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuY2VudGVyZWRWaWV3TWF0cml4KHtcbiAgaGVpZ2h0LFxuICBwaXRjaCxcbiAgYmVhcmluZyxcbiAgYWx0aXR1ZGVcbn0pIHtcbiAgLy8gVklFVyBNQVRSSVg6IFBST0pFQ1RTIE1FUkNBVE9SIFdPUkxEIENPT1JESU5BVEVTXG4gIC8vIE5vdGUgdGhhdCBtZXJjYXRvciB3b3JsZCBjb29yZGluYXRlcyB0eXBpY2FsbHkgbmVlZCB0byBiZSBmbGlwcGVkXG4gIC8vXG4gIC8vIE5vdGU6IEFzIHVzdWFsLCBtYXRyaXggb3BlcmF0aW9uIG9yZGVycyBzaG91bGQgYmUgcmVhZCBpbiByZXZlcnNlXG4gIC8vIHNpbmNlIHZlY3RvcnMgd2lsbCBiZSBtdWx0aXBsaWVkIGZyb20gdGhlIHJpZ2h0IGR1cmluZyB0cmFuc2Zvcm1hdGlvblxuICBjb25zdCB2bSA9IGNyZWF0ZU1hdDQoKTtcblxuICAvLyBNb3ZlIGNhbWVyYSB0byBhbHRpdHVkZSAoYWxvbmcgdGhlIHBpdGNoICYgYmVhcmluZyBkaXJlY3Rpb24pXG4gIG1hdDRfdHJhbnNsYXRlKHZtLCB2bSwgWzAsIDAsIC1hbHRpdHVkZV0pO1xuXG4gIC8vIEFmdGVyIHRoZSByb3RhdGVYLCB6IHZhbHVlcyBhcmUgaW4gcGl4ZWwgdW5pdHMuIENvbnZlcnQgdGhlbSB0b1xuICAvLyBhbHRpdHVkZSB1bml0cy4gMSBhbHRpdHVkZSB1bml0ID0gdGhlIHNjcmVlbiBoZWlnaHQuXG4gIG1hdDRfc2NhbGUodm0sIHZtLCBbMSwgMSwgMSAvIGhlaWdodF0pO1xuXG4gIC8vIFJvdGF0ZSBieSBiZWFyaW5nLCBhbmQgdGhlbiBieSBwaXRjaCAod2hpY2ggdGlsdHMgdGhlIHZpZXcpXG4gIG1hdDRfcm90YXRlWCh2bSwgdm0sIC1waXRjaCAqIERFR1JFRVNfVE9fUkFESUFOUyk7XG4gIG1hdDRfcm90YXRlWih2bSwgdm0sIGJlYXJpbmcgKiBERUdSRUVTX1RPX1JBRElBTlMpO1xuXG4gIHJldHVybiB2bTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZpZXdNYXRyaXgoe1xuICAvLyBWaWV3cG9ydCBwcm9wc1xuICB3aWR0aCxcbiAgaGVpZ2h0LFxuICBsb25naXR1ZGUsXG4gIGxhdGl0dWRlLFxuICB6b29tLFxuICBwaXRjaCxcbiAgYmVhcmluZyxcbiAgYWx0aXR1ZGUsXG4gIC8vIFByZS1jYWxjdWxhdGVkIHBhcmFtZXRlcnNcbiAgZGlzdGFuY2VTY2FsZXMgPSBudWxsLFxuICBjZW50ZXIgPSBudWxsLFxuICB2aWV3TWF0cml4VW5jZW50ZXJlZCA9IG51bGwsXG4gIC8vIE9wdGlvbnNcbiAgbWV0ZXJPZmZzZXQgPSBudWxsLFxuICBmbGlwWSA9IHRydWVcbn0pIHtcbiAgaWYgKCFjZW50ZXIpIHtcbiAgICBjZW50ZXIgPSBnZXRXb3JsZFBvc2l0aW9uKHtsb25naXR1ZGUsIGxhdGl0dWRlLCB6b29tLCBkaXN0YW5jZVNjYWxlcywgbWV0ZXJPZmZzZXR9KTtcbiAgfVxuXG4gIC8vIFZJRVcgTUFUUklYOiBQUk9KRUNUUyBGUk9NIFZJUlRVQUwgUElYRUxTIFRPIENBTUVSQSBTUEFDRVxuICAvLyBOb3RlOiBBcyB1c3VhbCwgbWF0cml4IG9wZXJhdGlvbiBvcmRlcnMgc2hvdWxkIGJlIHJlYWQgaW4gcmV2ZXJzZVxuICAvLyBzaW5jZSB2ZWN0b3JzIHdpbGwgYmUgbXVsdGlwbGllZCBmcm9tIHRoZSByaWdodCBkdXJpbmcgdHJhbnNmb3JtYXRpb25cbiAgaWYgKCF2aWV3TWF0cml4VW5jZW50ZXJlZCkge1xuICAgIHZpZXdNYXRyaXhVbmNlbnRlcmVkID0gZ2V0VW5jZW50ZXJlZFZpZXdNYXRyaXgoe2hlaWdodCwgcGl0Y2gsIGJlYXJpbmcsIGFsdGl0dWRlfSk7XG4gIH1cblxuICBjb25zdCB2bSA9IGNyZWF0ZU1hdDQoKTtcblxuICBpZiAoZmxpcFkpIHtcbiAgICBtYXQ0X3NjYWxlKHZtLCB2aWV3TWF0cml4VW5jZW50ZXJlZCwgWzEsIC0xLCAxXSk7XG4gIH1cblxuICBjb25zdCB2aWV3TWF0cml4Q2VudGVyZWQgPSBtYXQ0X3RyYW5zbGF0ZSh2bSwgdm0sIG5ldyBWZWN0b3IzKGNlbnRlcikubmVnYXRlKCkpO1xuXG4gIHJldHVybiB2aWV3TWF0cml4Q2VudGVyZWQ7XG59XG5cbi8vIFBST0pFQ1RJT04gTUFUUklYOiBQUk9KRUNUUyBGUk9NIENBTUVSQSAoVklFVykgU1BBQ0UgVE8gQ0xJUFNQQUNFXG4vLyBUaGlzIGlzIGEgXCJNYXBib3hcIiBwcm9qZWN0aW9uIG1hdHJpeCAtIG1hdGNoZXMgbWFwYm94IGV4YWN0bHkgaWYgZmFyWk11bHRpcGxpZXIgPT09IDFcbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9qZWN0aW9uTWF0cml4KHtcbiAgd2lkdGgsXG4gIGhlaWdodCxcbiAgcGl0Y2gsXG4gIGFsdGl0dWRlLFxuICBmYXJaTXVsdGlwbGllciA9IDEwXG59KSB7XG4gIGNvbnN0IHtuZWFyWiwgZmFyWn0gPSBnZXRDbGlwcGluZ1BsYW5lcyh7YWx0aXR1ZGUsIHBpdGNofSk7XG4gIGNvbnN0IGZvdiA9IGdldEZvdih7aGVpZ2h0LCBhbHRpdHVkZX0pO1xuXG4gIGNvbnN0IHByb2plY3Rpb25NYXRyaXggPSBtYXQ0X3BlcnNwZWN0aXZlKFxuICAgIFtdLFxuICAgIGZvdiwgICAgICAgICAgICAgIC8vIGZvdiBpbiByYWRpYW5zXG4gICAgd2lkdGggLyBoZWlnaHQsICAgLy8gYXNwZWN0IHJhdGlvXG4gICAgbmVhclosICAgICAgICAgICAgLy8gbmVhciBwbGFuZVxuICAgIGZhclogKiBmYXJaTXVsdGlwbGllciAvLyBmYXIgcGxhbmVcbiAgKTtcblxuICByZXR1cm4gcHJvamVjdGlvbk1hdHJpeDtcbn1cbiJdfQ==
{
"name": "viewport-mercator-project",
"version": "4.2.0-alpha.2",
"version": "5.0.0-alpha.1",
"description": "Utilities for perspective-enabled Web Mercator projections",

@@ -38,2 +38,3 @@ "author": "Uber Technologies, Inc.",

"devDependencies": {
"@turf/distance": "^5.0.4",
"babel-cli": "^6.22.2",

@@ -49,3 +50,4 @@ "babel-core": "^6.22.1",

"jsdom": "~9.9.1",
"mapbox-gl": "0.26.0",
"mapbox-gl": "0.41.0",
"mock-browser": "^0.92.14",
"module-alias": "^2.0.0",

@@ -52,0 +54,0 @@ "pre-commit": "^1.2.2",

@@ -16,24 +16,38 @@ <p align="right">

<h1 align="center">viewport-mercator-project</h1>
# viewport-mercator-project | [Docs](https://uber-common.github.io/viewport-mercator-project/#/)
Documentation is available in the [**website**](https://uber-common.github.io/viewport-mercator-project/#/) or in the [docs](./docs) folder).
Projection and camera utilities supporting the Web Mercator Projection. At its core this is a utility for converting to and from map coordinates (i.e. latitude, longitude) to screen coordinates and back.
## Installation
<h5 align="center">Utility to convert map or world coordinates to screen coordinates back and forth</h5>
```bash
npm install viewport-mercator-project --save
```
npm install viewport-mercator-project --save
## Overview
Projection and camera utilities supporting the Web Mercator Projection. At its core this is a utility for converting to and from map coordinates (i.e. latitude, longitude) to screen coordinates and back.
The `WebMercatorViewport` class offers the equivalent of a 3D matrix "camera" class of the type you would find in any 3D/WebGL/OpenGL library.
* `FlatMercatorViewport` - For 2D applications, a simple, fast utility is provided that supports the basic flat Web Mercator projection and unprojection between geo coordinates and pixels.
```js
import WebMercatorViewport from 'viewport-mercator-project';
* `PerspectiveMercatorViewport` - For 3D applications, a subclass of a generic `Viewport` class (which is essentially a 3D matrix "camera" class of the type you would find in any 3D/WebGL/OpenGL library).
// A viewport looking at San Francisco city area
const viewport = WebMercatorViewport({
width: 800,
height: 600,
longitude: -122.45,
latitude: 37.78,
zoom: 12,
pitch: 60,
bearing: 30
});
The constructor of this "advanced" perspective-enabled viewport also takes the same typical map view parameters as the `FlatMercatorViewport`, however it offers perspective enabled/project unproject functions, and generates general 4x4 view matrices that correspond to the parameters.
viewport.project([-122.45, 37.78]);
// returns pixel coordinates [400, 300]
viewport.unproject([400, 300]);
// returns map coordinates [-122.45, 37.78]
```
## Who is this for?
### Who is this for?
Specifically built for use with [deck.gl](https://github.com/uber/deck-gl) and [react-map-gl](https://github.com/uber/react-map-gl), but could be useful for any web mapping application that wants to support perspective enabled Web Mercator Projections with floating point zoom levels.
// Classic web-mercator-project
export {default as default} from './flat-mercator-viewport';
export {default as FlatMercatorViewport} from './flat-mercator-viewport';
export {default as PerspectiveMercatorViewport} from './perspective-mercator-viewport';
export {default as default} from './web-mercator-viewport';
export {default as WebMercatorViewport} from './web-mercator-viewport';
// Legacy class name
export {default as PerspectiveMercatorViewport} from './web-mercator-viewport';
export {projectFlat} from './web-mercator-utils';
export {unprojectFlat} from './web-mercator-utils';
export {getMercatorMeterZoom} from './web-mercator-utils';
export {getMercatorDistanceScales} from './web-mercator-utils';
export {getMercatorWorldPosition} from './web-mercator-utils';
export {makeViewMatricesFromMercatorParams} from './web-mercator-utils';
export {makeUncenteredViewMatrixFromMercatorParams} from './web-mercator-utils';
export {makeProjectionMatrixFromMercatorParams} from './web-mercator-utils';
export {getFov} from './web-mercator-utils';
export {getClippingPlanes} from './web-mercator-utils';
export {fitBounds} from './web-mercator-viewport';
export {
projectFlat,
unprojectFlat,
getMeterZoom,
getDistanceScales,
getWorldPosition,
getViewMatrix,
getUncenteredViewMatrix,
getProjectionMatrix
} from './web-mercator-utils';
// TODO - THE UTILITIES IN THIS FILE SHOULD BE IMPORTED FROM WEB-MERCATOR-VIEWPORT MODULE
import {Vector3} from 'math.gl';
import {createMat4} from './math-utils';
import mat4_perspective from 'gl-mat4/perspective';

@@ -19,10 +21,5 @@ import mat4_scale from 'gl-mat4/scale';

const WORLD_SCALE = TILE_SIZE;
const EARTH_CIRCUMFERENCE = 40.075e6;
// const METERS_PER_DEGREE_AT_EQUATOR = 111000; // Approximately 111km per degree at equator
// Helper, avoids low-precision 32 bit matrices from gl-matrix mat4.create()
function createMat4() {
return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
}
/**

@@ -65,5 +62,4 @@ * Project [lng,lat] on sphere onto [x,y] on 512*512 Mercator Zoom 0 tile.

// S=C*cos(y)/2^(z+8)
export function getMercatorMeterZoom({latitude}) {
export function getMeterZoom({latitude}) {
assert(latitude);
const EARTH_CIRCUMFERENCE = 40.075e6;
const radians = degrees => degrees / 180 * Math.PI;

@@ -79,3 +75,3 @@ return Math.log2(EARTH_CIRCUMFERENCE * Math.cos(radians(latitude))) - 8;

*/
export function getMercatorDistanceScales({latitude, longitude, zoom, scale}) {
export function getDistanceScales({latitude, longitude, zoom, scale}) {
// Calculate scale from zoom if not provided

@@ -125,3 +121,3 @@ scale = scale !== undefined ? scale : Math.pow(2, zoom);

*/
export function getMercatorWorldPosition({
export function getWorldPosition({
longitude,

@@ -135,5 +131,2 @@ latitude,

// Calculate distance scales if lng/lat/zoom are provided
distanceScales = distanceScales || getMercatorDistanceScales({latitude, longitude, scale});
// Make a centered version of the matrix for projection modes without an offset

@@ -144,2 +137,5 @@ const center2d = projectFlat([longitude, latitude], scale);

if (meterOffset) {
// Calculate distance scales if lng/lat/zoom are provided
distanceScales = distanceScales || getDistanceScales({latitude, longitude, scale});
const pixelPosition = new Vector3(meterOffset)

@@ -163,7 +159,7 @@ // Convert to pixels in current zoom

// Variable fov (in radians)
export function getFov({height, altitude}) {
function getFov({height, altitude}) {
return 2 * Math.atan((height / 2) / altitude);
}
export function getClippingPlanes({altitude, pitch}) {
function getClippingPlanes({altitude, pitch}) {
// Find the distance from the center point to the center top

@@ -183,12 +179,7 @@ // in altitude units using law of sines.

// TODO - rename this matrix
export function makeUncenteredViewMatrixFromMercatorParams({
width,
export function getUncenteredViewMatrix({
height,
longitude,
latitude,
zoom,
pitch,
bearing,
altitude,
center
altitude
}) {

@@ -216,3 +207,4 @@ // VIEW MATRIX: PROJECTS MERCATOR WORLD COORDINATES

export function makeViewMatricesFromMercatorParams({
export function getViewMatrix({
// Viewport props
width,

@@ -226,6 +218,13 @@ height,

altitude,
centerLngLat,
meterOffset = null
// Pre-calculated parameters
distanceScales = null,
center = null,
viewMatrixUncentered = null,
// Options
meterOffset = null,
flipY = true
}) {
const center = getMercatorWorldPosition({longitude, latitude, zoom, meterOffset});
if (!center) {
center = getWorldPosition({longitude, latitude, zoom, distanceScales, meterOffset});
}

@@ -235,22 +234,15 @@ // VIEW MATRIX: PROJECTS FROM VIRTUAL PIXELS TO CAMERA SPACE

// since vectors will be multiplied from the right during transformation
const viewMatrixUncentered = makeUncenteredViewMatrixFromMercatorParams({
width,
height,
longitude,
latitude,
zoom,
pitch,
bearing,
altitude
});
if (!viewMatrixUncentered) {
viewMatrixUncentered = getUncenteredViewMatrix({height, pitch, bearing, altitude});
}
const vm = createMat4();
mat4_scale(vm, viewMatrixUncentered, [1, -1, 1]);
if (flipY) {
mat4_scale(vm, viewMatrixUncentered, [1, -1, 1]);
}
const viewMatrixCentered = mat4_translate(vm, vm, new Vector3(center).negate());
return {
viewMatrixCentered,
viewMatrixUncentered,
center
};
return viewMatrixCentered;
}

@@ -260,3 +252,3 @@

// This is a "Mapbox" projection matrix - matches mapbox exactly if farZMultiplier === 1
export function makeProjectionMatrixFromMercatorParams({
export function getProjectionMatrix({
width,

@@ -272,3 +264,3 @@ height,

const projectionMatrix = mat4_perspective(
createMat4(),
[],
fov, // fov in radians

@@ -275,0 +267,0 @@ width / height, // aspect ratio

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc