{"version":3,"file":"2332.7a203069.js","mappings":"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","sources":["webpack://@finviz/website/../node_modules/hammerjs/hammer.js"],"sourcesContent":["/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n  'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n        each(arg, context[fn], context);\n        return true;\n    }\n    return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n        return;\n    }\n\n    if (obj.forEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n        i = 0;\n        while (i < obj.length) {\n            iterator.call(context, obj[i], i, obj);\n            i++;\n        }\n    } else {\n        for (i in obj) {\n            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n        }\n    }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n    return function() {\n        var e = new Error('get-stack-trace');\n        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n            .replace(/^\\s+at\\s+/gm, '')\n            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n        var log = window.console && (window.console.warn || window.console.log);\n        if (log) {\n            log.call(window.console, deprecationMessage, stack);\n        }\n        return method.apply(this, arguments);\n    };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n    assign = function assign(target) {\n        if (target === undefined || target === null) {\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        var output = Object(target);\n        for (var index = 1; index < arguments.length; index++) {\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for (var nextKey in source) {\n                    if (source.hasOwnProperty(nextKey)) {\n                        output[nextKey] = source[nextKey];\n                    }\n                }\n            }\n        }\n        return output;\n    };\n} else {\n    assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n    while (i < keys.length) {\n        if (!merge || (merge && dest[keys[i]] === undefined)) {\n            dest[keys[i]] = src[keys[i]];\n        }\n        i++;\n    }\n    return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n    return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n        assign(childP, properties);\n    }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n    return function boundFn() {\n        return fn.apply(context, arguments);\n    };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n        return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n    return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n    return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.addEventListener(type, handler, false);\n    });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.removeEventListener(type, handler, false);\n    });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n    while (node) {\n        if (node == parent) {\n            return true;\n        }\n        node = node.parentNode;\n    }\n    return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n    return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n    return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n        return src.indexOf(find);\n    } else {\n        var i = 0;\n        while (i < src.length) {\n            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n                return i;\n            }\n            i++;\n        }\n        return -1;\n    }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n        var val = key ? src[i][key] : src[i];\n        if (inArray(values, val) < 0) {\n            results.push(src[i]);\n        }\n        values[i] = val;\n        i++;\n    }\n\n    if (sort) {\n        if (!key) {\n            results = results.sort();\n        } else {\n            results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n    }\n\n    return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n    var i = 0;\n    while (i < VENDOR_PREFIXES.length) {\n        prefix = VENDOR_PREFIXES[i];\n        prop = (prefix) ? prefix + camelProp : property;\n\n        if (prop in obj) {\n            return prop;\n        }\n        i++;\n    }\n    return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n    return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n    var doc = element.ownerDocument || element;\n    return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget;\n\n    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n    this.domHandler = function(ev) {\n        if (boolOrFn(manager.options.enable, [manager])) {\n            self.handler(ev);\n        }\n    };\n\n    this.init();\n\n}\n\nInput.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function() { },\n\n    /**\n     * bind the events\n     */\n    init: function() {\n        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function() {\n        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n        Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n        Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n        Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n        Type = MouseInput;\n    } else {\n        Type = TouchMouseInput;\n    }\n    return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n        manager.session = {};\n    }\n\n    // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n    input.eventType = eventType;\n\n    // compute scale, rotation etc\n    computeInputData(manager, input);\n\n    // emit secret event\n    manager.emit('hammer.input', input);\n\n    manager.recognize(input);\n    manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length;\n\n    // store the first input to calculate the distance and direction\n    if (!session.firstInput) {\n        session.firstInput = simpleCloneInputData(input);\n    }\n\n    // to compute scale and rotation we need to store the multiple touches\n    if (pointersLength > 1 && !session.firstMultiple) {\n        session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n        session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n    input.overallVelocityX = overallVelocity.x;\n    input.overallVelocityY = overallVelocity.y;\n    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n    computeIntervalInputData(session, input);\n\n    // find the correct target\n    var target = manager.element;\n    if (hasParent(input.srcEvent.target, target)) {\n        target = input.srcEvent.target;\n    }\n    input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n        prevDelta = session.prevDelta = {\n            x: prevInput.deltaX || 0,\n            y: prevInput.deltaY || 0\n        };\n\n        offset = session.offsetDelta = {\n            x: center.x,\n            y: center.y\n        };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity, velocityX, velocityY, direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n        var deltaX = input.deltaX - last.deltaX;\n        var deltaY = input.deltaY - last.deltaY;\n\n        var v = getVelocity(deltaTime, deltaX, deltaY);\n        velocityX = v.x;\n        velocityY = v.y;\n        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n        direction = getDirection(deltaX, deltaY);\n\n        session.lastInterval = input;\n    } else {\n        // use latest velocity info if it doesn't overtake a minimum period\n        velocity = last.velocity;\n        velocityX = last.velocityX;\n        velocityY = last.velocityY;\n        direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n    while (i < input.pointers.length) {\n        pointers[i] = {\n            clientX: round(input.pointers[i].clientX),\n            clientY: round(input.pointers[i].clientY)\n        };\n        i++;\n    }\n\n    return {\n        timeStamp: now(),\n        pointers: pointers,\n        center: getCenter(pointers),\n        deltaX: input.deltaX,\n        deltaY: input.deltaY\n    };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n    var pointersLength = pointers.length;\n\n    // no need to loop when only one touch\n    if (pointersLength === 1) {\n        return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n    }\n\n    var x = 0, y = 0, i = 0;\n    while (i < pointersLength) {\n        x += pointers[i].clientX;\n        y += pointers[i].clientY;\n        i++;\n    }\n\n    return {\n        x: round(x / pointersLength),\n        y: round(y / pointersLength)\n    };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n    return {\n        x: x / deltaTime || 0,\n        y: y / deltaTime || 0\n    };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n    if (x === y) {\n        return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n\n    return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n        // on start we want to have the left mouse button down\n        if (eventType & INPUT_START && ev.button === 0) {\n            this.pressed = true;\n        }\n\n        if (eventType & INPUT_MOVE && ev.which !== 1) {\n            eventType = INPUT_END;\n        }\n\n        // mouse must be down\n        if (!this.pressed) {\n            return;\n        }\n\n        if (eventType & INPUT_END) {\n            this.pressed = false;\n        }\n\n        this.callback(this.manager, eventType, {\n            pointers: [ev],\n            changedPointers: [ev],\n            pointerType: INPUT_TYPE_MOUSE,\n            srcEvent: ev\n        });\n    }\n});\n\nvar POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n\n    Input.apply(this, arguments);\n\n    this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n        var store = this.store;\n        var removePointer = false;\n\n        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n        // get index of the event in the store\n        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n        // start and mouse must be down\n        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n            if (storeIndex < 0) {\n                store.push(ev);\n                storeIndex = store.length - 1;\n            }\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n            removePointer = true;\n        }\n\n        // it not found, so the pointer hasn't been down (so it's probably a hover)\n        if (storeIndex < 0) {\n            return;\n        }\n\n        // update the event in the store\n        store[storeIndex] = ev;\n\n        this.callback(this.manager, eventType, {\n            pointers: store,\n            changedPointers: [ev],\n            pointerType: pointerType,\n            srcEvent: ev\n        });\n\n        if (removePointer) {\n            // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n\n    Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n        // should we handle the touch events?\n        if (type === INPUT_START) {\n            this.started = true;\n        }\n\n        if (!this.started) {\n            return;\n        }\n\n        var touches = normalizeSingleTouches.call(this, ev, type);\n\n        // when done, reset the started state\n        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n            this.started = false;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n        all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n\n    Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n        var type = TOUCH_INPUT_MAP[ev.type];\n        var touches = getTouches.call(this, ev, type);\n        if (!touches) {\n            return;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds;\n\n    // when there is only one touch, the process can be simplified\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n        targetIds[allTouches[0].identifier] = true;\n        return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target;\n\n    // get target touches from touches\n    targetTouches = allTouches.filter(function(touch) {\n        return hasParent(touch.target, target);\n    });\n\n    // collect touches\n    if (type === INPUT_START) {\n        i = 0;\n        while (i < targetTouches.length) {\n            targetIds[targetTouches[i].identifier] = true;\n            i++;\n        }\n    }\n\n    // filter changed touches to only contain touches that exist in the collected target ids\n    i = 0;\n    while (i < changedTouches.length) {\n        if (targetIds[changedTouches[i].identifier]) {\n            changedTargetTouches.push(changedTouches[i]);\n        }\n\n        // cleanup removed touches\n        if (type & (INPUT_END | INPUT_CANCEL)) {\n            delete targetIds[changedTouches[i].identifier];\n        }\n        i++;\n    }\n\n    if (!changedTargetTouches.length) {\n        return;\n    }\n\n    return [\n        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n        changedTargetTouches\n    ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n    Input.apply(this, arguments);\n\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n\n    this.primaryTouch = null;\n    this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n            return;\n        }\n\n        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n        if (isTouch) {\n            recordTouches.call(this, inputEvent, inputData);\n        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n            return;\n        }\n\n        this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n        this.touch.destroy();\n        this.mouse.destroy();\n    }\n});\n\nfunction recordTouches(eventType, eventData) {\n    if (eventType & INPUT_START) {\n        this.primaryTouch = eventData.changedPointers[0].identifier;\n        setLastTouch.call(this, eventData);\n    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n        setLastTouch.call(this, eventData);\n    }\n}\n\nfunction setLastTouch(eventData) {\n    var touch = eventData.changedPointers[0];\n\n    if (touch.identifier === this.primaryTouch) {\n        var lastTouch = {x: touch.clientX, y: touch.clientY};\n        this.lastTouches.push(lastTouch);\n        var lts = this.lastTouches;\n        var removeLastTouch = function() {\n            var i = lts.indexOf(lastTouch);\n            if (i > -1) {\n                lts.splice(i, 1);\n            }\n        };\n        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n    }\n}\n\nfunction isSyntheticEvent(eventData) {\n    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n    for (var i = 0; i < this.lastTouches.length; i++) {\n        var t = this.lastTouches[i];\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n}\n\nTouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function(value) {\n        // find out the touch-action by the event handlers\n        if (value == TOUCH_ACTION_COMPUTE) {\n            value = this.compute();\n        }\n\n        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n        }\n        this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function() {\n        this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function() {\n        var actions = [];\n        each(this.manager.recognizers, function(recognizer) {\n            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n                actions = actions.concat(recognizer.getTouchAction());\n            }\n        });\n        return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function(input) {\n        var srcEvent = input.srcEvent;\n        var direction = input.offsetDirection;\n\n        // if the touch action did prevented once this session\n        if (this.manager.session.prevented) {\n            srcEvent.preventDefault();\n            return;\n        }\n\n        var actions = this.actions;\n        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n        if (hasNone) {\n            //do not prevent defaults if this is a tap gesture\n\n            var isTapPointer = input.pointers.length === 1;\n            var isTapMovement = input.distance < 2;\n            var isTapTouchTime = input.deltaTime < 250;\n\n            if (isTapPointer && isTapMovement && isTapTouchTime) {\n                return;\n            }\n        }\n\n        if (hasPanX && hasPanY) {\n            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n        }\n\n        if (hasNone ||\n            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n            (hasPanX && direction & DIRECTION_VERTICAL)) {\n            return this.preventSrc(srcEvent);\n        }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function(srcEvent) {\n        this.manager.session.prevented = true;\n        srcEvent.preventDefault();\n    }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n    // if both pan-x and pan-y are set (different recognizers\n    // for different directions, e.g. horizontal pan but vertical swipe?)\n    // we need none (as otherwise with pan-x pan-y combined none of these\n    // recognizers will work, since the browser would handle all panning\n    if (hasPanX && hasPanY) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    // pan-x OR pan-y\n    if (hasPanX || hasPanY) {\n        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    }\n\n    // manipulation\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n        return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n    if (!NATIVE_TOUCH_ACTION) {\n        return false;\n    }\n    var touchMap = {};\n    var cssSupports = window.CSS && window.CSS.supports;\n    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n        // If css.supports is not supported but there is native touch-action assume it supports\n        // all values. This is the case for IE 10 and 11.\n        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n    });\n    return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n    this.options = assign({}, this.defaults, options || {});\n\n    this.id = uniqueId();\n\n    this.manager = null;\n\n    // default is enable true\n    this.options.enable = ifUndefined(this.options.enable, true);\n\n    this.state = STATE_POSSIBLE;\n\n    this.simultaneous = {};\n    this.requireFail = [];\n}\n\nRecognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // also update the touchAction, in case something changed about the directions/enabled state\n        this.manager && this.manager.touchAction.update();\n        return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n            return this;\n        }\n\n        var simultaneous = this.simultaneous;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (!simultaneous[otherRecognizer.id]) {\n            simultaneous[otherRecognizer.id] = otherRecognizer;\n            otherRecognizer.recognizeWith(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        delete this.simultaneous[otherRecognizer.id];\n        return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n            return this;\n        }\n\n        var requireFail = this.requireFail;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (inArray(requireFail, otherRecognizer) === -1) {\n            requireFail.push(otherRecognizer);\n            otherRecognizer.requireFailure(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        var index = inArray(this.requireFail, otherRecognizer);\n        if (index > -1) {\n            this.requireFail.splice(index, 1);\n        }\n        return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function() {\n        return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function(otherRecognizer) {\n        return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function(input) {\n        var self = this;\n        var state = this.state;\n\n        function emit(event) {\n            self.manager.emit(event, input);\n        }\n\n        // 'panstart' and 'panmove'\n        if (state < STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n\n        emit(self.options.event); // simple 'eventName' events\n\n        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n            emit(input.additionalEvent);\n        }\n\n        // panend and pancancel\n        if (state >= STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function(input) {\n        if (this.canEmit()) {\n            return this.emit(input);\n        }\n        // it's failing anyway\n        this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function() {\n        var i = 0;\n        while (i < this.requireFail.length) {\n            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n                return false;\n            }\n            i++;\n        }\n        return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        // make a new copy of the inputData\n        // so we can change the inputData without messing up the other recognizers\n        var inputDataClone = assign({}, inputData);\n\n        // is is enabled and allow recognizing?\n        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n            this.reset();\n            this.state = STATE_FAILED;\n            return;\n        }\n\n        // reset when we've reached the end\n        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n            this.state = STATE_POSSIBLE;\n        }\n\n        this.state = this.process(inputDataClone);\n\n        // the recognizer has recognized a gesture\n        // so trigger an event\n        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n            this.tryEmit(inputDataClone);\n        }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function(inputData) { }, // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function() { },\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n    if (state & STATE_CANCELLED) {\n        return 'cancel';\n    } else if (state & STATE_ENDED) {\n        return 'end';\n    } else if (state & STATE_CHANGED) {\n        return 'move';\n    } else if (state & STATE_BEGAN) {\n        return 'start';\n    }\n    return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n        return 'down';\n    } else if (direction == DIRECTION_UP) {\n        return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n        return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n        return 'right';\n    }\n    return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n    if (manager) {\n        return manager.get(otherRecognizer);\n    }\n    return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n        /**\n         * @type {Number}\n         * @default 1\n         */\n        pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function(input) {\n        var optionPointers = this.options.pointers;\n        return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function(input) {\n        var state = this.state;\n        var eventType = input.eventType;\n\n        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n        var isValid = this.attrTest(input);\n\n        // on cancel input and we've recognized before, return STATE_CANCELLED\n        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n            return state | STATE_CANCELLED;\n        } else if (isRecognized || isValid) {\n            if (eventType & INPUT_END) {\n                return state | STATE_ENDED;\n            } else if (!(state & STATE_BEGAN)) {\n                return STATE_BEGAN;\n            }\n            return state | STATE_CHANGED;\n        }\n        return STATE_FAILED;\n    }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n\n    this.pX = null;\n    this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n        event: 'pan',\n        threshold: 10,\n        pointers: 1,\n        direction: DIRECTION_ALL\n    },\n\n    getTouchAction: function() {\n        var direction = this.options.direction;\n        var actions = [];\n        if (direction & DIRECTION_HORIZONTAL) {\n            actions.push(TOUCH_ACTION_PAN_Y);\n        }\n        if (direction & DIRECTION_VERTICAL) {\n            actions.push(TOUCH_ACTION_PAN_X);\n        }\n        return actions;\n    },\n\n    directionTest: function(input) {\n        var options = this.options;\n        var hasMoved = true;\n        var distance = input.distance;\n        var direction = input.direction;\n        var x = input.deltaX;\n        var y = input.deltaY;\n\n        // lock to axis?\n        if (!(direction & options.direction)) {\n            if (options.direction & DIRECTION_HORIZONTAL) {\n                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                hasMoved = x != this.pX;\n                distance = Math.abs(input.deltaX);\n            } else {\n                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n                hasMoved = y != this.pY;\n                distance = Math.abs(input.deltaY);\n            }\n        }\n        input.direction = direction;\n        return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n\n    attrTest: function(input) {\n        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n    },\n\n    emit: function(input) {\n\n        this.pX = input.deltaX;\n        this.pY = input.deltaY;\n\n        var direction = directionStr(input.direction);\n\n        if (direction) {\n            input.additionalEvent = this.options.event + direction;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'pinch',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n\n    emit: function(input) {\n        if (input.scale !== 1) {\n            var inOut = input.scale < 1 ? 'in' : 'out';\n            input.additionalEvent = this.options.event + inOut;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    this._timer = null;\n    this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n        event: 'press',\n        pointers: 1,\n        time: 251, // minimal time of the pointer to be pressed\n        threshold: 9 // a minimal movement is ok, but keep it low\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_AUTO];\n    },\n\n    process: function(input) {\n        var options = this.options;\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTime = input.deltaTime > options.time;\n\n        this._input = input;\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n            this.reset();\n        } else if (input.eventType & INPUT_START) {\n            this.reset();\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_RECOGNIZED;\n                this.tryEmit();\n            }, options.time, this);\n        } else if (input.eventType & INPUT_END) {\n            return STATE_RECOGNIZED;\n        }\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function(input) {\n        if (this.state !== STATE_RECOGNIZED) {\n            return;\n        }\n\n        if (input && (input.eventType & INPUT_END)) {\n            this.manager.emit(this.options.event + 'up', input);\n        } else {\n            this._input.timeStamp = now();\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n        event: 'rotate',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n        event: 'swipe',\n        threshold: 10,\n        velocity: 0.3,\n        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n        pointers: 1\n    },\n\n    getTouchAction: function() {\n        return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n\n    attrTest: function(input) {\n        var direction = this.options.direction;\n        var velocity;\n\n        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n            velocity = input.overallVelocity;\n        } else if (direction & DIRECTION_HORIZONTAL) {\n            velocity = input.overallVelocityX;\n        } else if (direction & DIRECTION_VERTICAL) {\n            velocity = input.overallVelocityY;\n        }\n\n        return this._super.attrTest.call(this, input) &&\n            direction & input.offsetDirection &&\n            input.distance > this.options.threshold &&\n            input.maxPointers == this.options.pointers &&\n            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n\n    emit: function(input) {\n        var direction = directionStr(input.offsetDirection);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this.manager.emit(this.options.event, input);\n    }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    // previous time and center,\n    // used for tap counting\n    this.pTime = false;\n    this.pCenter = false;\n\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'tap',\n        pointers: 1,\n        taps: 1,\n        interval: 300, // max time between the multi-tap taps\n        time: 250, // max time of the pointer to be down (like finger on the screen)\n        threshold: 9, // a minimal movement is ok, but keep it low\n        posThreshold: 10 // a multi-tap can be a bit off the initial position\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_MANIPULATION];\n    },\n\n    process: function(input) {\n        var options = this.options;\n\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTouchTime = input.deltaTime < options.time;\n\n        this.reset();\n\n        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n            return this.failTimeout();\n        }\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (validMovement && validTouchTime && validPointers) {\n            if (input.eventType != INPUT_END) {\n                return this.failTimeout();\n            }\n\n            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n            this.pTime = input.timeStamp;\n            this.pCenter = input.center;\n\n            if (!validMultiTap || !validInterval) {\n                this.count = 1;\n            } else {\n                this.count += 1;\n            }\n\n            this._input = input;\n\n            // if tap count matches we have recognized it,\n            // else it has began recognizing...\n            var tapCount = this.count % options.taps;\n            if (tapCount === 0) {\n                // no failing requirements, immediately trigger the tap event\n                // or wait as long as the multitap interval to trigger\n                if (!this.hasRequireFailures()) {\n                    return STATE_RECOGNIZED;\n                } else {\n                    this._timer = setTimeoutContext(function() {\n                        this.state = STATE_RECOGNIZED;\n                        this.tryEmit();\n                    }, options.interval, this);\n                    return STATE_BEGAN;\n                }\n            }\n        }\n        return STATE_FAILED;\n    },\n\n    failTimeout: function() {\n        this._timer = setTimeoutContext(function() {\n            this.state = STATE_FAILED;\n        }, this.options.interval, this);\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function() {\n        if (this.state == STATE_RECOGNIZED) {\n            this._input.tapCount = this.count;\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [\n        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n        [RotateRecognizer, {enable: false}],\n        [PinchRecognizer, {enable: false}, ['rotate']],\n        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n        [TapRecognizer],\n        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n        [PressRecognizer]\n    ],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n        /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userSelect: 'none',\n\n        /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */\n        touchSelect: 'none',\n\n        /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */\n        touchCallout: 'none',\n\n        /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */\n        contentZooming: 'none',\n\n        /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userDrag: 'none',\n\n        /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */\n        tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n    this.options = assign({}, Hammer.defaults, options || {});\n\n    this.options.inputTarget = this.options.inputTarget || element;\n\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n    this.oldCssProps = {};\n\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n    toggleCssProps(this, true);\n\n    each(this.options.recognizers, function(item) {\n        var recognizer = this.add(new (item[0])(item[1]));\n        item[2] && recognizer.recognizeWith(item[2]);\n        item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n}\n\nManager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // Options that need a little more setup\n        if (options.touchAction) {\n            this.touchAction.update();\n        }\n        if (options.inputTarget) {\n            // Clean up existing event listeners and reinitialize\n            this.input.destroy();\n            this.input.target = options.inputTarget;\n            this.input.init();\n        }\n        return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function(force) {\n        this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        var session = this.session;\n        if (session.stopped) {\n            return;\n        }\n\n        // run the touch-action polyfill\n        this.touchAction.preventDefaults(inputData);\n\n        var recognizer;\n        var recognizers = this.recognizers;\n\n        // this holds the recognizer that is being recognized.\n        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n        // if no recognizer is detecting a thing, it is set to `null`\n        var curRecognizer = session.curRecognizer;\n\n        // reset when the last recognizer is recognized\n        // or when we're in a new session\n        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n            curRecognizer = session.curRecognizer = null;\n        }\n\n        var i = 0;\n        while (i < recognizers.length) {\n            recognizer = recognizers[i];\n\n            // find out if we are allowed try to recognize the input for this one.\n            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n            //      that is being recognized.\n            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n            //      this can be setup with the `recognizeWith()` method on the recognizer.\n            if (session.stopped !== FORCED_STOP && ( // 1\n                    !curRecognizer || recognizer == curRecognizer || // 2\n                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n                recognizer.recognize(inputData);\n            } else {\n                recognizer.reset();\n            }\n\n            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n            // current active recognizer. but only if we don't already have an active recognizer\n            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n                curRecognizer = session.curRecognizer = recognizer;\n            }\n            i++;\n        }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function(recognizer) {\n        if (recognizer instanceof Recognizer) {\n            return recognizer;\n        }\n\n        var recognizers = this.recognizers;\n        for (var i = 0; i < recognizers.length; i++) {\n            if (recognizers[i].options.event == recognizer) {\n                return recognizers[i];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'add', this)) {\n            return this;\n        }\n\n        // remove existing\n        var existing = this.get(recognizer.options.event);\n        if (existing) {\n            this.remove(existing);\n        }\n\n        this.recognizers.push(recognizer);\n        recognizer.manager = this;\n\n        this.touchAction.update();\n        return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'remove', this)) {\n            return this;\n        }\n\n        recognizer = this.get(recognizer);\n\n        // let's make sure this recognizer exists\n        if (recognizer) {\n            var recognizers = this.recognizers;\n            var index = inArray(recognizers, recognizer);\n\n            if (index !== -1) {\n                recognizers.splice(index, 1);\n                this.touchAction.update();\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n        if (handler === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            handlers[event] = handlers[event] || [];\n            handlers[event].push(handler);\n        });\n        return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            if (!handler) {\n                delete handlers[event];\n            } else {\n                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            }\n        });\n        return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function(event, data) {\n        // we also want to trigger dom events\n        if (this.options.domEvents) {\n            triggerDomEvent(event, data);\n        }\n\n        // no handlers, so skip it all\n        var handlers = this.handlers[event] && this.handlers[event].slice();\n        if (!handlers || !handlers.length) {\n            return;\n        }\n\n        data.type = event;\n        data.preventDefault = function() {\n            data.srcEvent.preventDefault();\n        };\n\n        var i = 0;\n        while (i < handlers.length) {\n            handlers[i](data);\n            i++;\n        }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function() {\n        this.element && toggleCssProps(this, false);\n\n        this.handlers = {};\n        this.session = {};\n        this.input.destroy();\n        this.element = null;\n    }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n    var element = manager.element;\n    if (!element.style) {\n        return;\n    }\n    var prop;\n    each(manager.options.cssProps, function(value, name) {\n        prop = prefixed(element.style, name);\n        if (add) {\n            manager.oldCssProps[prop] = element.style[prop];\n            element.style[prop] = value;\n        } else {\n            element.style[prop] = manager.oldCssProps[prop] || '';\n        }\n    });\n    if (!add) {\n        manager.oldCssProps = {};\n    }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    assign: assign,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n//  style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n    define(function() {\n        return Hammer;\n    });\n} else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n} else {\n    window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n"],"names":["window","document","exportName","undefined","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","TYPE_FUNCTION","round","Math","abs","now","Date","setTimeoutContext","fn","timeout","context","setTimeout","bindFn","invokeArrayArg","arg","Array","isArray","each","obj","iterator","i","forEach","length","call","hasOwnProperty","deprecate","method","name","message","deprecationMessage","e","Error","stack","replace","log","console","warn","apply","this","arguments","Object","target","TypeError","output","index","source","nextKey","extend","dest","src","merge","keys","inherit","child","base","properties","childP","baseP","prototype","create","constructor","_super","boolOrFn","val","args","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","type","addEventListener","removeEventListeners","removeEventListener","hasParent","node","parent","parentNode","inStr","str","find","indexOf","trim","split","inArray","findByKey","toArray","slice","uniqueArray","key","sort","results","values","push","a","b","prefixed","property","prefix","prop","camelProp","toUpperCase","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","test","navigator","userAgent","INPUT_TYPE_TOUCH","INPUT_TYPE_MOUSE","COMPUTE_INTERVAL","INPUT_START","INPUT_END","INPUT_CANCEL","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","PROPS_XY","PROPS_CLIENT_XY","Input","manager","callback","self","options","inputTarget","domHandler","ev","enable","init","inputHandler","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","x","deltaX","y","deltaY","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","start","end","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","last","lastInterval","v","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","clientY","p1","p2","props","sqrt","atan2","PI","evEl","evTarget","evWin","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MOUSE_ELEMENT_EVENTS","MOUSE_WINDOW_EVENTS","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","touches","changed","changedTouches","concat","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","TouchInput","targetIds","getTouches","allTouches","identifier","targetTouches","changedTargetTouches","filter","touch","DEDUP_TIMEOUT","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","t","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","style","NATIVE_TOUCH_ACTION","TOUCH_ACTION_COMPUTE","TOUCH_ACTION_AUTO","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_NONE","TOUCH_ACTION_PAN_X","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","value","set","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_POSSIBLE","STATE_FAILED","Recognizer","defaults","id","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","preset","Manager","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","event","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","threshold","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","toggleCssProps","item","add","stop","force","stopped","curRecognizer","existing","remove","on","events","off","data","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","INPUT_MOVE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","Tap","Pan","Swipe","Pinch","Rotate","Press"],"sourceRoot":""}