{"version":3,"sources":["../../src/index.ts","../../node_modules/fast-deep-equal/index.js","../../src/google_map_map.js","../../src/marker_dispatcher.js","../../src/utils/omit.js","../../src/utils/shallowEqual.js","../../src/google_map_markers.js","../../src/google_map_markers_prerender.js","../../src/loaders/google_map_loader.js","../../src/lib/geo/wrap.js","../../src/lib/geo/lat_lng.js","../../src/lib/geo/transform.js","../../src/lib/geo/index.js","../../src/utils/raf.js","../../src/utils/log2.js","../../src/utils/pick.js","../../src/utils/isEmpty.js","../../src/utils/isNumber.js","../../src/utils/detect.js","../../src/utils/isPlainObject.js","../../src/utils/passiveEvents.js","../../src/utils/detectElementResize.js","../../src/google_map.js","../../src/google_heatmap.js","../../src/utils/isArraysEqualEps.js","../node_modules/eventemitter3/index.js","../node_modules/@mapbox/point-geometry/index.js"],"names":["equal","a","b","constructor","length","i","keys","Array","isArray","RegExp","source","flags","valueOf","Object","prototype","toString","hasOwnProperty","call","key","isEqual","style","width","height","left","top","margin","padding","position","GoogleMapMap","shouldComponentUpdate","render","React","ref","this","props","registerChild","Component","MarkerDispatcher","gmapInstance","_this","getChildren","children","getMousePosition","mouse_","getUpdateCounter","updateCounter_","dispose","removeAllListeners","EventEmitter","omit","obj","rest","is","x","y","shallowEqual","objA","objB","keysA","keysB","mainStyle","backgroundColor","GoogleMapMarkers","_getState","dispatcher","updateCounter","_onChangeHandler","dimensionsCache_","prevChildCount","state","setState","_onMouseChangeHandler","_onChildClick","onChildClick","hoverChildProps_","hoverKey_","_onChildMouseDown","onChildMouseDown","_onChildMouseEnter","hoverKey","childProps","onChildMouseEnter","_onChildMouseLeave","onChildMouseLeave","n","_onMouseAllow","value","allowMouse_","_onMouseChangeHandlerRaf","mp","distances","hoverDistance","getHoverDistance","Children","forEach","child","childIndex","latLng","lat","lng","childKey","dist","distanceToMouse","push","sort","_getDimensions","componentDidMount","on","nextProps","nextState","experimental","componentWillUnmount","removeListener","mainElementStyle","markers","map","cloneElement","$geoService","_this2","geoService","$onMouseAllow","$prerender","prerender","pt","insideMapPanes","fromLatLngToDivPixel","fromLatLngToCenterPixel","stylePtPos","seLatLng","seLat","seLng","sePt","containerPt","fromLatLngToContainerPixel","className","$markerHolderClassName","$hover","$getDimensions","$dimensionKey","propTypes","PropTypes","any","func","bool","defaultProps","loader_","loadPromise_","resolveCustomPromise_","_customPromise","Promise","resolve","bootstrapURLKeys","heatmapLibrary","libraries","includes","console","warn","window","Error","restKeys","Loader","apiKey","load","then","google","maps","wrap","min","max","d","LatLng","isNaN","convert","Transform","tileSize","minZoom","maxZoom","_minZoom","_maxZoom","latRange","zoom","center","angle","zoomScale","Math","pow","scaleZoom","scale","log","LN2","project","latlng","worldSize","Point","lngX","latY","unproject","point","yLat","xLng","lon","PI","tan","atan","exp","locationPoint","p","centerPoint","_sub","_rotate","pointLocation","p2","sub","bearing","_zoom","zoomV","tileZoom","floor","zoomFraction","Geo","hasSize_","hasView_","transform_","setView","t","setViewSize","setMapCanvasProjection","mapCanvasProjection","maps_","mapCanvasProjection_","canProject","hasSize","ptLatLng","round","fromContainerPixelToLatLng","ptXY","ptxy","ptRes","getWidth","getHeight","getZoom","getCenter","getBounds","margins","roundFactor","bndT","bndR","bndB","bndL","topLeftCorner","bottomRightCorner","res","r","raf","callback","requestAnimationFrame","nativeRaf","webkitRequestAnimationFrame","mozRequestAnimationFrame","setTimeout","log2","pick","fn","reduce","result","isEmpty","val","objectToString","isNumber","detectBrowserResult_","detectBrowser","navigator","isExplorer","userAgent","indexOf","isFirefox","isOpera","toLowerCase","isChrome","isSafari","fnToString","Function","isPlainObject","proto","getPrototypeOf","addPassiveEventListener","element","eventName","capture","addEventListener","passiveSupported","options","defineProperty","get","removeEventListener","err","passive","_window","canUseDOM","document","createElement","self","cancel","attachEvent","stylesCreated","requestFrame","cancelFrame","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","clearTimeout","id","resetTriggers","triggers","__resizeTriggers__","expand","firstElementChild","contract","lastElementChild","expandChild","scrollLeft","scrollWidth","scrollTop","scrollHeight","offsetWidth","offsetHeight","scrollListener","e","__resizeRAF__","__resizeLast__","__resizeListeners__","animation","keyframeprefix","animationstartevent","domPrefixes","split","startEvents","elm","animationName","animationstring","animationKeyframes","animationStyle","IS_REACT_16","ReactDOM","createPortal","unstable_renderSubtreeIntoContainer","latLng2Obj","_checkMinZoom","GoogleMap","_getMinZoom","geoService_","tilesPerWidth","ceil","tilesPerHeight","maxTilesPerDim","_computeMinZoom","_mapDomResizeCallback","resetSizeOnIdle_","originalCenter","defaultCenter","currentCenter","map_","event","trigger","setCenter","resetBoundsOnResize","_setLayers","layerTypes","layerType","layers_","setMap","_renderPortal","_getHoverDistance","markersDispatcher_","_initMap","initialized_","propsCenter","defaultZoom","_onBoundsChanged","googleMapLoader","mounted_","instance","centerLatLng","propsOptions","heatmap","positions","assign","visualization","HeatmapLayer","data","acc","weight","location","option","set","mapPlainObjects","draggableOptions","draggable","minZoom_","preMapOptions","overviewMapControl","streetViewControl","rotateControl","mapTypeControl","styles","featureType","elementType","stylers","visibility","defaultDraggableOption_","mapOptions","Map","findDOMNode","googleMapDom_","versionMatch","version","match","mapsVersion","Number","this_","overlay","OverlayView","onAdd","K_MAX_WIDTH","screen","K_MAX_HEIGHT","div","overlayViewDivStyle","property","getPanes","overlayMouseTarget","appendChild","getProjection","onRemove","renderedOverlay","unmountComponentAtNode","draw","debounced","googleApiLoadedCalled_","_onGoogleApiLoaded","_onChildMouseMove","emit","fireMouseEventOnIdle_","overlay_","onTilesLoaded","addListener","_onTilesLoaded","zoomAnimationInProgress_","_onZoomAnimationStart","Date","getTime","zoomControlClickTime_","_setViewSize","currMinZoom","setOptions","_onZoomAnimationEnd","dragTime_","mouseInMap_","_onDrag","idleListener","_onDragEnd","_onMapTypeIdChange","getMapTypeId","error","onGoogleApiLoaded","onDrag","onDragEnd","onMapTypeIdChange","onZoomAnimationStart","onZoomAnimationEnd","childMouseDownArgs_","_onChildMouseUp","onChildMouseUp","childMouseUpTime_","onChildMouseMove","fullscreen","webkitIsFullScreen","mozFullScreen","msFullscreenElement","innerWidth","innerHeight","mapDom","clientWidth","clientHeight","_onWindowResize","_onMapMouseMove","currTime","mouseMoveTime_","boundingRect_","currentTarget","getBoundingClientRect","mousePosX","clientX","mousePosY","clientY","_onClick","onClick","_onMapClick","_onMapMouseDownNative","_onMapMouseDown","_onMapMouseDownCapture","_onKeyDownCapture","_isCenterDefined","callExtBoundsChange","gmC","onChange","onBoundsChange","bounds","arrayA","arrayB","eps","abs","prevBounds_","marginBounds","centerIsObject_","nw","se","sw","ne","size","_registerChild","parentNode","tempParentDiv","getComputedStyle","css","head","getElementsByTagName","type","styleSheet","cssText","createTextNode","innerHTML","componentDidUpdate","prevProps","_this3","prevCenter","panTo","setZoom","layerKey","setData","detachEvent","splice","removeChild","shouldUnregisterMapOnUnmount","scrollwheel","clearInstanceListeners","mapMarkerPrerender","GoogleMapMarkersPrerender","onMouseMove","onMouseDownCapture","string","oneOfType","array","shape","number","yesIWantToUseGoogleMapApiInternals","arrayOf","mousePos","sqrt","has","prefix","Events","EE","context","once","emitter","TypeError","listener","evt","_events","_eventsCount","clearEvent","create","__proto__","eventNames","events","name","names","slice","getOwnPropertySymbols","concat","listeners","handlers","l","ee","listenerCount","a1","a2","a3","a4","a5","args","len","arguments","undefined","apply","j","off","prefixed","module","exports","clone","add","_add","multByPoint","_multByPoint","divByPoint","_divByPoint","mult","k","_mult","_div","rotate","rotateAround","_rotateAround","matMult","m","_matMult","unit","_unit","perp","_perp","_round","mag","equals","other","distSqr","dx","dy","atan2","angleTo","angleWith","angleWithSep","cos","sin"],"mappings":"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","file":"static/js/1.c6989006.chunk.js","sourcesContent":[null,"'use strict';\n\n// do not edit .js files directly - edit src/index.jst\n\n\n\nmodule.exports = function equal(a, b) {\n  if (a === b) return true;\n\n  if (a && b && typeof a == 'object' && typeof b == 'object') {\n    if (a.constructor !== b.constructor) return false;\n\n    var length, i, keys;\n    if (Array.isArray(a)) {\n      length = a.length;\n      if (length != b.length) return false;\n      for (i = length; i-- !== 0;)\n        if (!equal(a[i], b[i])) return false;\n      return true;\n    }\n\n\n\n    if (a.constructor === RegExp) return a.source === b.source && a.flags === b.flags;\n    if (a.valueOf !== Object.prototype.valueOf) return a.valueOf() === b.valueOf();\n    if (a.toString !== Object.prototype.toString) return a.toString() === b.toString();\n\n    keys = Object.keys(a);\n    length = keys.length;\n    if (length !== Object.keys(b).length) return false;\n\n    for (i = length; i-- !== 0;)\n      if (!Object.prototype.hasOwnProperty.call(b, keys[i])) return false;\n\n    for (i = length; i-- !== 0;) {\n      var key = keys[i];\n\n      if (!equal(a[key], b[key])) return false;\n    }\n\n    return true;\n  }\n\n  // true if both NaN, false otherwise\n  return a!==a && b!==b;\n};\n","import React, { Component } from 'react';\n\nconst style = {\n  width: '100%',\n  height: '100%',\n  left: 0,\n  top: 0,\n  margin: 0,\n  padding: 0,\n  position: 'absolute',\n};\n\nexport default class GoogleMapMap extends Component {\n  shouldComponentUpdate() {\n    return false; // disable react on this div\n  }\n\n  render() {\n    const { registerChild } = this.props;\n    return <div ref={registerChild} style={style} />;\n  }\n}\n","import EventEmitter from 'eventemitter3';\n\nexport default class MarkerDispatcher extends EventEmitter {\n  constructor(gmapInstance) {\n    super();\n    this.gmapInstance = gmapInstance;\n  }\n\n  getChildren() {\n    return this.gmapInstance.props.children;\n  }\n\n  getMousePosition() {\n    return this.gmapInstance.mouse_;\n  }\n\n  getUpdateCounter() {\n    return this.gmapInstance.updateCounter_;\n  }\n\n  dispose() {\n    this.gmapInstance = null;\n    this.removeAllListeners();\n  }\n}\n","// https://github.com/acdlite/recompose/blob/master/src/packages/recompose/utils/omit.js\nconst omit = (obj, keys) => {\n  const { ...rest } = obj;\n  for (let i = 0; i < keys.length; i++) {\n    const key = keys[i];\n    if (key in rest) {\n      delete rest[key];\n    }\n  }\n  return rest;\n};\n\nexport default omit;\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * @providesModule shallowEqual\n * @typechecks\n * @flow\n */\n\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\n\n/**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\nfunction is(x, y) {\n  // SameValue algorithm\n  if (x === y) {\n    // Steps 1-5, 7-10\n    // Steps 6.b-6.e: +0 != -0\n    // Added the nonzero y check to make Flow happy, but it is redundant\n    return x !== 0 || y !== 0 || 1 / x === 1 / y;\n  }\n  // Step 6.a: NaN == NaN\n  // eslint-disable-next-line no-self-compare\n  return x !== x && y !== y;\n}\n\n/**\n * Performs equality by iterating through keys on an object and returning false\n * when any key has values which are not strictly equal between the arguments.\n * Returns true when the values of all keys are strictly equal.\n */\nfunction shallowEqual(objA, objB) {\n  if (is(objA, objB)) {\n    return true;\n  }\n\n  if (\n    typeof objA !== 'object' ||\n    objA === null ||\n    typeof objB !== 'object' ||\n    objB === null\n  ) {\n    return false;\n  }\n\n  const keysA = Object.keys(objA);\n  const keysB = Object.keys(objB);\n\n  if (keysA.length !== keysB.length) {\n    return false;\n  }\n\n  // Test for A's keys different from B.\n  for (let i = 0; i < keysA.length; i++) {\n    if (\n      !hasOwnProperty.call(objB, keysA[i]) ||\n      !is(objA[keysA[i]], objB[keysA[i]])\n    ) {\n      return false;\n    }\n  }\n\n  return true;\n}\n\nexport default shallowEqual;\n/* src: https://github.com/facebook/fbjs/blob/master/packages/fbjs/src/core/shallowEqual.js */\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\n// utils\nimport omit from './utils/omit';\nimport shallowEqual from './utils/shallowEqual';\n\nconst mainStyle = {\n  width: '100%',\n  height: '100%',\n  left: 0,\n  top: 0,\n  margin: 0,\n  padding: 0,\n  position: 'absolute',\n};\n\nconst style = {\n  width: 0,\n  height: 0,\n  left: 0,\n  top: 0,\n  backgroundColor: 'transparent',\n  position: 'absolute',\n};\n\nexport default class GoogleMapMarkers extends Component {\n  /* eslint-disable react/forbid-prop-types */\n  static propTypes = {\n    geoService: PropTypes.any,\n    style: PropTypes.any,\n    distanceToMouse: PropTypes.func,\n    dispatcher: PropTypes.any,\n    onChildClick: PropTypes.func,\n    onChildMouseDown: PropTypes.func,\n    onChildMouseLeave: PropTypes.func,\n    onChildMouseEnter: PropTypes.func,\n    getHoverDistance: PropTypes.func,\n    insideMapPanes: PropTypes.bool,\n    prerender: PropTypes.bool,\n  };\n  /* eslint-enable react/forbid-prop-types */\n\n  static defaultProps = {\n    insideMapPanes: false,\n    prerender: false,\n  };\n\n  constructor(props) {\n    super(props);\n\n    this.dimensionsCache_ = {};\n    this.hoverKey_ = null;\n    this.hoverChildProps_ = null;\n    this.allowMouse_ = true;\n\n    this.state = { ...this._getState(), hoverKey: null };\n  }\n\n  componentDidMount() {\n    this.props.dispatcher.on('kON_CHANGE', this._onChangeHandler);\n    this.props.dispatcher.on(\n      'kON_MOUSE_POSITION_CHANGE',\n      this._onMouseChangeHandler\n    );\n    this.props.dispatcher.on('kON_CLICK', this._onChildClick);\n    this.props.dispatcher.on('kON_MDOWN', this._onChildMouseDown);\n  }\n\n  shouldComponentUpdate(nextProps, nextState) {\n    if (this.props.experimental === true) {\n      return (\n        !shallowEqual(this.props, nextProps) ||\n        !shallowEqual(\n          omit(this.state, ['hoverKey']),\n          omit(nextState, ['hoverKey'])\n        )\n      );\n    }\n\n    return (\n      !shallowEqual(this.props, nextProps) ||\n      !shallowEqual(this.state, nextState)\n    );\n  }\n\n  componentWillUnmount() {\n    this.props.dispatcher.removeListener('kON_CHANGE', this._onChangeHandler);\n    this.props.dispatcher.removeListener(\n      'kON_MOUSE_POSITION_CHANGE',\n      this._onMouseChangeHandler\n    );\n    this.props.dispatcher.removeListener('kON_CLICK', this._onChildClick);\n    this.props.dispatcher.removeListener('kON_MDOWN', this._onChildMouseDown);\n\n    this.dimensionsCache_ = null;\n  }\n\n  _getState = () => ({\n    children: this.props.dispatcher.getChildren(),\n    updateCounter: this.props.dispatcher.getUpdateCounter(),\n  });\n\n  _onChangeHandler = () => {\n    if (!this.dimensionsCache_) {\n      return;\n    }\n\n    const prevChildCount = (this.state.children || []).length;\n    const state = this._getState();\n\n    this.setState(\n      state,\n      () =>\n        (state.children || []).length !== prevChildCount &&\n        this._onMouseChangeHandler()\n    );\n  };\n\n  _onChildClick = () => {\n    if (this.props.onChildClick) {\n      if (this.hoverChildProps_) {\n        const hoverKey = this.hoverKey_;\n        const childProps = this.hoverChildProps_;\n        // click works only on hovered item\n        this.props.onChildClick(hoverKey, childProps);\n      }\n    }\n  };\n\n  _onChildMouseDown = () => {\n    if (this.props.onChildMouseDown) {\n      if (this.hoverChildProps_) {\n        const hoverKey = this.hoverKey_;\n        const childProps = this.hoverChildProps_;\n        // works only on hovered item\n        this.props.onChildMouseDown(hoverKey, childProps);\n      }\n    }\n  };\n\n  _onChildMouseEnter = (hoverKey, childProps) => {\n    if (!this.dimensionsCache_) {\n      return;\n    }\n\n    if (this.props.onChildMouseEnter) {\n      this.props.onChildMouseEnter(hoverKey, childProps);\n    }\n\n    this.hoverChildProps_ = childProps;\n    this.hoverKey_ = hoverKey;\n    this.setState({ hoverKey });\n  };\n\n  _onChildMouseLeave = () => {\n    if (!this.dimensionsCache_) {\n      return;\n    }\n\n    const hoverKey = this.hoverKey_;\n    const childProps = this.hoverChildProps_;\n\n    if (hoverKey !== undefined && hoverKey !== null) {\n      if (this.props.onChildMouseLeave) {\n        this.props.onChildMouseLeave(hoverKey, childProps);\n      }\n\n      this.hoverKey_ = null;\n      this.hoverChildProps_ = null;\n      this.setState({ hoverKey: null });\n    }\n  };\n\n  _onMouseAllow = (value) => {\n    if (!value) {\n      this._onChildMouseLeave();\n    }\n\n    this.allowMouse_ = value;\n  };\n\n  _onMouseChangeHandler = () => {\n    if (this.allowMouse_) {\n      this._onMouseChangeHandlerRaf();\n    }\n  };\n\n  _onMouseChangeHandlerRaf = () => {\n    if (!this.dimensionsCache_) {\n      return;\n    }\n\n    const mp = this.props.dispatcher.getMousePosition();\n\n    if (mp) {\n      const distances = [];\n      const hoverDistance = this.props.getHoverDistance();\n\n      React.Children.forEach(this.state.children, (child, childIndex) => {\n        if (!child) return;\n        // layers\n        if (\n          child.props.latLng === undefined &&\n          child.props.lat === undefined &&\n          child.props.lng === undefined\n        ) {\n          return;\n        }\n\n        const childKey =\n          child.key !== undefined && child.key !== null\n            ? child.key\n            : childIndex;\n        const dist = this.props.distanceToMouse(\n          this.dimensionsCache_[childKey],\n          mp,\n          child.props\n        );\n        if (dist < hoverDistance) {\n          distances.push({\n            key: childKey,\n            dist,\n            props: child.props,\n          });\n        }\n      });\n\n      if (distances.length) {\n        distances.sort((a, b) => a.dist - b.dist);\n        const hoverKey = distances[0].key;\n        const childProps = distances[0].props;\n\n        if (this.hoverKey_ !== hoverKey) {\n          this._onChildMouseLeave();\n\n          this._onChildMouseEnter(hoverKey, childProps);\n        }\n      } else {\n        this._onChildMouseLeave();\n      }\n    } else {\n      this._onChildMouseLeave();\n    }\n  };\n\n  _getDimensions = (key) => {\n    const childKey = key;\n    return this.dimensionsCache_[childKey];\n  };\n\n  render() {\n    const mainElementStyle = this.props.style || mainStyle;\n    this.dimensionsCache_ = {};\n\n    const markers = React.Children.map(\n      this.state.children,\n      (child, childIndex) => {\n        if (!child) return undefined;\n        if (\n          child.props.latLng === undefined &&\n          child.props.lat === undefined &&\n          child.props.lng === undefined\n        ) {\n          return React.cloneElement(child, {\n            $geoService: this.props.geoService,\n            $onMouseAllow: this._onMouseAllow,\n            $prerender: this.props.prerender,\n          });\n        }\n\n        const latLng =\n          child.props.latLng !== undefined\n            ? child.props.latLng\n            : { lat: child.props.lat, lng: child.props.lng };\n\n        const pt = this.props.insideMapPanes\n          ? this.props.geoService.fromLatLngToDivPixel(latLng)\n          : this.props.geoService.fromLatLngToCenterPixel(latLng);\n\n        const stylePtPos = {\n          left: pt.x,\n          top: pt.y,\n        };\n\n        // If the component has a southeast corner defined (either as a LatLng, or a separate\n        // lat and lng pair), set the width and height based on the distance between the northwest\n        // and the southeast corner to lock the overlay to the correct geographic bounds.\n        if (\n          child.props.seLatLng !== undefined ||\n          (child.props.seLat !== undefined && child.props.seLng !== undefined)\n        ) {\n          const seLatLng =\n            child.props.seLatLng !== undefined\n              ? child.props.seLatLng\n              : { lat: child.props.seLat, lng: child.props.seLng };\n\n          const sePt = this.props.insideMapPanes\n            ? this.props.geoService.fromLatLngToDivPixel(seLatLng)\n            : this.props.geoService.fromLatLngToCenterPixel(seLatLng);\n\n          stylePtPos.width = sePt.x - pt.x;\n          stylePtPos.height = sePt.y - pt.y;\n        }\n\n        const containerPt = this.props.geoService.fromLatLngToContainerPixel(\n          latLng\n        );\n\n        // to prevent rerender on child element i need to pass\n        // const params $getDimensions and $dimensionKey instead of dimension object\n        const childKey =\n          child.key !== undefined && child.key !== null\n            ? child.key\n            : childIndex;\n\n        this.dimensionsCache_[childKey] = {\n          x: containerPt.x,\n          y: containerPt.y,\n          ...latLng,\n        };\n\n        return (\n          <div\n            key={childKey}\n            style={{ ...style, ...stylePtPos }}\n            className={child.props.$markerHolderClassName}\n          >\n            {React.cloneElement(child, {\n              $hover: childKey === this.state.hoverKey,\n              $getDimensions: this._getDimensions,\n              $dimensionKey: childKey,\n              $geoService: this.props.geoService,\n              $onMouseAllow: this._onMouseAllow,\n              $prerender: this.props.prerender,\n            })}\n          </div>\n        );\n      }\n    );\n\n    return <div style={mainElementStyle}>{markers}</div>;\n  }\n}\n","import React from 'react';\nimport GoogleMapMarkers from './google_map_markers';\n\nconst style = {\n  width: '50%',\n  height: '50%',\n  left: '50%',\n  top: '50%',\n  // backgroundColor: 'red',\n  margin: 0,\n  padding: 0,\n  position: 'absolute',\n  // opacity: 0.3\n};\n\nexport default function (props) {\n  return (\n    <div style={style}>\n      <GoogleMapMarkers {...props} prerender />\n    </div>\n  );\n}\n","import { Loader } from '@googlemaps/js-api-loader';\n\nlet loader_;\nlet loadPromise_;\nlet resolveCustomPromise_;\n\nconst _customPromise = new Promise((resolve) => {\n  resolveCustomPromise_ = resolve;\n});\n\n// TODO add libraries language and other map options\nexport default (bootstrapURLKeys, heatmapLibrary) => {\n  // call from outside google-map-react\n  // will be as soon as loadPromise resolved\n  if (!bootstrapURLKeys) {\n    return _customPromise;\n  }\n\n  // avoid api to be loaded multiple times\n  if (loadPromise_) {\n    return loadPromise_;\n  }\n\n  if (!bootstrapURLKeys.libraries) {\n    bootstrapURLKeys.libraries = [];\n  }\n\n  const libraries = [...bootstrapURLKeys.libraries];\n\n  // note: heatmapLibrary will be deprecated on next major\n  if (heatmapLibrary) {\n    // if heatmapLibrary is present\n    // check if we need to add visualization library\n    if (libraries.length === 0 || !libraries.includes('visualization')) {\n      // if the array isEmpty or visualization is\n      // not present, push the visualization library\n      libraries.push('visualization');\n    }\n    console.warn(\n      \"heatmapLibrary will be deprecated in the future. Please use { libraries: ['visualization'] } in bootstrapURLKeys property instead\"\n    );\n  }\n\n  if (process.env.NODE_ENV !== 'production') {\n    if (Object.keys(bootstrapURLKeys).indexOf('callback') > -1) {\n      const message = `\"callback\" key in bootstrapURLKeys is not allowed,\n                      use onGoogleApiLoaded property instead`;\n      // eslint-disable-next-line no-console\n      console.error(message);\n      throw new Error(message);\n    }\n  }\n\n  if (typeof window === 'undefined') {\n    throw new Error('google map cannot be loaded outside browser env');\n  }\n\n  const { key, ...restKeys } = bootstrapURLKeys;\n\n  // use single instance of Loader to avoid multiple api loads\n  if (!loader_) {\n    loader_ = new Loader({\n      // need to keep key as a prop for backwards compatibility\n      apiKey: key || '',\n      ...restKeys,\n      libraries,\n    });\n  }\n\n  loadPromise_ = loader_.load().then(() => {\n    resolveCustomPromise_(window.google.maps);\n    return window.google.maps;\n  });\n\n  resolveCustomPromise_(loadPromise_);\n\n  return loadPromise_;\n};\n","/* eslint-disable import/prefer-default-export */\n\nexport function wrap(n, min, max) {\n  const d = max - min;\n  return n === max ? n : ((((n - min) % d) + d) % d) + min;\n}\n","import { wrap } from './wrap';\n\nexport default class LatLng {\n  static convert = (a) => {\n    if (a instanceof LatLng) {\n      return a;\n    }\n\n    if (Array.isArray(a)) {\n      return new LatLng(a[0], a[1]);\n    }\n\n    if ('lng' in a && 'lat' in a) {\n      return new LatLng(a.lat, a.lng);\n    }\n\n    return a;\n  };\n\n  constructor(lat, lng) {\n    if (isNaN(lat) || isNaN(lng)) {\n      throw new Error(`Invalid LatLng object: (${lat}, ${lng})`);\n    }\n    this.lat = +lat;\n    this.lng = +lng;\n  }\n\n  wrap() {\n    return new LatLng(this.lat, wrap(this.lng, -180, 180));\n  }\n}\n","/* eslint-disable class-methods-use-this */\nimport Point from '@mapbox/point-geometry';\nimport LatLng from './lat_lng';\nimport { wrap } from './wrap';\n\n// A single transform, generally used for a single tile to be scaled, rotated, and zoomed.\nexport default class Transform {\n  constructor(tileSize, minZoom, maxZoom) {\n    this.tileSize = tileSize || 512; // constant\n\n    this._minZoom = minZoom || 0;\n    this._maxZoom = maxZoom || 52;\n\n    this.latRange = [-85.05113, 85.05113];\n\n    this.width = 0;\n    this.height = 0;\n    this.zoom = 0;\n    this.center = new LatLng(0, 0);\n    this.angle = 0;\n  }\n\n  get minZoom() {\n    return this._minZoom;\n  }\n\n  set minZoom(zoom) {\n    this._minZoom = zoom;\n    this.zoom = Math.max(this.zoom, zoom);\n  }\n\n  get maxZoom() {\n    return this._maxZoom;\n  }\n\n  set maxZoom(zoom) {\n    this._maxZoom = zoom;\n    this.zoom = Math.min(this.zoom, zoom);\n  }\n\n  get worldSize() {\n    return this.tileSize * this.scale;\n  }\n\n  get centerPoint() {\n    return new Point(0, 0); // this.size._div(2);\n  }\n\n  get size() {\n    return new Point(this.width, this.height);\n  }\n\n  get bearing() {\n    return (-this.angle / Math.PI) * 180;\n  }\n\n  set bearing(bearing) {\n    this.angle = (-wrap(bearing, -180, 180) * Math.PI) / 180;\n  }\n\n  get zoom() {\n    return this._zoom;\n  }\n\n  set zoom(zoom) {\n    const zoomV = Math.min(Math.max(zoom, this.minZoom), this.maxZoom);\n    this._zoom = zoomV;\n    this.scale = this.zoomScale(zoomV);\n    this.tileZoom = Math.floor(zoomV);\n    this.zoomFraction = zoomV - this.tileZoom;\n  }\n\n  zoomScale(zoom) {\n    return Math.pow(2, zoom);\n  }\n\n  scaleZoom(scale) {\n    return Math.log(scale) / Math.LN2;\n  }\n\n  project(latlng, worldSize) {\n    return new Point(\n      this.lngX(latlng.lng, worldSize),\n      this.latY(latlng.lat, worldSize)\n    );\n  }\n\n  unproject(point, worldSize) {\n    return new LatLng(\n      this.yLat(point.y, worldSize),\n      this.xLng(point.x, worldSize)\n    );\n  }\n\n  get x() {\n    return this.lngX(this.center.lng);\n  }\n\n  get y() {\n    return this.latY(this.center.lat);\n  }\n\n  get point() {\n    return new Point(this.x, this.y);\n  }\n\n  // lat/lon <-> absolute pixel coords convertion\n  lngX(lon, worldSize) {\n    return ((180 + lon) * (worldSize || this.worldSize)) / 360;\n  }\n\n  // latitude to absolute y coord\n  latY(lat, worldSize) {\n    const y =\n      (180 / Math.PI) * Math.log(Math.tan(Math.PI / 4 + (lat * Math.PI) / 360));\n    return ((180 - y) * (worldSize || this.worldSize)) / 360;\n  }\n\n  xLng(x, worldSize) {\n    return (x * 360) / (worldSize || this.worldSize) - 180;\n  }\n\n  yLat(y, worldSize) {\n    const y2 = 180 - (y * 360) / (worldSize || this.worldSize);\n    return (360 / Math.PI) * Math.atan(Math.exp((y2 * Math.PI) / 180)) - 90;\n  }\n\n  locationPoint(latlng) {\n    const p = this.project(latlng);\n    return this.centerPoint._sub(this.point._sub(p)._rotate(this.angle));\n  }\n\n  pointLocation(p) {\n    const p2 = this.centerPoint._sub(p)._rotate(-this.angle);\n    return this.unproject(this.point.sub(p2));\n  }\n}\n","import Point from '@mapbox/point-geometry';\n\nimport LatLng from './lat_lng';\nimport Transform from './transform';\n\nexport default class Geo {\n  constructor(tileSize) {\n    // left_top view пользует гугл\n    // super();\n    this.hasSize_ = false;\n    this.hasView_ = false;\n    this.transform_ = new Transform(tileSize || 512);\n  }\n\n  setView(center, zoom, bearing) {\n    this.transform_.center = LatLng.convert(center);\n    this.transform_.zoom = +zoom;\n    this.transform_.bearing = +bearing;\n    this.hasView_ = true;\n  }\n\n  setViewSize(width, height) {\n    this.transform_.width = width;\n    this.transform_.height = height;\n    this.hasSize_ = true;\n  }\n\n  setMapCanvasProjection(maps, mapCanvasProjection) {\n    this.maps_ = maps;\n    this.mapCanvasProjection_ = mapCanvasProjection;\n  }\n\n  canProject() {\n    return this.hasSize_ && this.hasView_;\n  }\n\n  hasSize() {\n    return this.hasSize_;\n  }\n\n  /** Returns the pixel position relative to the map center. */\n  fromLatLngToCenterPixel(ptLatLng) {\n    return this.transform_.locationPoint(LatLng.convert(ptLatLng));\n  }\n\n  /**\n   * Returns the pixel position relative to the map panes,\n   * or relative to the map center if there are no panes.\n   */\n  fromLatLngToDivPixel(ptLatLng) {\n    if (this.mapCanvasProjection_) {\n      const latLng = new this.maps_.LatLng(ptLatLng.lat, ptLatLng.lng);\n      return this.mapCanvasProjection_.fromLatLngToDivPixel(latLng);\n    }\n    return this.fromLatLngToCenterPixel(ptLatLng);\n  }\n\n  /** Returns the pixel position relative to the map top-left. */\n  fromLatLngToContainerPixel(ptLatLng) {\n    if (this.mapCanvasProjection_) {\n      const latLng = new this.maps_.LatLng(ptLatLng.lat, ptLatLng.lng);\n      return this.mapCanvasProjection_.fromLatLngToContainerPixel(latLng);\n    }\n\n    const pt = this.fromLatLngToCenterPixel(ptLatLng);\n    pt.x -=\n      this.transform_.worldSize * Math.round(pt.x / this.transform_.worldSize);\n\n    pt.x += this.transform_.width / 2;\n    pt.y += this.transform_.height / 2;\n\n    return pt;\n  }\n\n  /** Returns the LatLng for the given offset from the map top-left. */\n  fromContainerPixelToLatLng(ptXY) {\n    if (this.mapCanvasProjection_) {\n      const latLng = this.mapCanvasProjection_.fromContainerPixelToLatLng(ptXY);\n      return { lat: latLng.lat(), lng: latLng.lng() };\n    }\n\n    const ptxy = { ...ptXY };\n    ptxy.x -= this.transform_.width / 2;\n    ptxy.y -= this.transform_.height / 2;\n    const ptRes = this.transform_.pointLocation(Point.convert(ptxy));\n\n    ptRes.lng -= 360 * Math.round(ptRes.lng / 360); // convert 2 google format\n    return ptRes;\n  }\n\n  getWidth() {\n    return this.transform_.width;\n  }\n\n  getHeight() {\n    return this.transform_.height;\n  }\n\n  getZoom() {\n    return this.transform_.zoom;\n  }\n\n  getCenter() {\n    const ptRes = this.transform_.pointLocation({ x: 0, y: 0 });\n\n    return ptRes;\n  }\n\n  getBounds(margins, roundFactor) {\n    const bndT = (margins && margins[0]) || 0;\n    const bndR = (margins && margins[1]) || 0;\n    const bndB = (margins && margins[2]) || 0;\n    const bndL = (margins && margins[3]) || 0;\n\n    if (\n      this.getWidth() - bndR - bndL > 0 &&\n      this.getHeight() - bndT - bndB > 0\n    ) {\n      const topLeftCorner = this.transform_.pointLocation(\n        Point.convert({\n          x: bndL - this.getWidth() / 2,\n          y: bndT - this.getHeight() / 2,\n        })\n      );\n      const bottomRightCorner = this.transform_.pointLocation(\n        Point.convert({\n          x: this.getWidth() / 2 - bndR,\n          y: this.getHeight() / 2 - bndB,\n        })\n      );\n\n      let res = [\n        topLeftCorner.lat,\n        topLeftCorner.lng, // NW\n        bottomRightCorner.lat,\n        bottomRightCorner.lng, // SE\n        bottomRightCorner.lat,\n        topLeftCorner.lng, // SW\n        topLeftCorner.lat,\n        bottomRightCorner.lng, // NE\n      ];\n\n      if (roundFactor) {\n        res = res.map((r) => Math.round(r * roundFactor) / roundFactor);\n      }\n      return res;\n    }\n\n    return [0, 0, 0, 0];\n  }\n}\n","export default function raf(callback) {\n  if (window.requestAnimationFrame) {\n    return window.requestAnimationFrame(callback);\n  }\n\n  const nativeRaf =\n    window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n\n  return nativeRaf\n    ? nativeRaf(callback)\n    : window.setTimeout(callback, 1e3 / 60);\n}\n","const log2 = Math.log2 ? Math.log2 : (x) => Math.log(x) / Math.LN2;\n\nexport default log2;\n","// source taken from https://github.com/rackt/redux/blob/master/src/utils/pick.js\n\nexport default function pick(obj, fn) {\n  return Object.keys(obj).reduce((result, key) => {\n    if (fn(obj[key])) {\n        result[key] = obj[key]; // eslint-disable-line\n    }\n    return result;\n  }, {});\n}\n","const isEmpty = (val) => {\n  // check for empty object {}, array []\n  if (val !== null && typeof val === 'object') {\n    if (Object.keys(val).length === 0) {\n      return true;\n    }\n  } else if (val === null || val === undefined || val === '') {\n    // check for undefined, null and \"\"\n    return true;\n  }\n  return false;\n};\n\nexport default isEmpty;\n","function isObjectLike(value) {\n  return !!value && typeof value === 'object';\n}\n\nconst objectToString = Object.prototype.toString;\n\nexport default function isNumber(value) {\n  const numberTag = '[object Number]';\n  return (\n    typeof value === 'number' ||\n    (isObjectLike(value) && objectToString.call(value) === numberTag)\n  );\n}\n","// http://stackoverflow.com/questions/5899783/detect-safari-chrome-ie-firefox-opera-with-user-agent\nlet detectBrowserResult_ = null;\n\nexport default function detectBrowser() {\n  if (detectBrowserResult_) {\n    return detectBrowserResult_;\n  }\n\n  if (typeof navigator !== 'undefined') {\n    const isExplorer = navigator.userAgent.indexOf('MSIE') > -1;\n    const isFirefox = navigator.userAgent.indexOf('Firefox') > -1;\n    const isOpera = navigator.userAgent.toLowerCase().indexOf('op') > -1;\n\n    let isChrome = navigator.userAgent.indexOf('Chrome') > -1;\n    let isSafari = navigator.userAgent.indexOf('Safari') > -1;\n\n    if (isChrome && isSafari) {\n      isSafari = false;\n    }\n\n    if (isChrome && isOpera) {\n      isChrome = false;\n    }\n\n    detectBrowserResult_ = {\n      isExplorer,\n      isFirefox,\n      isOpera,\n      isChrome,\n      isSafari,\n    };\n    return detectBrowserResult_;\n  }\n\n  detectBrowserResult_ = {\n    isChrome: true,\n    isExplorer: false,\n    isFirefox: false,\n    isOpera: false,\n    isSafari: false,\n  };\n\n  return detectBrowserResult_;\n}\n","// source taken from https://github.com/rackt/redux/blob/master/src/utils/isPlainObject.js\nconst fnToString = (fn) => Function.prototype.toString.call(fn);\n\n/**\n * @param {any} obj The object to inspect.\n * @returns {boolean} True if the argument appears to be a plain object.\n */\nexport default function isPlainObject(obj) {\n  if (!obj || typeof obj !== 'object') {\n    return false;\n  }\n\n  const proto =\n    typeof obj.constructor === 'function'\n      ? Object.getPrototypeOf(obj)\n      : Object.prototype;\n\n  if (proto === null) {\n    return true;\n  }\n\n  const constructor = proto.constructor;\n\n  return (\n    typeof constructor === 'function' &&\n    constructor instanceof constructor &&\n    fnToString(constructor) === fnToString(Object)\n  );\n}\n","// feature detection for passive support\n// see: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\nfunction hasPassiveSupport() {\n  let passiveSupported = false;\n\n  try {\n    const options = Object.defineProperty({}, 'passive', {\n      get() {\n        passiveSupported = true;\n      },\n    });\n\n    window.addEventListener('test', options, options);\n    window.removeEventListener('test', options, options);\n  } catch (err) {\n    passiveSupported = false;\n  }\n\n  return passiveSupported;\n}\n\nexport default function addPassiveEventListener(\n  element,\n  eventName,\n  func,\n  capture\n) {\n  element.addEventListener(\n    eventName,\n    func,\n    hasPassiveSupport()\n      ? {\n          capture,\n          passive: true,\n        }\n      : capture\n  );\n}\n","/* eslint-disable */\n/**\n* Detect Element Resize.\n* Forked in order to guard against unsafe 'window' and 'document' references.\n*\n* https://github.com/sdecima/javascript-detect-element-resize\n* Sebastian Decima\n*\n* version: 0.5.3\n**/\n\nimport addPassiveEventListener from './passiveEvents';\n\n// Reliable `window` and `document` detection\nvar canUseDOM = !!(typeof window !== 'undefined' &&\n  window.document &&\n  window.document.createElement);\n\n// Check `document` and `window` in case of server-side rendering\nvar _window;\nif (canUseDOM) {\n  _window = window;\n} else if (typeof self !== 'undefined') {\n  _window = self;\n} else {\n  _window = this;\n}\n\nvar attachEvent = typeof document !== 'undefined' && document.attachEvent;\nvar stylesCreated = false;\n\nif (canUseDOM && !attachEvent) {\n  var requestFrame = (function () {\n    var raf = _window.requestAnimationFrame ||\n      _window.mozRequestAnimationFrame ||\n      _window.webkitRequestAnimationFrame ||\n      function (fn) {\n        return _window.setTimeout(fn, 20);\n      };\n    return function (fn) {\n      return raf(fn);\n    };\n  })();\n\n  var cancelFrame = (function () {\n    var cancel = _window.cancelAnimationFrame ||\n      _window.mozCancelAnimationFrame ||\n      _window.webkitCancelAnimationFrame ||\n      _window.clearTimeout;\n    return function (id) {\n      return cancel(id);\n    };\n  })();\n\n  var resetTriggers = function (element) {\n    var triggers = element.__resizeTriggers__,\n      expand = triggers.firstElementChild,\n      contract = triggers.lastElementChild,\n      expandChild = expand.firstElementChild;\n    contract.scrollLeft = contract.scrollWidth;\n    contract.scrollTop = contract.scrollHeight;\n    expandChild.style.width = expand.offsetWidth + 1 + 'px';\n    expandChild.style.height = expand.offsetHeight + 1 + 'px';\n    expand.scrollLeft = expand.scrollWidth;\n    expand.scrollTop = expand.scrollHeight;\n  };\n\n  var checkTriggers = function (element) {\n    return element.offsetWidth != element.__resizeLast__.width ||\n      element.offsetHeight != element.__resizeLast__.height;\n  };\n\n  var scrollListener = function (e) {\n    var element = this;\n    resetTriggers(this);\n    if (this.__resizeRAF__) cancelFrame(this.__resizeRAF__);\n    this.__resizeRAF__ = requestFrame(function () {\n      if (checkTriggers(element)) {\n        element.__resizeLast__.width = element.offsetWidth;\n        element.__resizeLast__.height = element.offsetHeight;\n        element.__resizeListeners__.forEach(function (fn) {\n          fn.call(element, e);\n        });\n      }\n    });\n  };\n\n  /* Detect CSS Animations support to detect element display/re-attach */\n  var animation = false,\n    animationstring = 'animation',\n    keyframeprefix = '',\n    animationstartevent = 'animationstart',\n    domPrefixes = 'Webkit Moz O ms'.split(' '),\n    startEvents = 'webkitAnimationStart animationstart oAnimationStart MSAnimationStart'.split(\n      ' '\n    ),\n    pfx = '';\n\n  if (canUseDOM) {\n    var elm = document.createElement('fakeelement');\n    if (elm.style.animationName !== undefined) {\n      animation = true;\n    }\n\n    if (animation === false) {\n      for (var i = 0; i < domPrefixes.length; i++) {\n        if (elm.style[domPrefixes[i] + 'AnimationName'] !== undefined) {\n          pfx = domPrefixes[i];\n          animationstring = pfx + 'Animation';\n          keyframeprefix = '-' + pfx.toLowerCase() + '-';\n          animationstartevent = startEvents[i];\n          animation = true;\n          break;\n        }\n      }\n    }\n  }\n\n  var animationName = 'resizeanim';\n  var animationKeyframes = '@' +\n    keyframeprefix +\n    'keyframes ' +\n    animationName +\n    ' { from { opacity: 0; } to { opacity: 0; } } ';\n  var animationStyle = keyframeprefix +\n    'animation: 1ms ' +\n    animationName +\n    '; ';\n}\n\nvar createStyles = function () {\n  if (!stylesCreated) {\n    //opacity:0 works around a chrome bug https://code.google.com/p/chromium/issues/detail?id=286360\n    var css = (animationKeyframes ? animationKeyframes : '') +\n      '.resize-triggers { ' +\n      (animationStyle ? animationStyle : '') +\n      'visibility: hidden; opacity: 0; } ' +\n      '.resize-triggers, .resize-triggers > div, .contract-trigger:before { content: \" \"; display: block; position: absolute; top: 0; left: 0; height: 100%; width: 100%; overflow: hidden; } .resize-triggers > div { background: #eee; overflow: auto; } .contract-trigger:before { width: 200%; height: 200%; }',\n      head = document.head || document.getElementsByTagName('head')[0],\n      style = document.createElement('style');\n\n    style.type = 'text/css';\n    if (style.styleSheet) {\n      style.styleSheet.cssText = css;\n    } else {\n      style.appendChild(document.createTextNode(css));\n    }\n\n    head.appendChild(style);\n    stylesCreated = true;\n  }\n};\n\nvar addResizeListener = function (element, fn) {\n  if (element.parentNode === undefined) {\n    var tempParentDiv = document.createElement('div');\n    element.parentNode = tempParentDiv;\n  }\n  element = element.parentNode;\n  if (attachEvent)\n    element.attachEvent('onresize', fn);\n  else {\n    if (!element.__resizeTriggers__) {\n      if (getComputedStyle(element).position == 'static')\n        element.style.position = 'relative';\n      createStyles();\n      element.__resizeLast__ = {};\n      element.__resizeListeners__ = [];\n      (element.__resizeTriggers__ = document.createElement(\n        'div'\n      )).className = 'resize-triggers';\n      element.__resizeTriggers__.innerHTML = '<div class=\"expand-trigger\"><div></div></div>' +\n        '<div class=\"contract-trigger\"></div>';\n      element.appendChild(element.__resizeTriggers__);\n      resetTriggers(element);\n\n      addPassiveEventListener(element, 'scroll', scrollListener, true);\n\n      /* Listen for a css animation to detect element display/re-attach */\n      animationstartevent &&\n        element.__resizeTriggers__.addEventListener(\n          animationstartevent,\n          function (e) {\n            if (e.animationName == animationName) resetTriggers(element);\n          }\n        );\n    }\n    element.__resizeListeners__.push(fn);\n  }\n};\n\nvar removeResizeListener = function (element, fn) {\n  element = element.parentNode;\n  if (attachEvent)\n    element.detachEvent('onresize', fn);\n  else {\n    element.__resizeListeners__.splice(\n      element.__resizeListeners__.indexOf(fn),\n      1\n    );\n    if (!element.__resizeListeners__.length) {\n      element.removeEventListener('scroll', scrollListener);\n      element.__resizeTriggers__ = !element.removeChild(\n        element.__resizeTriggers__\n      );\n    }\n  }\n};\n\nexport {\n  addResizeListener,\n  removeResizeListener,\n};\n","/* eslint-disable import/no-extraneous-dependencies, react/forbid-prop-types, react/no-find-dom-node, no-console, no-undef */\nimport React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\n\n// helpers\nimport GoogleMapMap from './google_map_map';\nimport MarkerDispatcher from './marker_dispatcher';\nimport GoogleMapMarkers from './google_map_markers';\nimport GoogleMapMarkersPrerender from './google_map_markers_prerender';\nimport { generateHeatmap, optionsHeatmap } from './google_heatmap';\n\n// loaders\nimport googleMapLoader from './loaders/google_map_loader';\n\n// lib\nimport Geo from './lib/geo';\n\n// tools\nimport raf from './utils/raf';\nimport log2 from './utils/log2';\nimport omit from './utils/omit';\nimport pick from './utils/pick';\nimport isEmpty from './utils/isEmpty';\nimport isNumber from './utils/isNumber';\nimport detectBrowser from './utils/detect';\nimport shallowEqual from './utils/shallowEqual';\nimport isPlainObject from './utils/isPlainObject';\nimport isArraysEqualEps from './utils/isArraysEqualEps';\nimport {\n  addResizeListener,\n  removeResizeListener,\n} from './utils/detectElementResize';\nimport addPassiveEventListener from './utils/passiveEvents';\n\n// consts\nconst kEPS = 0.00001;\nconst K_GOOGLE_TILE_SIZE = 256;\n// real minZoom calculated here _getMinZoom\nconst K_IDLE_TIMEOUT = 100;\nconst K_IDLE_CLICK_TIMEOUT = 300;\nconst DEFAULT_MIN_ZOOM = 3;\n// Starting with version 3.32, the maps API calls `draw()` each frame during\n// a zoom animation.\nconst DRAW_CALLED_DURING_ANIMATION_VERSION = 32;\nconst IS_REACT_16 = ReactDOM.createPortal !== undefined;\n\nconst createPortal = IS_REACT_16\n  ? ReactDOM.createPortal\n  : ReactDOM.unstable_renderSubtreeIntoContainer;\n\nfunction defaultOptions_(/* maps */) {\n  return {\n    overviewMapControl: false,\n    streetViewControl: false,\n    rotateControl: true,\n    mapTypeControl: false,\n    // disable poi\n    styles: [\n      {\n        featureType: 'poi',\n        elementType: 'labels',\n        stylers: [{ visibility: 'off' }],\n      },\n    ],\n    minZoom: DEFAULT_MIN_ZOOM, // dynamically recalculted if possible during init\n  };\n}\n\nconst latLng2Obj = (latLng) =>\n  isPlainObject(latLng) ? latLng : { lat: latLng[0], lng: latLng[1] };\n\nconst _checkMinZoom = (zoom, minZoom) => {\n  if (process.env.NODE_ENV !== 'production') {\n    if (zoom < minZoom) {\n      console.warn(\n        'GoogleMap: ' + // eslint-disable-line\n          'minZoom option is less than recommended ' +\n          'minZoom option for your map sizes.\\n' +\n          'overrided to value ' +\n          minZoom\n      );\n    }\n  }\n\n  if (minZoom < zoom) {\n    return zoom;\n  }\n  return minZoom;\n};\n\nconst isFullScreen = () =>\n  document.fullscreen ||\n  document.webkitIsFullScreen ||\n  document.mozFullScreen ||\n  document.msFullscreenElement;\n\nclass GoogleMap extends Component {\n  static propTypes = {\n    apiKey: PropTypes.string,\n    bootstrapURLKeys: PropTypes.any,\n\n    defaultCenter: PropTypes.oneOfType([\n      PropTypes.array,\n      PropTypes.shape({\n        lat: PropTypes.number,\n        lng: PropTypes.number,\n      }),\n    ]),\n    center: PropTypes.oneOfType([\n      PropTypes.array,\n      PropTypes.shape({\n        lat: PropTypes.number,\n        lng: PropTypes.number,\n      }),\n    ]),\n    defaultZoom: PropTypes.number,\n    zoom: PropTypes.number,\n    onBoundsChange: PropTypes.func,\n    onChange: PropTypes.func,\n    onClick: PropTypes.func,\n    onChildClick: PropTypes.func,\n    onChildMouseDown: PropTypes.func,\n    onChildMouseUp: PropTypes.func,\n    onChildMouseMove: PropTypes.func,\n    onChildMouseEnter: PropTypes.func,\n    onChildMouseLeave: PropTypes.func,\n    onZoomAnimationStart: PropTypes.func,\n    onZoomAnimationEnd: PropTypes.func,\n    onDrag: PropTypes.func,\n    onDragEnd: PropTypes.func,\n    onMapTypeIdChange: PropTypes.func,\n    onTilesLoaded: PropTypes.func,\n    options: PropTypes.any,\n    distanceToMouse: PropTypes.func,\n    hoverDistance: PropTypes.number,\n    debounced: PropTypes.bool,\n    margin: PropTypes.array,\n    googleMapLoader: PropTypes.any,\n    onGoogleApiLoaded: PropTypes.func,\n    yesIWantToUseGoogleMapApiInternals: PropTypes.bool,\n    draggable: PropTypes.bool,\n    style: PropTypes.any,\n    resetBoundsOnResize: PropTypes.bool,\n    layerTypes: PropTypes.arrayOf(PropTypes.string), // ['TransitLayer', 'TrafficLayer']\n    shouldUnregisterMapOnUnmount: PropTypes.bool,\n  };\n\n  static defaultProps = {\n    distanceToMouse(pt, mousePos /* , markerProps */) {\n      return Math.sqrt(\n        (pt.x - mousePos.x) * (pt.x - mousePos.x) +\n          (pt.y - mousePos.y) * (pt.y - mousePos.y)\n      );\n    },\n    hoverDistance: 30,\n    debounced: true,\n    options: defaultOptions_,\n    googleMapLoader,\n    yesIWantToUseGoogleMapApiInternals: false,\n    style: {\n      width: '100%',\n      height: '100%',\n      margin: 0,\n      padding: 0,\n      position: 'relative',\n    },\n    layerTypes: [],\n    heatmap: {},\n    heatmapLibrary: false,\n    shouldUnregisterMapOnUnmount: true,\n  };\n\n  static googleMapLoader = googleMapLoader; // eslint-disable-line\n\n  constructor(props) {\n    super(props);\n    this.mounted_ = false;\n    this.initialized_ = false;\n    this.googleApiLoadedCalled_ = false;\n\n    this.map_ = null;\n    this.maps_ = null;\n    this.prevBounds_ = null;\n    this.heatmap = null;\n\n    this.layers_ = {};\n\n    this.mouse_ = null;\n    this.mouseMoveTime_ = 0;\n    this.boundingRect_ = null;\n    this.mouseInMap_ = true;\n\n    this.dragTime_ = 0;\n    this.fireMouseEventOnIdle_ = false;\n    this.updateCounter_ = 0;\n\n    this.markersDispatcher_ = new MarkerDispatcher(this);\n    this.geoService_ = new Geo(K_GOOGLE_TILE_SIZE);\n    this.centerIsObject_ = isPlainObject(this.props.center);\n\n    this.minZoom_ = DEFAULT_MIN_ZOOM;\n    this.defaultDraggableOption_ = true;\n\n    this.zoomControlClickTime_ = 0;\n\n    this.childMouseDownArgs_ = null;\n    this.childMouseUpTime_ = 0;\n\n    this.googleMapDom_ = null;\n\n    if (process.env.NODE_ENV !== 'production') {\n      if (this.props.apiKey) {\n        console.warn(\n          'GoogleMap: ' + // eslint-disable-line no-console\n            'apiKey is deprecated, use ' +\n            'bootstrapURLKeys={{key: YOUR_API_KEY}} instead.'\n        );\n      }\n\n      if (this.props.onBoundsChange) {\n        console.warn(\n          'GoogleMap: ' + // eslint-disable-line no-console\n            'onBoundsChange is deprecated, use ' +\n            'onChange({center, zoom, bounds, ...other}) instead.'\n        );\n      }\n\n      if (isEmpty(this.props.center) && isEmpty(this.props.defaultCenter)) {\n        console.warn(\n          'GoogleMap: center or defaultCenter property must be defined' // eslint-disable-line no-console\n        );\n      }\n\n      if (isEmpty(this.props.zoom) && isEmpty(this.props.defaultZoom)) {\n        console.warn(\n          'GoogleMap: zoom or defaultZoom property must be defined' // eslint-disable-line no-console\n        );\n      }\n    }\n\n    if (this._isCenterDefined(this.props.center || this.props.defaultCenter)) {\n      const propsCenter = latLng2Obj(\n        this.props.center || this.props.defaultCenter\n      );\n      this.geoService_.setView(\n        propsCenter,\n        this.props.zoom || this.props.defaultZoom,\n        0\n      );\n    }\n\n    this.zoomAnimationInProgress_ = false;\n\n    this.state = {\n      overlay: null,\n    };\n  }\n\n  componentDidMount() {\n    this.mounted_ = true;\n    addPassiveEventListener(window, 'resize', this._onWindowResize, false);\n    addPassiveEventListener(window, 'keydown', this._onKeyDownCapture, true);\n    const mapDom = ReactDOM.findDOMNode(this.googleMapDom_);\n    // gmap can't prevent map drag if mousedown event already occured\n    // the only workaround I find is prevent mousedown native browser event\n\n    if (mapDom) {\n      addPassiveEventListener(\n        mapDom,\n        'mousedown',\n        this._onMapMouseDownNative,\n        true\n      );\n    }\n\n    addPassiveEventListener(window, 'mouseup', this._onChildMouseUp, false);\n    const bootstrapURLKeys = {\n      ...(this.props.apiKey && { key: this.props.apiKey }),\n      ...this.props.bootstrapURLKeys,\n    };\n\n    this.props.googleMapLoader(bootstrapURLKeys, this.props.heatmapLibrary); // we can start load immediatly\n\n    setTimeout(\n      () => {\n        // to detect size\n        this._setViewSize();\n        if (\n          this._isCenterDefined(this.props.center || this.props.defaultCenter)\n        ) {\n          this._initMap();\n        }\n      },\n      0,\n      this\n    );\n    if (this.props.resetBoundsOnResize) {\n      const that = this;\n      addResizeListener(mapDom, that._mapDomResizeCallback);\n    }\n  }\n\n  shouldComponentUpdate(nextProps, nextState) {\n    // draggable does not affect inner components\n    return (\n      !shallowEqual(\n        omit(this.props, ['draggable']),\n        omit(nextProps, ['draggable'])\n      ) || !shallowEqual(this.state, nextState)\n    );\n  }\n\n  componentDidUpdate(prevProps) {\n    if (process.env.NODE_ENV !== 'production') {\n      if (!shallowEqual(prevProps.defaultCenter, this.props.defaultCenter)) {\n        console.warn(\n          \"GoogleMap: defaultCenter prop changed. You can't change default props.\"\n        );\n      }\n\n      if (!shallowEqual(prevProps.defaultZoom, this.props.defaultZoom)) {\n        console.warn(\n          \"GoogleMap: defaultZoom prop changed. You can't change default props.\"\n        );\n      }\n    }\n\n    if (\n      !this._isCenterDefined(prevProps.center) &&\n      this._isCenterDefined(this.props.center)\n    ) {\n      setTimeout(() => this._initMap(), 0);\n    }\n\n    if (this.map_) {\n      const centerLatLng = this.geoService_.getCenter();\n      if (this._isCenterDefined(this.props.center)) {\n        const currentCenter = latLng2Obj(this.props.center);\n        const prevCenter = this._isCenterDefined(prevProps.center)\n          ? latLng2Obj(prevProps.center)\n          : null;\n\n        if (\n          !prevCenter ||\n          Math.abs(currentCenter.lat - prevCenter.lat) +\n            Math.abs(currentCenter.lng - prevCenter.lng) >\n            kEPS\n        ) {\n          if (\n            Math.abs(currentCenter.lat - centerLatLng.lat) +\n              Math.abs(currentCenter.lng - centerLatLng.lng) >\n            kEPS\n          ) {\n            this.map_.panTo({\n              lat: currentCenter.lat,\n              lng: currentCenter.lng,\n            });\n          }\n        }\n      }\n\n      if (!isEmpty(this.props.zoom)) {\n        // if zoom chaged by user\n        if (Math.abs(this.props.zoom - prevProps.zoom) > 0) {\n          this.map_.setZoom(this.props.zoom);\n        }\n      }\n\n      if (!isEmpty(prevProps.draggable) && isEmpty(this.props.draggable)) {\n        // reset to default\n        this.map_.setOptions({ draggable: this.defaultDraggableOption_ });\n      } else if (!shallowEqual(prevProps.draggable, this.props.draggable)) {\n        // also prevent this on window 'mousedown' event to prevent map move\n        this.map_.setOptions({ draggable: this.props.draggable });\n      }\n\n      // use shallowEqual to try avoid calling map._setOptions if only the ref changes\n      if (\n        !isEmpty(this.props.options) &&\n        !shallowEqual(prevProps.options, this.props.options)\n      ) {\n        const mapPlainObjects = pick(this.maps_, isPlainObject);\n        let options =\n          typeof this.props.options === 'function'\n            ? this.props.options(mapPlainObjects)\n            : this.props.options;\n        // remove zoom, center and draggable options as these are managed by google-maps-react\n        options = omit(options, ['zoom', 'center', 'draggable']);\n\n        if ('minZoom' in options) {\n          const minZoom = this._computeMinZoom(options.minZoom);\n          options.minZoom = _checkMinZoom(options.minZoom, minZoom);\n        }\n\n        this.map_.setOptions(options);\n      }\n\n      if (!shallowEqual(this.props.layerTypes, prevProps.layerTypes)) {\n        Object.keys(this.layers_).forEach((layerKey) => {\n          this.layers_[layerKey].setMap(null);\n          delete this.layers_[layerKey];\n        });\n        this._setLayers(this.props.layerTypes);\n      }\n\n      if (\n        this.heatmap &&\n        !shallowEqual(this.props.heatmap.positions, prevProps.heatmap.positions)\n      ) {\n        this.heatmap.setData(\n          this.props.heatmap.positions.map((p) => ({\n            location: new this.maps_.LatLng(p.lat, p.lng),\n            weight: p.weight,\n          }))\n        );\n      }\n      if (\n        this.heatmap &&\n        !shallowEqual(this.props.heatmap.options, prevProps.heatmap.options)\n      ) {\n        Object.keys(this.props.heatmap.options).forEach((option) => {\n          this.heatmap.set(option, this.props.heatmap.options[option]);\n        });\n      }\n    }\n    // emit actions\n    this.markersDispatcher_.emit('kON_CHANGE');\n\n    if (!shallowEqual(this.props.hoverDistance, prevProps.hoverDistance)) {\n      this.markersDispatcher_.emit('kON_MOUSE_POSITION_CHANGE');\n    }\n  }\n\n  componentWillUnmount() {\n    this.mounted_ = false;\n    const mapDom = ReactDOM.findDOMNode(this.googleMapDom_);\n    if (mapDom) {\n      mapDom.removeEventListener('mousedown', this._onMapMouseDownNative, true);\n    }\n    window.removeEventListener('resize', this._onWindowResize);\n    window.removeEventListener('keydown', this._onKeyDownCapture);\n    window.removeEventListener('mouseup', this._onChildMouseUp, false);\n    if (this.props.resetBoundsOnResize) {\n      removeResizeListener(mapDom, this._mapDomResizeCallback);\n    }\n\n    if (this.overlay_) {\n      // this triggers overlay_.onRemove(), which will unmount the <GoogleMapMarkers/>\n      this.overlay_.setMap(null);\n    }\n\n    if (this.maps_ && this.map_ && this.props.shouldUnregisterMapOnUnmount) {\n      // fix google, as otherwise listeners works even without map\n      this.map_.setOptions({ scrollwheel: false });\n      this.maps_.event.clearInstanceListeners(this.map_);\n    }\n\n    if (this.props.shouldUnregisterMapOnUnmount) {\n      this.map_ = null;\n      this.maps_ = null;\n    }\n    this.markersDispatcher_.dispose();\n\n    this.resetSizeOnIdle_ = false;\n\n    if (this.props.shouldUnregisterMapOnUnmount) {\n      delete this.map_;\n      delete this.markersDispatcher_;\n    }\n  }\n\n  // calc minZoom if map size available\n  // it's better to not set minZoom less than this calculation gives\n  // otherwise there is no homeomorphism between screen coordinates and map\n  // (one map coordinate can have different screen coordinates)\n  _getMinZoom = () => {\n    if (this.geoService_.getWidth() > 0 || this.geoService_.getHeight() > 0) {\n      const tilesPerWidth =\n        Math.ceil(this.geoService_.getWidth() / K_GOOGLE_TILE_SIZE) + 2;\n      const tilesPerHeight =\n        Math.ceil(this.geoService_.getHeight() / K_GOOGLE_TILE_SIZE) + 2;\n      const maxTilesPerDim = Math.max(tilesPerWidth, tilesPerHeight);\n      return Math.ceil(log2(maxTilesPerDim));\n    }\n    return DEFAULT_MIN_ZOOM;\n  };\n\n  _computeMinZoom = (minZoom) => {\n    if (!isEmpty(minZoom)) {\n      return minZoom;\n    }\n    return this._getMinZoom();\n  };\n\n  _mapDomResizeCallback = () => {\n    this.resetSizeOnIdle_ = true;\n    if (this.maps_) {\n      const originalCenter = this.props.center || this.props.defaultCenter;\n      const currentCenter = this.map_.getCenter();\n      this.maps_.event.trigger(this.map_, 'resize');\n      this.map_.setCenter(\n        this.props.resetBoundsOnResize ? originalCenter : currentCenter\n      );\n    }\n  };\n\n  _setLayers = (layerTypes) => {\n    layerTypes.forEach((layerType) => {\n      this.layers_[layerType] = new this.maps_[layerType]();\n      this.layers_[layerType].setMap(this.map_);\n    });\n  };\n\n  _renderPortal = () => (\n    <GoogleMapMarkers\n      experimental={this.props.experimental}\n      onChildClick={this._onChildClick}\n      onChildMouseDown={this._onChildMouseDown}\n      onChildMouseEnter={this._onChildMouseEnter}\n      onChildMouseLeave={this._onChildMouseLeave}\n      geoService={this.geoService_}\n      insideMapPanes\n      distanceToMouse={this.props.distanceToMouse}\n      getHoverDistance={this._getHoverDistance}\n      dispatcher={this.markersDispatcher_}\n    />\n  );\n\n  _initMap = () => {\n    // only initialize the map once\n    if (this.initialized_) {\n      return;\n    }\n    this.initialized_ = true;\n\n    const propsCenter = latLng2Obj(\n      this.props.center || this.props.defaultCenter\n    );\n    this.geoService_.setView(\n      propsCenter,\n      this.props.zoom || this.props.defaultZoom,\n      0\n    );\n\n    this._onBoundsChanged(); // now we can calculate map bounds center etc...\n\n    const bootstrapURLKeys = {\n      ...(this.props.apiKey && { key: this.props.apiKey }),\n      ...this.props.bootstrapURLKeys,\n    };\n\n    this.props\n      .googleMapLoader(bootstrapURLKeys, this.props.heatmapLibrary)\n      .then((maps) => {\n        if (!this.mounted_) {\n          return;\n        }\n\n        const centerLatLng = this.geoService_.getCenter();\n\n        const propsOptions = {\n          zoom: this.props.zoom || this.props.defaultZoom,\n          center: new maps.LatLng(centerLatLng.lat, centerLatLng.lng),\n        };\n\n        // Start Heatmap\n        if (this.props.heatmap.positions) {\n          Object.assign(this, {\n            heatmap: generateHeatmap(maps, this.props.heatmap),\n          });\n          optionsHeatmap(this.heatmap, this.props.heatmap);\n        }\n        // End Heatmap\n\n        // prevent to exapose full api\n        // next props must be exposed (console.log(Object.keys(pick(maps, isPlainObject))))\n        // \"Animation\", \"ControlPosition\", \"MapTypeControlStyle\", \"MapTypeId\",\n        // \"NavigationControlStyle\", \"ScaleControlStyle\", \"StrokePosition\",\n        // \"SymbolPath\", \"ZoomControlStyle\",\n        // \"event\", \"DirectionsStatus\", \"DirectionsTravelMode\", \"DirectionsUnitSystem\",\n        // \"DistanceMatrixStatus\",\n        // \"DistanceMatrixElementStatus\", \"ElevationStatus\", \"GeocoderLocationType\",\n        // \"GeocoderStatus\", \"KmlLayerStatus\",\n        // \"MaxZoomStatus\", \"StreetViewStatus\", \"TransitMode\", \"TransitRoutePreference\",\n        // \"TravelMode\", \"UnitSystem\"\n        const mapPlainObjects = pick(maps, isPlainObject);\n        const options =\n          typeof this.props.options === 'function'\n            ? this.props.options(mapPlainObjects)\n            : this.props.options;\n        const defaultOptions = defaultOptions_(mapPlainObjects);\n\n        const draggableOptions = !isEmpty(this.props.draggable) && {\n          draggable: this.props.draggable,\n        };\n\n        const minZoom = this._computeMinZoom(options.minZoom);\n        this.minZoom_ = minZoom;\n\n        const preMapOptions = {\n          ...defaultOptions,\n          minZoom,\n          ...options,\n          ...propsOptions,\n        };\n\n        this.defaultDraggableOption_ = !isEmpty(preMapOptions.draggable)\n          ? preMapOptions.draggable\n          : this.defaultDraggableOption_;\n\n        const mapOptions = {\n          ...preMapOptions,\n          ...draggableOptions,\n        };\n\n        mapOptions.minZoom = _checkMinZoom(mapOptions.minZoom, minZoom);\n\n        const map = new maps.Map(\n          ReactDOM.findDOMNode(this.googleMapDom_),\n          mapOptions\n        );\n\n        this.map_ = map;\n        this.maps_ = maps;\n\n        this._setLayers(this.props.layerTypes);\n\n        // Parse `google.maps.version` to capture the major version number.\n        const versionMatch = maps.version.match(/^3\\.(\\d+)\\./);\n        // The major version is the first (and only) captured group.\n        const mapsVersion = versionMatch && Number(versionMatch[1]);\n\n        // render in overlay\n        const this_ = this;\n        const overlay = Object.assign(new maps.OverlayView(), {\n          onAdd() {\n            const K_MAX_WIDTH =\n              typeof screen !== 'undefined' ? `${screen.width}px` : '2000px';\n            const K_MAX_HEIGHT =\n              typeof screen !== 'undefined' ? `${screen.height}px` : '2000px';\n\n            const div = document.createElement('div');\n            div.style.backgroundColor = 'transparent';\n            div.style.position = 'absolute';\n            div.style.left = '0px';\n            div.style.top = '0px';\n            div.style.width = K_MAX_WIDTH; // prevents some chrome draw defects\n            div.style.height = K_MAX_HEIGHT;\n\n            if (this_.props.overlayViewDivStyle) {\n              const { overlayViewDivStyle } = this_.props;\n              if (typeof overlayViewDivStyle === 'object') {\n                Object.keys(overlayViewDivStyle).forEach((property) => {\n                  div.style[property] = overlayViewDivStyle[property];\n                });\n              }\n            }\n\n            const panes = this.getPanes();\n            panes.overlayMouseTarget.appendChild(div);\n            this_.geoService_.setMapCanvasProjection(\n              maps,\n              overlay.getProjection()\n            );\n\n            if (!IS_REACT_16) {\n              createPortal(\n                this_,\n                this_._renderPortal(),\n                div,\n                // remove prerendered markers\n                () => this_.setState({ overlay: div })\n              );\n            } else {\n              this_.setState({ overlay: div });\n            }\n          },\n\n          onRemove() {\n            const renderedOverlay = this_.state.overlay;\n            if (renderedOverlay && !IS_REACT_16) {\n              ReactDOM.unmountComponentAtNode(renderedOverlay);\n            }\n            this_.setState({ overlay: null });\n          },\n\n          draw() {\n            this_.updateCounter_++;\n            this_._onBoundsChanged(map, maps, !this_.props.debounced);\n\n            if (!this_.googleApiLoadedCalled_) {\n              this_._onGoogleApiLoaded({ map, maps, ref: this_.googleMapDom_ });\n              this_.googleApiLoadedCalled_ = true;\n            }\n\n            if (this_.mouse_) {\n              const latLng = this_.geoService_.fromContainerPixelToLatLng(\n                this_.mouse_\n              );\n              this_.mouse_.lat = latLng.lat;\n              this_.mouse_.lng = latLng.lng;\n            }\n\n            this_._onChildMouseMove();\n\n            if (this_.markersDispatcher_) {\n              this_.markersDispatcher_.emit('kON_CHANGE');\n              if (this_.fireMouseEventOnIdle_) {\n                this_.markersDispatcher_.emit('kON_MOUSE_POSITION_CHANGE');\n              }\n            }\n          },\n        });\n\n        this.overlay_ = overlay;\n\n        overlay.setMap(map);\n        if (this.props.heatmap.positions) {\n          this.heatmap.setMap(map);\n        }\n\n        if (this.props.onTilesLoaded) {\n          maps.event.addListener(map, 'tilesloaded', () => {\n            this_._onTilesLoaded();\n          });\n        }\n\n        maps.event.addListener(map, 'zoom_changed', () => {\n          // recalc position at zoom start\n          if (this_.geoService_.getZoom() !== map.getZoom()) {\n            if (!this_.zoomAnimationInProgress_) {\n              this_.zoomAnimationInProgress_ = true;\n              this_._onZoomAnimationStart(map.zoom);\n            }\n\n            // If draw() is not called each frame during a zoom animation,\n            // simulate it.\n            if (mapsVersion < DRAW_CALLED_DURING_ANIMATION_VERSION) {\n              const TIMEOUT_ZOOM = 300;\n\n              if (\n                new Date().getTime() - this.zoomControlClickTime_ <\n                TIMEOUT_ZOOM\n              ) {\n                // there is strange Google Map Api behavior in chrome when zoom animation of map\n                // is started only on second raf call, if was click on zoom control\n                // or +- keys pressed, so i wait for two rafs before change state\n\n                // this does not fully prevent animation jump\n                // but reduce it's occurence probability\n                raf(() =>\n                  raf(() => {\n                    this_.updateCounter_++;\n                    this_._onBoundsChanged(map, maps);\n                  })\n                );\n              } else {\n                this_.updateCounter_++;\n                this_._onBoundsChanged(map, maps);\n              }\n            }\n          }\n        });\n\n        maps.event.addListener(map, 'idle', () => {\n          if (this.resetSizeOnIdle_) {\n            this._setViewSize();\n            const currMinZoom = this._computeMinZoom(options.minZoom);\n\n            if (currMinZoom !== this.minZoom_) {\n              this.minZoom_ = currMinZoom;\n              map.setOptions({ minZoom: currMinZoom });\n            }\n\n            this.resetSizeOnIdle_ = false;\n          }\n\n          if (this_.zoomAnimationInProgress_) {\n            this_.zoomAnimationInProgress_ = false;\n            this_._onZoomAnimationEnd(map.zoom);\n          }\n\n          this_.updateCounter_++;\n          this_._onBoundsChanged(map, maps);\n\n          this_.dragTime_ = 0;\n\n          if (this_.markersDispatcher_) {\n            this_.markersDispatcher_.emit('kON_CHANGE');\n          }\n        });\n\n        maps.event.addListener(map, 'mouseover', () => {\n          // has advantage over div MouseLeave\n          this_.mouseInMap_ = true;\n        });\n\n        // an alternative way to know the mouse is back within the map\n        // This would not fire when clicking/interacting with google maps\n        // own on-map countrols+markers. This handles an edge case for touch devices\n        // + 'draggable:false' custom option. See #332 for more details.\n        maps.event.addListener(map, 'click', () => {\n          this_.mouseInMap_ = true;\n        });\n\n        maps.event.addListener(map, 'mouseout', () => {\n          // has advantage over div MouseLeave\n          this_.mouseInMap_ = false;\n          this_.mouse_ = null;\n          this_.markersDispatcher_.emit('kON_MOUSE_POSITION_CHANGE');\n        });\n\n        maps.event.addListener(map, 'drag', () => {\n          this_.dragTime_ = new Date().getTime();\n          this_._onDrag(map);\n        });\n\n        maps.event.addListener(map, 'dragend', () => {\n          // 'dragend' fires on mouse release.\n          // 'idle' listener waits until drag inertia ends before firing `onDragEnd`\n          const idleListener = maps.event.addListener(map, 'idle', () => {\n            maps.event.removeListener(idleListener);\n            this_._onDragEnd(map);\n          });\n        });\n        // user choosing satellite vs roads, etc\n        maps.event.addListener(map, 'maptypeid_changed', () => {\n          this_._onMapTypeIdChange(map.getMapTypeId());\n        });\n      })\n      .catch((e) => {\n        // notify callback of load failure\n        this._onGoogleApiLoaded({\n          map: null,\n          maps: null,\n          ref: this.googleMapDom_,\n        });\n        console.error(e); // eslint-disable-line no-console\n        throw e;\n      });\n  };\n\n  _onGoogleApiLoaded = (...args) => {\n    if (this.props.onGoogleApiLoaded) {\n      if (\n        process.env.NODE_ENV !== 'production' &&\n        this.props.yesIWantToUseGoogleMapApiInternals !== true\n      ) {\n        console.warn(\n          'GoogleMap: ' + // eslint-disable-line\n            'Usage of internal api objects is dangerous ' +\n            'and can cause a lot of issues.\\n' +\n            'To hide this warning add yesIWantToUseGoogleMapApiInternals={true} ' +\n            'to <GoogleMap instance'\n        );\n      }\n\n      this.props.onGoogleApiLoaded(...args);\n    }\n  };\n\n  _getHoverDistance = () => this.props.hoverDistance;\n\n  _onDrag = (...args) => this.props.onDrag && this.props.onDrag(...args);\n\n  _onDragEnd = (...args) =>\n    this.props.onDragEnd && this.props.onDragEnd(...args);\n\n  _onMapTypeIdChange = (...args) =>\n    this.props.onMapTypeIdChange && this.props.onMapTypeIdChange(...args);\n\n  _onZoomAnimationStart = (...args) =>\n    this.props.onZoomAnimationStart && this.props.onZoomAnimationStart(...args);\n\n  _onZoomAnimationEnd = (...args) =>\n    this.props.onZoomAnimationEnd && this.props.onZoomAnimationEnd(...args);\n\n  _onTilesLoaded = () => this.props.onTilesLoaded && this.props.onTilesLoaded();\n\n  _onChildClick = (...args) => {\n    if (this.props.onChildClick) {\n      return this.props.onChildClick(...args);\n    }\n    return undefined;\n  };\n\n  _onChildMouseDown = (hoverKey, childProps) => {\n    this.childMouseDownArgs_ = [hoverKey, childProps];\n    if (this.props.onChildMouseDown) {\n      this.props.onChildMouseDown(hoverKey, childProps, { ...this.mouse_ });\n    }\n  };\n\n  // this method works only if this.props.onChildMouseDown was called\n  _onChildMouseUp = () => {\n    if (this.childMouseDownArgs_) {\n      if (this.props.onChildMouseUp) {\n        this.props.onChildMouseUp(...this.childMouseDownArgs_, {\n          ...this.mouse_,\n        });\n      }\n      this.childMouseDownArgs_ = null;\n      this.childMouseUpTime_ = new Date().getTime();\n    }\n  };\n\n  // this method works only if this.props.onChildMouseDown was called\n  _onChildMouseMove = () => {\n    if (this.childMouseDownArgs_) {\n      if (this.props.onChildMouseMove) {\n        this.props.onChildMouseMove(...this.childMouseDownArgs_, {\n          ...this.mouse_,\n        });\n      }\n    }\n  };\n\n  _onChildMouseEnter = (...args) => {\n    if (this.props.onChildMouseEnter) {\n      return this.props.onChildMouseEnter(...args);\n    }\n    return undefined;\n  };\n\n  _onChildMouseLeave = (...args) => {\n    if (this.props.onChildMouseLeave) {\n      return this.props.onChildMouseLeave(...args);\n    }\n    return undefined;\n  };\n\n  _setViewSize = () => {\n    if (!this.mounted_) return;\n    if (isFullScreen()) {\n      this.geoService_.setViewSize(window.innerWidth, window.innerHeight);\n    } else {\n      const mapDom = ReactDOM.findDOMNode(this.googleMapDom_);\n      this.geoService_.setViewSize(mapDom.clientWidth, mapDom.clientHeight);\n    }\n    this._onBoundsChanged();\n  };\n\n  _onWindowResize = () => {\n    this.resetSizeOnIdle_ = true;\n  };\n\n  _onMapMouseMove = (e) => {\n    if (!this.mouseInMap_) return;\n\n    const currTime = new Date().getTime();\n    const K_RECALC_CLIENT_RECT_MS = 50;\n\n    if (currTime - this.mouseMoveTime_ > K_RECALC_CLIENT_RECT_MS) {\n      this.boundingRect_ = e.currentTarget.getBoundingClientRect();\n    }\n    this.mouseMoveTime_ = currTime;\n\n    const mousePosX = e.clientX - this.boundingRect_.left;\n    const mousePosY = e.clientY - this.boundingRect_.top;\n\n    if (!this.mouse_) {\n      this.mouse_ = { x: 0, y: 0, lat: 0, lng: 0 };\n    }\n\n    this.mouse_.x = mousePosX;\n    this.mouse_.y = mousePosY;\n\n    const latLng = this.geoService_.fromContainerPixelToLatLng(this.mouse_);\n    this.mouse_.lat = latLng.lat;\n    this.mouse_.lng = latLng.lng;\n\n    this._onChildMouseMove();\n\n    if (currTime - this.dragTime_ < K_IDLE_TIMEOUT) {\n      this.fireMouseEventOnIdle_ = true;\n    } else {\n      this.markersDispatcher_.emit('kON_MOUSE_POSITION_CHANGE');\n      this.fireMouseEventOnIdle_ = false;\n    }\n  };\n\n  // K_IDLE_CLICK_TIMEOUT - looks like 300 is enough\n  _onClick = (...args) =>\n    this.props.onClick &&\n    !this.childMouseDownArgs_ &&\n    new Date().getTime() - this.childMouseUpTime_ > K_IDLE_CLICK_TIMEOUT &&\n    this.dragTime_ === 0 &&\n    this.props.onClick(...args);\n\n  _onMapClick = (event) => {\n    if (this.markersDispatcher_) {\n      // support touch events and recalculate mouse position on click\n      this._onMapMouseMove(event);\n      const currTime = new Date().getTime();\n      if (currTime - this.dragTime_ > K_IDLE_TIMEOUT) {\n        if (this.mouse_) {\n          this._onClick({\n            ...this.mouse_,\n            event,\n          });\n        }\n\n        this.markersDispatcher_.emit('kON_CLICK', event);\n      }\n    }\n  };\n\n  // gmap can't prevent map drag if mousedown event already occured\n  // the only workaround I find is prevent mousedown native browser event\n  _onMapMouseDownNative = (event) => {\n    if (!this.mouseInMap_) return;\n\n    this._onMapMouseDown(event);\n  };\n\n  _onMapMouseDown = (event) => {\n    if (this.markersDispatcher_) {\n      const currTime = new Date().getTime();\n      if (currTime - this.dragTime_ > K_IDLE_TIMEOUT) {\n        // Hovered marker detected at mouse move could be deleted at mouse down time\n        // so it will be good to force hovered marker recalculation\n        this._onMapMouseMove(event);\n        this.markersDispatcher_.emit('kON_MDOWN', event);\n      }\n    }\n  };\n\n  _onMapMouseDownCapture = () => {\n    if (detectBrowser().isChrome) {\n      // to fix strange zoom in chrome\n      this.zoomControlClickTime_ = new Date().getTime();\n    }\n  };\n\n  _onKeyDownCapture = () => {\n    if (detectBrowser().isChrome) {\n      this.zoomControlClickTime_ = new Date().getTime();\n    }\n  };\n\n  _isCenterDefined = (center) =>\n    center &&\n    ((isPlainObject(center) && isNumber(center.lat) && isNumber(center.lng)) ||\n      (center.length === 2 && isNumber(center[0]) && isNumber(center[1])));\n\n  _onBoundsChanged = (map, maps, callExtBoundsChange) => {\n    if (map) {\n      const gmC = map.getCenter();\n      this.geoService_.setView([gmC.lat(), gmC.lng()], map.getZoom(), 0);\n    }\n\n    if (\n      (this.props.onChange || this.props.onBoundsChange) &&\n      this.geoService_.canProject()\n    ) {\n      const zoom = this.geoService_.getZoom();\n      const bounds = this.geoService_.getBounds();\n      const centerLatLng = this.geoService_.getCenter();\n\n      if (!isArraysEqualEps(bounds, this.prevBounds_, kEPS)) {\n        if (callExtBoundsChange !== false) {\n          const marginBounds = this.geoService_.getBounds(this.props.margin);\n          if (this.props.onBoundsChange) {\n            this.props.onBoundsChange(\n              this.centerIsObject_\n                ? { ...centerLatLng }\n                : [centerLatLng.lat, centerLatLng.lng],\n              zoom,\n              bounds,\n              marginBounds\n            );\n          }\n\n          if (this.props.onChange) {\n            this.props.onChange({\n              center: { ...centerLatLng },\n              zoom,\n              bounds: {\n                nw: {\n                  lat: bounds[0],\n                  lng: bounds[1],\n                },\n                se: {\n                  lat: bounds[2],\n                  lng: bounds[3],\n                },\n                sw: {\n                  lat: bounds[4],\n                  lng: bounds[5],\n                },\n                ne: {\n                  lat: bounds[6],\n                  lng: bounds[7],\n                },\n              },\n              marginBounds: {\n                nw: {\n                  lat: marginBounds[0],\n                  lng: marginBounds[1],\n                },\n                se: {\n                  lat: marginBounds[2],\n                  lng: marginBounds[3],\n                },\n                sw: {\n                  lat: marginBounds[4],\n                  lng: marginBounds[5],\n                },\n                ne: {\n                  lat: marginBounds[6],\n                  lng: marginBounds[7],\n                },\n              },\n\n              size: this.geoService_.hasSize()\n                ? {\n                    width: this.geoService_.getWidth(),\n                    height: this.geoService_.getHeight(),\n                  }\n                : {\n                    width: 0,\n                    height: 0,\n                  },\n            });\n          }\n\n          this.prevBounds_ = bounds;\n        }\n      }\n    }\n  };\n\n  _registerChild = (ref) => {\n    this.googleMapDom_ = ref;\n  };\n\n  render() {\n    const overlay = this.state.overlay;\n    const mapMarkerPrerender = !overlay ? (\n      <GoogleMapMarkersPrerender\n        experimental={this.props.experimental}\n        onChildClick={this._onChildClick}\n        onChildMouseDown={this._onChildMouseDown}\n        onChildMouseEnter={this._onChildMouseEnter}\n        onChildMouseLeave={this._onChildMouseLeave}\n        geoService={this.geoService_}\n        insideMapPanes={false}\n        distanceToMouse={this.props.distanceToMouse}\n        getHoverDistance={this._getHoverDistance}\n        dispatcher={this.markersDispatcher_}\n      />\n    ) : null;\n\n    return (\n      <div\n        style={this.props.style}\n        onMouseMove={this._onMapMouseMove}\n        onMouseDownCapture={this._onMapMouseDownCapture}\n        onClick={this._onMapClick}\n      >\n        <GoogleMapMap registerChild={this._registerChild} />\n        {IS_REACT_16 && overlay && createPortal(this._renderPortal(), overlay)}\n\n        {/* render markers before map load done */}\n        {mapMarkerPrerender}\n      </div>\n    );\n  }\n}\n\nexport default GoogleMap;\n","export const generateHeatmap = (instance, { positions }) =>\n  new instance.visualization.HeatmapLayer({\n    data: positions.reduce((acc, { lat, lng, weight = 1 }) => {\n      acc.push({\n        location: new instance.LatLng(lat, lng),\n        weight,\n      });\n      return acc;\n    }, []),\n  });\n\nexport const optionsHeatmap = (instance, { options = {} }) =>\n  Object.keys(options).map((option) => instance.set(option, options[option]));\n","export default function isArraysEqualEps(arrayA, arrayB, eps) {\n  if (arrayA && arrayB) {\n    for (let i = 0; i !== arrayA.length; ++i) {\n      if (Math.abs(arrayA[i] - arrayB[i]) > eps) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return false;\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n  , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n  Events.prototype = Object.create(null);\n\n  //\n  // This hack is needed because the `__proto__` property is still inherited in\n  // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n  //\n  if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n  this.fn = fn;\n  this.context = context;\n  this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n  if (typeof fn !== 'function') {\n    throw new TypeError('The listener must be a function');\n  }\n\n  var listener = new EE(fn, context || emitter, once)\n    , evt = prefix ? prefix + event : event;\n\n  if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n  else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n  else emitter._events[evt] = [emitter._events[evt], listener];\n\n  return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n  if (--emitter._eventsCount === 0) emitter._events = new Events();\n  else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n  this._events = new Events();\n  this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n  var names = []\n    , events\n    , name;\n\n  if (this._eventsCount === 0) return names;\n\n  for (name in (events = this._events)) {\n    if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n  }\n\n  if (Object.getOwnPropertySymbols) {\n    return names.concat(Object.getOwnPropertySymbols(events));\n  }\n\n  return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n  var evt = prefix ? prefix + event : event\n    , handlers = this._events[evt];\n\n  if (!handlers) return [];\n  if (handlers.fn) return [handlers.fn];\n\n  for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n    ee[i] = handlers[i].fn;\n  }\n\n  return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n  var evt = prefix ? prefix + event : event\n    , listeners = this._events[evt];\n\n  if (!listeners) return 0;\n  if (listeners.fn) return 1;\n  return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return false;\n\n  var listeners = this._events[evt]\n    , len = arguments.length\n    , args\n    , i;\n\n  if (listeners.fn) {\n    if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n    switch (len) {\n      case 1: return listeners.fn.call(listeners.context), true;\n      case 2: return listeners.fn.call(listeners.context, a1), true;\n      case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n      case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n      case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n      case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n    }\n\n    for (i = 1, args = new Array(len -1); i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    listeners.fn.apply(listeners.context, args);\n  } else {\n    var length = listeners.length\n      , j;\n\n    for (i = 0; i < length; i++) {\n      if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n      switch (len) {\n        case 1: listeners[i].fn.call(listeners[i].context); break;\n        case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n        case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n        case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n        default:\n          if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n            args[j - 1] = arguments[j];\n          }\n\n          listeners[i].fn.apply(listeners[i].context, args);\n      }\n    }\n  }\n\n  return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n  return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n  return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n  var evt = prefix ? prefix + event : event;\n\n  if (!this._events[evt]) return this;\n  if (!fn) {\n    clearEvent(this, evt);\n    return this;\n  }\n\n  var listeners = this._events[evt];\n\n  if (listeners.fn) {\n    if (\n      listeners.fn === fn &&\n      (!once || listeners.once) &&\n      (!context || listeners.context === context)\n    ) {\n      clearEvent(this, evt);\n    }\n  } else {\n    for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n      if (\n        listeners[i].fn !== fn ||\n        (once && !listeners[i].once) ||\n        (context && listeners[i].context !== context)\n      ) {\n        events.push(listeners[i]);\n      }\n    }\n\n    //\n    // Reset the array, or remove it completely if we have no more listeners.\n    //\n    if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n    else clearEvent(this, evt);\n  }\n\n  return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n  var evt;\n\n  if (event) {\n    evt = prefix ? prefix + event : event;\n    if (this._events[evt]) clearEvent(this, evt);\n  } else {\n    this._events = new Events();\n    this._eventsCount = 0;\n  }\n\n  return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n  module.exports = EventEmitter;\n}\n","'use strict';\n\nmodule.exports = Point;\n\n/**\n * A standalone point geometry with useful accessor, comparison, and\n * modification methods.\n *\n * @class Point\n * @param {Number} x the x-coordinate. this could be longitude or screen\n * pixels, or any other sort of unit.\n * @param {Number} y the y-coordinate. this could be latitude or screen\n * pixels, or any other sort of unit.\n * @example\n * var point = new Point(-77, 38);\n */\nfunction Point(x, y) {\n    this.x = x;\n    this.y = y;\n}\n\nPoint.prototype = {\n\n    /**\n     * Clone this point, returning a new point that can be modified\n     * without affecting the old one.\n     * @return {Point} the clone\n     */\n    clone: function() { return new Point(this.x, this.y); },\n\n    /**\n     * Add this point's x & y coordinates to another point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    add:     function(p) { return this.clone()._add(p); },\n\n    /**\n     * Subtract this point's x & y coordinates to from point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    sub:     function(p) { return this.clone()._sub(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    multByPoint:    function(p) { return this.clone()._multByPoint(p); },\n\n    /**\n     * Divide this point's x & y coordinates by point,\n     * yielding a new point.\n     * @param {Point} p the other point\n     * @return {Point} output point\n     */\n    divByPoint:     function(p) { return this.clone()._divByPoint(p); },\n\n    /**\n     * Multiply this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {Point} k factor\n     * @return {Point} output point\n     */\n    mult:    function(k) { return this.clone()._mult(k); },\n\n    /**\n     * Divide this point's x & y coordinates by a factor,\n     * yielding a new point.\n     * @param {Point} k factor\n     * @return {Point} output point\n     */\n    div:     function(k) { return this.clone()._div(k); },\n\n    /**\n     * Rotate this point around the 0, 0 origin by an angle a,\n     * given in radians\n     * @param {Number} a angle to rotate around, in radians\n     * @return {Point} output point\n     */\n    rotate:  function(a) { return this.clone()._rotate(a); },\n\n    /**\n     * Rotate this point around p point by an angle a,\n     * given in radians\n     * @param {Number} a angle to rotate around, in radians\n     * @param {Point} p Point to rotate around\n     * @return {Point} output point\n     */\n    rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },\n\n    /**\n     * Multiply this point by a 4x1 transformation matrix\n     * @param {Array<Number>} m transformation matrix\n     * @return {Point} output point\n     */\n    matMult: function(m) { return this.clone()._matMult(m); },\n\n    /**\n     * Calculate this point but as a unit vector from 0, 0, meaning\n     * that the distance from the resulting point to the 0, 0\n     * coordinate will be equal to 1 and the angle from the resulting\n     * point to the 0, 0 coordinate will be the same as before.\n     * @return {Point} unit vector point\n     */\n    unit:    function() { return this.clone()._unit(); },\n\n    /**\n     * Compute a perpendicular point, where the new y coordinate\n     * is the old x coordinate and the new x coordinate is the old y\n     * coordinate multiplied by -1\n     * @return {Point} perpendicular point\n     */\n    perp:    function() { return this.clone()._perp(); },\n\n    /**\n     * Return a version of this point with the x & y coordinates\n     * rounded to integers.\n     * @return {Point} rounded point\n     */\n    round:   function() { return this.clone()._round(); },\n\n    /**\n     * Return the magitude of this point: this is the Euclidean\n     * distance from the 0, 0 coordinate to this point's x and y\n     * coordinates.\n     * @return {Number} magnitude\n     */\n    mag: function() {\n        return Math.sqrt(this.x * this.x + this.y * this.y);\n    },\n\n    /**\n     * Judge whether this point is equal to another point, returning\n     * true or false.\n     * @param {Point} other the other point\n     * @return {boolean} whether the points are equal\n     */\n    equals: function(other) {\n        return this.x === other.x &&\n               this.y === other.y;\n    },\n\n    /**\n     * Calculate the distance from this point to another point\n     * @param {Point} p the other point\n     * @return {Number} distance\n     */\n    dist: function(p) {\n        return Math.sqrt(this.distSqr(p));\n    },\n\n    /**\n     * Calculate the distance from this point to another point,\n     * without the square root step. Useful if you're comparing\n     * relative distances.\n     * @param {Point} p the other point\n     * @return {Number} distance\n     */\n    distSqr: function(p) {\n        var dx = p.x - this.x,\n            dy = p.y - this.y;\n        return dx * dx + dy * dy;\n    },\n\n    /**\n     * Get the angle from the 0, 0 coordinate to this point, in radians\n     * coordinates.\n     * @return {Number} angle\n     */\n    angle: function() {\n        return Math.atan2(this.y, this.x);\n    },\n\n    /**\n     * Get the angle from this point to another point, in radians\n     * @param {Point} b the other point\n     * @return {Number} angle\n     */\n    angleTo: function(b) {\n        return Math.atan2(this.y - b.y, this.x - b.x);\n    },\n\n    /**\n     * Get the angle between this point and another point, in radians\n     * @param {Point} b the other point\n     * @return {Number} angle\n     */\n    angleWith: function(b) {\n        return this.angleWithSep(b.x, b.y);\n    },\n\n    /*\n     * Find the angle of the two vectors, solving the formula for\n     * the cross product a x b = |a||b|sin(θ) for θ.\n     * @param {Number} x the x-coordinate\n     * @param {Number} y the y-coordinate\n     * @return {Number} the angle in radians\n     */\n    angleWithSep: function(x, y) {\n        return Math.atan2(\n            this.x * y - this.y * x,\n            this.x * x + this.y * y);\n    },\n\n    _matMult: function(m) {\n        var x = m[0] * this.x + m[1] * this.y,\n            y = m[2] * this.x + m[3] * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _add: function(p) {\n        this.x += p.x;\n        this.y += p.y;\n        return this;\n    },\n\n    _sub: function(p) {\n        this.x -= p.x;\n        this.y -= p.y;\n        return this;\n    },\n\n    _mult: function(k) {\n        this.x *= k;\n        this.y *= k;\n        return this;\n    },\n\n    _div: function(k) {\n        this.x /= k;\n        this.y /= k;\n        return this;\n    },\n\n    _multByPoint: function(p) {\n        this.x *= p.x;\n        this.y *= p.y;\n        return this;\n    },\n\n    _divByPoint: function(p) {\n        this.x /= p.x;\n        this.y /= p.y;\n        return this;\n    },\n\n    _unit: function() {\n        this._div(this.mag());\n        return this;\n    },\n\n    _perp: function() {\n        var y = this.y;\n        this.y = this.x;\n        this.x = -y;\n        return this;\n    },\n\n    _rotate: function(angle) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = cos * this.x - sin * this.y,\n            y = sin * this.x + cos * this.y;\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _rotateAround: function(angle, p) {\n        var cos = Math.cos(angle),\n            sin = Math.sin(angle),\n            x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),\n            y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);\n        this.x = x;\n        this.y = y;\n        return this;\n    },\n\n    _round: function() {\n        this.x = Math.round(this.x);\n        this.y = Math.round(this.y);\n        return this;\n    }\n};\n\n/**\n * Construct a point from an array if necessary, otherwise if the input\n * is already a Point, or an unknown type, return it unchanged\n * @param {Array<Number>|Point|*} a any kind of input value\n * @return {Point} constructed point, or passed-through value.\n * @example\n * // this\n * var point = Point.convert([0, 1]);\n * // is equivalent to\n * var point = new Point(0, 1);\n */\nPoint.convert = function (a) {\n    if (a instanceof Point) {\n        return a;\n    }\n    if (Array.isArray(a)) {\n        return new Point(a[0], a[1]);\n    }\n    return a;\n};\n"],"sourceRoot":""}