{"version":3,"sources":["webpack:///scripts/vendor.fd6b3eb4dec369ae48e1.js","webpack:///../node_modules/lodash/_baseTrim.js","webpack:///../node_modules/lodash/now.js","webpack:///../node_modules/hammerjs/hammer.js","webpack:///../node_modules/lodash/debounce.js","webpack:///../node_modules/wallop/js/Wallop.js","webpack:///../node_modules/lodash/_root.js","webpack:///./scripts/vendor.js","webpack:///../node_modules/animejs/anime.min.js","webpack:///../node_modules/validate.js/validate.js","webpack:///../node_modules/lodash/isObjectLike.js","webpack:///../node_modules/lodash/throttle.js","webpack:///../node_modules/lodash/isSymbol.js","webpack:///../node_modules/lodash/_baseGetTag.js","webpack:///../node_modules/webpack/buildin/global.js","webpack:///../node_modules/lodash/toNumber.js","webpack:///../node_modules/lodash/_freeGlobal.js","webpack:///../node_modules/webpack/buildin/module.js","webpack:///../node_modules/lodash/_objectToString.js","webpack:///../node_modules/webpack/buildin/amd-define.js","webpack:///../node_modules/lodash/isObject.js","webpack:///../node_modules/lodash/_getRawTag.js","webpack:///../node_modules/lodash/_Symbol.js","webpack:///../node_modules/lodash/_trimmedEndIndex.js"],"names":["webpackJsonp","0S+K","module","exports","__webpack_require__","baseTrim","string","slice","trimmedEndIndex","replace","reTrimStart","0pJf","root","now","Date","3vhj","window","document","exportName","undefined","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","log","console","warn","apply","this","arguments","inherit","child","base","properties","childP","baseP","prototype","Object","create","constructor","_super","assign","boolOrFn","val","args","TYPE_FUNCTION","ifUndefined","val1","val2","addEventListeners","target","types","handler","splitStr","type","addEventListener","removeEventListeners","removeEventListener","hasParent","node","parent","parentNode","inStr","str","find","indexOf","trim","split","inArray","src","findByKey","toArray","uniqueArray","key","sort","results","values","push","a","b","prefixed","property","prefix","prop","camelProp","toUpperCase","VENDOR_PREFIXES","uniqueId","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","Input","manager","callback","self","options","inputTarget","domHandler","ev","enable","init","createInputInstance","inputClass","SUPPORT_POINTER_EVENTS","PointerEventInput","SUPPORT_ONLY_TOUCH","TouchInput","SUPPORT_TOUCH","TouchMouseInput","MouseInput","inputHandler","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","INPUT_START","isFinal","INPUT_END","INPUT_CANCEL","session","computeInputData","emit","recognize","prevInput","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","computeDeltaXY","offsetDirection","getDirection","deltaX","deltaY","overallVelocity","getVelocity","overallVelocityX","x","overallVelocityY","y","abs","scale","getScale","rotation","getRotation","maxPointers","computeIntervalInputData","srcEvent","offset","offsetDelta","prevDelta","velocity","velocityX","velocityY","direction","last","lastInterval","COMPUTE_INTERVAL","v","clientX","round","clientY","DIRECTION_NONE","DIRECTION_LEFT","DIRECTION_RIGHT","DIRECTION_UP","DIRECTION_DOWN","p1","p2","props","PROPS_XY","Math","sqrt","atan2","PI","start","end","PROPS_CLIENT_XY","evEl","MOUSE_ELEMENT_EVENTS","evWin","MOUSE_WINDOW_EVENTS","pressed","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","store","pointerEvents","SingleTouchInput","evTarget","SINGLE_TOUCH_TARGET_EVENTS","SINGLE_TOUCH_WINDOW_EVENTS","started","normalizeSingleTouches","all","touches","changed","changedTouches","concat","TOUCH_TARGET_EVENTS","targetIds","getTouches","allTouches","INPUT_MOVE","identifier","targetTouches","changedTargetTouches","filter","touch","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","removeLastTouch","splice","DEDUP_TIMEOUT","isSyntheticEvent","t","dx","dy","DEDUP_DISTANCE","TouchAction","value","set","cleanTouchActions","actions","TOUCH_ACTION_NONE","hasPanX","TOUCH_ACTION_PAN_X","hasPanY","TOUCH_ACTION_PAN_Y","TOUCH_ACTION_MANIPULATION","TOUCH_ACTION_AUTO","Recognizer","defaults","id","state","STATE_POSSIBLE","simultaneous","requireFail","stateStr","STATE_CANCELLED","STATE_ENDED","STATE_CHANGED","STATE_BEGAN","directionStr","getRecognizerByNameIfManager","otherRecognizer","recognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","recognizers","preset","Manager","handlers","oldCssProps","touchAction","toggleCssProps","item","add","recognizeWith","requireFailure","style","cssProps","triggerDomEvent","event","data","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","TEST_ELEMENT","createElement","TypeError","output","index","source","nextKey","extend","dest","merge","keys","MOBILE_REGEX","test","navigator","userAgent","DIRECTION_HORIZONTAL","DIRECTION_VERTICAL","DIRECTION_ALL","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","toLowerCase","isTouch","storeIndex","pointerId","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","TOUCH_INPUT_MAP","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","compute","update","getTouchAction","join","preventDefaults","prevented","preventDefault","hasNone","isTapPointer","isTapMovement","isTapTouchTime","preventSrc","STATE_RECOGNIZED","dropRecognizeWith","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","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","stop","force","stopped","curRecognizer","existing","remove","on","events","off","STATE_FAILED","Tap","Pan","Swipe","Pinch","Rotate","Press","CXfR","debounce","func","wait","invokeFunc","lastArgs","thisArg","lastThis","lastInvokeTime","result","leadingEdge","timerId","timerExpired","leading","remainingWait","timeSinceLastCall","lastCallTime","timeSinceLastInvoke","timeWaiting","maxing","nativeMin","maxWait","shouldInvoke","trailingEdge","trailing","cancel","flush","debounced","isInvoking","FUNC_ERROR_TEXT","toNumber","isObject","nativeMax","max","min","M9Vy","global","Wallop","selector","selectorPool","buttonPreviousClass","buttonNextClass","itemClass","currentItemClass","showPreviousClass","showNextClass","hidePreviousClass","hideNextClass","carousel","whitelist","$selector","buttonPrevious","querySelector","buttonNext","bindEvents","createCustomEvent","currentItemIndex","addClass","allItemsArray","updateButtonStates","_this","detail","$$","container","className","removeClass","origOptions","userOptions","attrname","extendOptions","CustomEvent","params","bubbles","cancelable","evt","initCustomEvent","WS","lastItemIndex","setAttribute","removeAllHelperSettings","removeAttribute","goTo","isForwards","previous","next","querySelectorAll","eventName","wallopEl","Number","MIhM","freeGlobal","freeSelf","Function","NK6C","__webpack_exports__","NQR3","$jscomp","scope","defineProperty","defineProperties","r","p","getGlobal","SYMBOL_PREFIX","initSymbol","Symbol","symbolCounter_","initSymbolIterator","configurable","writable","arrayIterator","iteratorPrototype","done","array","iteratorFromArray","String","m","u","polyfill","$jscomp$this","h","col","c","d","f","n","k","reduce","arr","NodeList","HTMLCollection","some","C","D","z","und","T","exec","parseInt","U","V","I","fnc","total","E","getComputedStyle","getPropertyValue","J","dom","W","getAttribute","svg","X","transform","K","L","parseFloat","F","pow","M","points","numberOfItems","getItem","N","getTotalLength","tagName","Y","el","getPointAtLength","O","pth","totalLength","rgb","hex","hsl","substr","original","numbers","match","map","strings","P","Z","aa","duration","delay","ba","ca","A","Q","da","tweens","to","w","from","easing","elasticity","isPath","isColor","ea","animatable","R","fa","ga","S","targets","children","animatables","animations","q","Promise","g","reversed","l","isNaN","ha","currentValue","H","body","currentTime","progress","remaining","G","seek","began","pause","completed","loop","paused","tick","speed","play","B","ia","reverse","restart","finished","autoplay","begin","run","complete","toString","SVGElement","nodeType","Float32Array","sin","asin","In","Out","InOut","linear","css","attribute","object","requestAnimationFrame","cancelAnimationFrame","version","running","getValue","path","setDashoffset","bezier","easings","timeline","random","floor","Ntm8","define","validate","attributes","constraints","runValidations","isPromise","error","processValidationResults","attr","major","minor","patch","metadata","format","isEmpty","EMPTY_STRING_REGEXP","validatorName","validators","validator","validatorOptions","isDomElement","isJqueryElement","collectFormValues","getDeepObjectValue","globalOptions","errors","pruneEmptyErrors","expandMultipleErrors","convertErrorMessages","formatters","async","WrapErrors","wrapErrors","cleanAttributes","resolve","reject","waitForResults","then","err","single","fullMessages","memo","isNumber","isFunction","isInteger","isBoolean","isDate","isDefined","o","isString","jquery","HTMLElement","nodeName","vals","FORMAT_REGEXP","m0","m1","m2","prettify","toFixed","s","stringifyValue","isHash","contains","unique","forEachKeyInKeypath","keypath","escape","form","j","inputs","option","sanitizeFormValue","checked","multiple","selected","_val","selectedIndex","nullify","capitalize","ret","msg","errorInfo","groupErrorsByAttribute","list","flattenErrorsToArray","whitelistCreator","cleanRecursive","ow","exposeModule","amd","presence","allowEmpty","is","maximum","minimum","tokenizer","wrongLength","tooShort","tooLong","notValid","numericality","checks","greaterThan","greaterThanOrEqualTo","equalTo","lessThan","lessThanOrEqualTo","divisibleBy","strict","pattern","onlyInteger","RegExp","noStrings","notInteger","odd","notOdd","even","notEven","datetime","parse","earliest","NaN","latest","dateOnly","tooEarly","date","tooLate","flags","inclusion","within","exclusion","email","PATTERN","equality","otherValue","comparator","v1","v2","url","schemes","allowLocal","regex","tld","detailed","flat","grouped","constraint","OuyB","isObjectLike","Ywd4","throttle","bgO7","isSymbol","baseGetTag","symbolTag","e5TX","undefinedTag","nullTag","symToStringTag","getRawTag","objectToString","toStringTag","h6ac","eval","iS0Z","NAN","other","valueOf","isBinary","reIsBinary","reIsOctal","freeParseInt","reIsBadHex","j3D9","l262","webpackPolyfill","paths","enumerable","lPmd","nativeObjectToString","objectProto","lfEA","u9vI","uiOY","isOwn","tag","unmasked","wppe","x2wq","reWhitespace","charAt"],"mappings":"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","file":"scripts/vendor.fd6b3eb4dec369ae48e1.js","sourcesContent":["webpackJsonp([1],{\n\n/***/ \"0S+K\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar trimmedEndIndex = __webpack_require__(\"x2wq\");\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n\n\n/***/ }),\n\n/***/ \"0pJf\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(\"MIhM\");\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n\n\n/***/ }),\n\n/***/ \"3vhj\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_RESULT__;/*! 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.\\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 (true) {\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function() {\n return Hammer;\n }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\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\n\n/***/ }),\n\n/***/ \"CXfR\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar isObject = __webpack_require__(\"u9vI\"),\n now = __webpack_require__(\"0pJf\"),\n toNumber = __webpack_require__(\"iS0Z\");\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n\n\n/***/ }),\n\n/***/ \"M9Vy\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar __WEBPACK_AMD_DEFINE_RESULT__;/**\n* Wallop.js\n*\n* @fileoverview Minimal JS library to show & hide things\n*\n* @author Pedro Duarte\n* @author http://pedroduarte.me/wallop\n*\n*/\n(function(global){\n function Wallop(selector, options) {\n if (!selector) { throw new Error('Missing selector. Refer to Usage documentation: https://github.com/peduarte/wallop#javascript'); }\n\n for (var i = 0; i < selectorPool.length; i++) {\n if (selectorPool[i] === selector) {\n throw new Error('An instance of Wallop with this selector already exists.');\n }\n }\n\n this.options = {\n buttonPreviousClass: 'Wallop-buttonPrevious',\n buttonNextClass: 'Wallop-buttonNext',\n itemClass: 'Wallop-item',\n currentItemClass: 'Wallop-item--current',\n showPreviousClass: 'Wallop-item--showPrevious',\n showNextClass: 'Wallop-item--showNext',\n hidePreviousClass: 'Wallop-item--hidePrevious',\n hideNextClass: 'Wallop-item--hideNext',\n carousel: true\n };\n\n // Whitelist elements which contain `length`\n this.whitelist = {\n 'form': true\n };\n\n if (selector.length > 0 && !this.whitelist[selector]) {\n throw new Error('Selector cannot be an array, Refer to Usage documentation: https://github.com/peduarte/wallop#javascript');\n } else {\n this.$selector = selector;\n }\n\n this.options = extend(this.options, options);\n this.event = null;\n\n // \"Global vars\"\n this.reset();\n this.buttonPrevious = this.$selector.querySelector(' .' + this.options.buttonPreviousClass);\n this.buttonNext = this.$selector.querySelector(' .' + this.options.buttonNextClass);\n\n this.bindEvents();\n this.createCustomEvent();\n\n // If there is no active item, start at 0\n if (this.currentItemIndex === -1) {\n this.currentItemIndex = 0;\n addClass(this.allItemsArray[this.currentItemIndex], this.options.currentItemClass);\n }\n\n // Update button states to make sure the correct state is set on initialization\n this.updateButtonStates();\n\n // Wrapped in timeout function so event can\n // be listened from outside at anytime\n var _this = this;\n setTimeout(function() {\n _this.event.detail.currentItemIndex = _this.currentItemIndex;\n _this.$selector.dispatchEvent(_this.event);\n }, 0);\n }\n\n var selectorPool = [];\n\n var WS = Wallop.prototype;\n\n // Update prev/next disabled attribute\n WS.updateButtonStates = function () {\n if ((!this.buttonPrevious && !this.buttonNext) || this.options.carousel) { return; }\n\n if (this.currentItemIndex === this.lastItemIndex) {\n this.buttonNext.setAttribute('disabled', 'disabled');\n } else if (this.currentItemIndex === 0) {\n this.buttonPrevious.setAttribute('disabled', 'disabled');\n }\n };\n\n // Reset all settings by removing classes and attributes added by goTo() & updateButtonStates()\n WS.removeAllHelperSettings = function () {\n removeClass(this.allItemsArray[this.currentItemIndex], this.options.currentItemClass);\n removeClass($$(this.options.hidePreviousClass, this.$selector), this.options.hidePreviousClass);\n removeClass($$(this.options.hideNextClass, this.$selector), this.options.hideNextClass);\n removeClass($$(this.options.showPreviousClass, this.$selector), this.options.showPreviousClass);\n removeClass($$(this.options.showNextClass, this.$selector), this.options.showNextClass);\n\n if (!this.buttonPrevious && !this.buttonNext) { return; }\n\n this.buttonPrevious.removeAttribute('disabled');\n this.buttonNext.removeAttribute('disabled');\n };\n\n // Method to add classes to the right elements depending on the index passed\n WS.goTo = function (index) {\n if (index === this.currentItemIndex) { return; }\n\n // Fix the index if it's out of bounds and carousel is enabled\n index = index === -1 && this.options.carousel ? this.lastItemIndex : index;\n index = index === this.lastItemIndex + 1 && this.options.carousel ? 0 : index;\n\n // Exit when index is out of bounds\n if (index < 0 || index > this.lastItemIndex) { return; }\n\n this.removeAllHelperSettings();\n\n var isForwards = (index > this.currentItemIndex || index === 0 && this.currentItemIndex === this.lastItemIndex) && !(index === this.lastItemIndex && this.currentItemIndex === 0);\n addClass(this.allItemsArray[this.currentItemIndex], isForwards ? this.options.hidePreviousClass : this.options.hideNextClass);\n addClass(this.allItemsArray[index], this.options.currentItemClass + ' ' + (isForwards ? this.options.showNextClass : this.options.showPreviousClass));\n\n this.currentItemIndex = index;\n\n this.updateButtonStates();\n\n this.event.detail.currentItemIndex = this.currentItemIndex;\n this.$selector.dispatchEvent(this.event);\n };\n\n // Previous item handler\n WS.previous = function () {\n this.goTo(this.currentItemIndex - 1);\n };\n\n // Next item handler\n WS.next = function () {\n this.goTo(this.currentItemIndex + 1);\n };\n\n // Update global variables\n WS.reset = function () {\n this.allItemsArray = Array.prototype.slice.call(this.$selector.querySelectorAll(' .' + this.options.itemClass));\n this.currentItemIndex = this.allItemsArray.indexOf(this.$selector.querySelector(' .' + this.options.currentItemClass));\n this.lastItemIndex = this.allItemsArray.length - 1;\n };\n\n // Attach click handlers\n WS.bindEvents = function () {\n selectorPool.push(this.$selector);\n\n var _this = this;\n\n if (this.buttonPrevious) {\n this.buttonPrevious.addEventListener('click', function (event) {\n event.preventDefault();\n _this.previous();\n });\n }\n\n if (this.buttonNext) {\n this.buttonNext.addEventListener('click', function (event) {\n event.preventDefault();\n _this.next();\n });\n }\n\n };\n\n // Method to bind custom event\n WS.on = function (eventName, callback) {\n this.$selector.addEventListener(eventName, callback, false);\n };\n\n // Method to unbind custom event\n WS.off = function (eventName, callback) {\n this.$selector.removeEventListener(eventName, callback, false);\n };\n\n // Create custom Event\n WS.createCustomEvent = function () {\n var _this = this;\n this.event = new CustomEvent('change', {\n detail: {\n wallopEl: _this.$selector,\n currentItemIndex: Number(_this.currentItemIndex)\n },\n bubbles: true,\n cancelable: true\n });\n };\n\n // Helper functions\n function $$(element, container) {\n if (!element) { return; }\n if (!container) {\n container = document;\n }\n return container.querySelector('.' + element);\n }\n\n function addClass(element, className) {\n if (!element) { return; }\n element.className = (element.className + ' ' + className).trim();\n }\n\n function removeClass(element, className) {\n if (!element) { return; }\n element.className = element.className.replace(className, '').trim();\n }\n\n function extend(origOptions, userOptions){\n var extendOptions = {}, attrname;\n for (attrname in origOptions) { extendOptions[attrname] = origOptions[attrname]; }\n for (attrname in userOptions) { extendOptions[attrname] = userOptions[attrname]; }\n return extendOptions;\n }\n\n // Pollyfill for CustomEvent() Constructor - thanks to Internet Explorer\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n function CustomEvent(event, params) {\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n\n CustomEvent.prototype = window.CustomEvent ? window.CustomEvent.prototype : {};\n window.CustomEvent = CustomEvent;\n\n // Exports to multiple environments\n if(true){ //AMD\n !(__WEBPACK_AMD_DEFINE_RESULT__ = (function () { return Wallop; }).call(exports, __webpack_require__, exports, module),\n\t\t\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n } else if (typeof module !== 'undefined' && module.exports){ //node\n module.exports = Wallop;\n } else { // browser\n // use string because of Google closure compiler ADVANCED_MODE\n /* jslint sub:true */\n global['Wallop'] = Wallop;\n }\n}(this));\n\n\n/***/ }),\n\n/***/ \"MIhM\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar freeGlobal = __webpack_require__(\"j3D9\");\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n/***/ }),\n\n/***/ \"NK6C\":\n/***/ (function(module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\nObject.defineProperty(__webpack_exports__, \"__esModule\", { value: true });\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_animejs__ = __webpack_require__(\"NQR3\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_0_animejs___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_0_animejs__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_hammerjs__ = __webpack_require__(\"3vhj\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_1_hammerjs___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_1_hammerjs__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_validate_js__ = __webpack_require__(\"Ntm8\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_2_validate_js___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_2_validate_js__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_wallop__ = __webpack_require__(\"M9Vy\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_3_wallop___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_3_wallop__);\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_lodash_throttle__ = __webpack_require__(\"Ywd4\");\n/* harmony import */ var __WEBPACK_IMPORTED_MODULE_4_lodash_throttle___default = __webpack_require__.n(__WEBPACK_IMPORTED_MODULE_4_lodash_throttle__);\n// Polyfills\n// import 'core-js/es6/promise'\n// import 'core-js/fn/promise'\n// import 'core-js/fn/string/includes'\n// import 'core-js/fn/object/assign'\n// import 'core-js/fn/object/keys'\n// import 'core-js/fn/array/from'\n// import 'core-js/fn/array/find'\n// import 'core-js/fn/array/find-index'\n// import 'core-js/fn/array/includes'\n// import 'core-js/fn/array/for-each'\n// import 'whatwg-fetch'\n// import 'objectFitPolyfill/src/objectFitPolyfill.basic'\n\n// Vendor\n\n\n\n\n\n\n\n/***/ }),\n\n/***/ \"NQR3\":\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*\n 2017 Julian Garnier\n Released under the MIT license\n*/\nvar $jscomp={scope:{}};$jscomp.defineProperty=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(e,r,p){if(p.get||p.set)throw new TypeError(\"ES3 does not support getters and setters.\");e!=Array.prototype&&e!=Object.prototype&&(e[r]=p.value)};$jscomp.getGlobal=function(e){return\"undefined\"!=typeof window&&window===e?e:\"undefined\"!=typeof global&&null!=global?global:e};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX=\"jscomp_symbol_\";\n$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(e){return $jscomp.SYMBOL_PREFIX+(e||\"\")+$jscomp.symbolCounter_++};\n$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var e=$jscomp.global.Symbol.iterator;e||(e=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol(\"iterator\"));\"function\"!=typeof Array.prototype[e]&&$jscomp.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(e){var r=0;return $jscomp.iteratorPrototype(function(){return rb&&(b+=1);1b?c:b<2/3?a+(c-a)*(2/3-b)*6:a}var d=/hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.exec(a)||/hsla\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%,\\s*([\\d.]+)\\)/g.exec(a);a=parseInt(d[1])/360;var b=parseInt(d[2])/100,f=parseInt(d[3])/100,d=d[4]||1;if(0==b)f=b=a=f;else{var n=.5>f?f*(1+b):f+b-f*b,k=2*f-n,f=c(k,n,a+1/3),b=c(k,n,a);a=c(k,n,a-1/3)}return\"rgba(\"+\n255*f+\",\"+255*b+\",\"+255*a+\",\"+d+\")\"}function y(a){if(a=/([\\+\\-]?[0-9#\\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(a))return a[2]}function V(a){if(-1=g.currentTime)for(var G=0;G=w||!k)g.began||(g.began=!0,f(\"begin\")),f(\"run\");if(q>n&&q=k&&r!==k||!k)b(k),x||e();f(\"update\");a>=k&&(g.remaining?(t=h,\"alternate\"===g.direction&&(g.reversed=!g.reversed)):(g.pause(),g.completed||(g.completed=!0,f(\"complete\"),\"Promise\"in window&&(p(),m=c()))),l=0)}a=void 0===a?{}:a;var h,t,l=0,p=null,m=c(),g=fa(a);g.reset=function(){var a=g.direction,c=g.loop;g.currentTime=\n0;g.progress=0;g.paused=!0;g.began=!1;g.completed=!1;g.reversed=\"reverse\"===a;g.remaining=\"alternate\"===a&&1===c?2:c;b(0);for(a=g.children.length;a--;)g.children[a].reset()};g.tick=function(a){h=a;t||(t=h);k((l+h-t)*q.speed)};g.seek=function(a){k(d(a))};g.pause=function(){var a=v.indexOf(g);-1=c&&0<=b&&1>=b){var e=new Float32Array(11);if(c!==d||b!==f)for(var k=0;11>k;++k)e[k]=a(.1*k,c,b);return function(k){if(c===d&&b===f)return k;if(0===k)return 0;if(1===k)return 1;for(var h=0,l=1;10!==l&&e[l]<=k;++l)h+=.1;--l;var l=h+(k-e[l])/(e[l+1]-e[l])*.1,n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(.001<=n){for(h=0;4>h;++h){n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(0===n)break;var m=a(l,c,b)-k,l=l-m/n}k=l}else if(0===\nn)k=l;else{var l=h,h=h+.1,g=0;do m=l+(h-l)/2,n=a(m,c,b)-k,0++g);k=m}return a(k,d,f)}}}}(),Q=function(){function a(a,b){return 0===a||1===a?a:-Math.pow(2,10*(a-1))*Math.sin(2*(a-1-b/(2*Math.PI)*Math.asin(1))*Math.PI/b)}var c=\"Quad Cubic Quart Quint Sine Expo Circ Back Elastic\".split(\" \"),d={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],a],Out:[[.25,\n.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(b,c){return 1-a(1-b,c)}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(b,c){return.5>b?a(2*b,c)/2:1-a(-2*b+2,c)/2}]},b={linear:A(.25,.25,.75,.75)},f={},e;for(e in d)f.type=e,d[f.type].forEach(function(a){return function(d,f){b[\"ease\"+a.type+c[f]]=h.fnc(d)?\nd:A.apply($jscomp$this,d)}}(f)),f={type:f.type};return b}(),ha={css:function(a,c,d){return a.style[c]=d},attribute:function(a,c,d){return a.setAttribute(c,d)},object:function(a,c,d){return a[c]=d},transform:function(a,c,d,b,f){b[f]||(b[f]=[]);b[f].push(c+\"(\"+d+\")\")}},v=[],B=0,ia=function(){function a(){B=requestAnimationFrame(c)}function c(c){var b=v.length;if(b){for(var d=0;db&&(c.duration=d.duration);c.children.push(d)});c.seek(0);c.reset();c.autoplay&&c.restart();return c};return c};q.random=function(a,c){return Math.floor(Math.random()*(c-a+1))+a};return q});\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"h6ac\")))\n\n/***/ }),\n\n/***/ \"Ntm8\":\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(module) {/*!\n * validate.js 0.12.0\n *\n * (c) 2013-2017 Nicklas Ansman, 2013 Wrapp\n * Validate.js may be freely distributed under the MIT license.\n * For all details and documentation:\n * http://validatejs.org/\n */\n\n(function(exports, module, define) {\n \"use strict\";\n\n // The main function that calls the validators specified by the constraints.\n // The options are the following:\n // - format (string) - An option that controls how the returned value is formatted\n // * flat - Returns a flat array of just the error messages\n // * grouped - Returns the messages grouped by attribute (default)\n // * detailed - Returns an array of the raw validation data\n // - fullMessages (boolean) - If `true` (default) the attribute name is prepended to the error.\n //\n // Please note that the options are also passed to each validator.\n var validate = function(attributes, constraints, options) {\n options = v.extend({}, v.options, options);\n\n var results = v.runValidations(attributes, constraints, options)\n , attr\n , validator;\n\n if (results.some(function(r) { return v.isPromise(r.error); })) {\n throw new Error(\"Use validate.async if you want support for promises\");\n }\n return validate.processValidationResults(results, options);\n };\n\n var v = validate;\n\n // Copies over attributes from one or more sources to a single destination.\n // Very much similar to underscore's extend.\n // The first argument is the target object and the remaining arguments will be\n // used as sources.\n v.extend = function(obj) {\n [].slice.call(arguments, 1).forEach(function(source) {\n for (var attr in source) {\n obj[attr] = source[attr];\n }\n });\n return obj;\n };\n\n v.extend(validate, {\n // This is the version of the library as a semver.\n // The toString function will allow it to be coerced into a string\n version: {\n major: 0,\n minor: 12,\n patch: 0,\n metadata: null,\n toString: function() {\n var version = v.format(\"%{major}.%{minor}.%{patch}\", v.version);\n if (!v.isEmpty(v.version.metadata)) {\n version += \"+\" + v.version.metadata;\n }\n return version;\n }\n },\n\n // Below is the dependencies that are used in validate.js\n\n // The constructor of the Promise implementation.\n // If you are using Q.js, RSVP or any other A+ compatible implementation\n // override this attribute to be the constructor of that promise.\n // Since jQuery promises aren't A+ compatible they won't work.\n Promise: typeof Promise !== \"undefined\" ? Promise : /* istanbul ignore next */ null,\n\n EMPTY_STRING_REGEXP: /^\\s*$/,\n\n // Runs the validators specified by the constraints object.\n // Will return an array of the format:\n // [{attribute: \"\", error: \"\"}, ...]\n runValidations: function(attributes, constraints, options) {\n var results = []\n , attr\n , validatorName\n , value\n , validators\n , validator\n , validatorOptions\n , error;\n\n if (v.isDomElement(attributes) || v.isJqueryElement(attributes)) {\n attributes = v.collectFormValues(attributes);\n }\n\n // Loops through each constraints, finds the correct validator and run it.\n for (attr in constraints) {\n value = v.getDeepObjectValue(attributes, attr);\n // This allows the constraints for an attribute to be a function.\n // The function will be called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validators = v.result(constraints[attr], value, attributes, attr, options, constraints);\n\n for (validatorName in validators) {\n validator = v.validators[validatorName];\n\n if (!validator) {\n error = v.format(\"Unknown validator %{name}\", {name: validatorName});\n throw new Error(error);\n }\n\n validatorOptions = validators[validatorName];\n // This allows the options to be a function. The function will be\n // called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validatorOptions = v.result(validatorOptions, value, attributes, attr, options, constraints);\n if (!validatorOptions) {\n continue;\n }\n results.push({\n attribute: attr,\n value: value,\n validator: validatorName,\n globalOptions: options,\n attributes: attributes,\n options: validatorOptions,\n error: validator.call(validator,\n value,\n validatorOptions,\n attr,\n attributes,\n options)\n });\n }\n }\n\n return results;\n },\n\n // Takes the output from runValidations and converts it to the correct\n // output format.\n processValidationResults: function(errors, options) {\n errors = v.pruneEmptyErrors(errors, options);\n errors = v.expandMultipleErrors(errors, options);\n errors = v.convertErrorMessages(errors, options);\n\n var format = options.format || \"grouped\";\n\n if (typeof v.formatters[format] === 'function') {\n errors = v.formatters[format](errors);\n } else {\n throw new Error(v.format(\"Unknown format %{format}\", options));\n }\n\n return v.isEmpty(errors) ? undefined : errors;\n },\n\n // Runs the validations with support for promises.\n // This function will return a promise that is settled when all the\n // validation promises have been completed.\n // It can be called even if no validations returned a promise.\n async: function(attributes, constraints, options) {\n options = v.extend({}, v.async.options, options);\n\n var WrapErrors = options.wrapErrors || function(errors) {\n return errors;\n };\n\n // Removes unknown attributes\n if (options.cleanAttributes !== false) {\n attributes = v.cleanAttributes(attributes, constraints);\n }\n\n var results = v.runValidations(attributes, constraints, options);\n\n return new v.Promise(function(resolve, reject) {\n v.waitForResults(results).then(function() {\n var errors = v.processValidationResults(results, options);\n if (errors) {\n reject(new WrapErrors(errors, options, attributes, constraints));\n } else {\n resolve(attributes);\n }\n }, function(err) {\n reject(err);\n });\n });\n },\n\n single: function(value, constraints, options) {\n options = v.extend({}, v.single.options, options, {\n format: \"flat\",\n fullMessages: false\n });\n return v({single: value}, {single: constraints}, options);\n },\n\n // Returns a promise that is resolved when all promises in the results array\n // are settled. The promise returned from this function is always resolved,\n // never rejected.\n // This function modifies the input argument, it replaces the promises\n // with the value returned from the promise.\n waitForResults: function(results) {\n // Create a sequence of all the results starting with a resolved promise.\n return results.reduce(function(memo, result) {\n // If this result isn't a promise skip it in the sequence.\n if (!v.isPromise(result.error)) {\n return memo;\n }\n\n return memo.then(function() {\n return result.error.then(function(error) {\n result.error = error || null;\n });\n });\n }, new v.Promise(function(r) { r(); })); // A resolved promise\n },\n\n // If the given argument is a call: function the and: function return the value\n // otherwise just return the value. Additional arguments will be passed as\n // arguments to the function.\n // Example:\n // ```\n // result('foo') // 'foo'\n // result(Math.max, 1, 2) // 2\n // ```\n result: function(value) {\n var args = [].slice.call(arguments, 1);\n if (typeof value === 'function') {\n value = value.apply(null, args);\n }\n return value;\n },\n\n // Checks if the value is a number. This function does not consider NaN a\n // number like many other `isNumber` functions do.\n isNumber: function(value) {\n return typeof value === 'number' && !isNaN(value);\n },\n\n // Returns false if the object is not a function\n isFunction: function(value) {\n return typeof value === 'function';\n },\n\n // A simple check to verify that the value is an integer. Uses `isNumber`\n // and a simple modulo check.\n isInteger: function(value) {\n return v.isNumber(value) && value % 1 === 0;\n },\n\n // Checks if the value is a boolean\n isBoolean: function(value) {\n return typeof value === 'boolean';\n },\n\n // Uses the `Object` function to check if the given argument is an object.\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n // Simply checks if the object is an instance of a date\n isDate: function(obj) {\n return obj instanceof Date;\n },\n\n // Returns false if the object is `null` of `undefined`\n isDefined: function(obj) {\n return obj !== null && obj !== undefined;\n },\n\n // Checks if the given argument is a promise. Anything with a `then`\n // function is considered a promise.\n isPromise: function(p) {\n return !!p && v.isFunction(p.then);\n },\n\n isJqueryElement: function(o) {\n return o && v.isString(o.jquery);\n },\n\n isDomElement: function(o) {\n if (!o) {\n return false;\n }\n\n if (!o.querySelectorAll || !o.querySelector) {\n return false;\n }\n\n if (v.isObject(document) && o === document) {\n return true;\n }\n\n // http://stackoverflow.com/a/384380/699304\n /* istanbul ignore else */\n if (typeof HTMLElement === \"object\") {\n return o instanceof HTMLElement;\n } else {\n return o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\";\n }\n },\n\n isEmpty: function(value) {\n var attr;\n\n // Null and undefined are empty\n if (!v.isDefined(value)) {\n return true;\n }\n\n // functions are non empty\n if (v.isFunction(value)) {\n return false;\n }\n\n // Whitespace only strings are empty\n if (v.isString(value)) {\n return v.EMPTY_STRING_REGEXP.test(value);\n }\n\n // For arrays we use the length property\n if (v.isArray(value)) {\n return value.length === 0;\n }\n\n // Dates have no attributes but aren't empty\n if (v.isDate(value)) {\n return false;\n }\n\n // If we find at least one property we consider it non empty\n if (v.isObject(value)) {\n for (attr in value) {\n return false;\n }\n return true;\n }\n\n return false;\n },\n\n // Formats the specified strings with the given values like so:\n // ```\n // format(\"Foo: %{foo}\", {foo: \"bar\"}) // \"Foo bar\"\n // ```\n // If you want to write %{...} without having it replaced simply\n // prefix it with % like this `Foo: %%{foo}` and it will be returned\n // as `\"Foo: %{foo}\"`\n format: v.extend(function(str, vals) {\n if (!v.isString(str)) {\n return str;\n }\n return str.replace(v.format.FORMAT_REGEXP, function(m0, m1, m2) {\n if (m1 === '%') {\n return \"%{\" + m2 + \"}\";\n } else {\n return String(vals[m2]);\n }\n });\n }, {\n // Finds %{key} style patterns in the given string\n FORMAT_REGEXP: /(%?)%\\{([^\\}]+)\\}/g\n }),\n\n // \"Prettifies\" the given string.\n // Prettifying means replacing [.\\_-] with spaces as well as splitting\n // camel case words.\n prettify: function(str) {\n if (v.isNumber(str)) {\n // If there are more than 2 decimals round it to two\n if ((str * 100) % 1 === 0) {\n return \"\" + str;\n } else {\n return parseFloat(Math.round(str * 100) / 100).toFixed(2);\n }\n }\n\n if (v.isArray(str)) {\n return str.map(function(s) { return v.prettify(s); }).join(\", \");\n }\n\n if (v.isObject(str)) {\n return str.toString();\n }\n\n // Ensure the string is actually a string\n str = \"\" + str;\n\n return str\n // Splits keys separated by periods\n .replace(/([^\\s])\\.([^\\s])/g, '$1 $2')\n // Removes backslashes\n .replace(/\\\\+/g, '')\n // Replaces - and - with space\n .replace(/[_-]/g, ' ')\n // Splits camel cased words\n .replace(/([a-z])([A-Z])/g, function(m0, m1, m2) {\n return \"\" + m1 + \" \" + m2.toLowerCase();\n })\n .toLowerCase();\n },\n\n stringifyValue: function(value, options) {\n var prettify = options && options.prettify || v.prettify;\n return prettify(value);\n },\n\n isString: function(value) {\n return typeof value === 'string';\n },\n\n isArray: function(value) {\n return {}.toString.call(value) === '[object Array]';\n },\n\n // Checks if the object is a hash, which is equivalent to an object that\n // is neither an array nor a function.\n isHash: function(value) {\n return v.isObject(value) && !v.isArray(value) && !v.isFunction(value);\n },\n\n contains: function(obj, value) {\n if (!v.isDefined(obj)) {\n return false;\n }\n if (v.isArray(obj)) {\n return obj.indexOf(value) !== -1;\n }\n return value in obj;\n },\n\n unique: function(array) {\n if (!v.isArray(array)) {\n return array;\n }\n return array.filter(function(el, index, array) {\n return array.indexOf(el) == index;\n });\n },\n\n forEachKeyInKeypath: function(object, keypath, callback) {\n if (!v.isString(keypath)) {\n return undefined;\n }\n\n var key = \"\"\n , i\n , escape = false;\n\n for (i = 0; i < keypath.length; ++i) {\n switch (keypath[i]) {\n case '.':\n if (escape) {\n escape = false;\n key += '.';\n } else {\n object = callback(object, key, false);\n key = \"\";\n }\n break;\n\n case '\\\\':\n if (escape) {\n escape = false;\n key += '\\\\';\n } else {\n escape = true;\n }\n break;\n\n default:\n escape = false;\n key += keypath[i];\n break;\n }\n }\n\n return callback(object, key, true);\n },\n\n getDeepObjectValue: function(obj, keypath) {\n if (!v.isObject(obj)) {\n return undefined;\n }\n\n return v.forEachKeyInKeypath(obj, keypath, function(obj, key) {\n if (v.isObject(obj)) {\n return obj[key];\n }\n });\n },\n\n // This returns an object with all the values of the form.\n // It uses the input name as key and the value as value\n // So for example this:\n // \n // would return:\n // {email: \"foo@bar.com\"}\n collectFormValues: function(form, options) {\n var values = {}\n , i\n , j\n , input\n , inputs\n , option\n , value;\n\n if (v.isJqueryElement(form)) {\n form = form[0];\n }\n\n if (!form) {\n return values;\n }\n\n options = options || {};\n\n inputs = form.querySelectorAll(\"input[name], textarea[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n name = input.name.replace(/\\./g, \"\\\\\\\\.\");\n value = v.sanitizeFormValue(input.value, options);\n if (input.type === \"number\") {\n value = value ? +value : null;\n } else if (input.type === \"checkbox\") {\n if (input.attributes.value) {\n if (!input.checked) {\n value = values[name] || null;\n }\n } else {\n value = input.checked;\n }\n } else if (input.type === \"radio\") {\n if (!input.checked) {\n value = values[name] || null;\n }\n }\n values[name] = value;\n }\n\n inputs = form.querySelectorAll(\"select[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n if (input.multiple) {\n value = [];\n for (j in input.options) {\n option = input.options[j];\n if (option && option.selected) {\n value.push(v.sanitizeFormValue(option.value, options));\n }\n }\n } else {\n var _val = typeof input.options[input.selectedIndex] !== 'undefined' ? input.options[input.selectedIndex].value : '';\n value = v.sanitizeFormValue(_val, options);\n }\n values[input.name] = value;\n }\n\n return values;\n },\n\n sanitizeFormValue: function(value, options) {\n if (options.trim && v.isString(value)) {\n value = value.trim();\n }\n\n if (options.nullify !== false && value === \"\") {\n return null;\n }\n return value;\n },\n\n capitalize: function(str) {\n if (!v.isString(str)) {\n return str;\n }\n return str[0].toUpperCase() + str.slice(1);\n },\n\n // Remove all errors who's error attribute is empty (null or undefined)\n pruneEmptyErrors: function(errors) {\n return errors.filter(function(error) {\n return !v.isEmpty(error.error);\n });\n },\n\n // In\n // [{error: [\"err1\", \"err2\"], ...}]\n // Out\n // [{error: \"err1\", ...}, {error: \"err2\", ...}]\n //\n // All attributes in an error with multiple messages are duplicated\n // when expanding the errors.\n expandMultipleErrors: function(errors) {\n var ret = [];\n errors.forEach(function(error) {\n // Removes errors without a message\n if (v.isArray(error.error)) {\n error.error.forEach(function(msg) {\n ret.push(v.extend({}, error, {error: msg}));\n });\n } else {\n ret.push(error);\n }\n });\n return ret;\n },\n\n // Converts the error mesages by prepending the attribute name unless the\n // message is prefixed by ^\n convertErrorMessages: function(errors, options) {\n options = options || {};\n\n var ret = []\n , prettify = options.prettify || v.prettify;\n errors.forEach(function(errorInfo) {\n var error = v.result(errorInfo.error,\n errorInfo.value,\n errorInfo.attribute,\n errorInfo.options,\n errorInfo.attributes,\n errorInfo.globalOptions);\n\n if (!v.isString(error)) {\n ret.push(errorInfo);\n return;\n }\n\n if (error[0] === '^') {\n error = error.slice(1);\n } else if (options.fullMessages !== false) {\n error = v.capitalize(prettify(errorInfo.attribute)) + \" \" + error;\n }\n error = error.replace(/\\\\\\^/g, \"^\");\n error = v.format(error, {\n value: v.stringifyValue(errorInfo.value, options)\n });\n ret.push(v.extend({}, errorInfo, {error: error}));\n });\n return ret;\n },\n\n // In:\n // [{attribute: \"\", ...}]\n // Out:\n // {\"\": [{attribute: \"\", ...}]}\n groupErrorsByAttribute: function(errors) {\n var ret = {};\n errors.forEach(function(error) {\n var list = ret[error.attribute];\n if (list) {\n list.push(error);\n } else {\n ret[error.attribute] = [error];\n }\n });\n return ret;\n },\n\n // In:\n // [{error: \"\", ...}, {error: \"\", ...}]\n // Out:\n // [\"\", \"\"]\n flattenErrorsToArray: function(errors) {\n return errors\n .map(function(error) { return error.error; })\n .filter(function(value, index, self) {\n return self.indexOf(value) === index;\n });\n },\n\n cleanAttributes: function(attributes, whitelist) {\n function whitelistCreator(obj, key, last) {\n if (v.isObject(obj[key])) {\n return obj[key];\n }\n return (obj[key] = last ? true : {});\n }\n\n function buildObjectWhitelist(whitelist) {\n var ow = {}\n , lastObject\n , attr;\n for (attr in whitelist) {\n if (!whitelist[attr]) {\n continue;\n }\n v.forEachKeyInKeypath(ow, attr, whitelistCreator);\n }\n return ow;\n }\n\n function cleanRecursive(attributes, whitelist) {\n if (!v.isObject(attributes)) {\n return attributes;\n }\n\n var ret = v.extend({}, attributes)\n , w\n , attribute;\n\n for (attribute in attributes) {\n w = whitelist[attribute];\n\n if (v.isObject(w)) {\n ret[attribute] = cleanRecursive(ret[attribute], w);\n } else if (!w) {\n delete ret[attribute];\n }\n }\n return ret;\n }\n\n if (!v.isObject(whitelist) || !v.isObject(attributes)) {\n return {};\n }\n\n whitelist = buildObjectWhitelist(whitelist);\n return cleanRecursive(attributes, whitelist);\n },\n\n exposeModule: function(validate, root, exports, module, define) {\n if (exports) {\n if (module && module.exports) {\n exports = module.exports = validate;\n }\n exports.validate = validate;\n } else {\n root.validate = validate;\n if (validate.isFunction(define) && define.amd) {\n define([], function () { return validate; });\n }\n }\n },\n\n warn: function(msg) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[validate.js] \" + msg);\n }\n },\n\n error: function(msg) {\n if (typeof console !== \"undefined\" && console.error) {\n console.error(\"[validate.js] \" + msg);\n }\n }\n });\n\n validate.validators = {\n // Presence validates that the value isn't empty\n presence: function(value, options) {\n options = v.extend({}, this.options, options);\n if (options.allowEmpty !== false ? !v.isDefined(value) : v.isEmpty(value)) {\n return options.message || this.message || \"can't be blank\";\n }\n },\n length: function(value, options, attribute) {\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var is = options.is\n , maximum = options.maximum\n , minimum = options.minimum\n , tokenizer = options.tokenizer || function(val) { return val; }\n , err\n , errors = [];\n\n value = tokenizer(value);\n var length = value.length;\n if(!v.isNumber(length)) {\n v.error(v.format(\"Attribute %{attr} has a non numeric value for `length`\", {attr: attribute}));\n return options.message || this.notValid || \"has an incorrect length\";\n }\n\n // Is checks\n if (v.isNumber(is) && length !== is) {\n err = options.wrongLength ||\n this.wrongLength ||\n \"is the wrong length (should be %{count} characters)\";\n errors.push(v.format(err, {count: is}));\n }\n\n if (v.isNumber(minimum) && length < minimum) {\n err = options.tooShort ||\n this.tooShort ||\n \"is too short (minimum is %{count} characters)\";\n errors.push(v.format(err, {count: minimum}));\n }\n\n if (v.isNumber(maximum) && length > maximum) {\n err = options.tooLong ||\n this.tooLong ||\n \"is too long (maximum is %{count} characters)\";\n errors.push(v.format(err, {count: maximum}));\n }\n\n if (errors.length > 0) {\n return options.message || errors;\n }\n },\n numericality: function(value, options, attribute, attributes, globalOptions) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var errors = []\n , name\n , count\n , checks = {\n greaterThan: function(v, c) { return v > c; },\n greaterThanOrEqualTo: function(v, c) { return v >= c; },\n equalTo: function(v, c) { return v === c; },\n lessThan: function(v, c) { return v < c; },\n lessThanOrEqualTo: function(v, c) { return v <= c; },\n divisibleBy: function(v, c) { return v % c === 0; }\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n // Strict will check that it is a valid looking number\n if (v.isString(value) && options.strict) {\n var pattern = \"^-?(0|[1-9]\\\\d*)\";\n if (!options.onlyInteger) {\n pattern += \"(\\\\.\\\\d+)?\";\n }\n pattern += \"$\";\n\n if (!(new RegExp(pattern).test(value))) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"must be a valid number\";\n }\n }\n\n // Coerce the value to a number unless we're being strict.\n if (options.noStrings !== true && v.isString(value) && !v.isEmpty(value)) {\n value = +value;\n }\n\n // If it's not a number we shouldn't continue since it will compare it.\n if (!v.isNumber(value)) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"is not a number\";\n }\n\n // Same logic as above, sort of. Don't bother with comparisons if this\n // doesn't pass.\n if (options.onlyInteger && !v.isInteger(value)) {\n return options.message ||\n options.notInteger ||\n this.notInteger ||\n this.message ||\n \"must be an integer\";\n }\n\n for (name in checks) {\n count = options[name];\n if (v.isNumber(count) && !checks[name](value, count)) {\n // This picks the default message if specified\n // For example the greaterThan check uses the message from\n // this.notGreaterThan so we capitalize the name and prepend \"not\"\n var key = \"not\" + v.capitalize(name);\n var msg = options[key] ||\n this[key] ||\n this.message ||\n \"must be %{type} %{count}\";\n\n errors.push(v.format(msg, {\n count: count,\n type: prettify(name)\n }));\n }\n }\n\n if (options.odd && value % 2 !== 1) {\n errors.push(options.notOdd ||\n this.notOdd ||\n this.message ||\n \"must be odd\");\n }\n if (options.even && value % 2 !== 0) {\n errors.push(options.notEven ||\n this.notEven ||\n this.message ||\n \"must be even\");\n }\n\n if (errors.length) {\n return options.message || errors;\n }\n },\n datetime: v.extend(function(value, options) {\n if (!v.isFunction(this.parse) || !v.isFunction(this.format)) {\n throw new Error(\"Both the parse and format functions needs to be set to use the datetime/date validator\");\n }\n\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var err\n , errors = []\n , earliest = options.earliest ? this.parse(options.earliest, options) : NaN\n , latest = options.latest ? this.parse(options.latest, options) : NaN;\n\n value = this.parse(value, options);\n\n // 86400000 is the number of milliseconds in a day, this is used to remove\n // the time from the date\n if (isNaN(value) || options.dateOnly && value % 86400000 !== 0) {\n err = options.notValid ||\n options.message ||\n this.notValid ||\n \"must be a valid date\";\n return v.format(err, {value: arguments[0]});\n }\n\n if (!isNaN(earliest) && value < earliest) {\n err = options.tooEarly ||\n options.message ||\n this.tooEarly ||\n \"must be no earlier than %{date}\";\n err = v.format(err, {\n value: this.format(value, options),\n date: this.format(earliest, options)\n });\n errors.push(err);\n }\n\n if (!isNaN(latest) && value > latest) {\n err = options.tooLate ||\n options.message ||\n this.tooLate ||\n \"must be no later than %{date}\";\n err = v.format(err, {\n date: this.format(latest, options),\n value: this.format(value, options)\n });\n errors.push(err);\n }\n\n if (errors.length) {\n return v.unique(errors);\n }\n }, {\n parse: null,\n format: null\n }),\n date: function(value, options) {\n options = v.extend({}, options, {dateOnly: true});\n return v.validators.datetime.call(v.validators.datetime, value, options);\n },\n format: function(value, options) {\n if (v.isString(options) || (options instanceof RegExp)) {\n options = {pattern: options};\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is invalid\"\n , pattern = options.pattern\n , match;\n\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n\n if (v.isString(pattern)) {\n pattern = new RegExp(options.pattern, options.flags);\n }\n match = pattern.exec(value);\n if (!match || match[0].length != value.length) {\n return message;\n }\n },\n inclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (v.contains(options.within, value)) {\n return;\n }\n var message = options.message ||\n this.message ||\n \"^%{value} is not included in the list\";\n return v.format(message, {value: value});\n },\n exclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (!v.contains(options.within, value)) {\n return;\n }\n var message = options.message || this.message || \"^%{value} is restricted\";\n return v.format(message, {value: value});\n },\n email: v.extend(function(value, options) {\n options = v.extend({}, this.options, options);\n var message = options.message || this.message || \"is not a valid email\";\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n if (!this.PATTERN.exec(value)) {\n return message;\n }\n }, {\n PATTERN: /^[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$/i\n }),\n equality: function(value, options, attribute, attributes, globalOptions) {\n if (!v.isDefined(value)) {\n return;\n }\n\n if (v.isString(options)) {\n options = {attribute: options};\n }\n options = v.extend({}, this.options, options);\n var message = options.message ||\n this.message ||\n \"is not equal to %{attribute}\";\n\n if (v.isEmpty(options.attribute) || !v.isString(options.attribute)) {\n throw new Error(\"The attribute must be a non empty string\");\n }\n\n var otherValue = v.getDeepObjectValue(attributes, options.attribute)\n , comparator = options.comparator || function(v1, v2) {\n return v1 === v2;\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n if (!comparator(value, otherValue, options, attribute, attributes)) {\n return v.format(message, {attribute: prettify(options.attribute)});\n }\n },\n\n // A URL validator that is used to validate URLs with the ability to\n // restrict schemes and some domains.\n url: function(value, options) {\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is not a valid url\"\n , schemes = options.schemes || this.schemes || ['http', 'https']\n , allowLocal = options.allowLocal || this.allowLocal || false;\n\n if (!v.isString(value)) {\n return message;\n }\n\n // https://gist.github.com/dperini/729294\n var regex =\n \"^\" +\n // protocol identifier\n \"(?:(?:\" + schemes.join(\"|\") + \")://)\" +\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\";\n\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n\n if (allowLocal) {\n tld += \"?\";\n } else {\n regex +=\n // IP address exclusion\n // private & local networks\n \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\";\n }\n\n regex +=\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n tld +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:[/?#]\\\\S*)?\" +\n \"$\";\n\n var PATTERN = new RegExp(regex, 'i');\n if (!PATTERN.exec(value)) {\n return message;\n }\n }\n };\n\n validate.formatters = {\n detailed: function(errors) {return errors;},\n flat: v.flattenErrorsToArray,\n grouped: function(errors) {\n var attr;\n\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = v.flattenErrorsToArray(errors[attr]);\n }\n return errors;\n },\n constraint: function(errors) {\n var attr;\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = errors[attr].map(function(result) {\n return result.validator;\n }).sort();\n }\n return errors;\n }\n };\n\n validate.exposeModule(validate, this, exports, module, __webpack_require__(\"lfEA\"));\n}).call(this,\n true ? /* istanbul ignore next */ exports : null,\n true ? /* istanbul ignore next */ module : null,\n __webpack_require__(\"lfEA\"));\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"l262\")(module)))\n\n/***/ }),\n\n/***/ \"OuyB\":\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n/***/ }),\n\n/***/ \"Ywd4\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar debounce = __webpack_require__(\"CXfR\"),\n isObject = __webpack_require__(\"u9vI\");\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n\n\n/***/ }),\n\n/***/ \"bgO7\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseGetTag = __webpack_require__(\"e5TX\"),\n isObjectLike = __webpack_require__(\"OuyB\");\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n\n\n/***/ }),\n\n/***/ \"e5TX\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(\"wppe\"),\n getRawTag = __webpack_require__(\"uiOY\"),\n objectToString = __webpack_require__(\"lPmd\");\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n/***/ }),\n\n/***/ \"h6ac\":\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n\n/***/ \"iS0Z\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar baseTrim = __webpack_require__(\"0S+K\"),\n isObject = __webpack_require__(\"u9vI\"),\n isSymbol = __webpack_require__(\"bgO7\");\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n\n\n/***/ }),\n\n/***/ \"j3D9\":\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(\"h6ac\")))\n\n/***/ }),\n\n/***/ \"l262\":\n/***/ (function(module, exports) {\n\nmodule.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n/***/ }),\n\n/***/ \"lPmd\":\n/***/ (function(module, exports) {\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n/***/ }),\n\n/***/ \"lfEA\":\n/***/ (function(module, exports) {\n\nmodule.exports = function() {\r\n\tthrow new Error(\"define cannot be used indirect\");\r\n};\r\n\n\n/***/ }),\n\n/***/ \"u9vI\":\n/***/ (function(module, exports) {\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n/***/ }),\n\n/***/ \"uiOY\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Symbol = __webpack_require__(\"wppe\");\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n\n\n/***/ }),\n\n/***/ \"wppe\":\n/***/ (function(module, exports, __webpack_require__) {\n\nvar root = __webpack_require__(\"MIhM\");\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n/***/ }),\n\n/***/ \"x2wq\":\n/***/ (function(module, exports) {\n\n/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n\n\n/***/ })\n\n},[\"NK6C\"]);\n\n\n// WEBPACK FOOTER //\n// scripts/vendor.fd6b3eb4dec369ae48e1.js","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_baseTrim.js\n// module id = 0S+K\n// module chunks = 1","var root = require('./_root');\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nmodule.exports = now;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/now.js\n// module id = 0pJf\n// module chunks = 1","/*! 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.\\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\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/hammerjs/hammer.js\n// module id = 3vhj\n// module chunks = 1","var isObject = require('./isObject'),\n now = require('./now'),\n toNumber = require('./toNumber');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n clearTimeout(timerId);\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\nmodule.exports = debounce;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/debounce.js\n// module id = CXfR\n// module chunks = 1","/**\n* Wallop.js\n*\n* @fileoverview Minimal JS library to show & hide things\n*\n* @author Pedro Duarte\n* @author http://pedroduarte.me/wallop\n*\n*/\n(function(global){\n function Wallop(selector, options) {\n if (!selector) { throw new Error('Missing selector. Refer to Usage documentation: https://github.com/peduarte/wallop#javascript'); }\n\n for (var i = 0; i < selectorPool.length; i++) {\n if (selectorPool[i] === selector) {\n throw new Error('An instance of Wallop with this selector already exists.');\n }\n }\n\n this.options = {\n buttonPreviousClass: 'Wallop-buttonPrevious',\n buttonNextClass: 'Wallop-buttonNext',\n itemClass: 'Wallop-item',\n currentItemClass: 'Wallop-item--current',\n showPreviousClass: 'Wallop-item--showPrevious',\n showNextClass: 'Wallop-item--showNext',\n hidePreviousClass: 'Wallop-item--hidePrevious',\n hideNextClass: 'Wallop-item--hideNext',\n carousel: true\n };\n\n // Whitelist elements which contain `length`\n this.whitelist = {\n 'form': true\n };\n\n if (selector.length > 0 && !this.whitelist[selector]) {\n throw new Error('Selector cannot be an array, Refer to Usage documentation: https://github.com/peduarte/wallop#javascript');\n } else {\n this.$selector = selector;\n }\n\n this.options = extend(this.options, options);\n this.event = null;\n\n // \"Global vars\"\n this.reset();\n this.buttonPrevious = this.$selector.querySelector(' .' + this.options.buttonPreviousClass);\n this.buttonNext = this.$selector.querySelector(' .' + this.options.buttonNextClass);\n\n this.bindEvents();\n this.createCustomEvent();\n\n // If there is no active item, start at 0\n if (this.currentItemIndex === -1) {\n this.currentItemIndex = 0;\n addClass(this.allItemsArray[this.currentItemIndex], this.options.currentItemClass);\n }\n\n // Update button states to make sure the correct state is set on initialization\n this.updateButtonStates();\n\n // Wrapped in timeout function so event can\n // be listened from outside at anytime\n var _this = this;\n setTimeout(function() {\n _this.event.detail.currentItemIndex = _this.currentItemIndex;\n _this.$selector.dispatchEvent(_this.event);\n }, 0);\n }\n\n var selectorPool = [];\n\n var WS = Wallop.prototype;\n\n // Update prev/next disabled attribute\n WS.updateButtonStates = function () {\n if ((!this.buttonPrevious && !this.buttonNext) || this.options.carousel) { return; }\n\n if (this.currentItemIndex === this.lastItemIndex) {\n this.buttonNext.setAttribute('disabled', 'disabled');\n } else if (this.currentItemIndex === 0) {\n this.buttonPrevious.setAttribute('disabled', 'disabled');\n }\n };\n\n // Reset all settings by removing classes and attributes added by goTo() & updateButtonStates()\n WS.removeAllHelperSettings = function () {\n removeClass(this.allItemsArray[this.currentItemIndex], this.options.currentItemClass);\n removeClass($$(this.options.hidePreviousClass, this.$selector), this.options.hidePreviousClass);\n removeClass($$(this.options.hideNextClass, this.$selector), this.options.hideNextClass);\n removeClass($$(this.options.showPreviousClass, this.$selector), this.options.showPreviousClass);\n removeClass($$(this.options.showNextClass, this.$selector), this.options.showNextClass);\n\n if (!this.buttonPrevious && !this.buttonNext) { return; }\n\n this.buttonPrevious.removeAttribute('disabled');\n this.buttonNext.removeAttribute('disabled');\n };\n\n // Method to add classes to the right elements depending on the index passed\n WS.goTo = function (index) {\n if (index === this.currentItemIndex) { return; }\n\n // Fix the index if it's out of bounds and carousel is enabled\n index = index === -1 && this.options.carousel ? this.lastItemIndex : index;\n index = index === this.lastItemIndex + 1 && this.options.carousel ? 0 : index;\n\n // Exit when index is out of bounds\n if (index < 0 || index > this.lastItemIndex) { return; }\n\n this.removeAllHelperSettings();\n\n var isForwards = (index > this.currentItemIndex || index === 0 && this.currentItemIndex === this.lastItemIndex) && !(index === this.lastItemIndex && this.currentItemIndex === 0);\n addClass(this.allItemsArray[this.currentItemIndex], isForwards ? this.options.hidePreviousClass : this.options.hideNextClass);\n addClass(this.allItemsArray[index], this.options.currentItemClass + ' ' + (isForwards ? this.options.showNextClass : this.options.showPreviousClass));\n\n this.currentItemIndex = index;\n\n this.updateButtonStates();\n\n this.event.detail.currentItemIndex = this.currentItemIndex;\n this.$selector.dispatchEvent(this.event);\n };\n\n // Previous item handler\n WS.previous = function () {\n this.goTo(this.currentItemIndex - 1);\n };\n\n // Next item handler\n WS.next = function () {\n this.goTo(this.currentItemIndex + 1);\n };\n\n // Update global variables\n WS.reset = function () {\n this.allItemsArray = Array.prototype.slice.call(this.$selector.querySelectorAll(' .' + this.options.itemClass));\n this.currentItemIndex = this.allItemsArray.indexOf(this.$selector.querySelector(' .' + this.options.currentItemClass));\n this.lastItemIndex = this.allItemsArray.length - 1;\n };\n\n // Attach click handlers\n WS.bindEvents = function () {\n selectorPool.push(this.$selector);\n\n var _this = this;\n\n if (this.buttonPrevious) {\n this.buttonPrevious.addEventListener('click', function (event) {\n event.preventDefault();\n _this.previous();\n });\n }\n\n if (this.buttonNext) {\n this.buttonNext.addEventListener('click', function (event) {\n event.preventDefault();\n _this.next();\n });\n }\n\n };\n\n // Method to bind custom event\n WS.on = function (eventName, callback) {\n this.$selector.addEventListener(eventName, callback, false);\n };\n\n // Method to unbind custom event\n WS.off = function (eventName, callback) {\n this.$selector.removeEventListener(eventName, callback, false);\n };\n\n // Create custom Event\n WS.createCustomEvent = function () {\n var _this = this;\n this.event = new CustomEvent('change', {\n detail: {\n wallopEl: _this.$selector,\n currentItemIndex: Number(_this.currentItemIndex)\n },\n bubbles: true,\n cancelable: true\n });\n };\n\n // Helper functions\n function $$(element, container) {\n if (!element) { return; }\n if (!container) {\n container = document;\n }\n return container.querySelector('.' + element);\n }\n\n function addClass(element, className) {\n if (!element) { return; }\n element.className = (element.className + ' ' + className).trim();\n }\n\n function removeClass(element, className) {\n if (!element) { return; }\n element.className = element.className.replace(className, '').trim();\n }\n\n function extend(origOptions, userOptions){\n var extendOptions = {}, attrname;\n for (attrname in origOptions) { extendOptions[attrname] = origOptions[attrname]; }\n for (attrname in userOptions) { extendOptions[attrname] = userOptions[attrname]; }\n return extendOptions;\n }\n\n // Pollyfill for CustomEvent() Constructor - thanks to Internet Explorer\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n function CustomEvent(event, params) {\n params = params || { bubbles: false, cancelable: false, detail: undefined };\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n\n CustomEvent.prototype = window.CustomEvent ? window.CustomEvent.prototype : {};\n window.CustomEvent = CustomEvent;\n\n // Exports to multiple environments\n if(typeof define === 'function' && define.amd){ //AMD\n define(function () { return Wallop; });\n } else if (typeof module !== 'undefined' && module.exports){ //node\n module.exports = Wallop;\n } else { // browser\n // use string because of Google closure compiler ADVANCED_MODE\n /* jslint sub:true */\n global['Wallop'] = Wallop;\n }\n}(this));\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/wallop/js/Wallop.js\n// module id = M9Vy\n// module chunks = 1","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_root.js\n// module id = MIhM\n// module chunks = 1","// Polyfills\r\n// import 'core-js/es6/promise'\r\n// import 'core-js/fn/promise'\r\n// import 'core-js/fn/string/includes'\r\n// import 'core-js/fn/object/assign'\r\n// import 'core-js/fn/object/keys'\r\n// import 'core-js/fn/array/from'\r\n// import 'core-js/fn/array/find'\r\n// import 'core-js/fn/array/find-index'\r\n// import 'core-js/fn/array/includes'\r\n// import 'core-js/fn/array/for-each'\r\n// import 'whatwg-fetch'\r\n// import 'objectFitPolyfill/src/objectFitPolyfill.basic'\r\n\r\n// Vendor\r\nimport 'animejs'\r\nimport 'hammerjs'\r\nimport 'validate.js'\r\nimport 'wallop'\r\n\r\nimport 'lodash/throttle'\r\n\n\n\n// WEBPACK FOOTER //\n// ./scripts/vendor.js","/*\n 2017 Julian Garnier\n Released under the MIT license\n*/\nvar $jscomp={scope:{}};$jscomp.defineProperty=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(e,r,p){if(p.get||p.set)throw new TypeError(\"ES3 does not support getters and setters.\");e!=Array.prototype&&e!=Object.prototype&&(e[r]=p.value)};$jscomp.getGlobal=function(e){return\"undefined\"!=typeof window&&window===e?e:\"undefined\"!=typeof global&&null!=global?global:e};$jscomp.global=$jscomp.getGlobal(this);$jscomp.SYMBOL_PREFIX=\"jscomp_symbol_\";\n$jscomp.initSymbol=function(){$jscomp.initSymbol=function(){};$jscomp.global.Symbol||($jscomp.global.Symbol=$jscomp.Symbol)};$jscomp.symbolCounter_=0;$jscomp.Symbol=function(e){return $jscomp.SYMBOL_PREFIX+(e||\"\")+$jscomp.symbolCounter_++};\n$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var e=$jscomp.global.Symbol.iterator;e||(e=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol(\"iterator\"));\"function\"!=typeof Array.prototype[e]&&$jscomp.defineProperty(Array.prototype,e,{configurable:!0,writable:!0,value:function(){return $jscomp.arrayIterator(this)}});$jscomp.initSymbolIterator=function(){}};$jscomp.arrayIterator=function(e){var r=0;return $jscomp.iteratorPrototype(function(){return rb&&(b+=1);1b?c:b<2/3?a+(c-a)*(2/3-b)*6:a}var d=/hsl\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%\\)/g.exec(a)||/hsla\\((\\d+),\\s*([\\d.]+)%,\\s*([\\d.]+)%,\\s*([\\d.]+)\\)/g.exec(a);a=parseInt(d[1])/360;var b=parseInt(d[2])/100,f=parseInt(d[3])/100,d=d[4]||1;if(0==b)f=b=a=f;else{var n=.5>f?f*(1+b):f+b-f*b,k=2*f-n,f=c(k,n,a+1/3),b=c(k,n,a);a=c(k,n,a-1/3)}return\"rgba(\"+\n255*f+\",\"+255*b+\",\"+255*a+\",\"+d+\")\"}function y(a){if(a=/([\\+\\-]?[0-9#\\.]+)(%|px|pt|em|rem|in|cm|mm|ex|ch|pc|vw|vh|vmin|vmax|deg|rad|turn)?$/.exec(a))return a[2]}function V(a){if(-1=g.currentTime)for(var G=0;G=w||!k)g.began||(g.began=!0,f(\"begin\")),f(\"run\");if(q>n&&q=k&&r!==k||!k)b(k),x||e();f(\"update\");a>=k&&(g.remaining?(t=h,\"alternate\"===g.direction&&(g.reversed=!g.reversed)):(g.pause(),g.completed||(g.completed=!0,f(\"complete\"),\"Promise\"in window&&(p(),m=c()))),l=0)}a=void 0===a?{}:a;var h,t,l=0,p=null,m=c(),g=fa(a);g.reset=function(){var a=g.direction,c=g.loop;g.currentTime=\n0;g.progress=0;g.paused=!0;g.began=!1;g.completed=!1;g.reversed=\"reverse\"===a;g.remaining=\"alternate\"===a&&1===c?2:c;b(0);for(a=g.children.length;a--;)g.children[a].reset()};g.tick=function(a){h=a;t||(t=h);k((l+h-t)*q.speed)};g.seek=function(a){k(d(a))};g.pause=function(){var a=v.indexOf(g);-1=c&&0<=b&&1>=b){var e=new Float32Array(11);if(c!==d||b!==f)for(var k=0;11>k;++k)e[k]=a(.1*k,c,b);return function(k){if(c===d&&b===f)return k;if(0===k)return 0;if(1===k)return 1;for(var h=0,l=1;10!==l&&e[l]<=k;++l)h+=.1;--l;var l=h+(k-e[l])/(e[l+1]-e[l])*.1,n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(.001<=n){for(h=0;4>h;++h){n=3*(1-3*b+3*c)*l*l+2*(3*b-6*c)*l+3*c;if(0===n)break;var m=a(l,c,b)-k,l=l-m/n}k=l}else if(0===\nn)k=l;else{var l=h,h=h+.1,g=0;do m=l+(h-l)/2,n=a(m,c,b)-k,0++g);k=m}return a(k,d,f)}}}}(),Q=function(){function a(a,b){return 0===a||1===a?a:-Math.pow(2,10*(a-1))*Math.sin(2*(a-1-b/(2*Math.PI)*Math.asin(1))*Math.PI/b)}var c=\"Quad Cubic Quart Quint Sine Expo Circ Back Elastic\".split(\" \"),d={In:[[.55,.085,.68,.53],[.55,.055,.675,.19],[.895,.03,.685,.22],[.755,.05,.855,.06],[.47,0,.745,.715],[.95,.05,.795,.035],[.6,.04,.98,.335],[.6,-.28,.735,.045],a],Out:[[.25,\n.46,.45,.94],[.215,.61,.355,1],[.165,.84,.44,1],[.23,1,.32,1],[.39,.575,.565,1],[.19,1,.22,1],[.075,.82,.165,1],[.175,.885,.32,1.275],function(b,c){return 1-a(1-b,c)}],InOut:[[.455,.03,.515,.955],[.645,.045,.355,1],[.77,0,.175,1],[.86,0,.07,1],[.445,.05,.55,.95],[1,0,0,1],[.785,.135,.15,.86],[.68,-.55,.265,1.55],function(b,c){return.5>b?a(2*b,c)/2:1-a(-2*b+2,c)/2}]},b={linear:A(.25,.25,.75,.75)},f={},e;for(e in d)f.type=e,d[f.type].forEach(function(a){return function(d,f){b[\"ease\"+a.type+c[f]]=h.fnc(d)?\nd:A.apply($jscomp$this,d)}}(f)),f={type:f.type};return b}(),ha={css:function(a,c,d){return a.style[c]=d},attribute:function(a,c,d){return a.setAttribute(c,d)},object:function(a,c,d){return a[c]=d},transform:function(a,c,d,b,f){b[f]||(b[f]=[]);b[f].push(c+\"(\"+d+\")\")}},v=[],B=0,ia=function(){function a(){B=requestAnimationFrame(c)}function c(c){var b=v.length;if(b){for(var d=0;db&&(c.duration=d.duration);c.children.push(d)});c.seek(0);c.reset();c.autoplay&&c.restart();return c};return c};q.random=function(a,c){return Math.floor(Math.random()*(c-a+1))+a};return q});\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/animejs/anime.min.js\n// module id = NQR3\n// module chunks = 1","/*!\n * validate.js 0.12.0\n *\n * (c) 2013-2017 Nicklas Ansman, 2013 Wrapp\n * Validate.js may be freely distributed under the MIT license.\n * For all details and documentation:\n * http://validatejs.org/\n */\n\n(function(exports, module, define) {\n \"use strict\";\n\n // The main function that calls the validators specified by the constraints.\n // The options are the following:\n // - format (string) - An option that controls how the returned value is formatted\n // * flat - Returns a flat array of just the error messages\n // * grouped - Returns the messages grouped by attribute (default)\n // * detailed - Returns an array of the raw validation data\n // - fullMessages (boolean) - If `true` (default) the attribute name is prepended to the error.\n //\n // Please note that the options are also passed to each validator.\n var validate = function(attributes, constraints, options) {\n options = v.extend({}, v.options, options);\n\n var results = v.runValidations(attributes, constraints, options)\n , attr\n , validator;\n\n if (results.some(function(r) { return v.isPromise(r.error); })) {\n throw new Error(\"Use validate.async if you want support for promises\");\n }\n return validate.processValidationResults(results, options);\n };\n\n var v = validate;\n\n // Copies over attributes from one or more sources to a single destination.\n // Very much similar to underscore's extend.\n // The first argument is the target object and the remaining arguments will be\n // used as sources.\n v.extend = function(obj) {\n [].slice.call(arguments, 1).forEach(function(source) {\n for (var attr in source) {\n obj[attr] = source[attr];\n }\n });\n return obj;\n };\n\n v.extend(validate, {\n // This is the version of the library as a semver.\n // The toString function will allow it to be coerced into a string\n version: {\n major: 0,\n minor: 12,\n patch: 0,\n metadata: null,\n toString: function() {\n var version = v.format(\"%{major}.%{minor}.%{patch}\", v.version);\n if (!v.isEmpty(v.version.metadata)) {\n version += \"+\" + v.version.metadata;\n }\n return version;\n }\n },\n\n // Below is the dependencies that are used in validate.js\n\n // The constructor of the Promise implementation.\n // If you are using Q.js, RSVP or any other A+ compatible implementation\n // override this attribute to be the constructor of that promise.\n // Since jQuery promises aren't A+ compatible they won't work.\n Promise: typeof Promise !== \"undefined\" ? Promise : /* istanbul ignore next */ null,\n\n EMPTY_STRING_REGEXP: /^\\s*$/,\n\n // Runs the validators specified by the constraints object.\n // Will return an array of the format:\n // [{attribute: \"\", error: \"\"}, ...]\n runValidations: function(attributes, constraints, options) {\n var results = []\n , attr\n , validatorName\n , value\n , validators\n , validator\n , validatorOptions\n , error;\n\n if (v.isDomElement(attributes) || v.isJqueryElement(attributes)) {\n attributes = v.collectFormValues(attributes);\n }\n\n // Loops through each constraints, finds the correct validator and run it.\n for (attr in constraints) {\n value = v.getDeepObjectValue(attributes, attr);\n // This allows the constraints for an attribute to be a function.\n // The function will be called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validators = v.result(constraints[attr], value, attributes, attr, options, constraints);\n\n for (validatorName in validators) {\n validator = v.validators[validatorName];\n\n if (!validator) {\n error = v.format(\"Unknown validator %{name}\", {name: validatorName});\n throw new Error(error);\n }\n\n validatorOptions = validators[validatorName];\n // This allows the options to be a function. The function will be\n // called with the value, attribute name, the complete dict of\n // attributes as well as the options and constraints passed in.\n // This is useful when you want to have different\n // validations depending on the attribute value.\n validatorOptions = v.result(validatorOptions, value, attributes, attr, options, constraints);\n if (!validatorOptions) {\n continue;\n }\n results.push({\n attribute: attr,\n value: value,\n validator: validatorName,\n globalOptions: options,\n attributes: attributes,\n options: validatorOptions,\n error: validator.call(validator,\n value,\n validatorOptions,\n attr,\n attributes,\n options)\n });\n }\n }\n\n return results;\n },\n\n // Takes the output from runValidations and converts it to the correct\n // output format.\n processValidationResults: function(errors, options) {\n errors = v.pruneEmptyErrors(errors, options);\n errors = v.expandMultipleErrors(errors, options);\n errors = v.convertErrorMessages(errors, options);\n\n var format = options.format || \"grouped\";\n\n if (typeof v.formatters[format] === 'function') {\n errors = v.formatters[format](errors);\n } else {\n throw new Error(v.format(\"Unknown format %{format}\", options));\n }\n\n return v.isEmpty(errors) ? undefined : errors;\n },\n\n // Runs the validations with support for promises.\n // This function will return a promise that is settled when all the\n // validation promises have been completed.\n // It can be called even if no validations returned a promise.\n async: function(attributes, constraints, options) {\n options = v.extend({}, v.async.options, options);\n\n var WrapErrors = options.wrapErrors || function(errors) {\n return errors;\n };\n\n // Removes unknown attributes\n if (options.cleanAttributes !== false) {\n attributes = v.cleanAttributes(attributes, constraints);\n }\n\n var results = v.runValidations(attributes, constraints, options);\n\n return new v.Promise(function(resolve, reject) {\n v.waitForResults(results).then(function() {\n var errors = v.processValidationResults(results, options);\n if (errors) {\n reject(new WrapErrors(errors, options, attributes, constraints));\n } else {\n resolve(attributes);\n }\n }, function(err) {\n reject(err);\n });\n });\n },\n\n single: function(value, constraints, options) {\n options = v.extend({}, v.single.options, options, {\n format: \"flat\",\n fullMessages: false\n });\n return v({single: value}, {single: constraints}, options);\n },\n\n // Returns a promise that is resolved when all promises in the results array\n // are settled. The promise returned from this function is always resolved,\n // never rejected.\n // This function modifies the input argument, it replaces the promises\n // with the value returned from the promise.\n waitForResults: function(results) {\n // Create a sequence of all the results starting with a resolved promise.\n return results.reduce(function(memo, result) {\n // If this result isn't a promise skip it in the sequence.\n if (!v.isPromise(result.error)) {\n return memo;\n }\n\n return memo.then(function() {\n return result.error.then(function(error) {\n result.error = error || null;\n });\n });\n }, new v.Promise(function(r) { r(); })); // A resolved promise\n },\n\n // If the given argument is a call: function the and: function return the value\n // otherwise just return the value. Additional arguments will be passed as\n // arguments to the function.\n // Example:\n // ```\n // result('foo') // 'foo'\n // result(Math.max, 1, 2) // 2\n // ```\n result: function(value) {\n var args = [].slice.call(arguments, 1);\n if (typeof value === 'function') {\n value = value.apply(null, args);\n }\n return value;\n },\n\n // Checks if the value is a number. This function does not consider NaN a\n // number like many other `isNumber` functions do.\n isNumber: function(value) {\n return typeof value === 'number' && !isNaN(value);\n },\n\n // Returns false if the object is not a function\n isFunction: function(value) {\n return typeof value === 'function';\n },\n\n // A simple check to verify that the value is an integer. Uses `isNumber`\n // and a simple modulo check.\n isInteger: function(value) {\n return v.isNumber(value) && value % 1 === 0;\n },\n\n // Checks if the value is a boolean\n isBoolean: function(value) {\n return typeof value === 'boolean';\n },\n\n // Uses the `Object` function to check if the given argument is an object.\n isObject: function(obj) {\n return obj === Object(obj);\n },\n\n // Simply checks if the object is an instance of a date\n isDate: function(obj) {\n return obj instanceof Date;\n },\n\n // Returns false if the object is `null` of `undefined`\n isDefined: function(obj) {\n return obj !== null && obj !== undefined;\n },\n\n // Checks if the given argument is a promise. Anything with a `then`\n // function is considered a promise.\n isPromise: function(p) {\n return !!p && v.isFunction(p.then);\n },\n\n isJqueryElement: function(o) {\n return o && v.isString(o.jquery);\n },\n\n isDomElement: function(o) {\n if (!o) {\n return false;\n }\n\n if (!o.querySelectorAll || !o.querySelector) {\n return false;\n }\n\n if (v.isObject(document) && o === document) {\n return true;\n }\n\n // http://stackoverflow.com/a/384380/699304\n /* istanbul ignore else */\n if (typeof HTMLElement === \"object\") {\n return o instanceof HTMLElement;\n } else {\n return o &&\n typeof o === \"object\" &&\n o !== null &&\n o.nodeType === 1 &&\n typeof o.nodeName === \"string\";\n }\n },\n\n isEmpty: function(value) {\n var attr;\n\n // Null and undefined are empty\n if (!v.isDefined(value)) {\n return true;\n }\n\n // functions are non empty\n if (v.isFunction(value)) {\n return false;\n }\n\n // Whitespace only strings are empty\n if (v.isString(value)) {\n return v.EMPTY_STRING_REGEXP.test(value);\n }\n\n // For arrays we use the length property\n if (v.isArray(value)) {\n return value.length === 0;\n }\n\n // Dates have no attributes but aren't empty\n if (v.isDate(value)) {\n return false;\n }\n\n // If we find at least one property we consider it non empty\n if (v.isObject(value)) {\n for (attr in value) {\n return false;\n }\n return true;\n }\n\n return false;\n },\n\n // Formats the specified strings with the given values like so:\n // ```\n // format(\"Foo: %{foo}\", {foo: \"bar\"}) // \"Foo bar\"\n // ```\n // If you want to write %{...} without having it replaced simply\n // prefix it with % like this `Foo: %%{foo}` and it will be returned\n // as `\"Foo: %{foo}\"`\n format: v.extend(function(str, vals) {\n if (!v.isString(str)) {\n return str;\n }\n return str.replace(v.format.FORMAT_REGEXP, function(m0, m1, m2) {\n if (m1 === '%') {\n return \"%{\" + m2 + \"}\";\n } else {\n return String(vals[m2]);\n }\n });\n }, {\n // Finds %{key} style patterns in the given string\n FORMAT_REGEXP: /(%?)%\\{([^\\}]+)\\}/g\n }),\n\n // \"Prettifies\" the given string.\n // Prettifying means replacing [.\\_-] with spaces as well as splitting\n // camel case words.\n prettify: function(str) {\n if (v.isNumber(str)) {\n // If there are more than 2 decimals round it to two\n if ((str * 100) % 1 === 0) {\n return \"\" + str;\n } else {\n return parseFloat(Math.round(str * 100) / 100).toFixed(2);\n }\n }\n\n if (v.isArray(str)) {\n return str.map(function(s) { return v.prettify(s); }).join(\", \");\n }\n\n if (v.isObject(str)) {\n return str.toString();\n }\n\n // Ensure the string is actually a string\n str = \"\" + str;\n\n return str\n // Splits keys separated by periods\n .replace(/([^\\s])\\.([^\\s])/g, '$1 $2')\n // Removes backslashes\n .replace(/\\\\+/g, '')\n // Replaces - and - with space\n .replace(/[_-]/g, ' ')\n // Splits camel cased words\n .replace(/([a-z])([A-Z])/g, function(m0, m1, m2) {\n return \"\" + m1 + \" \" + m2.toLowerCase();\n })\n .toLowerCase();\n },\n\n stringifyValue: function(value, options) {\n var prettify = options && options.prettify || v.prettify;\n return prettify(value);\n },\n\n isString: function(value) {\n return typeof value === 'string';\n },\n\n isArray: function(value) {\n return {}.toString.call(value) === '[object Array]';\n },\n\n // Checks if the object is a hash, which is equivalent to an object that\n // is neither an array nor a function.\n isHash: function(value) {\n return v.isObject(value) && !v.isArray(value) && !v.isFunction(value);\n },\n\n contains: function(obj, value) {\n if (!v.isDefined(obj)) {\n return false;\n }\n if (v.isArray(obj)) {\n return obj.indexOf(value) !== -1;\n }\n return value in obj;\n },\n\n unique: function(array) {\n if (!v.isArray(array)) {\n return array;\n }\n return array.filter(function(el, index, array) {\n return array.indexOf(el) == index;\n });\n },\n\n forEachKeyInKeypath: function(object, keypath, callback) {\n if (!v.isString(keypath)) {\n return undefined;\n }\n\n var key = \"\"\n , i\n , escape = false;\n\n for (i = 0; i < keypath.length; ++i) {\n switch (keypath[i]) {\n case '.':\n if (escape) {\n escape = false;\n key += '.';\n } else {\n object = callback(object, key, false);\n key = \"\";\n }\n break;\n\n case '\\\\':\n if (escape) {\n escape = false;\n key += '\\\\';\n } else {\n escape = true;\n }\n break;\n\n default:\n escape = false;\n key += keypath[i];\n break;\n }\n }\n\n return callback(object, key, true);\n },\n\n getDeepObjectValue: function(obj, keypath) {\n if (!v.isObject(obj)) {\n return undefined;\n }\n\n return v.forEachKeyInKeypath(obj, keypath, function(obj, key) {\n if (v.isObject(obj)) {\n return obj[key];\n }\n });\n },\n\n // This returns an object with all the values of the form.\n // It uses the input name as key and the value as value\n // So for example this:\n // \n // would return:\n // {email: \"foo@bar.com\"}\n collectFormValues: function(form, options) {\n var values = {}\n , i\n , j\n , input\n , inputs\n , option\n , value;\n\n if (v.isJqueryElement(form)) {\n form = form[0];\n }\n\n if (!form) {\n return values;\n }\n\n options = options || {};\n\n inputs = form.querySelectorAll(\"input[name], textarea[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n name = input.name.replace(/\\./g, \"\\\\\\\\.\");\n value = v.sanitizeFormValue(input.value, options);\n if (input.type === \"number\") {\n value = value ? +value : null;\n } else if (input.type === \"checkbox\") {\n if (input.attributes.value) {\n if (!input.checked) {\n value = values[name] || null;\n }\n } else {\n value = input.checked;\n }\n } else if (input.type === \"radio\") {\n if (!input.checked) {\n value = values[name] || null;\n }\n }\n values[name] = value;\n }\n\n inputs = form.querySelectorAll(\"select[name]\");\n for (i = 0; i < inputs.length; ++i) {\n input = inputs.item(i);\n if (v.isDefined(input.getAttribute(\"data-ignored\"))) {\n continue;\n }\n\n if (input.multiple) {\n value = [];\n for (j in input.options) {\n option = input.options[j];\n if (option && option.selected) {\n value.push(v.sanitizeFormValue(option.value, options));\n }\n }\n } else {\n var _val = typeof input.options[input.selectedIndex] !== 'undefined' ? input.options[input.selectedIndex].value : '';\n value = v.sanitizeFormValue(_val, options);\n }\n values[input.name] = value;\n }\n\n return values;\n },\n\n sanitizeFormValue: function(value, options) {\n if (options.trim && v.isString(value)) {\n value = value.trim();\n }\n\n if (options.nullify !== false && value === \"\") {\n return null;\n }\n return value;\n },\n\n capitalize: function(str) {\n if (!v.isString(str)) {\n return str;\n }\n return str[0].toUpperCase() + str.slice(1);\n },\n\n // Remove all errors who's error attribute is empty (null or undefined)\n pruneEmptyErrors: function(errors) {\n return errors.filter(function(error) {\n return !v.isEmpty(error.error);\n });\n },\n\n // In\n // [{error: [\"err1\", \"err2\"], ...}]\n // Out\n // [{error: \"err1\", ...}, {error: \"err2\", ...}]\n //\n // All attributes in an error with multiple messages are duplicated\n // when expanding the errors.\n expandMultipleErrors: function(errors) {\n var ret = [];\n errors.forEach(function(error) {\n // Removes errors without a message\n if (v.isArray(error.error)) {\n error.error.forEach(function(msg) {\n ret.push(v.extend({}, error, {error: msg}));\n });\n } else {\n ret.push(error);\n }\n });\n return ret;\n },\n\n // Converts the error mesages by prepending the attribute name unless the\n // message is prefixed by ^\n convertErrorMessages: function(errors, options) {\n options = options || {};\n\n var ret = []\n , prettify = options.prettify || v.prettify;\n errors.forEach(function(errorInfo) {\n var error = v.result(errorInfo.error,\n errorInfo.value,\n errorInfo.attribute,\n errorInfo.options,\n errorInfo.attributes,\n errorInfo.globalOptions);\n\n if (!v.isString(error)) {\n ret.push(errorInfo);\n return;\n }\n\n if (error[0] === '^') {\n error = error.slice(1);\n } else if (options.fullMessages !== false) {\n error = v.capitalize(prettify(errorInfo.attribute)) + \" \" + error;\n }\n error = error.replace(/\\\\\\^/g, \"^\");\n error = v.format(error, {\n value: v.stringifyValue(errorInfo.value, options)\n });\n ret.push(v.extend({}, errorInfo, {error: error}));\n });\n return ret;\n },\n\n // In:\n // [{attribute: \"\", ...}]\n // Out:\n // {\"\": [{attribute: \"\", ...}]}\n groupErrorsByAttribute: function(errors) {\n var ret = {};\n errors.forEach(function(error) {\n var list = ret[error.attribute];\n if (list) {\n list.push(error);\n } else {\n ret[error.attribute] = [error];\n }\n });\n return ret;\n },\n\n // In:\n // [{error: \"\", ...}, {error: \"\", ...}]\n // Out:\n // [\"\", \"\"]\n flattenErrorsToArray: function(errors) {\n return errors\n .map(function(error) { return error.error; })\n .filter(function(value, index, self) {\n return self.indexOf(value) === index;\n });\n },\n\n cleanAttributes: function(attributes, whitelist) {\n function whitelistCreator(obj, key, last) {\n if (v.isObject(obj[key])) {\n return obj[key];\n }\n return (obj[key] = last ? true : {});\n }\n\n function buildObjectWhitelist(whitelist) {\n var ow = {}\n , lastObject\n , attr;\n for (attr in whitelist) {\n if (!whitelist[attr]) {\n continue;\n }\n v.forEachKeyInKeypath(ow, attr, whitelistCreator);\n }\n return ow;\n }\n\n function cleanRecursive(attributes, whitelist) {\n if (!v.isObject(attributes)) {\n return attributes;\n }\n\n var ret = v.extend({}, attributes)\n , w\n , attribute;\n\n for (attribute in attributes) {\n w = whitelist[attribute];\n\n if (v.isObject(w)) {\n ret[attribute] = cleanRecursive(ret[attribute], w);\n } else if (!w) {\n delete ret[attribute];\n }\n }\n return ret;\n }\n\n if (!v.isObject(whitelist) || !v.isObject(attributes)) {\n return {};\n }\n\n whitelist = buildObjectWhitelist(whitelist);\n return cleanRecursive(attributes, whitelist);\n },\n\n exposeModule: function(validate, root, exports, module, define) {\n if (exports) {\n if (module && module.exports) {\n exports = module.exports = validate;\n }\n exports.validate = validate;\n } else {\n root.validate = validate;\n if (validate.isFunction(define) && define.amd) {\n define([], function () { return validate; });\n }\n }\n },\n\n warn: function(msg) {\n if (typeof console !== \"undefined\" && console.warn) {\n console.warn(\"[validate.js] \" + msg);\n }\n },\n\n error: function(msg) {\n if (typeof console !== \"undefined\" && console.error) {\n console.error(\"[validate.js] \" + msg);\n }\n }\n });\n\n validate.validators = {\n // Presence validates that the value isn't empty\n presence: function(value, options) {\n options = v.extend({}, this.options, options);\n if (options.allowEmpty !== false ? !v.isDefined(value) : v.isEmpty(value)) {\n return options.message || this.message || \"can't be blank\";\n }\n },\n length: function(value, options, attribute) {\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var is = options.is\n , maximum = options.maximum\n , minimum = options.minimum\n , tokenizer = options.tokenizer || function(val) { return val; }\n , err\n , errors = [];\n\n value = tokenizer(value);\n var length = value.length;\n if(!v.isNumber(length)) {\n v.error(v.format(\"Attribute %{attr} has a non numeric value for `length`\", {attr: attribute}));\n return options.message || this.notValid || \"has an incorrect length\";\n }\n\n // Is checks\n if (v.isNumber(is) && length !== is) {\n err = options.wrongLength ||\n this.wrongLength ||\n \"is the wrong length (should be %{count} characters)\";\n errors.push(v.format(err, {count: is}));\n }\n\n if (v.isNumber(minimum) && length < minimum) {\n err = options.tooShort ||\n this.tooShort ||\n \"is too short (minimum is %{count} characters)\";\n errors.push(v.format(err, {count: minimum}));\n }\n\n if (v.isNumber(maximum) && length > maximum) {\n err = options.tooLong ||\n this.tooLong ||\n \"is too long (maximum is %{count} characters)\";\n errors.push(v.format(err, {count: maximum}));\n }\n\n if (errors.length > 0) {\n return options.message || errors;\n }\n },\n numericality: function(value, options, attribute, attributes, globalOptions) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var errors = []\n , name\n , count\n , checks = {\n greaterThan: function(v, c) { return v > c; },\n greaterThanOrEqualTo: function(v, c) { return v >= c; },\n equalTo: function(v, c) { return v === c; },\n lessThan: function(v, c) { return v < c; },\n lessThanOrEqualTo: function(v, c) { return v <= c; },\n divisibleBy: function(v, c) { return v % c === 0; }\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n // Strict will check that it is a valid looking number\n if (v.isString(value) && options.strict) {\n var pattern = \"^-?(0|[1-9]\\\\d*)\";\n if (!options.onlyInteger) {\n pattern += \"(\\\\.\\\\d+)?\";\n }\n pattern += \"$\";\n\n if (!(new RegExp(pattern).test(value))) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"must be a valid number\";\n }\n }\n\n // Coerce the value to a number unless we're being strict.\n if (options.noStrings !== true && v.isString(value) && !v.isEmpty(value)) {\n value = +value;\n }\n\n // If it's not a number we shouldn't continue since it will compare it.\n if (!v.isNumber(value)) {\n return options.message ||\n options.notValid ||\n this.notValid ||\n this.message ||\n \"is not a number\";\n }\n\n // Same logic as above, sort of. Don't bother with comparisons if this\n // doesn't pass.\n if (options.onlyInteger && !v.isInteger(value)) {\n return options.message ||\n options.notInteger ||\n this.notInteger ||\n this.message ||\n \"must be an integer\";\n }\n\n for (name in checks) {\n count = options[name];\n if (v.isNumber(count) && !checks[name](value, count)) {\n // This picks the default message if specified\n // For example the greaterThan check uses the message from\n // this.notGreaterThan so we capitalize the name and prepend \"not\"\n var key = \"not\" + v.capitalize(name);\n var msg = options[key] ||\n this[key] ||\n this.message ||\n \"must be %{type} %{count}\";\n\n errors.push(v.format(msg, {\n count: count,\n type: prettify(name)\n }));\n }\n }\n\n if (options.odd && value % 2 !== 1) {\n errors.push(options.notOdd ||\n this.notOdd ||\n this.message ||\n \"must be odd\");\n }\n if (options.even && value % 2 !== 0) {\n errors.push(options.notEven ||\n this.notEven ||\n this.message ||\n \"must be even\");\n }\n\n if (errors.length) {\n return options.message || errors;\n }\n },\n datetime: v.extend(function(value, options) {\n if (!v.isFunction(this.parse) || !v.isFunction(this.format)) {\n throw new Error(\"Both the parse and format functions needs to be set to use the datetime/date validator\");\n }\n\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var err\n , errors = []\n , earliest = options.earliest ? this.parse(options.earliest, options) : NaN\n , latest = options.latest ? this.parse(options.latest, options) : NaN;\n\n value = this.parse(value, options);\n\n // 86400000 is the number of milliseconds in a day, this is used to remove\n // the time from the date\n if (isNaN(value) || options.dateOnly && value % 86400000 !== 0) {\n err = options.notValid ||\n options.message ||\n this.notValid ||\n \"must be a valid date\";\n return v.format(err, {value: arguments[0]});\n }\n\n if (!isNaN(earliest) && value < earliest) {\n err = options.tooEarly ||\n options.message ||\n this.tooEarly ||\n \"must be no earlier than %{date}\";\n err = v.format(err, {\n value: this.format(value, options),\n date: this.format(earliest, options)\n });\n errors.push(err);\n }\n\n if (!isNaN(latest) && value > latest) {\n err = options.tooLate ||\n options.message ||\n this.tooLate ||\n \"must be no later than %{date}\";\n err = v.format(err, {\n date: this.format(latest, options),\n value: this.format(value, options)\n });\n errors.push(err);\n }\n\n if (errors.length) {\n return v.unique(errors);\n }\n }, {\n parse: null,\n format: null\n }),\n date: function(value, options) {\n options = v.extend({}, options, {dateOnly: true});\n return v.validators.datetime.call(v.validators.datetime, value, options);\n },\n format: function(value, options) {\n if (v.isString(options) || (options instanceof RegExp)) {\n options = {pattern: options};\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is invalid\"\n , pattern = options.pattern\n , match;\n\n // Empty values are allowed\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n\n if (v.isString(pattern)) {\n pattern = new RegExp(options.pattern, options.flags);\n }\n match = pattern.exec(value);\n if (!match || match[0].length != value.length) {\n return message;\n }\n },\n inclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (v.contains(options.within, value)) {\n return;\n }\n var message = options.message ||\n this.message ||\n \"^%{value} is not included in the list\";\n return v.format(message, {value: value});\n },\n exclusion: function(value, options) {\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (v.isArray(options)) {\n options = {within: options};\n }\n options = v.extend({}, this.options, options);\n if (!v.contains(options.within, value)) {\n return;\n }\n var message = options.message || this.message || \"^%{value} is restricted\";\n return v.format(message, {value: value});\n },\n email: v.extend(function(value, options) {\n options = v.extend({}, this.options, options);\n var message = options.message || this.message || \"is not a valid email\";\n // Empty values are fine\n if (!v.isDefined(value)) {\n return;\n }\n if (!v.isString(value)) {\n return message;\n }\n if (!this.PATTERN.exec(value)) {\n return message;\n }\n }, {\n PATTERN: /^[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9\\u007F-\\uffff!#$%&'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z]{2,}$/i\n }),\n equality: function(value, options, attribute, attributes, globalOptions) {\n if (!v.isDefined(value)) {\n return;\n }\n\n if (v.isString(options)) {\n options = {attribute: options};\n }\n options = v.extend({}, this.options, options);\n var message = options.message ||\n this.message ||\n \"is not equal to %{attribute}\";\n\n if (v.isEmpty(options.attribute) || !v.isString(options.attribute)) {\n throw new Error(\"The attribute must be a non empty string\");\n }\n\n var otherValue = v.getDeepObjectValue(attributes, options.attribute)\n , comparator = options.comparator || function(v1, v2) {\n return v1 === v2;\n }\n , prettify = options.prettify ||\n (globalOptions && globalOptions.prettify) ||\n v.prettify;\n\n if (!comparator(value, otherValue, options, attribute, attributes)) {\n return v.format(message, {attribute: prettify(options.attribute)});\n }\n },\n\n // A URL validator that is used to validate URLs with the ability to\n // restrict schemes and some domains.\n url: function(value, options) {\n if (!v.isDefined(value)) {\n return;\n }\n\n options = v.extend({}, this.options, options);\n\n var message = options.message || this.message || \"is not a valid url\"\n , schemes = options.schemes || this.schemes || ['http', 'https']\n , allowLocal = options.allowLocal || this.allowLocal || false;\n\n if (!v.isString(value)) {\n return message;\n }\n\n // https://gist.github.com/dperini/729294\n var regex =\n \"^\" +\n // protocol identifier\n \"(?:(?:\" + schemes.join(\"|\") + \")://)\" +\n // user:pass authentication\n \"(?:\\\\S+(?::\\\\S*)?@)?\" +\n \"(?:\";\n\n var tld = \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff]{2,}))\";\n\n if (allowLocal) {\n tld += \"?\";\n } else {\n regex +=\n // IP address exclusion\n // private & local networks\n \"(?!(?:10|127)(?:\\\\.\\\\d{1,3}){3})\" +\n \"(?!(?:169\\\\.254|192\\\\.168)(?:\\\\.\\\\d{1,3}){2})\" +\n \"(?!172\\\\.(?:1[6-9]|2\\\\d|3[0-1])(?:\\\\.\\\\d{1,3}){2})\";\n }\n\n regex +=\n // IP address dotted notation octets\n // excludes loopback network 0.0.0.0\n // excludes reserved space >= 224.0.0.0\n // excludes network & broacast addresses\n // (first & last IP address of each class)\n \"(?:[1-9]\\\\d?|1\\\\d\\\\d|2[01]\\\\d|22[0-3])\" +\n \"(?:\\\\.(?:1?\\\\d{1,2}|2[0-4]\\\\d|25[0-5])){2}\" +\n \"(?:\\\\.(?:[1-9]\\\\d?|1\\\\d\\\\d|2[0-4]\\\\d|25[0-4]))\" +\n \"|\" +\n // host name\n \"(?:(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)\" +\n // domain name\n \"(?:\\\\.(?:[a-z\\\\u00a1-\\\\uffff0-9]-*)*[a-z\\\\u00a1-\\\\uffff0-9]+)*\" +\n tld +\n \")\" +\n // port number\n \"(?::\\\\d{2,5})?\" +\n // resource path\n \"(?:[/?#]\\\\S*)?\" +\n \"$\";\n\n var PATTERN = new RegExp(regex, 'i');\n if (!PATTERN.exec(value)) {\n return message;\n }\n }\n };\n\n validate.formatters = {\n detailed: function(errors) {return errors;},\n flat: v.flattenErrorsToArray,\n grouped: function(errors) {\n var attr;\n\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = v.flattenErrorsToArray(errors[attr]);\n }\n return errors;\n },\n constraint: function(errors) {\n var attr;\n errors = v.groupErrorsByAttribute(errors);\n for (attr in errors) {\n errors[attr] = errors[attr].map(function(result) {\n return result.validator;\n }).sort();\n }\n return errors;\n }\n };\n\n validate.exposeModule(validate, this, exports, module, define);\n}).call(this,\n typeof exports !== 'undefined' ? /* istanbul ignore next */ exports : null,\n typeof module !== 'undefined' ? /* istanbul ignore next */ module : null,\n typeof define !== 'undefined' ? /* istanbul ignore next */ define : null);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/validate.js/validate.js\n// module id = Ntm8\n// module chunks = 1","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/isObjectLike.js\n// module id = OuyB\n// module chunks = 1","var debounce = require('./debounce'),\n isObject = require('./isObject');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n * Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n var leading = true,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n if (isObject(options)) {\n leading = 'leading' in options ? !!options.leading : leading;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n return debounce(func, wait, {\n 'leading': leading,\n 'maxWait': wait,\n 'trailing': trailing\n });\n}\n\nmodule.exports = throttle;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/throttle.js\n// module id = Ywd4\n// module chunks = 1","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/isSymbol.js\n// module id = bgO7\n// module chunks = 1","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_baseGetTag.js\n// module id = e5TX\n// module chunks = 1","var g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/webpack/buildin/global.js\n// module id = h6ac\n// module chunks = 1","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/toNumber.js\n// module id = iS0Z\n// module chunks = 1","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_freeGlobal.js\n// module id = j3D9\n// module chunks = 1","module.exports = function(module) {\r\n\tif(!module.webpackPolyfill) {\r\n\t\tmodule.deprecate = function() {};\r\n\t\tmodule.paths = [];\r\n\t\t// module.parent = undefined by default\r\n\t\tif(!module.children) module.children = [];\r\n\t\tObject.defineProperty(module, \"loaded\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.l;\r\n\t\t\t}\r\n\t\t});\r\n\t\tObject.defineProperty(module, \"id\", {\r\n\t\t\tenumerable: true,\r\n\t\t\tget: function() {\r\n\t\t\t\treturn module.i;\r\n\t\t\t}\r\n\t\t});\r\n\t\tmodule.webpackPolyfill = 1;\r\n\t}\r\n\treturn module;\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/webpack/buildin/module.js\n// module id = l262\n// module chunks = 1","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_objectToString.js\n// module id = lPmd\n// module chunks = 1","module.exports = function() {\r\n\tthrow new Error(\"define cannot be used indirect\");\r\n};\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/webpack/buildin/amd-define.js\n// module id = lfEA\n// module chunks = 1","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/isObject.js\n// module id = u9vI\n// module chunks = 1","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_getRawTag.js\n// module id = uiOY\n// module chunks = 1","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_Symbol.js\n// module id = wppe\n// module chunks = 1","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ../node_modules/lodash/_trimmedEndIndex.js\n// module id = x2wq\n// module chunks = 1"],"sourceRoot":""}