HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers54/csbinstallatietechniek.nl/wwwroot/js/vendor.js.map
{"version":3,"sources":["webpack:///./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js","webpack:///./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js","webpack:///./node_modules/hammerjs/hammer.js"],"names":["window","t","navigator","userAgent","match","n","parseInt","document","documentElement","style","o","e","i","l","a","d","split","length","clientWidth","clientHeight","indexOf","dataset","objectFit","getAttribute","objectPosition","parentNode","getComputedStyle","getPropertyValue","position","overflow","display","height","className","max-width","max-height","min-width","min-height","top","right","bottom","left","margin-top","margin-right","margin-bottom","margin-left","width","marginTop","marginLeft","Event","querySelectorAll","nodeName","toLowerCase","complete","addEventListener","this","readyState","objectFitPolyfill","__WEBPACK_AMD_DEFINE_FACTORY__","__WEBPACK_AMD_DEFINE_ARRAY__","__WEBPACK_AMD_DEFINE_RESULT__","exports","undefined","r","Array","isArray","from","Object","defineProperty","value","passive","removeEventListener","platform","test","c","u","s","v","f","some","options","allowTouchMove","m","event","target","touches","preventDefault","setTimeout","body","paddingRight","disableBodyScroll","console","error","targetElement","concat","ontouchstart","targetTouches","clientY","ontouchmove","scrollTop","scrollHeight","stopPropagation","reserveScrollBarGap","innerWidth","clearAllBodyScrollLocks","forEach","enableBodyScroll","filter","apply","module","exportName","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","TYPE_FUNCTION","round","Math","abs","now","Date","setTimeoutContext","fn","timeout","context","bindFn","invokeArrayArg","arg","each","obj","iterator","call","hasOwnProperty","deprecate","method","name","message","deprecationMessage","Error","stack","replace","log","warn","arguments","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","removeEventListeners","hasParent","node","parent","inStr","str","find","trim","inArray","findByKey","toArray","slice","uniqueArray","key","sort","results","values","push","b","prefixed","property","prefix","prop","camelProp","toUpperCase","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","COMPUTE_INTERVAL","INPUT_START","INPUT_MOVE","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","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","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","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","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","SingleTouchInput","started","all","changed","changedTouches","TOUCH_INPUT_MAP","TOUCH_TARGET_EVENTS","TouchInput","targetIds","allTouches","identifier","changedTargetTouches","touch","DEDUP_TIMEOUT","DEDUP_DISTANCE","TouchMouseInput","mouse","primaryTouch","lastTouches","setLastTouch","eventData","lastTouch","lts","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","dx","dy","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","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","set","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","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","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","STATE_FAILED","Tap","Pan","Swipe","Pinch","Rotate","Press","__webpack_require__"],"mappings":"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","file":"/js/vendor.js","sourcesContent":["!function(){\"use strict\";if(\"undefined\"!=typeof window){var t=window.navigator.userAgent.match(/Edge\\/(\\d{2})\\./),n=!!t&&16<=parseInt(t[1],10);if(!(\"objectFit\"in document.documentElement.style!=!1)||n){var o=function(t,e,i){var n,o,l,a,d;if((i=i.split(\" \")).length<2&&(i[1]=i[0]),\"x\"===t)n=i[0],o=i[1],l=\"left\",a=\"right\",d=e.clientWidth;else{if(\"y\"!==t)return;n=i[1],o=i[0],l=\"top\",a=\"bottom\",d=e.clientHeight}if(n!==l&&o!==l){if(n!==a&&o!==a)return\"center\"===n||\"50%\"===n?(e.style[l]=\"50%\",void(e.style[\"margin-\"+l]=d/-2+\"px\")):void(0<=n.indexOf(\"%\")?(n=parseInt(n))<50?(e.style[l]=n+\"%\",e.style[\"margin-\"+l]=d*(n/-100)+\"px\"):(n=100-n,e.style[a]=n+\"%\",e.style[\"margin-\"+a]=d*(n/-100)+\"px\"):e.style[l]=n);e.style[a]=\"0\"}else e.style[l]=\"0\"},l=function(t){var e=t.dataset?t.dataset.objectFit:t.getAttribute(\"data-object-fit\"),i=t.dataset?t.dataset.objectPosition:t.getAttribute(\"data-object-position\");e=e||\"cover\",i=i||\"50% 50%\";var n=t.parentNode;return function(t){var e=window.getComputedStyle(t,null),i=e.getPropertyValue(\"position\"),n=e.getPropertyValue(\"overflow\"),o=e.getPropertyValue(\"display\");i&&\"static\"!==i||(t.style.position=\"relative\"),\"hidden\"!==n&&(t.style.overflow=\"hidden\"),o&&\"inline\"!==o||(t.style.display=\"block\"),0===t.clientHeight&&(t.style.height=\"100%\"),-1===t.className.indexOf(\"object-fit-polyfill\")&&(t.className=t.className+\" object-fit-polyfill\")}(n),function(t){var e=window.getComputedStyle(t,null),i={\"max-width\":\"none\",\"max-height\":\"none\",\"min-width\":\"0px\",\"min-height\":\"0px\",top:\"auto\",right:\"auto\",bottom:\"auto\",left:\"auto\",\"margin-top\":\"0px\",\"margin-right\":\"0px\",\"margin-bottom\":\"0px\",\"margin-left\":\"0px\"};for(var n in i)e.getPropertyValue(n)!==i[n]&&(t.style[n]=i[n])}(t),t.style.position=\"absolute\",t.style.width=\"auto\",t.style.height=\"auto\",\"scale-down\"===e&&(e=t.clientWidth<n.clientWidth&&t.clientHeight<n.clientHeight?\"none\":\"contain\"),\"none\"===e?(o(\"x\",t,i),void o(\"y\",t,i)):\"fill\"===e?(t.style.width=\"100%\",t.style.height=\"100%\",o(\"x\",t,i),void o(\"y\",t,i)):(t.style.height=\"100%\",void(\"cover\"===e&&t.clientWidth>n.clientWidth||\"contain\"===e&&t.clientWidth<n.clientWidth?(t.style.top=\"0\",t.style.marginTop=\"0\",o(\"x\",t,i)):(t.style.width=\"100%\",t.style.height=\"auto\",t.style.left=\"0\",t.style.marginLeft=\"0\",o(\"y\",t,i))))},e=function(t){if(void 0===t||t instanceof Event)t=document.querySelectorAll(\"[data-object-fit]\");else if(t&&t.nodeName)t=[t];else{if(\"object\"!=typeof t||!t.length||!t[0].nodeName)return!1;t=t}for(var e=0;e<t.length;e++)if(t[e].nodeName){var i=t[e].nodeName.toLowerCase();if(\"img\"===i){if(n)continue;t[e].complete?l(t[e]):t[e].addEventListener(\"load\",function(){l(this)})}else\"video\"===i?0<t[e].readyState?l(t[e]):t[e].addEventListener(\"loadedmetadata\",function(){l(this)}):l(t[e])}return!0};\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",e):e(),window.addEventListener(\"resize\",e),window.objectFitPolyfill=e}else window.objectFitPolyfill=function(){return!1}}}();","!function(e,t){if(\"function\"==typeof define&&define.amd)define([\"exports\"],t);else if(\"undefined\"!=typeof exports)t(exports);else{var o={};t(o),e.bodyScrollLock=o}}(this,function(exports){\"use strict\";function r(e){if(Array.isArray(e)){for(var t=0,o=Array(e.length);t<e.length;t++)o[t]=e[t];return o}return Array.from(e)}Object.defineProperty(exports,\"__esModule\",{value:!0});var l=!1;if(\"undefined\"!=typeof window){var e={get passive(){l=!0}};window.addEventListener(\"testPassive\",null,e),window.removeEventListener(\"testPassive\",null,e)}var d=\"undefined\"!=typeof window&&window.navigator&&window.navigator.platform&&/iP(ad|hone|od)/.test(window.navigator.platform),c=[],u=!1,a=-1,s=void 0,v=void 0,f=function(t){return c.some(function(e){return!(!e.options.allowTouchMove||!e.options.allowTouchMove(t))})},m=function(e){var t=e||window.event;return!!f(t.target)||(1<t.touches.length||(t.preventDefault&&t.preventDefault(),!1))},o=function(){setTimeout(function(){void 0!==v&&(document.body.style.paddingRight=v,v=void 0),void 0!==s&&(document.body.style.overflow=s,s=void 0)})};exports.disableBodyScroll=function(i,e){if(d){if(!i)return void console.error(\"disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.\");if(i&&!c.some(function(e){return e.targetElement===i})){var t={targetElement:i,options:e||{}};c=[].concat(r(c),[t]),i.ontouchstart=function(e){1===e.targetTouches.length&&(a=e.targetTouches[0].clientY)},i.ontouchmove=function(e){var t,o,n,r;1===e.targetTouches.length&&(o=i,r=(t=e).targetTouches[0].clientY-a,!f(t.target)&&(o&&0===o.scrollTop&&0<r?m(t):(n=o)&&n.scrollHeight-n.scrollTop<=n.clientHeight&&r<0?m(t):t.stopPropagation()))},u||(document.addEventListener(\"touchmove\",m,l?{passive:!1}:void 0),u=!0)}}else{n=e,setTimeout(function(){if(void 0===v){var e=!!n&&!0===n.reserveScrollBarGap,t=window.innerWidth-document.documentElement.clientWidth;e&&0<t&&(v=document.body.style.paddingRight,document.body.style.paddingRight=t+\"px\")}void 0===s&&(s=document.body.style.overflow,document.body.style.overflow=\"hidden\")});var o={targetElement:i,options:e||{}};c=[].concat(r(c),[o])}var n},exports.clearAllBodyScrollLocks=function(){d?(c.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),u&&(document.removeEventListener(\"touchmove\",m,l?{passive:!1}:void 0),u=!1),c=[],a=-1):(o(),c=[])},exports.enableBodyScroll=function(t){if(d){if(!t)return void console.error(\"enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.\");t.ontouchstart=null,t.ontouchmove=null,c=c.filter(function(e){return e.targetElement!==t}),u&&0===c.length&&(document.removeEventListener(\"touchmove\",m,l?{passive:!1}:void 0),u=!1)}else(c=c.filter(function(e){return e.targetElement!==t})).length||o()}});\n","/*! 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"],"sourceRoot":""}