{"version":3,"sources":["../node_modules/svg-pan-zoom/src/svg-utilities.js","../node_modules/svg-pan-zoom/src/utilities.js","../node_modules/svg-pan-zoom/src/browserify.js","../node_modules/svg-pan-zoom/src/svg-pan-zoom.js","../node_modules/svg-pan-zoom/src/uniwheel.js","../node_modules/svg-pan-zoom/src/control-icons.js","../node_modules/svg-pan-zoom/src/shadow-viewport.js"],"names":["Utils","require","_browser","document","documentMode","module","exports","svgNS","xmlNS","xmlnsNS","xlinkNS","evNS","getBoundingClientRectNormalized","svg","clientWidth","clientHeight","width","height","getBoundingClientRect","Error","getOrCreateViewport","selector","viewport","isElement","querySelector","childNodes","Array","prototype","slice","call","children","filter","el","nodeName","length","getAttribute","viewportId","Date","toISOString","replace","createElementNS","this","setAttribute","svgChildren","i","appendChild","classNames","split","indexOf","push","join","setupSvgAttributes","setAttributeNS","parentNode","style","toLowerCase","internetExplorerRedisplayInterval","refreshDefsGlobal","throttle","allDefs","querySelectorAll","allDefsCount","thisDefs","insertBefore","setCTM","element","matrix","defs","that","s","a","b","c","d","e","f","transform","window","setTimeout","getEventPoint","evt","point","createSVGPoint","mouseAndTouchNormalize","x","clientX","y","clientY","getSvgCenterPoint","requestTimeout","timeout","callback","extend","target","source","prop","isObject","o","HTMLElement","SVGElement","SVGSVGElement","nodeType","Object","toString","isNumber","n","isNaN","parseFloat","isFinite","getSvg","elementOrSelector","String","tagName","contentDocument","documentElement","getSVGDocument","proxy","fn","context","apply","arguments","getType","touches","pageX","rect","left","pageY","top","originalEvent","isDblClick","prevEvt","detail","timeStampDiff","timeStamp","touchesDistance","Math","sqrt","pow","now","getTime","func","wait","options","args","result","previous","later","leading","remaining","clearTimeout","trailing","createRequestAnimationFrame","refreshRate","floor","requestAnimationFrame","SvgPanZoom","Wheel","ControlIcons","SvgUtils","ShadowViewport","init","optionsDefaults","viewportSelector","panEnabled","controlIconsEnabled","zoomEnabled","dblClickZoomEnabled","mouseWheelZoomEnabled","preventMouseEventsDefault","zoomScaleSensitivity","minZoom","maxZoom","fit","contain","center","beforeZoom","onZoom","beforePan","onPan","customEventsHandler","eventsListenerElement","onUpdatedCTM","passiveListenerOption","passive","state","boundingClientRectNormalized","oldScale","newScale","scale","oldPoint","newPoint","ctm","publicInstance","getPublicInstance","setBeforeZoom","setOnZoom","setBeforePan","setOnPan","setOnUpdatedCTM","enable","lastMouseWheelEventTime","setupHandlers","eventListeners","mousedown","handleMouseDown","touchstart","mouseup","handleMouseUp","touchend","mousemove","handleMouseMove","touchmove","mouseleave","touchleave","touchcancel","svgElement","instance","haltEventListeners","hasOwnProperty","event","addEventListener","enableMouseWheelZoom","wheelListener","handleMouseWheel","isPassiveListener","on","disableMouseWheelZoom","off","preventDefault","returnValue","delta","deltaY","timeDelta","divider","max","deltaMode","wheelDelta","abs","log","inversedScreenCTM","getScreenCTM","inverse","relativeMousePoint","matrixTransform","zoom","zoomAtPoint","zoomScale","zoomAbsolute","originalState","getOriginalState","min","getZoom","oldCTM","getCTM","relativePoint","modifier","createSVGMatrix","translate","newCTM","multiply","absolute","publicZoom","computeFromRelativeZoom","publicZoomAtPoint","getRelativeZoom","resetZoom","resetPan","pan","reset","handleDblClick","zoomFactor","shiftKey","firstEventCTM","stateOrigin","viewportCTM","viewBox","getViewBox","offsetX","offsetY","updateBBox","simpleViewBoxCache","panBy","getPan","getState","resize","processCTM","disableControlIcons","enableControlIcons","destroy","removeEventListener","instancesStore","pi","enablePan","disablePan","isPanEnabled","enableZoom","disableZoom","isZoomEnabled","disable","isControlIconsEnabled","enableDblClickZoom","disableDblClickZoom","isDblClickZoomEnabled","isMouseWheelZoomEnabled","setZoomScaleSensitivity","setMinZoom","setMaxZoom","zoomBy","zoomAtPointBy","zoomIn","zoomOut","getSizes","realZoom","_addEventListener","_removeEventListener","support","prefix","fns","passiveOption","_addWheelListener","elem","eventName","cb","srcElement","type","deltaX","delatZ","wheelDeltaX","createCallback","_removeWheelListener","getCallback","splice","removeCallback","createElement","undefined","onmousewheel","textContent","zoomGroup","_createZoomIn","_createZoomReset","_createZoomOut","controlIcons","zoomInBackground","zoomInShape","resetPanZoomControl","resetPanZoomControlBackground","resetPanZoomControlShape1","resetPanZoomControlShape2","zoomOutBackground","zoomOutShape","removeChild","activeState","updateCTMCached","updateCTM","cacheViewBox","svgViewBox","viewBoxValues","v","map","updateCTMOnNextFrame","removeAttribute","bBox","getBBox","computeRelativeZoom","safeCTM","willZoom","isZoomDifferent","willPan","isPanDifferent","updateCache","preventPan","preventPanX","preventPanY","pendingUpdate"],"mappings":"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","file":"js/30.a7da270b.chunk.js","sourcesContent":["var Utils = require(\"./utilities\"),\n _browser = \"unknown\";\n\n// http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser\nif (/*@cc_on!@*/ false || !!document.documentMode) {\n // internet explorer\n _browser = \"ie\";\n}\n\nmodule.exports = {\n svgNS: \"http://www.w3.org/2000/svg\",\n xmlNS: \"http://www.w3.org/XML/1998/namespace\",\n xmlnsNS: \"http://www.w3.org/2000/xmlns/\",\n xlinkNS: \"http://www.w3.org/1999/xlink\",\n evNS: \"http://www.w3.org/2001/xml-events\",\n\n /**\n * Get svg dimensions: width and height\n *\n * @param {SVGSVGElement} svg\n * @return {Object} {width: 0, height: 0}\n */\n getBoundingClientRectNormalized: function(svg) {\n if (svg.clientWidth && svg.clientHeight) {\n return { width: svg.clientWidth, height: svg.clientHeight };\n } else if (!!svg.getBoundingClientRect()) {\n return svg.getBoundingClientRect();\n } else {\n throw new Error(\"Cannot get BoundingClientRect for SVG.\");\n }\n },\n\n /**\n * Gets g element with class of \"viewport\" or creates it if it doesn't exist\n *\n * @param {SVGSVGElement} svg\n * @return {SVGElement} g (group) element\n */\n getOrCreateViewport: function(svg, selector) {\n var viewport = null;\n\n if (Utils.isElement(selector)) {\n viewport = selector;\n } else {\n viewport = svg.querySelector(selector);\n }\n\n // Check if there is just one main group in SVG\n if (!viewport) {\n var childNodes = Array.prototype.slice\n .call(svg.childNodes || svg.children)\n .filter(function(el) {\n return el.nodeName !== \"defs\" && el.nodeName !== \"#text\";\n });\n\n // Node name should be SVGGElement and should have no transform attribute\n // Groups with transform are not used as viewport because it involves parsing of all transform possibilities\n if (\n childNodes.length === 1 &&\n childNodes[0].nodeName === \"g\" &&\n childNodes[0].getAttribute(\"transform\") === null\n ) {\n viewport = childNodes[0];\n }\n }\n\n // If no favorable group element exists then create one\n if (!viewport) {\n var viewportId =\n \"viewport-\" + new Date().toISOString().replace(/\\D/g, \"\");\n viewport = document.createElementNS(this.svgNS, \"g\");\n viewport.setAttribute(\"id\", viewportId);\n\n // Internet Explorer (all versions?) can't use childNodes, but other browsers prefer (require?) using childNodes\n var svgChildren = svg.childNodes || svg.children;\n if (!!svgChildren && svgChildren.length > 0) {\n for (var i = svgChildren.length; i > 0; i--) {\n // Move everything into viewport except defs\n if (svgChildren[svgChildren.length - i].nodeName !== \"defs\") {\n viewport.appendChild(svgChildren[svgChildren.length - i]);\n }\n }\n }\n svg.appendChild(viewport);\n }\n\n // Parse class names\n var classNames = [];\n if (viewport.getAttribute(\"class\")) {\n classNames = viewport.getAttribute(\"class\").split(\" \");\n }\n\n // Set class (if not set already)\n if (!~classNames.indexOf(\"svg-pan-zoom_viewport\")) {\n classNames.push(\"svg-pan-zoom_viewport\");\n viewport.setAttribute(\"class\", classNames.join(\" \"));\n }\n\n return viewport;\n },\n\n /**\n * Set SVG attributes\n *\n * @param {SVGSVGElement} svg\n */\n setupSvgAttributes: function(svg) {\n // Setting default attributes\n svg.setAttribute(\"xmlns\", this.svgNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:xlink\", this.xlinkNS);\n svg.setAttributeNS(this.xmlnsNS, \"xmlns:ev\", this.evNS);\n\n // Needed for Internet Explorer, otherwise the viewport overflows\n if (svg.parentNode !== null) {\n var style = svg.getAttribute(\"style\") || \"\";\n if (style.toLowerCase().indexOf(\"overflow\") === -1) {\n svg.setAttribute(\"style\", \"overflow: hidden; \" + style);\n }\n }\n },\n\n /**\n * How long Internet Explorer takes to finish updating its display (ms).\n */\n internetExplorerRedisplayInterval: 300,\n\n /**\n * Forces the browser to redisplay all SVG elements that rely on an\n * element defined in a 'defs' section. It works globally, for every\n * available defs element on the page.\n * The throttling is intentionally global.\n *\n * This is only needed for IE. It is as a hack to make markers (and 'use' elements?)\n * visible after pan/zoom when there are multiple SVGs on the page.\n * See bug report: https://connect.microsoft.com/IE/feedback/details/781964/\n * also see svg-pan-zoom issue: https://github.com/ariutta/svg-pan-zoom/issues/62\n */\n refreshDefsGlobal: Utils.throttle(\n function() {\n var allDefs = document.querySelectorAll(\"defs\");\n var allDefsCount = allDefs.length;\n for (var i = 0; i < allDefsCount; i++) {\n var thisDefs = allDefs[i];\n thisDefs.parentNode.insertBefore(thisDefs, thisDefs);\n }\n },\n this ? this.internetExplorerRedisplayInterval : null\n ),\n\n /**\n * Sets the current transform matrix of an element\n *\n * @param {SVGElement} element\n * @param {SVGMatrix} matrix CTM\n * @param {SVGElement} defs\n */\n setCTM: function(element, matrix, defs) {\n var that = this,\n s =\n \"matrix(\" +\n matrix.a +\n \",\" +\n matrix.b +\n \",\" +\n matrix.c +\n \",\" +\n matrix.d +\n \",\" +\n matrix.e +\n \",\" +\n matrix.f +\n \")\";\n\n element.setAttributeNS(null, \"transform\", s);\n if (\"transform\" in element.style) {\n element.style.transform = s;\n } else if (\"-ms-transform\" in element.style) {\n element.style[\"-ms-transform\"] = s;\n } else if (\"-webkit-transform\" in element.style) {\n element.style[\"-webkit-transform\"] = s;\n }\n\n // IE has a bug that makes markers disappear on zoom (when the matrix \"a\" and/or \"d\" elements change)\n // see http://stackoverflow.com/questions/17654578/svg-marker-does-not-work-in-ie9-10\n // and http://srndolha.wordpress.com/2013/11/25/svg-line-markers-may-disappear-in-internet-explorer-11/\n if (_browser === \"ie\" && !!defs) {\n // this refresh is intended for redisplaying the SVG during zooming\n defs.parentNode.insertBefore(defs, defs);\n // this refresh is intended for redisplaying the other SVGs on a page when panning a given SVG\n // it is also needed for the given SVG itself, on zoomEnd, if the SVG contains any markers that\n // are located under any other element(s).\n window.setTimeout(function() {\n that.refreshDefsGlobal();\n }, that.internetExplorerRedisplayInterval);\n }\n },\n\n /**\n * Instantiate an SVGPoint object with given event coordinates\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n * @return {SVGPoint} point\n */\n getEventPoint: function(evt, svg) {\n var point = svg.createSVGPoint();\n\n Utils.mouseAndTouchNormalize(evt, svg);\n\n point.x = evt.clientX;\n point.y = evt.clientY;\n\n return point;\n },\n\n /**\n * Get SVG center point\n *\n * @param {SVGSVGElement} svg\n * @return {SVGPoint}\n */\n getSvgCenterPoint: function(svg, width, height) {\n return this.createSVGPoint(svg, width / 2, height / 2);\n },\n\n /**\n * Create a SVGPoint with given x and y\n *\n * @param {SVGSVGElement} svg\n * @param {Number} x\n * @param {Number} y\n * @return {SVGPoint}\n */\n createSVGPoint: function(svg, x, y) {\n var point = svg.createSVGPoint();\n point.x = x;\n point.y = y;\n\n return point;\n }\n};\n","module.exports = {\n /**\n * Extends an object\n *\n * @param {Object} target object to extend\n * @param {Object} source object to take properties from\n * @return {Object} extended object\n */\n extend: function(target, source) {\n target = target || {};\n for (var prop in source) {\n // Go recursively\n if (this.isObject(source[prop])) {\n target[prop] = this.extend(target[prop], source[prop]);\n } else {\n target[prop] = source[prop];\n }\n }\n return target;\n },\n\n /**\n * Checks if an object is a DOM element\n *\n * @param {Object} o HTML element or String\n * @return {Boolean} returns true if object is a DOM element\n */\n isElement: function(o) {\n return (\n o instanceof HTMLElement ||\n o instanceof SVGElement ||\n o instanceof SVGSVGElement || //DOM2\n (o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\")\n );\n },\n\n /**\n * Checks if an object is an Object\n *\n * @param {Object} o Object\n * @return {Boolean} returns true if object is an Object\n */\n isObject: function(o) {\n return Object.prototype.toString.call(o) === \"[object Object]\";\n },\n\n /**\n * Checks if variable is Number\n *\n * @param {Integer|Float} n\n * @return {Boolean} returns true if variable is Number\n */\n isNumber: function(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n },\n\n /**\n * Search for an SVG element\n *\n * @param {Object|String} elementOrSelector DOM Element or selector String\n * @return {Object|Null} SVG or null\n */\n getSvg: function(elementOrSelector) {\n var element, svg;\n\n if (!this.isElement(elementOrSelector)) {\n // If selector provided\n if (\n typeof elementOrSelector === \"string\" ||\n elementOrSelector instanceof String\n ) {\n // Try to find the element\n element = document.querySelector(elementOrSelector);\n\n if (!element) {\n throw new Error(\n \"Provided selector did not find any elements. Selector: \" +\n elementOrSelector\n );\n return null;\n }\n } else {\n throw new Error(\"Provided selector is not an HTML object nor String\");\n return null;\n }\n } else {\n element = elementOrSelector;\n }\n\n if (element.tagName.toLowerCase() === \"svg\") {\n svg = element;\n } else {\n if (element.tagName.toLowerCase() === \"object\") {\n svg = element.contentDocument.documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"embed\") {\n svg = element.getSVGDocument().documentElement;\n } else {\n if (element.tagName.toLowerCase() === \"img\") {\n throw new Error(\n 'Cannot script an SVG in an \"img\" element. Please use an \"object\" element or an in-line SVG.'\n );\n } else {\n throw new Error(\"Cannot get SVG.\");\n }\n return null;\n }\n }\n }\n\n return svg;\n },\n\n /**\n * Attach a given context to a function\n * @param {Function} fn Function\n * @param {Object} context Context\n * @return {Function} Function with certain context\n */\n proxy: function(fn, context) {\n return function() {\n return fn.apply(context, arguments);\n };\n },\n\n /**\n * Returns object type\n * Uses toString that returns [object SVGPoint]\n * And than parses object type from string\n *\n * @param {Object} o Any object\n * @return {String} Object type\n */\n getType: function(o) {\n return Object.prototype.toString\n .apply(o)\n .replace(/^\\[object\\s/, \"\")\n .replace(/\\]$/, \"\");\n },\n\n /**\n * If it is a touch event than add clientX and clientY to event object\n *\n * @param {Event} evt\n * @param {SVGSVGElement} svg\n */\n mouseAndTouchNormalize: function(evt, svg) {\n // If no clientX then fallback\n if (evt.clientX === void 0 || evt.clientX === null) {\n // Fallback\n evt.clientX = 0;\n evt.clientY = 0;\n\n // If it is a touch event\n if (evt.touches !== void 0 && evt.touches.length) {\n if (evt.touches[0].clientX !== void 0) {\n evt.clientX = evt.touches[0].clientX;\n evt.clientY = evt.touches[0].clientY;\n } else if (evt.touches[0].pageX !== void 0) {\n var rect = svg.getBoundingClientRect();\n\n evt.clientX = evt.touches[0].pageX - rect.left;\n evt.clientY = evt.touches[0].pageY - rect.top;\n }\n // If it is a custom event\n } else if (evt.originalEvent !== void 0) {\n if (evt.originalEvent.clientX !== void 0) {\n evt.clientX = evt.originalEvent.clientX;\n evt.clientY = evt.originalEvent.clientY;\n }\n }\n }\n },\n\n /**\n * Check if an event is a double click/tap\n * TODO: For touch gestures use a library (hammer.js) that takes in account other events\n * (touchmove and touchend). It should take in account tap duration and traveled distance\n *\n * @param {Event} evt\n * @param {Event} prevEvt Previous Event\n * @return {Boolean}\n */\n isDblClick: function(evt, prevEvt) {\n // Double click detected by browser\n if (evt.detail === 2) {\n return true;\n }\n // Try to compare events\n else if (prevEvt !== void 0 && prevEvt !== null) {\n var timeStampDiff = evt.timeStamp - prevEvt.timeStamp, // should be lower than 250 ms\n touchesDistance = Math.sqrt(\n Math.pow(evt.clientX - prevEvt.clientX, 2) +\n Math.pow(evt.clientY - prevEvt.clientY, 2)\n );\n\n return timeStampDiff < 250 && touchesDistance < 10;\n }\n\n // Nothing found\n return false;\n },\n\n /**\n * Returns current timestamp as an integer\n *\n * @return {Number}\n */\n now:\n Date.now ||\n function() {\n return new Date().getTime();\n },\n\n // From underscore.\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n throttle: function(func, wait, options) {\n var that = this;\n var context, args, result;\n var timeout = null;\n var previous = 0;\n if (!options) {\n options = {};\n }\n var later = function() {\n previous = options.leading === false ? 0 : that.now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n };\n return function() {\n var now = that.now();\n if (!previous && options.leading === false) {\n previous = now;\n }\n var remaining = wait - (now - previous);\n context = this; // eslint-disable-line consistent-this\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n clearTimeout(timeout);\n timeout = null;\n previous = now;\n result = func.apply(context, args);\n if (!timeout) {\n context = args = null;\n }\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n },\n\n /**\n * Create a requestAnimationFrame simulation\n *\n * @param {Number|String} refreshRate\n * @return {Function}\n */\n createRequestAnimationFrame: function(refreshRate) {\n var timeout = null;\n\n // Convert refreshRate to timeout\n if (refreshRate !== \"auto\" && refreshRate < 60 && refreshRate > 1) {\n timeout = Math.floor(1000 / refreshRate);\n }\n\n if (timeout === null) {\n return window.requestAnimationFrame || requestTimeout(33);\n } else {\n return requestTimeout(timeout);\n }\n }\n};\n\n/**\n * Create a callback that will execute after a given timeout\n *\n * @param {Function} timeout\n * @return {Function}\n */\nfunction requestTimeout(timeout) {\n return function(callback) {\n window.setTimeout(callback, timeout);\n };\n}\n","var SvgPanZoom = require(\"./svg-pan-zoom.js\");\n\nmodule.exports = SvgPanZoom;\n","var Wheel = require(\"./uniwheel\"),\n ControlIcons = require(\"./control-icons\"),\n Utils = require(\"./utilities\"),\n SvgUtils = require(\"./svg-utilities\"),\n ShadowViewport = require(\"./shadow-viewport\");\n\nvar SvgPanZoom = function(svg, options) {\n this.init(svg, options);\n};\n\nvar optionsDefaults = {\n viewportSelector: \".svg-pan-zoom_viewport\", // Viewport selector. Can be querySelector string or SVGElement\n panEnabled: true, // enable or disable panning (default enabled)\n controlIconsEnabled: false, // insert icons to give user an option in addition to mouse events to control pan/zoom (default disabled)\n zoomEnabled: true, // enable or disable zooming (default enabled)\n dblClickZoomEnabled: true, // enable or disable zooming by double clicking (default enabled)\n mouseWheelZoomEnabled: true, // enable or disable zooming by mouse wheel (default enabled)\n preventMouseEventsDefault: true, // enable or disable preventDefault for mouse events\n zoomScaleSensitivity: 0.1, // Zoom sensitivity\n minZoom: 0.5, // Minimum Zoom level\n maxZoom: 10, // Maximum Zoom level\n fit: true, // enable or disable viewport fit in SVG (default true)\n contain: false, // enable or disable viewport contain the svg (default false)\n center: true, // enable or disable viewport centering in SVG (default true)\n refreshRate: \"auto\", // Maximum number of frames per second (altering SVG's viewport)\n beforeZoom: null,\n onZoom: null,\n beforePan: null,\n onPan: null,\n customEventsHandler: null,\n eventsListenerElement: null,\n onUpdatedCTM: null\n};\n\nvar passiveListenerOption = { passive: true };\n\nSvgPanZoom.prototype.init = function(svg, options) {\n var that = this;\n\n this.svg = svg;\n this.defs = svg.querySelector(\"defs\");\n\n // Add default attributes to SVG\n SvgUtils.setupSvgAttributes(this.svg);\n\n // Set options\n this.options = Utils.extend(Utils.extend({}, optionsDefaults), options);\n\n // Set default state\n this.state = \"none\";\n\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Init shadow viewport\n this.viewport = ShadowViewport(\n SvgUtils.getOrCreateViewport(this.svg, this.options.viewportSelector),\n {\n svg: this.svg,\n width: this.width,\n height: this.height,\n fit: this.options.fit,\n contain: this.options.contain,\n center: this.options.center,\n refreshRate: this.options.refreshRate,\n // Put callbacks into functions as they can change through time\n beforeZoom: function(oldScale, newScale) {\n if (that.viewport && that.options.beforeZoom) {\n return that.options.beforeZoom(oldScale, newScale);\n }\n },\n onZoom: function(scale) {\n if (that.viewport && that.options.onZoom) {\n return that.options.onZoom(scale);\n }\n },\n beforePan: function(oldPoint, newPoint) {\n if (that.viewport && that.options.beforePan) {\n return that.options.beforePan(oldPoint, newPoint);\n }\n },\n onPan: function(point) {\n if (that.viewport && that.options.onPan) {\n return that.options.onPan(point);\n }\n },\n onUpdatedCTM: function(ctm) {\n if (that.viewport && that.options.onUpdatedCTM) {\n return that.options.onUpdatedCTM(ctm);\n }\n }\n }\n );\n\n // Wrap callbacks into public API context\n var publicInstance = this.getPublicInstance();\n publicInstance.setBeforeZoom(this.options.beforeZoom);\n publicInstance.setOnZoom(this.options.onZoom);\n publicInstance.setBeforePan(this.options.beforePan);\n publicInstance.setOnPan(this.options.onPan);\n publicInstance.setOnUpdatedCTM(this.options.onUpdatedCTM);\n\n if (this.options.controlIconsEnabled) {\n ControlIcons.enable(this);\n }\n\n // Init events handlers\n this.lastMouseWheelEventTime = Date.now();\n this.setupHandlers();\n};\n\n/**\n * Register event handlers\n */\nSvgPanZoom.prototype.setupHandlers = function() {\n var that = this,\n prevEvt = null; // use for touchstart event to detect double tap\n\n this.eventListeners = {\n // Mouse down group\n mousedown: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n touchstart: function(evt) {\n var result = that.handleMouseDown(evt, prevEvt);\n prevEvt = evt;\n return result;\n },\n\n // Mouse up group\n mouseup: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchend: function(evt) {\n return that.handleMouseUp(evt);\n },\n\n // Mouse move group\n mousemove: function(evt) {\n return that.handleMouseMove(evt);\n },\n touchmove: function(evt) {\n return that.handleMouseMove(evt);\n },\n\n // Mouse leave group\n mouseleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchleave: function(evt) {\n return that.handleMouseUp(evt);\n },\n touchcancel: function(evt) {\n return that.handleMouseUp(evt);\n }\n };\n\n // Init custom events handler if available\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.init({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n\n // Custom event handler may halt builtin listeners\n var haltEventListeners = this.options.customEventsHandler\n .haltEventListeners;\n if (haltEventListeners && haltEventListeners.length) {\n for (var i = haltEventListeners.length - 1; i >= 0; i--) {\n if (this.eventListeners.hasOwnProperty(haltEventListeners[i])) {\n delete this.eventListeners[haltEventListeners[i]];\n }\n }\n }\n }\n\n // Bind eventListeners\n for (var event in this.eventListeners) {\n // Attach event to eventsListenerElement or SVG if not available\n (this.options.eventsListenerElement || this.svg).addEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Zoom using mouse wheel\n if (this.options.mouseWheelZoomEnabled) {\n this.options.mouseWheelZoomEnabled = false; // set to false as enable will set it back to true\n this.enableMouseWheelZoom();\n }\n};\n\n/**\n * Enable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.enableMouseWheelZoom = function() {\n if (!this.options.mouseWheelZoomEnabled) {\n var that = this;\n\n // Mouse wheel listener\n this.wheelListener = function(evt) {\n return that.handleMouseWheel(evt);\n };\n\n // Bind wheelListener\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.on(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n\n this.options.mouseWheelZoomEnabled = true;\n }\n};\n\n/**\n * Disable ability to zoom using mouse wheel\n */\nSvgPanZoom.prototype.disableMouseWheelZoom = function() {\n if (this.options.mouseWheelZoomEnabled) {\n var isPassiveListener = !this.options.preventMouseEventsDefault;\n Wheel.off(\n this.options.eventsListenerElement || this.svg,\n this.wheelListener,\n isPassiveListener\n );\n this.options.mouseWheelZoomEnabled = false;\n }\n};\n\n/**\n * Handle mouse wheel event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseWheel = function(evt) {\n if (!this.options.zoomEnabled || this.state !== \"none\") {\n return;\n }\n\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Default delta in case that deltaY is not available\n var delta = evt.deltaY || 1,\n timeDelta = Date.now() - this.lastMouseWheelEventTime,\n divider = 3 + Math.max(0, 30 - timeDelta);\n\n // Update cache\n this.lastMouseWheelEventTime = Date.now();\n\n // Make empirical adjustments for browsers that give deltaY in pixels (deltaMode=0)\n if (\"deltaMode\" in evt && evt.deltaMode === 0 && evt.wheelDelta) {\n delta = evt.deltaY === 0 ? 0 : Math.abs(evt.wheelDelta) / evt.deltaY;\n }\n\n delta =\n -0.3 < delta && delta < 0.3\n ? delta\n : ((delta > 0 ? 1 : -1) * Math.log(Math.abs(delta) + 10)) / divider;\n\n var inversedScreenCTM = this.svg.getScreenCTM().inverse(),\n relativeMousePoint = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n inversedScreenCTM\n ),\n zoom = Math.pow(1 + this.options.zoomScaleSensitivity, -1 * delta); // multiplying by neg. 1 so as to make zoom in/out behavior match Google maps behavior\n\n this.zoomAtPoint(zoom, relativeMousePoint);\n};\n\n/**\n * Zoom in at a SVG point\n *\n * @param {SVGPoint} point\n * @param {Float} zoomScale Number representing how much to zoom\n * @param {Boolean} zoomAbsolute Default false. If true, zoomScale is treated as an absolute value.\n * Otherwise, zoomScale is treated as a multiplied (e.g. 1.10 would zoom in 10%)\n */\nSvgPanZoom.prototype.zoomAtPoint = function(zoomScale, point, zoomAbsolute) {\n var originalState = this.viewport.getOriginalState();\n\n if (!zoomAbsolute) {\n // Fit zoomScale in set bounds\n if (\n this.getZoom() * zoomScale <\n this.options.minZoom * originalState.zoom\n ) {\n zoomScale = (this.options.minZoom * originalState.zoom) / this.getZoom();\n } else if (\n this.getZoom() * zoomScale >\n this.options.maxZoom * originalState.zoom\n ) {\n zoomScale = (this.options.maxZoom * originalState.zoom) / this.getZoom();\n }\n } else {\n // Fit zoomScale in set bounds\n zoomScale = Math.max(\n this.options.minZoom * originalState.zoom,\n Math.min(this.options.maxZoom * originalState.zoom, zoomScale)\n );\n // Find relative scale to achieve desired scale\n zoomScale = zoomScale / this.getZoom();\n }\n\n var oldCTM = this.viewport.getCTM(),\n relativePoint = point.matrixTransform(oldCTM.inverse()),\n modifier = this.svg\n .createSVGMatrix()\n .translate(relativePoint.x, relativePoint.y)\n .scale(zoomScale)\n .translate(-relativePoint.x, -relativePoint.y),\n newCTM = oldCTM.multiply(modifier);\n\n if (newCTM.a !== oldCTM.a) {\n this.viewport.setCTM(newCTM);\n }\n};\n\n/**\n * Zoom at center point\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.zoom = function(scale, absolute) {\n this.zoomAtPoint(\n scale,\n SvgUtils.getSvgCenterPoint(this.svg, this.width, this.height),\n absolute\n );\n};\n\n/**\n * Zoom used by public instance\n *\n * @param {Float} scale\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoom = function(scale, absolute) {\n if (absolute) {\n scale = this.computeFromRelativeZoom(scale);\n }\n\n this.zoom(scale, absolute);\n};\n\n/**\n * Zoom at point used by public instance\n *\n * @param {Float} scale\n * @param {SVGPoint|Object} point An object that has x and y attributes\n * @param {Boolean} absolute Marks zoom scale as relative or absolute\n */\nSvgPanZoom.prototype.publicZoomAtPoint = function(scale, point, absolute) {\n if (absolute) {\n // Transform zoom into a relative value\n scale = this.computeFromRelativeZoom(scale);\n }\n\n // If not a SVGPoint but has x and y then create a SVGPoint\n if (Utils.getType(point) !== \"SVGPoint\") {\n if (\"x\" in point && \"y\" in point) {\n point = SvgUtils.createSVGPoint(this.svg, point.x, point.y);\n } else {\n throw new Error(\"Given point is invalid\");\n }\n }\n\n this.zoomAtPoint(scale, point, absolute);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getZoom = function() {\n return this.viewport.getZoom();\n};\n\n/**\n * Get zoom scale for public usage\n *\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.getRelativeZoom = function() {\n return this.viewport.getRelativeZoom();\n};\n\n/**\n * Compute actual zoom from public zoom\n *\n * @param {Float} zoom\n * @return {Float} zoom scale\n */\nSvgPanZoom.prototype.computeFromRelativeZoom = function(zoom) {\n return zoom * this.viewport.getOriginalState().zoom;\n};\n\n/**\n * Set zoom to initial state\n */\nSvgPanZoom.prototype.resetZoom = function() {\n var originalState = this.viewport.getOriginalState();\n\n this.zoom(originalState.zoom, true);\n};\n\n/**\n * Set pan to initial state\n */\nSvgPanZoom.prototype.resetPan = function() {\n this.pan(this.viewport.getOriginalState());\n};\n\n/**\n * Set pan and zoom to initial state\n */\nSvgPanZoom.prototype.reset = function() {\n this.resetZoom();\n this.resetPan();\n};\n\n/**\n * Handle double click event\n * See handleMouseDown() for alternate detection method\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleDblClick = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n // Check if target was a control button\n if (this.options.controlIconsEnabled) {\n var targetClass = evt.target.getAttribute(\"class\") || \"\";\n if (targetClass.indexOf(\"svg-pan-zoom-control\") > -1) {\n return false;\n }\n }\n\n var zoomFactor;\n\n if (evt.shiftKey) {\n zoomFactor = 1 / ((1 + this.options.zoomScaleSensitivity) * 2); // zoom out when shift key pressed\n } else {\n zoomFactor = (1 + this.options.zoomScaleSensitivity) * 2;\n }\n\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.svg.getScreenCTM().inverse()\n );\n this.zoomAtPoint(zoomFactor, point);\n};\n\n/**\n * Handle click event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseDown = function(evt, prevEvt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n Utils.mouseAndTouchNormalize(evt, this.svg);\n\n // Double click detection; more consistent than ondblclick\n if (this.options.dblClickZoomEnabled && Utils.isDblClick(evt, prevEvt)) {\n this.handleDblClick(evt);\n } else {\n // Pan mode\n this.state = \"pan\";\n this.firstEventCTM = this.viewport.getCTM();\n this.stateOrigin = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n );\n }\n};\n\n/**\n * Handle mouse move event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseMove = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\" && this.options.panEnabled) {\n // Pan mode\n var point = SvgUtils.getEventPoint(evt, this.svg).matrixTransform(\n this.firstEventCTM.inverse()\n ),\n viewportCTM = this.firstEventCTM.translate(\n point.x - this.stateOrigin.x,\n point.y - this.stateOrigin.y\n );\n\n this.viewport.setCTM(viewportCTM);\n }\n};\n\n/**\n * Handle mouse button release event\n *\n * @param {Event} evt\n */\nSvgPanZoom.prototype.handleMouseUp = function(evt) {\n if (this.options.preventMouseEventsDefault) {\n if (evt.preventDefault) {\n evt.preventDefault();\n } else {\n evt.returnValue = false;\n }\n }\n\n if (this.state === \"pan\") {\n // Quit pan mode\n this.state = \"none\";\n }\n};\n\n/**\n * Adjust viewport size (only) so it will fit in SVG\n * Does not center image\n */\nSvgPanZoom.prototype.fit = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.min(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport size (only) so it will contain the SVG\n * Does not center image\n */\nSvgPanZoom.prototype.contain = function() {\n var viewBox = this.viewport.getViewBox(),\n newScale = Math.max(\n this.width / viewBox.width,\n this.height / viewBox.height\n );\n\n this.zoom(newScale, true);\n};\n\n/**\n * Adjust viewport pan (only) so it will be centered in SVG\n * Does not zoom/fit/contain image\n */\nSvgPanZoom.prototype.center = function() {\n var viewBox = this.viewport.getViewBox(),\n offsetX =\n (this.width - (viewBox.width + viewBox.x * 2) * this.getZoom()) * 0.5,\n offsetY =\n (this.height - (viewBox.height + viewBox.y * 2) * this.getZoom()) * 0.5;\n\n this.getPublicInstance().pan({ x: offsetX, y: offsetY });\n};\n\n/**\n * Update content cached BorderBox\n * Use when viewport contents change\n */\nSvgPanZoom.prototype.updateBBox = function() {\n this.viewport.simpleViewBoxCache();\n};\n\n/**\n * Pan to a rendered position\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.pan = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e = point.x;\n viewportCTM.f = point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Relatively pan the graph by a specified rendered position vector\n *\n * @param {Object} point {x: 0, y: 0}\n */\nSvgPanZoom.prototype.panBy = function(point) {\n var viewportCTM = this.viewport.getCTM();\n viewportCTM.e += point.x;\n viewportCTM.f += point.y;\n this.viewport.setCTM(viewportCTM);\n};\n\n/**\n * Get pan vector\n *\n * @return {Object} {x: 0, y: 0}\n */\nSvgPanZoom.prototype.getPan = function() {\n var state = this.viewport.getState();\n\n return { x: state.x, y: state.y };\n};\n\n/**\n * Recalculates cached svg dimensions and controls position\n */\nSvgPanZoom.prototype.resize = function() {\n // Get dimensions\n var boundingClientRectNormalized = SvgUtils.getBoundingClientRectNormalized(\n this.svg\n );\n this.width = boundingClientRectNormalized.width;\n this.height = boundingClientRectNormalized.height;\n\n // Recalculate original state\n var viewport = this.viewport;\n viewport.options.width = this.width;\n viewport.options.height = this.height;\n viewport.processCTM();\n\n // Reposition control icons by re-enabling them\n if (this.options.controlIconsEnabled) {\n this.getPublicInstance().disableControlIcons();\n this.getPublicInstance().enableControlIcons();\n }\n};\n\n/**\n * Unbind mouse events, free callbacks and destroy public instance\n */\nSvgPanZoom.prototype.destroy = function() {\n var that = this;\n\n // Free callbacks\n this.beforeZoom = null;\n this.onZoom = null;\n this.beforePan = null;\n this.onPan = null;\n this.onUpdatedCTM = null;\n\n // Destroy custom event handlers\n // eslint-disable-next-line eqeqeq\n if (this.options.customEventsHandler != null) {\n this.options.customEventsHandler.destroy({\n svgElement: this.svg,\n eventsListenerElement: this.options.eventsListenerElement,\n instance: this.getPublicInstance()\n });\n }\n\n // Unbind eventListeners\n for (var event in this.eventListeners) {\n (this.options.eventsListenerElement || this.svg).removeEventListener(\n event,\n this.eventListeners[event],\n !this.options.preventMouseEventsDefault ? passiveListenerOption : false\n );\n }\n\n // Unbind wheelListener\n this.disableMouseWheelZoom();\n\n // Remove control icons\n this.getPublicInstance().disableControlIcons();\n\n // Reset zoom and pan\n this.reset();\n\n // Remove instance from instancesStore\n instancesStore = instancesStore.filter(function(instance) {\n return instance.svg !== that.svg;\n });\n\n // Delete options and its contents\n delete this.options;\n\n // Delete viewport to make public shadow viewport functions uncallable\n delete this.viewport;\n\n // Destroy public instance and rewrite getPublicInstance\n delete this.publicInstance;\n delete this.pi;\n this.getPublicInstance = function() {\n return null;\n };\n};\n\n/**\n * Returns a public instance object\n *\n * @return {Object} Public instance object\n */\nSvgPanZoom.prototype.getPublicInstance = function() {\n var that = this;\n\n // Create cache\n if (!this.publicInstance) {\n this.publicInstance = this.pi = {\n // Pan\n enablePan: function() {\n that.options.panEnabled = true;\n return that.pi;\n },\n disablePan: function() {\n that.options.panEnabled = false;\n return that.pi;\n },\n isPanEnabled: function() {\n return !!that.options.panEnabled;\n },\n pan: function(point) {\n that.pan(point);\n return that.pi;\n },\n panBy: function(point) {\n that.panBy(point);\n return that.pi;\n },\n getPan: function() {\n return that.getPan();\n },\n // Pan event\n setBeforePan: function(fn) {\n that.options.beforePan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnPan: function(fn) {\n that.options.onPan =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zoom and Control Icons\n enableZoom: function() {\n that.options.zoomEnabled = true;\n return that.pi;\n },\n disableZoom: function() {\n that.options.zoomEnabled = false;\n return that.pi;\n },\n isZoomEnabled: function() {\n return !!that.options.zoomEnabled;\n },\n enableControlIcons: function() {\n if (!that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = true;\n ControlIcons.enable(that);\n }\n return that.pi;\n },\n disableControlIcons: function() {\n if (that.options.controlIconsEnabled) {\n that.options.controlIconsEnabled = false;\n ControlIcons.disable(that);\n }\n return that.pi;\n },\n isControlIconsEnabled: function() {\n return !!that.options.controlIconsEnabled;\n },\n // Double click zoom\n enableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = true;\n return that.pi;\n },\n disableDblClickZoom: function() {\n that.options.dblClickZoomEnabled = false;\n return that.pi;\n },\n isDblClickZoomEnabled: function() {\n return !!that.options.dblClickZoomEnabled;\n },\n // Mouse wheel zoom\n enableMouseWheelZoom: function() {\n that.enableMouseWheelZoom();\n return that.pi;\n },\n disableMouseWheelZoom: function() {\n that.disableMouseWheelZoom();\n return that.pi;\n },\n isMouseWheelZoomEnabled: function() {\n return !!that.options.mouseWheelZoomEnabled;\n },\n // Zoom scale and bounds\n setZoomScaleSensitivity: function(scale) {\n that.options.zoomScaleSensitivity = scale;\n return that.pi;\n },\n setMinZoom: function(zoom) {\n that.options.minZoom = zoom;\n return that.pi;\n },\n setMaxZoom: function(zoom) {\n that.options.maxZoom = zoom;\n return that.pi;\n },\n // Zoom event\n setBeforeZoom: function(fn) {\n that.options.beforeZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n setOnZoom: function(fn) {\n that.options.onZoom =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Zooming\n zoom: function(scale) {\n that.publicZoom(scale, true);\n return that.pi;\n },\n zoomBy: function(scale) {\n that.publicZoom(scale, false);\n return that.pi;\n },\n zoomAtPoint: function(scale, point) {\n that.publicZoomAtPoint(scale, point, true);\n return that.pi;\n },\n zoomAtPointBy: function(scale, point) {\n that.publicZoomAtPoint(scale, point, false);\n return that.pi;\n },\n zoomIn: function() {\n this.zoomBy(1 + that.options.zoomScaleSensitivity);\n return that.pi;\n },\n zoomOut: function() {\n this.zoomBy(1 / (1 + that.options.zoomScaleSensitivity));\n return that.pi;\n },\n getZoom: function() {\n return that.getRelativeZoom();\n },\n // CTM update\n setOnUpdatedCTM: function(fn) {\n that.options.onUpdatedCTM =\n fn === null ? null : Utils.proxy(fn, that.publicInstance);\n return that.pi;\n },\n // Reset\n resetZoom: function() {\n that.resetZoom();\n return that.pi;\n },\n resetPan: function() {\n that.resetPan();\n return that.pi;\n },\n reset: function() {\n that.reset();\n return that.pi;\n },\n // Fit, Contain and Center\n fit: function() {\n that.fit();\n return that.pi;\n },\n contain: function() {\n that.contain();\n return that.pi;\n },\n center: function() {\n that.center();\n return that.pi;\n },\n // Size and Resize\n updateBBox: function() {\n that.updateBBox();\n return that.pi;\n },\n resize: function() {\n that.resize();\n return that.pi;\n },\n getSizes: function() {\n return {\n width: that.width,\n height: that.height,\n realZoom: that.getZoom(),\n viewBox: that.viewport.getViewBox()\n };\n },\n // Destroy\n destroy: function() {\n that.destroy();\n return that.pi;\n }\n };\n }\n\n return this.publicInstance;\n};\n\n/**\n * Stores pairs of instances of SvgPanZoom and SVG\n * Each pair is represented by an object {svg: SVGSVGElement, instance: SvgPanZoom}\n *\n * @type {Array}\n */\nvar instancesStore = [];\n\nvar svgPanZoom = function(elementOrSelector, options) {\n var svg = Utils.getSvg(elementOrSelector);\n\n if (svg === null) {\n return null;\n } else {\n // Look for existent instance\n for (var i = instancesStore.length - 1; i >= 0; i--) {\n if (instancesStore[i].svg === svg) {\n return instancesStore[i].instance.getPublicInstance();\n }\n }\n\n // If instance not found - create one\n instancesStore.push({\n svg: svg,\n instance: new SvgPanZoom(svg, options)\n });\n\n // Return just pushed instance\n return instancesStore[\n instancesStore.length - 1\n ].instance.getPublicInstance();\n }\n};\n\nmodule.exports = svgPanZoom;\n","// uniwheel 0.1.2 (customized)\n// A unified cross browser mouse wheel event handler\n// https://github.com/teemualap/uniwheel\n\nmodule.exports = (function(){\n\n //Full details: https://developer.mozilla.org/en-US/docs/Web/Reference/Events/wheel\n\n var prefix = \"\", _addEventListener, _removeEventListener, support, fns = [];\n var passiveOption = {passive: true};\n\n // detect event model\n if ( window.addEventListener ) {\n _addEventListener = \"addEventListener\";\n _removeEventListener = \"removeEventListener\";\n } else {\n _addEventListener = \"attachEvent\";\n _removeEventListener = \"detachEvent\";\n prefix = \"on\";\n }\n\n // detect available wheel event\n support = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\n document.onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\n\n\n function createCallback(element,callback) {\n\n var fn = function(originalEvent) {\n\n !originalEvent && ( originalEvent = window.event );\n\n // create a normalized event object\n var event = {\n // keep a ref to the original event object\n originalEvent: originalEvent,\n target: originalEvent.target || originalEvent.srcElement,\n type: \"wheel\",\n deltaMode: originalEvent.type == \"MozMousePixelScroll\" ? 0 : 1,\n deltaX: 0,\n delatZ: 0,\n preventDefault: function() {\n originalEvent.preventDefault ?\n originalEvent.preventDefault() :\n originalEvent.returnValue = false;\n }\n };\n\n // calculate deltaY (and deltaX) according to the event\n if ( support == \"mousewheel\" ) {\n event.deltaY = - 1/40 * originalEvent.wheelDelta;\n // Webkit also support wheelDeltaX\n originalEvent.wheelDeltaX && ( event.deltaX = - 1/40 * originalEvent.wheelDeltaX );\n } else {\n event.deltaY = originalEvent.detail;\n }\n\n // it's time to fire the callback\n return callback( event );\n\n };\n\n fns.push({\n element: element,\n fn: fn,\n });\n\n return fn;\n }\n\n function getCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns[i].fn;\n }\n }\n return function(){};\n }\n\n function removeCallback(element) {\n for (var i = 0; i < fns.length; i++) {\n if (fns[i].element === element) {\n return fns.splice(i,1);\n }\n }\n }\n\n function _addWheelListener(elem, eventName, callback, isPassiveListener ) {\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = createCallback(elem, callback);\n }\n\n elem[_addEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false);\n }\n\n function _removeWheelListener(elem, eventName, callback, isPassiveListener ) {\n\n var cb;\n\n if (support === \"wheel\") {\n cb = callback;\n } else {\n cb = getCallback(elem);\n }\n\n elem[_removeEventListener](prefix + eventName, cb, isPassiveListener ? passiveOption : false);\n\n removeCallback(elem);\n }\n\n function addWheelListener( elem, callback, isPassiveListener ) {\n _addWheelListener(elem, support, callback, isPassiveListener );\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _addWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener );\n }\n }\n\n function removeWheelListener(elem, callback, isPassiveListener){\n _removeWheelListener(elem, support, callback, isPassiveListener);\n\n // handle MozMousePixelScroll in older Firefox\n if( support == \"DOMMouseScroll\" ) {\n _removeWheelListener(elem, \"MozMousePixelScroll\", callback, isPassiveListener);\n }\n }\n\n return {\n on: addWheelListener,\n off: removeWheelListener\n };\n\n})();\n","var SvgUtils = require(\"./svg-utilities\");\n\nmodule.exports = {\n enable: function(instance) {\n // Select (and create if necessary) defs\n var defs = instance.svg.querySelector(\"defs\");\n if (!defs) {\n defs = document.createElementNS(SvgUtils.svgNS, \"defs\");\n instance.svg.appendChild(defs);\n }\n\n // Check for style element, and create it if it doesn't exist\n var styleEl = defs.querySelector(\"style#svg-pan-zoom-controls-styles\");\n if (!styleEl) {\n var style = document.createElementNS(SvgUtils.svgNS, \"style\");\n style.setAttribute(\"id\", \"svg-pan-zoom-controls-styles\");\n style.setAttribute(\"type\", \"text/css\");\n style.textContent =\n \".svg-pan-zoom-control { cursor: pointer; fill: black; fill-opacity: 0.333; } .svg-pan-zoom-control:hover { fill-opacity: 0.8; } .svg-pan-zoom-control-background { fill: white; fill-opacity: 0.5; } .svg-pan-zoom-control-background { fill-opacity: 0.8; }\";\n defs.appendChild(style);\n }\n\n // Zoom Group\n var zoomGroup = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomGroup.setAttribute(\"id\", \"svg-pan-zoom-controls\");\n zoomGroup.setAttribute(\n \"transform\",\n \"translate(\" +\n (instance.width - 70) +\n \" \" +\n (instance.height - 76) +\n \") scale(0.75)\"\n );\n zoomGroup.setAttribute(\"class\", \"svg-pan-zoom-control\");\n\n // Control elements\n zoomGroup.appendChild(this._createZoomIn(instance));\n zoomGroup.appendChild(this._createZoomReset(instance));\n zoomGroup.appendChild(this._createZoomOut(instance));\n\n // Finally append created element\n instance.svg.appendChild(zoomGroup);\n\n // Cache control instance\n instance.controlIcons = zoomGroup;\n },\n\n _createZoomIn: function(instance) {\n var zoomIn = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomIn.setAttribute(\"id\", \"svg-pan-zoom-zoom-in\");\n zoomIn.setAttribute(\"transform\", \"translate(30.5 5) scale(0.015)\");\n zoomIn.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomIn.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n zoomIn.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomIn();\n },\n false\n );\n\n var zoomInBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomInBackground.setAttribute(\"x\", \"0\");\n zoomInBackground.setAttribute(\"y\", \"0\");\n zoomInBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomInBackground.setAttribute(\"height\", \"1400\");\n zoomInBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomIn.appendChild(zoomInBackground);\n\n var zoomInShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomInShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z\"\n );\n zoomInShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomIn.appendChild(zoomInShape);\n\n return zoomIn;\n },\n\n _createZoomReset: function(instance) {\n // reset\n var resetPanZoomControl = document.createElementNS(SvgUtils.svgNS, \"g\");\n resetPanZoomControl.setAttribute(\"id\", \"svg-pan-zoom-reset-pan-zoom\");\n resetPanZoomControl.setAttribute(\"transform\", \"translate(5 35) scale(0.4)\");\n resetPanZoomControl.setAttribute(\"class\", \"svg-pan-zoom-control\");\n resetPanZoomControl.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n resetPanZoomControl.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().reset();\n },\n false\n );\n\n var resetPanZoomControlBackground = document.createElementNS(\n SvgUtils.svgNS,\n \"rect\"\n ); // TODO change these background space fillers to rounded rectangles so they look prettier\n resetPanZoomControlBackground.setAttribute(\"x\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"y\", \"2\");\n resetPanZoomControlBackground.setAttribute(\"width\", \"182\"); // larger than expected because the whole group is transformed to scale down\n resetPanZoomControlBackground.setAttribute(\"height\", \"58\");\n resetPanZoomControlBackground.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-background\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlBackground);\n\n var resetPanZoomControlShape1 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"d\",\n \"M33.051,20.632c-0.742-0.406-1.854-0.609-3.338-0.609h-7.969v9.281h7.769c1.543,0,2.701-0.188,3.473-0.562c1.365-0.656,2.048-1.953,2.048-3.891C35.032,22.757,34.372,21.351,33.051,20.632z\"\n );\n resetPanZoomControlShape1.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape1);\n\n var resetPanZoomControlShape2 = document.createElementNS(\n SvgUtils.svgNS,\n \"path\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"d\",\n \"M170.231,0.5H15.847C7.102,0.5,0.5,5.708,0.5,11.84v38.861C0.5,56.833,7.102,61.5,15.847,61.5h154.384c8.745,0,15.269-4.667,15.269-10.798V11.84C185.5,5.708,178.976,0.5,170.231,0.5z M42.837,48.569h-7.969c-0.219-0.766-0.375-1.383-0.469-1.852c-0.188-0.969-0.289-1.961-0.305-2.977l-0.047-3.211c-0.03-2.203-0.41-3.672-1.142-4.406c-0.732-0.734-2.103-1.102-4.113-1.102h-7.05v13.547h-7.055V14.022h16.524c2.361,0.047,4.178,0.344,5.45,0.891c1.272,0.547,2.351,1.352,3.234,2.414c0.731,0.875,1.31,1.844,1.737,2.906s0.64,2.273,0.64,3.633c0,1.641-0.414,3.254-1.242,4.84s-2.195,2.707-4.102,3.363c1.594,0.641,2.723,1.551,3.387,2.73s0.996,2.98,0.996,5.402v2.32c0,1.578,0.063,2.648,0.19,3.211c0.19,0.891,0.635,1.547,1.333,1.969V48.569z M75.579,48.569h-26.18V14.022h25.336v6.117H56.454v7.336h16.781v6H56.454v8.883h19.125V48.569z M104.497,46.331c-2.44,2.086-5.887,3.129-10.34,3.129c-4.548,0-8.125-1.027-10.731-3.082s-3.909-4.879-3.909-8.473h6.891c0.224,1.578,0.662,2.758,1.316,3.539c1.196,1.422,3.246,2.133,6.15,2.133c1.739,0,3.151-0.188,4.236-0.562c2.058-0.719,3.087-2.055,3.087-4.008c0-1.141-0.504-2.023-1.512-2.648c-1.008-0.609-2.607-1.148-4.796-1.617l-3.74-0.82c-3.676-0.812-6.201-1.695-7.576-2.648c-2.328-1.594-3.492-4.086-3.492-7.477c0-3.094,1.139-5.664,3.417-7.711s5.623-3.07,10.036-3.07c3.685,0,6.829,0.965,9.431,2.895c2.602,1.93,3.966,4.73,4.093,8.402h-6.938c-0.128-2.078-1.057-3.555-2.787-4.43c-1.154-0.578-2.587-0.867-4.301-0.867c-1.907,0-3.428,0.375-4.565,1.125c-1.138,0.75-1.706,1.797-1.706,3.141c0,1.234,0.561,2.156,1.682,2.766c0.721,0.406,2.25,0.883,4.589,1.43l6.063,1.43c2.657,0.625,4.648,1.461,5.975,2.508c2.059,1.625,3.089,3.977,3.089,7.055C108.157,41.624,106.937,44.245,104.497,46.331z M139.61,48.569h-26.18V14.022h25.336v6.117h-18.281v7.336h16.781v6h-16.781v8.883h19.125V48.569z M170.337,20.14h-10.336v28.43h-7.266V20.14h-10.383v-6.117h27.984V20.14z\"\n );\n resetPanZoomControlShape2.setAttribute(\n \"class\",\n \"svg-pan-zoom-control-element\"\n );\n resetPanZoomControl.appendChild(resetPanZoomControlShape2);\n\n return resetPanZoomControl;\n },\n\n _createZoomOut: function(instance) {\n // zoom out\n var zoomOut = document.createElementNS(SvgUtils.svgNS, \"g\");\n zoomOut.setAttribute(\"id\", \"svg-pan-zoom-zoom-out\");\n zoomOut.setAttribute(\"transform\", \"translate(30.5 70) scale(0.015)\");\n zoomOut.setAttribute(\"class\", \"svg-pan-zoom-control\");\n zoomOut.addEventListener(\n \"click\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n zoomOut.addEventListener(\n \"touchstart\",\n function() {\n instance.getPublicInstance().zoomOut();\n },\n false\n );\n\n var zoomOutBackground = document.createElementNS(SvgUtils.svgNS, \"rect\"); // TODO change these background space fillers to rounded rectangles so they look prettier\n zoomOutBackground.setAttribute(\"x\", \"0\");\n zoomOutBackground.setAttribute(\"y\", \"0\");\n zoomOutBackground.setAttribute(\"width\", \"1500\"); // larger than expected because the whole group is transformed to scale down\n zoomOutBackground.setAttribute(\"height\", \"1400\");\n zoomOutBackground.setAttribute(\"class\", \"svg-pan-zoom-control-background\");\n zoomOut.appendChild(zoomOutBackground);\n\n var zoomOutShape = document.createElementNS(SvgUtils.svgNS, \"path\");\n zoomOutShape.setAttribute(\n \"d\",\n \"M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z\"\n );\n zoomOutShape.setAttribute(\"class\", \"svg-pan-zoom-control-element\");\n zoomOut.appendChild(zoomOutShape);\n\n return zoomOut;\n },\n\n disable: function(instance) {\n if (instance.controlIcons) {\n instance.controlIcons.parentNode.removeChild(instance.controlIcons);\n instance.controlIcons = null;\n }\n }\n};\n","var SvgUtils = require(\"./svg-utilities\"),\n Utils = require(\"./utilities\");\n\nvar ShadowViewport = function(viewport, options) {\n this.init(viewport, options);\n};\n\n/**\n * Initialization\n *\n * @param {SVGElement} viewport\n * @param {Object} options\n */\nShadowViewport.prototype.init = function(viewport, options) {\n // DOM Elements\n this.viewport = viewport;\n this.options = options;\n\n // State cache\n this.originalState = { zoom: 1, x: 0, y: 0 };\n this.activeState = { zoom: 1, x: 0, y: 0 };\n\n this.updateCTMCached = Utils.proxy(this.updateCTM, this);\n\n // Create a custom requestAnimationFrame taking in account refreshRate\n this.requestAnimationFrame = Utils.createRequestAnimationFrame(\n this.options.refreshRate\n );\n\n // ViewBox\n this.viewBox = { x: 0, y: 0, width: 0, height: 0 };\n this.cacheViewBox();\n\n // Process CTM\n var newCTM = this.processCTM();\n\n // Update viewport CTM and cache zoom and pan\n this.setCTM(newCTM);\n\n // Update CTM in this frame\n this.updateCTM();\n};\n\n/**\n * Cache initial viewBox value\n * If no viewBox is defined, then use viewport size/position instead for viewBox values\n */\nShadowViewport.prototype.cacheViewBox = function() {\n var svgViewBox = this.options.svg.getAttribute(\"viewBox\");\n\n if (svgViewBox) {\n var viewBoxValues = svgViewBox\n .split(/[\\s\\,]/)\n .filter(function(v) {\n return v;\n })\n .map(parseFloat);\n\n // Cache viewbox x and y offset\n this.viewBox.x = viewBoxValues[0];\n this.viewBox.y = viewBoxValues[1];\n this.viewBox.width = viewBoxValues[2];\n this.viewBox.height = viewBoxValues[3];\n\n var zoom = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n\n // Update active state\n this.activeState.zoom = zoom;\n this.activeState.x = (this.options.width - this.viewBox.width * zoom) / 2;\n this.activeState.y = (this.options.height - this.viewBox.height * zoom) / 2;\n\n // Force updating CTM\n this.updateCTMOnNextFrame();\n\n this.options.svg.removeAttribute(\"viewBox\");\n } else {\n this.simpleViewBoxCache();\n }\n};\n\n/**\n * Recalculate viewport sizes and update viewBox cache\n */\nShadowViewport.prototype.simpleViewBoxCache = function() {\n var bBox = this.viewport.getBBox();\n\n this.viewBox.x = bBox.x;\n this.viewBox.y = bBox.y;\n this.viewBox.width = bBox.width;\n this.viewBox.height = bBox.height;\n};\n\n/**\n * Returns a viewbox object. Safe to alter\n *\n * @return {Object} viewbox object\n */\nShadowViewport.prototype.getViewBox = function() {\n return Utils.extend({}, this.viewBox);\n};\n\n/**\n * Get initial zoom and pan values. Save them into originalState\n * Parses viewBox attribute to alter initial sizes\n *\n * @return {CTM} CTM object based on options\n */\nShadowViewport.prototype.processCTM = function() {\n var newCTM = this.getCTM();\n\n if (this.options.fit || this.options.contain) {\n var newScale;\n if (this.options.fit) {\n newScale = Math.min(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n } else {\n newScale = Math.max(\n this.options.width / this.viewBox.width,\n this.options.height / this.viewBox.height\n );\n }\n\n newCTM.a = newScale; //x-scale\n newCTM.d = newScale; //y-scale\n newCTM.e = -this.viewBox.x * newScale; //x-transform\n newCTM.f = -this.viewBox.y * newScale; //y-transform\n }\n\n if (this.options.center) {\n var offsetX =\n (this.options.width -\n (this.viewBox.width + this.viewBox.x * 2) * newCTM.a) *\n 0.5,\n offsetY =\n (this.options.height -\n (this.viewBox.height + this.viewBox.y * 2) * newCTM.a) *\n 0.5;\n\n newCTM.e = offsetX;\n newCTM.f = offsetY;\n }\n\n // Cache initial values. Based on activeState and fix+center opitons\n this.originalState.zoom = newCTM.a;\n this.originalState.x = newCTM.e;\n this.originalState.y = newCTM.f;\n\n return newCTM;\n};\n\n/**\n * Return originalState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getOriginalState = function() {\n return Utils.extend({}, this.originalState);\n};\n\n/**\n * Return actualState object. Safe to alter\n *\n * @return {Object}\n */\nShadowViewport.prototype.getState = function() {\n return Utils.extend({}, this.activeState);\n};\n\n/**\n * Get zoom scale\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getZoom = function() {\n return this.activeState.zoom;\n};\n\n/**\n * Get zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.getRelativeZoom = function() {\n return this.activeState.zoom / this.originalState.zoom;\n};\n\n/**\n * Compute zoom scale for pubilc usage\n *\n * @return {Float} zoom scale\n */\nShadowViewport.prototype.computeRelativeZoom = function(scale) {\n return scale / this.originalState.zoom;\n};\n\n/**\n * Get pan\n *\n * @return {Object}\n */\nShadowViewport.prototype.getPan = function() {\n return { x: this.activeState.x, y: this.activeState.y };\n};\n\n/**\n * Return cached viewport CTM value that can be safely modified\n *\n * @return {SVGMatrix}\n */\nShadowViewport.prototype.getCTM = function() {\n var safeCTM = this.options.svg.createSVGMatrix();\n\n // Copy values manually as in FF they are not itterable\n safeCTM.a = this.activeState.zoom;\n safeCTM.b = 0;\n safeCTM.c = 0;\n safeCTM.d = this.activeState.zoom;\n safeCTM.e = this.activeState.x;\n safeCTM.f = this.activeState.y;\n\n return safeCTM;\n};\n\n/**\n * Set a new CTM\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.setCTM = function(newCTM) {\n var willZoom = this.isZoomDifferent(newCTM),\n willPan = this.isPanDifferent(newCTM);\n\n if (willZoom || willPan) {\n // Before zoom\n if (willZoom) {\n // If returns false then cancel zooming\n if (\n this.options.beforeZoom(\n this.getRelativeZoom(),\n this.computeRelativeZoom(newCTM.a)\n ) === false\n ) {\n newCTM.a = newCTM.d = this.activeState.zoom;\n willZoom = false;\n } else {\n this.updateCache(newCTM);\n this.options.onZoom(this.getRelativeZoom());\n }\n }\n\n // Before pan\n if (willPan) {\n var preventPan = this.options.beforePan(this.getPan(), {\n x: newCTM.e,\n y: newCTM.f\n }),\n // If prevent pan is an object\n preventPanX = false,\n preventPanY = false;\n\n // If prevent pan is Boolean false\n if (preventPan === false) {\n // Set x and y same as before\n newCTM.e = this.getPan().x;\n newCTM.f = this.getPan().y;\n\n preventPanX = preventPanY = true;\n } else if (Utils.isObject(preventPan)) {\n // Check for X axes attribute\n if (preventPan.x === false) {\n // Prevent panning on x axes\n newCTM.e = this.getPan().x;\n preventPanX = true;\n } else if (Utils.isNumber(preventPan.x)) {\n // Set a custom pan value\n newCTM.e = preventPan.x;\n }\n\n // Check for Y axes attribute\n if (preventPan.y === false) {\n // Prevent panning on x axes\n newCTM.f = this.getPan().y;\n preventPanY = true;\n } else if (Utils.isNumber(preventPan.y)) {\n // Set a custom pan value\n newCTM.f = preventPan.y;\n }\n }\n\n // Update willPan flag\n // Check if newCTM is still different\n if ((preventPanX && preventPanY) || !this.isPanDifferent(newCTM)) {\n willPan = false;\n } else {\n this.updateCache(newCTM);\n this.options.onPan(this.getPan());\n }\n }\n\n // Check again if should zoom or pan\n if (willZoom || willPan) {\n this.updateCTMOnNextFrame();\n }\n }\n};\n\nShadowViewport.prototype.isZoomDifferent = function(newCTM) {\n return this.activeState.zoom !== newCTM.a;\n};\n\nShadowViewport.prototype.isPanDifferent = function(newCTM) {\n return this.activeState.x !== newCTM.e || this.activeState.y !== newCTM.f;\n};\n\n/**\n * Update cached CTM and active state\n *\n * @param {SVGMatrix} newCTM\n */\nShadowViewport.prototype.updateCache = function(newCTM) {\n this.activeState.zoom = newCTM.a;\n this.activeState.x = newCTM.e;\n this.activeState.y = newCTM.f;\n};\n\nShadowViewport.prototype.pendingUpdate = false;\n\n/**\n * Place a request to update CTM on next Frame\n */\nShadowViewport.prototype.updateCTMOnNextFrame = function() {\n if (!this.pendingUpdate) {\n // Lock\n this.pendingUpdate = true;\n\n // Throttle next update\n this.requestAnimationFrame.call(window, this.updateCTMCached);\n }\n};\n\n/**\n * Update viewport CTM with cached CTM\n */\nShadowViewport.prototype.updateCTM = function() {\n var ctm = this.getCTM();\n\n // Updates SVG element\n SvgUtils.setCTM(this.viewport, ctm, this.defs);\n\n // Free the lock\n this.pendingUpdate = false;\n\n // Notify about the update\n if (this.options.onUpdatedCTM) {\n this.options.onUpdatedCTM(ctm);\n }\n};\n\nmodule.exports = function(viewport, options) {\n return new ShadowViewport(viewport, options);\n};\n"],"sourceRoot":""}