HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/SBogers10/blije-gasten.komma.pro/wwwroot/js/site/vendor.js.map
{"version":3,"sources":["webpack:///./node_modules/flatpickr/dist/l10n/nl.js","webpack:///./node_modules/objectFitPolyfill/dist/objectFitPolyfill.min.js","webpack:///./node_modules/body-scroll-lock/lib/bodyScrollLock.min.js","webpack:///./node_modules/hammerjs/hammer.js","webpack:///./node_modules/flatpickr/dist/flatpickr.js"],"names":["exports","fp","window","undefined","flatpickr","l10ns","Dutch","weekdays","shorthand","longhand","months","firstDayOfWeek","weekAbbreviation","rangeSeparator","scrollTitle","toggleTitle","time_24hr","ordinal","nth","nl","default","Object","defineProperty","value","factory","t","navigator","userAgent","match","n","parseInt","document","documentElement","style","o","e","i","l","a","d","split","length","clientWidth","clientHeight","indexOf","dataset","objectFit","getAttribute","objectPosition","parentNode","getComputedStyle","getPropertyValue","position","overflow","display","height","className","top","right","bottom","left","width","marginTop","marginLeft","Event","querySelectorAll","nodeName","toLowerCase","complete","addEventListener","this","readyState","objectFitPolyfill","Array","isArray","from","removeEventListener","u","some","options","allowTouchMove","c","event","target","touches","preventDefault","setTimeout","m","body","paddingRight","f","platform","test","maxTouchPoints","s","v","disableBodyScroll","r","console","error","targetElement","concat","ontouchstart","targetTouches","clientY","ontouchmove","scrollTop","scrollHeight","stopPropagation","passive","reserveScrollBarGap","innerWidth","clearAllBodyScrollLocks","forEach","enableBodyScroll","filter","exportName","assign","VENDOR_PREFIXES","TEST_ELEMENT","createElement","round","Math","abs","now","Date","setTimeoutContext","fn","timeout","context","bindFn","invokeArrayArg","arg","each","obj","iterator","call","hasOwnProperty","deprecate","method","name","message","deprecationMessage","Error","stack","replace","log","warn","apply","arguments","TypeError","output","index","source","nextKey","extend","dest","src","merge","keys","inherit","child","base","properties","childP","baseP","prototype","create","constructor","_super","boolOrFn","val","args","ifUndefined","val1","val2","addEventListeners","types","handler","splitStr","type","removeEventListeners","hasParent","node","parent","inStr","str","find","trim","inArray","findByKey","toArray","slice","uniqueArray","key","sort","results","values","push","b","prefixed","property","prefix","prop","camelProp","toUpperCase","_uniqueId","getWindowForElement","element","doc","ownerDocument","defaultView","parentWindow","SUPPORT_TOUCH","SUPPORT_POINTER_EVENTS","SUPPORT_ONLY_TOUCH","PROPS_XY","PROPS_CLIENT_XY","Input","manager","callback","self","inputTarget","domHandler","ev","enable","init","inputHandler","eventType","input","pointersLen","pointers","changedPointersLen","changedPointers","isFirst","isFinal","session","pointersLength","firstInput","simpleCloneInputData","firstMultiple","offsetCenter","center","getCenter","timeStamp","deltaTime","angle","getAngle","distance","getDistance","offset","offsetDelta","prevDelta","prevInput","x","deltaX","y","deltaY","computeDeltaXY","offsetDirection","getDirection","overallVelocity","getVelocity","overallVelocityX","overallVelocityY","scale","start","end","rotation","getRotation","maxPointers","velocity","velocityX","velocityY","direction","last","lastInterval","computeIntervalInputData","srcEvent","computeInputData","emit","recognize","clientX","p1","p2","props","sqrt","atan2","PI","evEl","evTarget","evWin","destroy","MOUSE_INPUT_MAP","mousedown","mousemove","mouseup","MouseInput","pressed","button","which","pointerType","POINTER_INPUT_MAP","pointerdown","pointermove","pointerup","pointercancel","pointerout","IE10_POINTER_TYPE_ENUM","2","3","4","5","POINTER_ELEMENT_EVENTS","POINTER_WINDOW_EVENTS","PointerEventInput","store","pointerEvents","MSPointerEvent","PointerEvent","removePointer","eventTypeNormalized","isTouch","storeIndex","pointerId","splice","SINGLE_TOUCH_INPUT_MAP","touchstart","touchmove","touchend","touchcancel","SingleTouchInput","started","normalizeSingleTouches","all","changed","changedTouches","TOUCH_INPUT_MAP","TouchInput","targetIds","getTouches","allTouches","identifier","changedTargetTouches","touch","TouchMouseInput","mouse","primaryTouch","lastTouches","recordTouches","eventData","setLastTouch","lastTouch","lts","isSyntheticEvent","dx","dy","inputEvent","inputData","isMouse","sourceCapabilities","firesTouchEvents","PREFIXED_TOUCH_ACTION","NATIVE_TOUCH_ACTION","TOUCH_ACTION_MAP","touchMap","cssSupports","CSS","supports","getTouchActionProps","TouchAction","set","compute","actions","update","touchAction","recognizers","recognizer","getTouchAction","hasPanX","hasPanY","cleanTouchActions","join","preventDefaults","prevented","hasNone","isTapPointer","isTapMovement","isTapTouchTime","DIRECTION_LEFT","DIRECTION_UP","preventSrc","Recognizer","defaults","id","state","simultaneous","requireFail","stateStr","directionStr","getRecognizerByNameIfManager","otherRecognizer","get","AttrRecognizer","PanRecognizer","pX","pY","PinchRecognizer","PressRecognizer","_timer","_input","RotateRecognizer","SwipeRecognizer","TapRecognizer","pTime","pCenter","count","Hammer","preset","Manager","recognizeWith","dropRecognizeWith","requireFailure","dropRequireFailure","hasRequireFailures","canRecognizeWith","additionalEvent","tryEmit","canEmit","inputDataClone","reset","process","attrTest","optionPointers","isRecognized","isValid","threshold","DIRECTION_HORIZONTAL","directionTest","hasMoved","inOut","time","validPointers","validMovement","validTime","clearTimeout","taps","interval","posThreshold","validTouchTime","failTimeout","validInterval","validMultiTap","tapCount","VERSION","domEvents","inputClass","cssProps","userSelect","touchSelect","touchCallout","contentZooming","userDrag","tapHighlightColor","handlers","oldCssProps","toggleCssProps","item","add","stop","force","stopped","curRecognizer","existing","remove","on","events","off","data","gestureEvent","createEvent","initEvent","gesture","dispatchEvent","triggerDomEvent","INPUT_START","INPUT_MOVE","INPUT_END","INPUT_CANCEL","STATE_POSSIBLE","STATE_BEGAN","STATE_CHANGED","STATE_ENDED","STATE_RECOGNIZED","STATE_CANCELLED","STATE_FAILED","DIRECTION_NONE","DIRECTION_RIGHT","DIRECTION_DOWN","DIRECTION_VERTICAL","DIRECTION_ALL","Tap","Pan","Swipe","Pinch","Rotate","Press","module","__assign","p","HOOKS","_disable","_enable","allowInput","altFormat","altInput","altInputClass","animate","ariaDateFormat","clickOpens","closeOnSelect","conjunction","dateFormat","defaultHour","defaultMinute","defaultSeconds","disable","disableMobile","enableSeconds","enableTime","errorHandler","err","getWeek","givenDate","date","getTime","setHours","setDate","getDate","getDay","week1","getFullYear","hourIncrement","ignoredFocusElements","inline","locale","minuteIncrement","mode","monthSelectorType","nextArrow","noCalendar","onChange","onClose","onDayCreate","onDestroy","onKeyDown","onMonthChange","onOpen","onParseConfig","onReady","onValueUpdate","onYearChange","onPreCalendarPosition","plugins","positionElement","prevArrow","shorthandCurrentMonth","showMonths","static","weekNumbers","wrap","english","daysInMonth","amPM","yearAriaLabel","hourAriaLabel","minuteAriaLabel","pad","number","int","bool","debounce","func","wait","immediate","arrayify","toggleClass","elem","classList","tag","content","textContent","clearNode","firstChild","removeChild","createNumberInput","inputClassName","opts","wrapper","numInput","arrowUp","arrowDown","pattern","setAttribute","appendChild","doNothing","monthToStr","monthNumber","revFormat","D","F","dateObj","monthName","setMonth","G","hour","parseFloat","H","J","day","K","getHours","RegExp","M","shortMonth","S","seconds","setSeconds","U","_","unixSeconds","W","weekNum","weekNumber","Y","year","setFullYear","Z","ISODate","h","minutes","setMinutes","j","month","unixMillSeconds","w","tokenRegex","formats","toISOString","getMonth","getSeconds","getMinutes","String","substring","createDateFormatter","_a","_b","config","_c","l10n","frmt","overrideLocale","formatDate","map","arr","createDateParser","givenFormat","timeless","customLocale","parsedDate","dateOrig","toFixed","format","datestr","parseDate","matched","ops","matchIndex","regexStr","token_1","isBackSlash","escaped","exec","isNaN","compareDates","date1","date2","duration","FlatpickrInstance","instanceConfig","defaultConfig","bindToInstance","bind","setCalendarWidth","requestAnimationFrame","calendarContainer","visibility","daysContainer","daysWidth","days","offsetWidth","weekWrapper","removeProperty","updateTime","selectedDates","setDefaultTime","isKeyDown","min","max","step","curValue","delta","newValue","isHourElem","hourElement","isMinuteElem","minuteElement","incrementNumInput","timeWrapper","prevValue","setHoursFromInputs","updateValue","_debouncedChange","hours","secondElement","limitMinHours","minTime","minDate","minDateHasTime","latestSelectedDateObj","maxTime","maxDate","maxDateHasTime","setHoursFromDate","setDefaultHours","minHr","minMinutes","maxHr","maxMinutes","isMobile","onYearInput","toString","changeYear","el","_handlers","onClick","evt","triggerChange","triggerEvent","jumpToDate","jumpDate","jumpTo","oldYear","currentYear","oldMonth","currentMonth","buildMonthSwitch","redraw","timeIncrement","contains","inputElem","createDay","dayNumber","dateIsEnabled","isEnabled","dayElement","$i","todayDateElem","tabIndex","isDateSelected","selectedDateElem","isDateInRange","insertAdjacentHTML","focusOnDayElem","targetNode","focus","onMouseOver","getFirstAvailableDay","startMonth","endMonth","children","startIndex","endIndex","focusOnDay","current","dayFocused","isInView","activeElement","startElem","givenMonth","loopDelta","numMonthDays","changeMonth","getNextAvailableDay","buildMonthDays","firstOfMonth","prevMonthDays","utils","getDaysInMonth","createDocumentFragment","isMultiMonth","prevMonthDayClass","nextMonthDayClass","dayIndex","dayNum","dayContainer","buildDays","frag","shouldBuildMonth","monthsDropdownContainer","innerHTML","selected","buildMonth","monthElement","container","monthNavFragment","selectedMonth","yearInput","tabindex","yearElement","getElementsByTagName","disabled","buildMonths","monthNav","prevMonthNav","yearElements","monthElements","nextMonthNav","buildWeekdays","weekdayContainer","updateWeekdays","isOffset","_hidePrevMonthArrow","_hideNextMonthArrow","updateNavigationCurrentMonth","isCalendarElem","appendTo","documentClick","isOpen","eventTarget_1","composedPath","isCalendarElement","isInput","path","lostFocus","relatedTarget","isIgnored","timeContainer","close","clear","newYear","newYearNum","isNewYear","dateToCheck","array","parsed","to","allowKeydown","allowInlineKeydown","keyCode","blur","open","isTimeObj","focusAndClose","selectDate","delta_1","ctrlKey","currentYearElement","elems","pluginElements","shiftKey","charAt","hoverDate","firstElementChild","initialDate","rangeStartDate","rangeEndDate","containsDisabled","minRange","maxRange","_loop_1","ts","ts1","ts2","dayElem","timestamp","outOfRange","onResize","positionCalendar","minMaxDateSetter","inverseDateObj","removeAttribute","setupLocale","JSON","parse","stringify","customPositionElement","_positionElement","calendarHeight","reduce","acc","offsetHeight","calendarWidth","configPos","configPosVertical","configPosHorizontal","inputBounds","getBoundingClientRect","distanceFromBottom","innerHeight","showOnTop","pageYOffset","pageXOffset","rightMost","centerMost","styleSheets","bodyWidth","centerLeft","centerIndex","cssRules","centerStyle","insertRule","centerBefore","msMaxTouchPoints","findParent","condition","selectedDate","shouldChangeMonth","selectedIndex","showTimeInput","single","range","loadedPlugins","_bind","_setHoursFromDate","_positionCalendar","triggerChangeEvent","toInitial","mobileInput","_initialDate","_createElement","lastChild","insertBefore","_type","k","click","wasOpen","select","option","CALLBACKS","setSelectedDate","toggle","inputDate","dates","parseDateRules","rule","hooks","getDateStr","dObj","mobileFormatStr","onMonthNavClick","isPrevMonth","isNextMonth","boolOpts","userConfig","timeMode","defaultDateFormat","defaultAltFormat","_minDate","_maxDate","minMaxTimeSetter","_minTime","_maxTime","hook","pluginConf","parseConfig","querySelector","placeholder","required","nextSibling","preloadedDate","defaultDate","_showTimeInput","setupDates","yr","fragment","__hidePrevMonthArrow","__hideNextMonthArrow","innerContainer","buildWeeks","rContainer","separator","hourInput","minuteInput","military2ampm","secondInput","title","buildTime","customAppend","nodeType","build","inputType","defaultValue","setupMobile","debouncedResize","capture","bindEvents","isSafari","_flatpickr","nodeList","nodes","HTMLElement","instances","_i","args_1","HTMLCollection","NodeList","selector","Node","en","localize","setDefaults","jQuery","fp_incr"],"mappings":"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","file":"/js/site/vendor.js","sourcesContent":["(function (global, factory) {\n  typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n  typeof define === 'function' && define.amd ? define(['exports'], factory) :\n  (global = global || self, factory(global.nl = {}));\n}(this, function (exports) { 'use strict';\n\n  var fp = typeof window !== \"undefined\" && window.flatpickr !== undefined\n      ? window.flatpickr\n      : {\n          l10ns: {}\n      };\n  var Dutch = {\n      weekdays: {\n          shorthand: [\"zo\", \"ma\", \"di\", \"wo\", \"do\", \"vr\", \"za\"],\n          longhand: [\n              \"zondag\",\n              \"maandag\",\n              \"dinsdag\",\n              \"woensdag\",\n              \"donderdag\",\n              \"vrijdag\",\n              \"zaterdag\",\n          ]\n      },\n      months: {\n          shorthand: [\n              \"jan\",\n              \"feb\",\n              \"mrt\",\n              \"apr\",\n              \"mei\",\n              \"jun\",\n              \"jul\",\n              \"aug\",\n              \"sept\",\n              \"okt\",\n              \"nov\",\n              \"dec\",\n          ],\n          longhand: [\n              \"januari\",\n              \"februari\",\n              \"maart\",\n              \"april\",\n              \"mei\",\n              \"juni\",\n              \"juli\",\n              \"augustus\",\n              \"september\",\n              \"oktober\",\n              \"november\",\n              \"december\",\n          ]\n      },\n      firstDayOfWeek: 1,\n      weekAbbreviation: \"wk\",\n      rangeSeparator: \" tot \",\n      scrollTitle: \"Scroll voor volgende / vorige\",\n      toggleTitle: \"Klik om te wisselen\",\n      time_24hr: true,\n      ordinal: function (nth) {\n          if (nth === 1 || nth === 8 || nth >= 20)\n              return \"ste\";\n          return \"de\";\n      }\n  };\n  fp.l10ns.nl = Dutch;\n  var nl = fp.l10ns;\n\n  exports.Dutch = Dutch;\n  exports.default = nl;\n\n  Object.defineProperty(exports, '__esModule', { value: true });\n\n}));\n","!function(){\"use strict\";if(\"undefined\"!=typeof window){var t=window.navigator.userAgent.match(/Edge\\/(\\d{2})\\./),n=!!t&&16<=parseInt(t[1],10);if(!(\"objectFit\"in document.documentElement.style!=!1)||n){var o=function(t,e,i){var n,o,l,a,d;if((i=i.split(\" \")).length<2&&(i[1]=i[0]),\"x\"===t)n=i[0],o=i[1],l=\"left\",a=\"right\",d=e.clientWidth;else{if(\"y\"!==t)return;n=i[1],o=i[0],l=\"top\",a=\"bottom\",d=e.clientHeight}if(n!==l&&o!==l){if(n!==a&&o!==a)return\"center\"===n||\"50%\"===n?(e.style[l]=\"50%\",void(e.style[\"margin-\"+l]=d/-2+\"px\")):void(0<=n.indexOf(\"%\")?(n=parseInt(n))<50?(e.style[l]=n+\"%\",e.style[\"margin-\"+l]=d*(n/-100)+\"px\"):(n=100-n,e.style[a]=n+\"%\",e.style[\"margin-\"+a]=d*(n/-100)+\"px\"):e.style[l]=n);e.style[a]=\"0\"}else e.style[l]=\"0\"},l=function(t){var e=t.dataset?t.dataset.objectFit:t.getAttribute(\"data-object-fit\"),i=t.dataset?t.dataset.objectPosition:t.getAttribute(\"data-object-position\");e=e||\"cover\",i=i||\"50% 50%\";var n=t.parentNode;return function(t){var e=window.getComputedStyle(t,null),i=e.getPropertyValue(\"position\"),n=e.getPropertyValue(\"overflow\"),o=e.getPropertyValue(\"display\");i&&\"static\"!==i||(t.style.position=\"relative\"),\"hidden\"!==n&&(t.style.overflow=\"hidden\"),o&&\"inline\"!==o||(t.style.display=\"block\"),0===t.clientHeight&&(t.style.height=\"100%\"),-1===t.className.indexOf(\"object-fit-polyfill\")&&(t.className=t.className+\" object-fit-polyfill\")}(n),function(t){var e=window.getComputedStyle(t,null),i={\"max-width\":\"none\",\"max-height\":\"none\",\"min-width\":\"0px\",\"min-height\":\"0px\",top:\"auto\",right:\"auto\",bottom:\"auto\",left:\"auto\",\"margin-top\":\"0px\",\"margin-right\":\"0px\",\"margin-bottom\":\"0px\",\"margin-left\":\"0px\"};for(var n in i)e.getPropertyValue(n)!==i[n]&&(t.style[n]=i[n])}(t),t.style.position=\"absolute\",t.style.width=\"auto\",t.style.height=\"auto\",\"scale-down\"===e&&(e=t.clientWidth<n.clientWidth&&t.clientHeight<n.clientHeight?\"none\":\"contain\"),\"none\"===e?(o(\"x\",t,i),void o(\"y\",t,i)):\"fill\"===e?(t.style.width=\"100%\",t.style.height=\"100%\",o(\"x\",t,i),void o(\"y\",t,i)):(t.style.height=\"100%\",void(\"cover\"===e&&t.clientWidth>n.clientWidth||\"contain\"===e&&t.clientWidth<n.clientWidth?(t.style.top=\"0\",t.style.marginTop=\"0\",o(\"x\",t,i)):(t.style.width=\"100%\",t.style.height=\"auto\",t.style.left=\"0\",t.style.marginLeft=\"0\",o(\"y\",t,i))))},e=function(t){if(void 0===t||t instanceof Event)t=document.querySelectorAll(\"[data-object-fit]\");else if(t&&t.nodeName)t=[t];else{if(\"object\"!=typeof t||!t.length||!t[0].nodeName)return!1;t=t}for(var e=0;e<t.length;e++)if(t[e].nodeName){var i=t[e].nodeName.toLowerCase();if(\"img\"===i){if(n)continue;t[e].complete?l(t[e]):t[e].addEventListener(\"load\",function(){l(this)})}else\"video\"===i?0<t[e].readyState?l(t[e]):t[e].addEventListener(\"loadedmetadata\",function(){l(this)}):l(t[e])}return!0};\"loading\"===document.readyState?document.addEventListener(\"DOMContentLoaded\",e):e(),window.addEventListener(\"resize\",e),window.objectFitPolyfill=e}else window.objectFitPolyfill=function(){return!1}}}();","!function(e,t){if(\"function\"==typeof define&&define.amd)define([\"exports\"],t);else if(\"undefined\"!=typeof exports)t(exports);else{var o={};t(o),e.bodyScrollLock=o}}(this,function(exports){\"use strict\";function i(e){if(Array.isArray(e)){for(var t=0,o=Array(e.length);t<e.length;t++)o[t]=e[t];return o}return Array.from(e)}Object.defineProperty(exports,\"__esModule\",{value:!0});var l=!1;if(\"undefined\"!=typeof window){var e={get passive(){l=!0}};window.addEventListener(\"testPassive\",null,e),window.removeEventListener(\"testPassive\",null,e)}function d(t){return u.some(function(e){return!(!e.options.allowTouchMove||!e.options.allowTouchMove(t))})}function c(e){var t=e||window.event;return!!d(t.target)||(1<t.touches.length||(t.preventDefault&&t.preventDefault(),!1))}function o(){setTimeout(function(){void 0!==m&&(document.body.style.paddingRight=m,m=void 0),void 0!==f&&(document.body.style.overflow=f,f=void 0)})}var a=\"undefined\"!=typeof window&&window.navigator&&window.navigator.platform&&(/iP(ad|hone|od)/.test(window.navigator.platform)||\"MacIntel\"===window.navigator.platform&&1<window.navigator.maxTouchPoints),u=[],s=!1,v=-1,f=void 0,m=void 0;exports.disableBodyScroll=function(r,e){if(a){if(!r)return void console.error(\"disableBodyScroll unsuccessful - targetElement must be provided when calling disableBodyScroll on IOS devices.\");if(r&&!u.some(function(e){return e.targetElement===r})){var t={targetElement:r,options:e||{}};u=[].concat(i(u),[t]),r.ontouchstart=function(e){1===e.targetTouches.length&&(v=e.targetTouches[0].clientY)},r.ontouchmove=function(e){var t,o,n,i;1===e.targetTouches.length&&(o=r,i=(t=e).targetTouches[0].clientY-v,d(t.target)||(o&&0===o.scrollTop&&0<i||(n=o)&&n.scrollHeight-n.scrollTop<=n.clientHeight&&i<0?c(t):t.stopPropagation()))},s||(document.addEventListener(\"touchmove\",c,l?{passive:!1}:void 0),s=!0)}}else{n=e,setTimeout(function(){if(void 0===m){var e=!!n&&!0===n.reserveScrollBarGap,t=window.innerWidth-document.documentElement.clientWidth;e&&0<t&&(m=document.body.style.paddingRight,document.body.style.paddingRight=t+\"px\")}void 0===f&&(f=document.body.style.overflow,document.body.style.overflow=\"hidden\")});var o={targetElement:r,options:e||{}};u=[].concat(i(u),[o])}var n},exports.clearAllBodyScrollLocks=function(){a?(u.forEach(function(e){e.targetElement.ontouchstart=null,e.targetElement.ontouchmove=null}),s&&(document.removeEventListener(\"touchmove\",c,l?{passive:!1}:void 0),s=!1),u=[],v=-1):(o(),u=[])},exports.enableBodyScroll=function(t){if(a){if(!t)return void console.error(\"enableBodyScroll unsuccessful - targetElement must be provided when calling enableBodyScroll on IOS devices.\");t.ontouchstart=null,t.ontouchmove=null,u=u.filter(function(e){return e.targetElement!==t}),s&&0===u.length&&(document.removeEventListener(\"touchmove\",c,l?{passive:!1}:void 0),s=!1)}else(u=u.filter(function(e){return e.targetElement!==t})).length||o()}});\n","/*! Hammer.JS - v2.0.7 - 2016-04-22\n * http://hammerjs.github.io/\n *\n * Copyright (c) 2016 Jorik Tangelder;\n * Licensed under the MIT license */\n(function(window, document, exportName, undefined) {\n  'use strict';\n\nvar VENDOR_PREFIXES = ['', 'webkit', 'Moz', 'MS', 'ms', 'o'];\nvar TEST_ELEMENT = document.createElement('div');\n\nvar TYPE_FUNCTION = 'function';\n\nvar round = Math.round;\nvar abs = Math.abs;\nvar now = Date.now;\n\n/**\n * set a timeout with a given scope\n * @param {Function} fn\n * @param {Number} timeout\n * @param {Object} context\n * @returns {number}\n */\nfunction setTimeoutContext(fn, timeout, context) {\n    return setTimeout(bindFn(fn, context), timeout);\n}\n\n/**\n * if the argument is an array, we want to execute the fn on each entry\n * if it aint an array we don't want to do a thing.\n * this is used by all the methods that accept a single and array argument.\n * @param {*|Array} arg\n * @param {String} fn\n * @param {Object} [context]\n * @returns {Boolean}\n */\nfunction invokeArrayArg(arg, fn, context) {\n    if (Array.isArray(arg)) {\n        each(arg, context[fn], context);\n        return true;\n    }\n    return false;\n}\n\n/**\n * walk objects and arrays\n * @param {Object} obj\n * @param {Function} iterator\n * @param {Object} context\n */\nfunction each(obj, iterator, context) {\n    var i;\n\n    if (!obj) {\n        return;\n    }\n\n    if (obj.forEach) {\n        obj.forEach(iterator, context);\n    } else if (obj.length !== undefined) {\n        i = 0;\n        while (i < obj.length) {\n            iterator.call(context, obj[i], i, obj);\n            i++;\n        }\n    } else {\n        for (i in obj) {\n            obj.hasOwnProperty(i) && iterator.call(context, obj[i], i, obj);\n        }\n    }\n}\n\n/**\n * wrap a method with a deprecation warning and stack trace\n * @param {Function} method\n * @param {String} name\n * @param {String} message\n * @returns {Function} A new function wrapping the supplied method.\n */\nfunction deprecate(method, name, message) {\n    var deprecationMessage = 'DEPRECATED METHOD: ' + name + '\\n' + message + ' AT \\n';\n    return function() {\n        var e = new Error('get-stack-trace');\n        var stack = e && e.stack ? e.stack.replace(/^[^\\(]+?[\\n$]/gm, '')\n            .replace(/^\\s+at\\s+/gm, '')\n            .replace(/^Object.<anonymous>\\s*\\(/gm, '{anonymous}()@') : 'Unknown Stack Trace';\n\n        var log = window.console && (window.console.warn || window.console.log);\n        if (log) {\n            log.call(window.console, deprecationMessage, stack);\n        }\n        return method.apply(this, arguments);\n    };\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} target\n * @param {...Object} objects_to_assign\n * @returns {Object} target\n */\nvar assign;\nif (typeof Object.assign !== 'function') {\n    assign = function assign(target) {\n        if (target === undefined || target === null) {\n            throw new TypeError('Cannot convert undefined or null to object');\n        }\n\n        var output = Object(target);\n        for (var index = 1; index < arguments.length; index++) {\n            var source = arguments[index];\n            if (source !== undefined && source !== null) {\n                for (var nextKey in source) {\n                    if (source.hasOwnProperty(nextKey)) {\n                        output[nextKey] = source[nextKey];\n                    }\n                }\n            }\n        }\n        return output;\n    };\n} else {\n    assign = Object.assign;\n}\n\n/**\n * extend object.\n * means that properties in dest will be overwritten by the ones in src.\n * @param {Object} dest\n * @param {Object} src\n * @param {Boolean} [merge=false]\n * @returns {Object} dest\n */\nvar extend = deprecate(function extend(dest, src, merge) {\n    var keys = Object.keys(src);\n    var i = 0;\n    while (i < keys.length) {\n        if (!merge || (merge && dest[keys[i]] === undefined)) {\n            dest[keys[i]] = src[keys[i]];\n        }\n        i++;\n    }\n    return dest;\n}, 'extend', 'Use `assign`.');\n\n/**\n * merge the values from src in the dest.\n * means that properties that exist in dest will not be overwritten by src\n * @param {Object} dest\n * @param {Object} src\n * @returns {Object} dest\n */\nvar merge = deprecate(function merge(dest, src) {\n    return extend(dest, src, true);\n}, 'merge', 'Use `assign`.');\n\n/**\n * simple class inheritance\n * @param {Function} child\n * @param {Function} base\n * @param {Object} [properties]\n */\nfunction inherit(child, base, properties) {\n    var baseP = base.prototype,\n        childP;\n\n    childP = child.prototype = Object.create(baseP);\n    childP.constructor = child;\n    childP._super = baseP;\n\n    if (properties) {\n        assign(childP, properties);\n    }\n}\n\n/**\n * simple function bind\n * @param {Function} fn\n * @param {Object} context\n * @returns {Function}\n */\nfunction bindFn(fn, context) {\n    return function boundFn() {\n        return fn.apply(context, arguments);\n    };\n}\n\n/**\n * let a boolean value also be a function that must return a boolean\n * this first item in args will be used as the context\n * @param {Boolean|Function} val\n * @param {Array} [args]\n * @returns {Boolean}\n */\nfunction boolOrFn(val, args) {\n    if (typeof val == TYPE_FUNCTION) {\n        return val.apply(args ? args[0] || undefined : undefined, args);\n    }\n    return val;\n}\n\n/**\n * use the val2 when val1 is undefined\n * @param {*} val1\n * @param {*} val2\n * @returns {*}\n */\nfunction ifUndefined(val1, val2) {\n    return (val1 === undefined) ? val2 : val1;\n}\n\n/**\n * addEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction addEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.addEventListener(type, handler, false);\n    });\n}\n\n/**\n * removeEventListener with multiple events at once\n * @param {EventTarget} target\n * @param {String} types\n * @param {Function} handler\n */\nfunction removeEventListeners(target, types, handler) {\n    each(splitStr(types), function(type) {\n        target.removeEventListener(type, handler, false);\n    });\n}\n\n/**\n * find if a node is in the given parent\n * @method hasParent\n * @param {HTMLElement} node\n * @param {HTMLElement} parent\n * @return {Boolean} found\n */\nfunction hasParent(node, parent) {\n    while (node) {\n        if (node == parent) {\n            return true;\n        }\n        node = node.parentNode;\n    }\n    return false;\n}\n\n/**\n * small indexOf wrapper\n * @param {String} str\n * @param {String} find\n * @returns {Boolean} found\n */\nfunction inStr(str, find) {\n    return str.indexOf(find) > -1;\n}\n\n/**\n * split string on whitespace\n * @param {String} str\n * @returns {Array} words\n */\nfunction splitStr(str) {\n    return str.trim().split(/\\s+/g);\n}\n\n/**\n * find if a array contains the object using indexOf or a simple polyFill\n * @param {Array} src\n * @param {String} find\n * @param {String} [findByKey]\n * @return {Boolean|Number} false when not found, or the index\n */\nfunction inArray(src, find, findByKey) {\n    if (src.indexOf && !findByKey) {\n        return src.indexOf(find);\n    } else {\n        var i = 0;\n        while (i < src.length) {\n            if ((findByKey && src[i][findByKey] == find) || (!findByKey && src[i] === find)) {\n                return i;\n            }\n            i++;\n        }\n        return -1;\n    }\n}\n\n/**\n * convert array-like objects to real arrays\n * @param {Object} obj\n * @returns {Array}\n */\nfunction toArray(obj) {\n    return Array.prototype.slice.call(obj, 0);\n}\n\n/**\n * unique array with objects based on a key (like 'id') or just by the array's value\n * @param {Array} src [{id:1},{id:2},{id:1}]\n * @param {String} [key]\n * @param {Boolean} [sort=False]\n * @returns {Array} [{id:1},{id:2}]\n */\nfunction uniqueArray(src, key, sort) {\n    var results = [];\n    var values = [];\n    var i = 0;\n\n    while (i < src.length) {\n        var val = key ? src[i][key] : src[i];\n        if (inArray(values, val) < 0) {\n            results.push(src[i]);\n        }\n        values[i] = val;\n        i++;\n    }\n\n    if (sort) {\n        if (!key) {\n            results = results.sort();\n        } else {\n            results = results.sort(function sortUniqueArray(a, b) {\n                return a[key] > b[key];\n            });\n        }\n    }\n\n    return results;\n}\n\n/**\n * get the prefixed property\n * @param {Object} obj\n * @param {String} property\n * @returns {String|Undefined} prefixed\n */\nfunction prefixed(obj, property) {\n    var prefix, prop;\n    var camelProp = property[0].toUpperCase() + property.slice(1);\n\n    var i = 0;\n    while (i < VENDOR_PREFIXES.length) {\n        prefix = VENDOR_PREFIXES[i];\n        prop = (prefix) ? prefix + camelProp : property;\n\n        if (prop in obj) {\n            return prop;\n        }\n        i++;\n    }\n    return undefined;\n}\n\n/**\n * get a unique id\n * @returns {number} uniqueId\n */\nvar _uniqueId = 1;\nfunction uniqueId() {\n    return _uniqueId++;\n}\n\n/**\n * get the window object of an element\n * @param {HTMLElement} element\n * @returns {DocumentView|Window}\n */\nfunction getWindowForElement(element) {\n    var doc = element.ownerDocument || element;\n    return (doc.defaultView || doc.parentWindow || window);\n}\n\nvar MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;\n\nvar SUPPORT_TOUCH = ('ontouchstart' in window);\nvar SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;\nvar SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent);\n\nvar INPUT_TYPE_TOUCH = 'touch';\nvar INPUT_TYPE_PEN = 'pen';\nvar INPUT_TYPE_MOUSE = 'mouse';\nvar INPUT_TYPE_KINECT = 'kinect';\n\nvar COMPUTE_INTERVAL = 25;\n\nvar INPUT_START = 1;\nvar INPUT_MOVE = 2;\nvar INPUT_END = 4;\nvar INPUT_CANCEL = 8;\n\nvar DIRECTION_NONE = 1;\nvar DIRECTION_LEFT = 2;\nvar DIRECTION_RIGHT = 4;\nvar DIRECTION_UP = 8;\nvar DIRECTION_DOWN = 16;\n\nvar DIRECTION_HORIZONTAL = DIRECTION_LEFT | DIRECTION_RIGHT;\nvar DIRECTION_VERTICAL = DIRECTION_UP | DIRECTION_DOWN;\nvar DIRECTION_ALL = DIRECTION_HORIZONTAL | DIRECTION_VERTICAL;\n\nvar PROPS_XY = ['x', 'y'];\nvar PROPS_CLIENT_XY = ['clientX', 'clientY'];\n\n/**\n * create new input type manager\n * @param {Manager} manager\n * @param {Function} callback\n * @returns {Input}\n * @constructor\n */\nfunction Input(manager, callback) {\n    var self = this;\n    this.manager = manager;\n    this.callback = callback;\n    this.element = manager.element;\n    this.target = manager.options.inputTarget;\n\n    // smaller wrapper around the handler, for the scope and the enabled state of the manager,\n    // so when disabled the input events are completely bypassed.\n    this.domHandler = function(ev) {\n        if (boolOrFn(manager.options.enable, [manager])) {\n            self.handler(ev);\n        }\n    };\n\n    this.init();\n\n}\n\nInput.prototype = {\n    /**\n     * should handle the inputEvent data and trigger the callback\n     * @virtual\n     */\n    handler: function() { },\n\n    /**\n     * bind the events\n     */\n    init: function() {\n        this.evEl && addEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && addEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && addEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    },\n\n    /**\n     * unbind the events\n     */\n    destroy: function() {\n        this.evEl && removeEventListeners(this.element, this.evEl, this.domHandler);\n        this.evTarget && removeEventListeners(this.target, this.evTarget, this.domHandler);\n        this.evWin && removeEventListeners(getWindowForElement(this.element), this.evWin, this.domHandler);\n    }\n};\n\n/**\n * create new input type manager\n * called by the Manager constructor\n * @param {Hammer} manager\n * @returns {Input}\n */\nfunction createInputInstance(manager) {\n    var Type;\n    var inputClass = manager.options.inputClass;\n\n    if (inputClass) {\n        Type = inputClass;\n    } else if (SUPPORT_POINTER_EVENTS) {\n        Type = PointerEventInput;\n    } else if (SUPPORT_ONLY_TOUCH) {\n        Type = TouchInput;\n    } else if (!SUPPORT_TOUCH) {\n        Type = MouseInput;\n    } else {\n        Type = TouchMouseInput;\n    }\n    return new (Type)(manager, inputHandler);\n}\n\n/**\n * handle input events\n * @param {Manager} manager\n * @param {String} eventType\n * @param {Object} input\n */\nfunction inputHandler(manager, eventType, input) {\n    var pointersLen = input.pointers.length;\n    var changedPointersLen = input.changedPointers.length;\n    var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));\n    var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));\n\n    input.isFirst = !!isFirst;\n    input.isFinal = !!isFinal;\n\n    if (isFirst) {\n        manager.session = {};\n    }\n\n    // source event is the normalized value of the domEvents\n    // like 'touchstart, mouseup, pointerdown'\n    input.eventType = eventType;\n\n    // compute scale, rotation etc\n    computeInputData(manager, input);\n\n    // emit secret event\n    manager.emit('hammer.input', input);\n\n    manager.recognize(input);\n    manager.session.prevInput = input;\n}\n\n/**\n * extend the data with some usable properties like scale, rotate, velocity etc\n * @param {Object} manager\n * @param {Object} input\n */\nfunction computeInputData(manager, input) {\n    var session = manager.session;\n    var pointers = input.pointers;\n    var pointersLength = pointers.length;\n\n    // store the first input to calculate the distance and direction\n    if (!session.firstInput) {\n        session.firstInput = simpleCloneInputData(input);\n    }\n\n    // to compute scale and rotation we need to store the multiple touches\n    if (pointersLength > 1 && !session.firstMultiple) {\n        session.firstMultiple = simpleCloneInputData(input);\n    } else if (pointersLength === 1) {\n        session.firstMultiple = false;\n    }\n\n    var firstInput = session.firstInput;\n    var firstMultiple = session.firstMultiple;\n    var offsetCenter = firstMultiple ? firstMultiple.center : firstInput.center;\n\n    var center = input.center = getCenter(pointers);\n    input.timeStamp = now();\n    input.deltaTime = input.timeStamp - firstInput.timeStamp;\n\n    input.angle = getAngle(offsetCenter, center);\n    input.distance = getDistance(offsetCenter, center);\n\n    computeDeltaXY(session, input);\n    input.offsetDirection = getDirection(input.deltaX, input.deltaY);\n\n    var overallVelocity = getVelocity(input.deltaTime, input.deltaX, input.deltaY);\n    input.overallVelocityX = overallVelocity.x;\n    input.overallVelocityY = overallVelocity.y;\n    input.overallVelocity = (abs(overallVelocity.x) > abs(overallVelocity.y)) ? overallVelocity.x : overallVelocity.y;\n\n    input.scale = firstMultiple ? getScale(firstMultiple.pointers, pointers) : 1;\n    input.rotation = firstMultiple ? getRotation(firstMultiple.pointers, pointers) : 0;\n\n    input.maxPointers = !session.prevInput ? input.pointers.length : ((input.pointers.length >\n        session.prevInput.maxPointers) ? input.pointers.length : session.prevInput.maxPointers);\n\n    computeIntervalInputData(session, input);\n\n    // find the correct target\n    var target = manager.element;\n    if (hasParent(input.srcEvent.target, target)) {\n        target = input.srcEvent.target;\n    }\n    input.target = target;\n}\n\nfunction computeDeltaXY(session, input) {\n    var center = input.center;\n    var offset = session.offsetDelta || {};\n    var prevDelta = session.prevDelta || {};\n    var prevInput = session.prevInput || {};\n\n    if (input.eventType === INPUT_START || prevInput.eventType === INPUT_END) {\n        prevDelta = session.prevDelta = {\n            x: prevInput.deltaX || 0,\n            y: prevInput.deltaY || 0\n        };\n\n        offset = session.offsetDelta = {\n            x: center.x,\n            y: center.y\n        };\n    }\n\n    input.deltaX = prevDelta.x + (center.x - offset.x);\n    input.deltaY = prevDelta.y + (center.y - offset.y);\n}\n\n/**\n * velocity is calculated every x ms\n * @param {Object} session\n * @param {Object} input\n */\nfunction computeIntervalInputData(session, input) {\n    var last = session.lastInterval || input,\n        deltaTime = input.timeStamp - last.timeStamp,\n        velocity, velocityX, velocityY, direction;\n\n    if (input.eventType != INPUT_CANCEL && (deltaTime > COMPUTE_INTERVAL || last.velocity === undefined)) {\n        var deltaX = input.deltaX - last.deltaX;\n        var deltaY = input.deltaY - last.deltaY;\n\n        var v = getVelocity(deltaTime, deltaX, deltaY);\n        velocityX = v.x;\n        velocityY = v.y;\n        velocity = (abs(v.x) > abs(v.y)) ? v.x : v.y;\n        direction = getDirection(deltaX, deltaY);\n\n        session.lastInterval = input;\n    } else {\n        // use latest velocity info if it doesn't overtake a minimum period\n        velocity = last.velocity;\n        velocityX = last.velocityX;\n        velocityY = last.velocityY;\n        direction = last.direction;\n    }\n\n    input.velocity = velocity;\n    input.velocityX = velocityX;\n    input.velocityY = velocityY;\n    input.direction = direction;\n}\n\n/**\n * create a simple clone from the input used for storage of firstInput and firstMultiple\n * @param {Object} input\n * @returns {Object} clonedInputData\n */\nfunction simpleCloneInputData(input) {\n    // make a simple copy of the pointers because we will get a reference if we don't\n    // we only need clientXY for the calculations\n    var pointers = [];\n    var i = 0;\n    while (i < input.pointers.length) {\n        pointers[i] = {\n            clientX: round(input.pointers[i].clientX),\n            clientY: round(input.pointers[i].clientY)\n        };\n        i++;\n    }\n\n    return {\n        timeStamp: now(),\n        pointers: pointers,\n        center: getCenter(pointers),\n        deltaX: input.deltaX,\n        deltaY: input.deltaY\n    };\n}\n\n/**\n * get the center of all the pointers\n * @param {Array} pointers\n * @return {Object} center contains `x` and `y` properties\n */\nfunction getCenter(pointers) {\n    var pointersLength = pointers.length;\n\n    // no need to loop when only one touch\n    if (pointersLength === 1) {\n        return {\n            x: round(pointers[0].clientX),\n            y: round(pointers[0].clientY)\n        };\n    }\n\n    var x = 0, y = 0, i = 0;\n    while (i < pointersLength) {\n        x += pointers[i].clientX;\n        y += pointers[i].clientY;\n        i++;\n    }\n\n    return {\n        x: round(x / pointersLength),\n        y: round(y / pointersLength)\n    };\n}\n\n/**\n * calculate the velocity between two points. unit is in px per ms.\n * @param {Number} deltaTime\n * @param {Number} x\n * @param {Number} y\n * @return {Object} velocity `x` and `y`\n */\nfunction getVelocity(deltaTime, x, y) {\n    return {\n        x: x / deltaTime || 0,\n        y: y / deltaTime || 0\n    };\n}\n\n/**\n * get the direction between two points\n * @param {Number} x\n * @param {Number} y\n * @return {Number} direction\n */\nfunction getDirection(x, y) {\n    if (x === y) {\n        return DIRECTION_NONE;\n    }\n\n    if (abs(x) >= abs(y)) {\n        return x < 0 ? DIRECTION_LEFT : DIRECTION_RIGHT;\n    }\n    return y < 0 ? DIRECTION_UP : DIRECTION_DOWN;\n}\n\n/**\n * calculate the absolute distance between two points\n * @param {Object} p1 {x, y}\n * @param {Object} p2 {x, y}\n * @param {Array} [props] containing x and y keys\n * @return {Number} distance\n */\nfunction getDistance(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n\n    return Math.sqrt((x * x) + (y * y));\n}\n\n/**\n * calculate the angle between two coordinates\n * @param {Object} p1\n * @param {Object} p2\n * @param {Array} [props] containing x and y keys\n * @return {Number} angle\n */\nfunction getAngle(p1, p2, props) {\n    if (!props) {\n        props = PROPS_XY;\n    }\n    var x = p2[props[0]] - p1[props[0]],\n        y = p2[props[1]] - p1[props[1]];\n    return Math.atan2(y, x) * 180 / Math.PI;\n}\n\n/**\n * calculate the rotation degrees between two pointersets\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} rotation\n */\nfunction getRotation(start, end) {\n    return getAngle(end[1], end[0], PROPS_CLIENT_XY) + getAngle(start[1], start[0], PROPS_CLIENT_XY);\n}\n\n/**\n * calculate the scale factor between two pointersets\n * no scale is 1, and goes down to 0 when pinched together, and bigger when pinched out\n * @param {Array} start array of pointers\n * @param {Array} end array of pointers\n * @return {Number} scale\n */\nfunction getScale(start, end) {\n    return getDistance(end[0], end[1], PROPS_CLIENT_XY) / getDistance(start[0], start[1], PROPS_CLIENT_XY);\n}\n\nvar MOUSE_INPUT_MAP = {\n    mousedown: INPUT_START,\n    mousemove: INPUT_MOVE,\n    mouseup: INPUT_END\n};\n\nvar MOUSE_ELEMENT_EVENTS = 'mousedown';\nvar MOUSE_WINDOW_EVENTS = 'mousemove mouseup';\n\n/**\n * Mouse events input\n * @constructor\n * @extends Input\n */\nfunction MouseInput() {\n    this.evEl = MOUSE_ELEMENT_EVENTS;\n    this.evWin = MOUSE_WINDOW_EVENTS;\n\n    this.pressed = false; // mousedown state\n\n    Input.apply(this, arguments);\n}\n\ninherit(MouseInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function MEhandler(ev) {\n        var eventType = MOUSE_INPUT_MAP[ev.type];\n\n        // on start we want to have the left mouse button down\n        if (eventType & INPUT_START && ev.button === 0) {\n            this.pressed = true;\n        }\n\n        if (eventType & INPUT_MOVE && ev.which !== 1) {\n            eventType = INPUT_END;\n        }\n\n        // mouse must be down\n        if (!this.pressed) {\n            return;\n        }\n\n        if (eventType & INPUT_END) {\n            this.pressed = false;\n        }\n\n        this.callback(this.manager, eventType, {\n            pointers: [ev],\n            changedPointers: [ev],\n            pointerType: INPUT_TYPE_MOUSE,\n            srcEvent: ev\n        });\n    }\n});\n\nvar POINTER_INPUT_MAP = {\n    pointerdown: INPUT_START,\n    pointermove: INPUT_MOVE,\n    pointerup: INPUT_END,\n    pointercancel: INPUT_CANCEL,\n    pointerout: INPUT_CANCEL\n};\n\n// in IE10 the pointer types is defined as an enum\nvar IE10_POINTER_TYPE_ENUM = {\n    2: INPUT_TYPE_TOUCH,\n    3: INPUT_TYPE_PEN,\n    4: INPUT_TYPE_MOUSE,\n    5: INPUT_TYPE_KINECT // see https://twitter.com/jacobrossi/status/480596438489890816\n};\n\nvar POINTER_ELEMENT_EVENTS = 'pointerdown';\nvar POINTER_WINDOW_EVENTS = 'pointermove pointerup pointercancel';\n\n// IE10 has prefixed support, and case-sensitive\nif (window.MSPointerEvent && !window.PointerEvent) {\n    POINTER_ELEMENT_EVENTS = 'MSPointerDown';\n    POINTER_WINDOW_EVENTS = 'MSPointerMove MSPointerUp MSPointerCancel';\n}\n\n/**\n * Pointer events input\n * @constructor\n * @extends Input\n */\nfunction PointerEventInput() {\n    this.evEl = POINTER_ELEMENT_EVENTS;\n    this.evWin = POINTER_WINDOW_EVENTS;\n\n    Input.apply(this, arguments);\n\n    this.store = (this.manager.session.pointerEvents = []);\n}\n\ninherit(PointerEventInput, Input, {\n    /**\n     * handle mouse events\n     * @param {Object} ev\n     */\n    handler: function PEhandler(ev) {\n        var store = this.store;\n        var removePointer = false;\n\n        var eventTypeNormalized = ev.type.toLowerCase().replace('ms', '');\n        var eventType = POINTER_INPUT_MAP[eventTypeNormalized];\n        var pointerType = IE10_POINTER_TYPE_ENUM[ev.pointerType] || ev.pointerType;\n\n        var isTouch = (pointerType == INPUT_TYPE_TOUCH);\n\n        // get index of the event in the store\n        var storeIndex = inArray(store, ev.pointerId, 'pointerId');\n\n        // start and mouse must be down\n        if (eventType & INPUT_START && (ev.button === 0 || isTouch)) {\n            if (storeIndex < 0) {\n                store.push(ev);\n                storeIndex = store.length - 1;\n            }\n        } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n            removePointer = true;\n        }\n\n        // it not found, so the pointer hasn't been down (so it's probably a hover)\n        if (storeIndex < 0) {\n            return;\n        }\n\n        // update the event in the store\n        store[storeIndex] = ev;\n\n        this.callback(this.manager, eventType, {\n            pointers: store,\n            changedPointers: [ev],\n            pointerType: pointerType,\n            srcEvent: ev\n        });\n\n        if (removePointer) {\n            // remove from the store\n            store.splice(storeIndex, 1);\n        }\n    }\n});\n\nvar SINGLE_TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar SINGLE_TOUCH_TARGET_EVENTS = 'touchstart';\nvar SINGLE_TOUCH_WINDOW_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Touch events input\n * @constructor\n * @extends Input\n */\nfunction SingleTouchInput() {\n    this.evTarget = SINGLE_TOUCH_TARGET_EVENTS;\n    this.evWin = SINGLE_TOUCH_WINDOW_EVENTS;\n    this.started = false;\n\n    Input.apply(this, arguments);\n}\n\ninherit(SingleTouchInput, Input, {\n    handler: function TEhandler(ev) {\n        var type = SINGLE_TOUCH_INPUT_MAP[ev.type];\n\n        // should we handle the touch events?\n        if (type === INPUT_START) {\n            this.started = true;\n        }\n\n        if (!this.started) {\n            return;\n        }\n\n        var touches = normalizeSingleTouches.call(this, ev, type);\n\n        // when done, reset the started state\n        if (type & (INPUT_END | INPUT_CANCEL) && touches[0].length - touches[1].length === 0) {\n            this.started = false;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction normalizeSingleTouches(ev, type) {\n    var all = toArray(ev.touches);\n    var changed = toArray(ev.changedTouches);\n\n    if (type & (INPUT_END | INPUT_CANCEL)) {\n        all = uniqueArray(all.concat(changed), 'identifier', true);\n    }\n\n    return [all, changed];\n}\n\nvar TOUCH_INPUT_MAP = {\n    touchstart: INPUT_START,\n    touchmove: INPUT_MOVE,\n    touchend: INPUT_END,\n    touchcancel: INPUT_CANCEL\n};\n\nvar TOUCH_TARGET_EVENTS = 'touchstart touchmove touchend touchcancel';\n\n/**\n * Multi-user touch events input\n * @constructor\n * @extends Input\n */\nfunction TouchInput() {\n    this.evTarget = TOUCH_TARGET_EVENTS;\n    this.targetIds = {};\n\n    Input.apply(this, arguments);\n}\n\ninherit(TouchInput, Input, {\n    handler: function MTEhandler(ev) {\n        var type = TOUCH_INPUT_MAP[ev.type];\n        var touches = getTouches.call(this, ev, type);\n        if (!touches) {\n            return;\n        }\n\n        this.callback(this.manager, type, {\n            pointers: touches[0],\n            changedPointers: touches[1],\n            pointerType: INPUT_TYPE_TOUCH,\n            srcEvent: ev\n        });\n    }\n});\n\n/**\n * @this {TouchInput}\n * @param {Object} ev\n * @param {Number} type flag\n * @returns {undefined|Array} [all, changed]\n */\nfunction getTouches(ev, type) {\n    var allTouches = toArray(ev.touches);\n    var targetIds = this.targetIds;\n\n    // when there is only one touch, the process can be simplified\n    if (type & (INPUT_START | INPUT_MOVE) && allTouches.length === 1) {\n        targetIds[allTouches[0].identifier] = true;\n        return [allTouches, allTouches];\n    }\n\n    var i,\n        targetTouches,\n        changedTouches = toArray(ev.changedTouches),\n        changedTargetTouches = [],\n        target = this.target;\n\n    // get target touches from touches\n    targetTouches = allTouches.filter(function(touch) {\n        return hasParent(touch.target, target);\n    });\n\n    // collect touches\n    if (type === INPUT_START) {\n        i = 0;\n        while (i < targetTouches.length) {\n            targetIds[targetTouches[i].identifier] = true;\n            i++;\n        }\n    }\n\n    // filter changed touches to only contain touches that exist in the collected target ids\n    i = 0;\n    while (i < changedTouches.length) {\n        if (targetIds[changedTouches[i].identifier]) {\n            changedTargetTouches.push(changedTouches[i]);\n        }\n\n        // cleanup removed touches\n        if (type & (INPUT_END | INPUT_CANCEL)) {\n            delete targetIds[changedTouches[i].identifier];\n        }\n        i++;\n    }\n\n    if (!changedTargetTouches.length) {\n        return;\n    }\n\n    return [\n        // merge targetTouches with changedTargetTouches so it contains ALL touches, including 'end' and 'cancel'\n        uniqueArray(targetTouches.concat(changedTargetTouches), 'identifier', true),\n        changedTargetTouches\n    ];\n}\n\n/**\n * Combined touch and mouse input\n *\n * Touch has a higher priority then mouse, and while touching no mouse events are allowed.\n * This because touch devices also emit mouse events while doing a touch.\n *\n * @constructor\n * @extends Input\n */\n\nvar DEDUP_TIMEOUT = 2500;\nvar DEDUP_DISTANCE = 25;\n\nfunction TouchMouseInput() {\n    Input.apply(this, arguments);\n\n    var handler = bindFn(this.handler, this);\n    this.touch = new TouchInput(this.manager, handler);\n    this.mouse = new MouseInput(this.manager, handler);\n\n    this.primaryTouch = null;\n    this.lastTouches = [];\n}\n\ninherit(TouchMouseInput, Input, {\n    /**\n     * handle mouse and touch events\n     * @param {Hammer} manager\n     * @param {String} inputEvent\n     * @param {Object} inputData\n     */\n    handler: function TMEhandler(manager, inputEvent, inputData) {\n        var isTouch = (inputData.pointerType == INPUT_TYPE_TOUCH),\n            isMouse = (inputData.pointerType == INPUT_TYPE_MOUSE);\n\n        if (isMouse && inputData.sourceCapabilities && inputData.sourceCapabilities.firesTouchEvents) {\n            return;\n        }\n\n        // when we're in a touch event, record touches to  de-dupe synthetic mouse event\n        if (isTouch) {\n            recordTouches.call(this, inputEvent, inputData);\n        } else if (isMouse && isSyntheticEvent.call(this, inputData)) {\n            return;\n        }\n\n        this.callback(manager, inputEvent, inputData);\n    },\n\n    /**\n     * remove the event listeners\n     */\n    destroy: function destroy() {\n        this.touch.destroy();\n        this.mouse.destroy();\n    }\n});\n\nfunction recordTouches(eventType, eventData) {\n    if (eventType & INPUT_START) {\n        this.primaryTouch = eventData.changedPointers[0].identifier;\n        setLastTouch.call(this, eventData);\n    } else if (eventType & (INPUT_END | INPUT_CANCEL)) {\n        setLastTouch.call(this, eventData);\n    }\n}\n\nfunction setLastTouch(eventData) {\n    var touch = eventData.changedPointers[0];\n\n    if (touch.identifier === this.primaryTouch) {\n        var lastTouch = {x: touch.clientX, y: touch.clientY};\n        this.lastTouches.push(lastTouch);\n        var lts = this.lastTouches;\n        var removeLastTouch = function() {\n            var i = lts.indexOf(lastTouch);\n            if (i > -1) {\n                lts.splice(i, 1);\n            }\n        };\n        setTimeout(removeLastTouch, DEDUP_TIMEOUT);\n    }\n}\n\nfunction isSyntheticEvent(eventData) {\n    var x = eventData.srcEvent.clientX, y = eventData.srcEvent.clientY;\n    for (var i = 0; i < this.lastTouches.length; i++) {\n        var t = this.lastTouches[i];\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DISTANCE && dy <= DEDUP_DISTANCE) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar PREFIXED_TOUCH_ACTION = prefixed(TEST_ELEMENT.style, 'touchAction');\nvar NATIVE_TOUCH_ACTION = PREFIXED_TOUCH_ACTION !== undefined;\n\n// magical touchAction value\nvar TOUCH_ACTION_COMPUTE = 'compute';\nvar TOUCH_ACTION_AUTO = 'auto';\nvar TOUCH_ACTION_MANIPULATION = 'manipulation'; // not implemented\nvar TOUCH_ACTION_NONE = 'none';\nvar TOUCH_ACTION_PAN_X = 'pan-x';\nvar TOUCH_ACTION_PAN_Y = 'pan-y';\nvar TOUCH_ACTION_MAP = getTouchActionProps();\n\n/**\n * Touch Action\n * sets the touchAction property or uses the js alternative\n * @param {Manager} manager\n * @param {String} value\n * @constructor\n */\nfunction TouchAction(manager, value) {\n    this.manager = manager;\n    this.set(value);\n}\n\nTouchAction.prototype = {\n    /**\n     * set the touchAction value on the element or enable the polyfill\n     * @param {String} value\n     */\n    set: function(value) {\n        // find out the touch-action by the event handlers\n        if (value == TOUCH_ACTION_COMPUTE) {\n            value = this.compute();\n        }\n\n        if (NATIVE_TOUCH_ACTION && this.manager.element.style && TOUCH_ACTION_MAP[value]) {\n            this.manager.element.style[PREFIXED_TOUCH_ACTION] = value;\n        }\n        this.actions = value.toLowerCase().trim();\n    },\n\n    /**\n     * just re-set the touchAction value\n     */\n    update: function() {\n        this.set(this.manager.options.touchAction);\n    },\n\n    /**\n     * compute the value for the touchAction property based on the recognizer's settings\n     * @returns {String} value\n     */\n    compute: function() {\n        var actions = [];\n        each(this.manager.recognizers, function(recognizer) {\n            if (boolOrFn(recognizer.options.enable, [recognizer])) {\n                actions = actions.concat(recognizer.getTouchAction());\n            }\n        });\n        return cleanTouchActions(actions.join(' '));\n    },\n\n    /**\n     * this method is called on each input cycle and provides the preventing of the browser behavior\n     * @param {Object} input\n     */\n    preventDefaults: function(input) {\n        var srcEvent = input.srcEvent;\n        var direction = input.offsetDirection;\n\n        // if the touch action did prevented once this session\n        if (this.manager.session.prevented) {\n            srcEvent.preventDefault();\n            return;\n        }\n\n        var actions = this.actions;\n        var hasNone = inStr(actions, TOUCH_ACTION_NONE) && !TOUCH_ACTION_MAP[TOUCH_ACTION_NONE];\n        var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_Y];\n        var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X) && !TOUCH_ACTION_MAP[TOUCH_ACTION_PAN_X];\n\n        if (hasNone) {\n            //do not prevent defaults if this is a tap gesture\n\n            var isTapPointer = input.pointers.length === 1;\n            var isTapMovement = input.distance < 2;\n            var isTapTouchTime = input.deltaTime < 250;\n\n            if (isTapPointer && isTapMovement && isTapTouchTime) {\n                return;\n            }\n        }\n\n        if (hasPanX && hasPanY) {\n            // `pan-x pan-y` means browser handles all scrolling/panning, do not prevent\n            return;\n        }\n\n        if (hasNone ||\n            (hasPanY && direction & DIRECTION_HORIZONTAL) ||\n            (hasPanX && direction & DIRECTION_VERTICAL)) {\n            return this.preventSrc(srcEvent);\n        }\n    },\n\n    /**\n     * call preventDefault to prevent the browser's default behavior (scrolling in most cases)\n     * @param {Object} srcEvent\n     */\n    preventSrc: function(srcEvent) {\n        this.manager.session.prevented = true;\n        srcEvent.preventDefault();\n    }\n};\n\n/**\n * when the touchActions are collected they are not a valid value, so we need to clean things up. *\n * @param {String} actions\n * @returns {*}\n */\nfunction cleanTouchActions(actions) {\n    // none\n    if (inStr(actions, TOUCH_ACTION_NONE)) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    var hasPanX = inStr(actions, TOUCH_ACTION_PAN_X);\n    var hasPanY = inStr(actions, TOUCH_ACTION_PAN_Y);\n\n    // if both pan-x and pan-y are set (different recognizers\n    // for different directions, e.g. horizontal pan but vertical swipe?)\n    // we need none (as otherwise with pan-x pan-y combined none of these\n    // recognizers will work, since the browser would handle all panning\n    if (hasPanX && hasPanY) {\n        return TOUCH_ACTION_NONE;\n    }\n\n    // pan-x OR pan-y\n    if (hasPanX || hasPanY) {\n        return hasPanX ? TOUCH_ACTION_PAN_X : TOUCH_ACTION_PAN_Y;\n    }\n\n    // manipulation\n    if (inStr(actions, TOUCH_ACTION_MANIPULATION)) {\n        return TOUCH_ACTION_MANIPULATION;\n    }\n\n    return TOUCH_ACTION_AUTO;\n}\n\nfunction getTouchActionProps() {\n    if (!NATIVE_TOUCH_ACTION) {\n        return false;\n    }\n    var touchMap = {};\n    var cssSupports = window.CSS && window.CSS.supports;\n    ['auto', 'manipulation', 'pan-y', 'pan-x', 'pan-x pan-y', 'none'].forEach(function(val) {\n\n        // If css.supports is not supported but there is native touch-action assume it supports\n        // all values. This is the case for IE 10 and 11.\n        touchMap[val] = cssSupports ? window.CSS.supports('touch-action', val) : true;\n    });\n    return touchMap;\n}\n\n/**\n * Recognizer flow explained; *\n * All recognizers have the initial state of POSSIBLE when a input session starts.\n * The definition of a input session is from the first input until the last input, with all it's movement in it. *\n * Example session for mouse-input: mousedown -> mousemove -> mouseup\n *\n * On each recognizing cycle (see Manager.recognize) the .recognize() method is executed\n * which determines with state it should be.\n *\n * If the recognizer has the state FAILED, CANCELLED or RECOGNIZED (equals ENDED), it is reset to\n * POSSIBLE to give it another change on the next cycle.\n *\n *               Possible\n *                  |\n *            +-----+---------------+\n *            |                     |\n *      +-----+-----+               |\n *      |           |               |\n *   Failed      Cancelled          |\n *                          +-------+------+\n *                          |              |\n *                      Recognized       Began\n *                                         |\n *                                      Changed\n *                                         |\n *                                  Ended/Recognized\n */\nvar STATE_POSSIBLE = 1;\nvar STATE_BEGAN = 2;\nvar STATE_CHANGED = 4;\nvar STATE_ENDED = 8;\nvar STATE_RECOGNIZED = STATE_ENDED;\nvar STATE_CANCELLED = 16;\nvar STATE_FAILED = 32;\n\n/**\n * Recognizer\n * Every recognizer needs to extend from this class.\n * @constructor\n * @param {Object} options\n */\nfunction Recognizer(options) {\n    this.options = assign({}, this.defaults, options || {});\n\n    this.id = uniqueId();\n\n    this.manager = null;\n\n    // default is enable true\n    this.options.enable = ifUndefined(this.options.enable, true);\n\n    this.state = STATE_POSSIBLE;\n\n    this.simultaneous = {};\n    this.requireFail = [];\n}\n\nRecognizer.prototype = {\n    /**\n     * @virtual\n     * @type {Object}\n     */\n    defaults: {},\n\n    /**\n     * set options\n     * @param {Object} options\n     * @return {Recognizer}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // also update the touchAction, in case something changed about the directions/enabled state\n        this.manager && this.manager.touchAction.update();\n        return this;\n    },\n\n    /**\n     * recognize simultaneous with an other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    recognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'recognizeWith', this)) {\n            return this;\n        }\n\n        var simultaneous = this.simultaneous;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (!simultaneous[otherRecognizer.id]) {\n            simultaneous[otherRecognizer.id] = otherRecognizer;\n            otherRecognizer.recognizeWith(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the simultaneous link. it doesnt remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRecognizeWith: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRecognizeWith', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        delete this.simultaneous[otherRecognizer.id];\n        return this;\n    },\n\n    /**\n     * recognizer can only run when an other is failing\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    requireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'requireFailure', this)) {\n            return this;\n        }\n\n        var requireFail = this.requireFail;\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        if (inArray(requireFail, otherRecognizer) === -1) {\n            requireFail.push(otherRecognizer);\n            otherRecognizer.requireFailure(this);\n        }\n        return this;\n    },\n\n    /**\n     * drop the requireFailure link. it does not remove the link on the other recognizer.\n     * @param {Recognizer} otherRecognizer\n     * @returns {Recognizer} this\n     */\n    dropRequireFailure: function(otherRecognizer) {\n        if (invokeArrayArg(otherRecognizer, 'dropRequireFailure', this)) {\n            return this;\n        }\n\n        otherRecognizer = getRecognizerByNameIfManager(otherRecognizer, this);\n        var index = inArray(this.requireFail, otherRecognizer);\n        if (index > -1) {\n            this.requireFail.splice(index, 1);\n        }\n        return this;\n    },\n\n    /**\n     * has require failures boolean\n     * @returns {boolean}\n     */\n    hasRequireFailures: function() {\n        return this.requireFail.length > 0;\n    },\n\n    /**\n     * if the recognizer can recognize simultaneous with an other recognizer\n     * @param {Recognizer} otherRecognizer\n     * @returns {Boolean}\n     */\n    canRecognizeWith: function(otherRecognizer) {\n        return !!this.simultaneous[otherRecognizer.id];\n    },\n\n    /**\n     * You should use `tryEmit` instead of `emit` directly to check\n     * that all the needed recognizers has failed before emitting.\n     * @param {Object} input\n     */\n    emit: function(input) {\n        var self = this;\n        var state = this.state;\n\n        function emit(event) {\n            self.manager.emit(event, input);\n        }\n\n        // 'panstart' and 'panmove'\n        if (state < STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n\n        emit(self.options.event); // simple 'eventName' events\n\n        if (input.additionalEvent) { // additional event(panleft, panright, pinchin, pinchout...)\n            emit(input.additionalEvent);\n        }\n\n        // panend and pancancel\n        if (state >= STATE_ENDED) {\n            emit(self.options.event + stateStr(state));\n        }\n    },\n\n    /**\n     * Check that all the require failure recognizers has failed,\n     * if true, it emits a gesture event,\n     * otherwise, setup the state to FAILED.\n     * @param {Object} input\n     */\n    tryEmit: function(input) {\n        if (this.canEmit()) {\n            return this.emit(input);\n        }\n        // it's failing anyway\n        this.state = STATE_FAILED;\n    },\n\n    /**\n     * can we emit?\n     * @returns {boolean}\n     */\n    canEmit: function() {\n        var i = 0;\n        while (i < this.requireFail.length) {\n            if (!(this.requireFail[i].state & (STATE_FAILED | STATE_POSSIBLE))) {\n                return false;\n            }\n            i++;\n        }\n        return true;\n    },\n\n    /**\n     * update the recognizer\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        // make a new copy of the inputData\n        // so we can change the inputData without messing up the other recognizers\n        var inputDataClone = assign({}, inputData);\n\n        // is is enabled and allow recognizing?\n        if (!boolOrFn(this.options.enable, [this, inputDataClone])) {\n            this.reset();\n            this.state = STATE_FAILED;\n            return;\n        }\n\n        // reset when we've reached the end\n        if (this.state & (STATE_RECOGNIZED | STATE_CANCELLED | STATE_FAILED)) {\n            this.state = STATE_POSSIBLE;\n        }\n\n        this.state = this.process(inputDataClone);\n\n        // the recognizer has recognized a gesture\n        // so trigger an event\n        if (this.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED | STATE_CANCELLED)) {\n            this.tryEmit(inputDataClone);\n        }\n    },\n\n    /**\n     * return the state of the recognizer\n     * the actual recognizing happens in this method\n     * @virtual\n     * @param {Object} inputData\n     * @returns {Const} STATE\n     */\n    process: function(inputData) { }, // jshint ignore:line\n\n    /**\n     * return the preferred touch-action\n     * @virtual\n     * @returns {Array}\n     */\n    getTouchAction: function() { },\n\n    /**\n     * called when the gesture isn't allowed to recognize\n     * like when another is being recognized or it is disabled\n     * @virtual\n     */\n    reset: function() { }\n};\n\n/**\n * get a usable string, used as event postfix\n * @param {Const} state\n * @returns {String} state\n */\nfunction stateStr(state) {\n    if (state & STATE_CANCELLED) {\n        return 'cancel';\n    } else if (state & STATE_ENDED) {\n        return 'end';\n    } else if (state & STATE_CHANGED) {\n        return 'move';\n    } else if (state & STATE_BEGAN) {\n        return 'start';\n    }\n    return '';\n}\n\n/**\n * direction cons to string\n * @param {Const} direction\n * @returns {String}\n */\nfunction directionStr(direction) {\n    if (direction == DIRECTION_DOWN) {\n        return 'down';\n    } else if (direction == DIRECTION_UP) {\n        return 'up';\n    } else if (direction == DIRECTION_LEFT) {\n        return 'left';\n    } else if (direction == DIRECTION_RIGHT) {\n        return 'right';\n    }\n    return '';\n}\n\n/**\n * get a recognizer by name if it is bound to a manager\n * @param {Recognizer|String} otherRecognizer\n * @param {Recognizer} recognizer\n * @returns {Recognizer}\n */\nfunction getRecognizerByNameIfManager(otherRecognizer, recognizer) {\n    var manager = recognizer.manager;\n    if (manager) {\n        return manager.get(otherRecognizer);\n    }\n    return otherRecognizer;\n}\n\n/**\n * This recognizer is just used as a base for the simple attribute recognizers.\n * @constructor\n * @extends Recognizer\n */\nfunction AttrRecognizer() {\n    Recognizer.apply(this, arguments);\n}\n\ninherit(AttrRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof AttrRecognizer\n     */\n    defaults: {\n        /**\n         * @type {Number}\n         * @default 1\n         */\n        pointers: 1\n    },\n\n    /**\n     * Used to check if it the recognizer receives valid input, like input.distance > 10.\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {Boolean} recognized\n     */\n    attrTest: function(input) {\n        var optionPointers = this.options.pointers;\n        return optionPointers === 0 || input.pointers.length === optionPointers;\n    },\n\n    /**\n     * Process the input and return the state for the recognizer\n     * @memberof AttrRecognizer\n     * @param {Object} input\n     * @returns {*} State\n     */\n    process: function(input) {\n        var state = this.state;\n        var eventType = input.eventType;\n\n        var isRecognized = state & (STATE_BEGAN | STATE_CHANGED);\n        var isValid = this.attrTest(input);\n\n        // on cancel input and we've recognized before, return STATE_CANCELLED\n        if (isRecognized && (eventType & INPUT_CANCEL || !isValid)) {\n            return state | STATE_CANCELLED;\n        } else if (isRecognized || isValid) {\n            if (eventType & INPUT_END) {\n                return state | STATE_ENDED;\n            } else if (!(state & STATE_BEGAN)) {\n                return STATE_BEGAN;\n            }\n            return state | STATE_CHANGED;\n        }\n        return STATE_FAILED;\n    }\n});\n\n/**\n * Pan\n * Recognized when the pointer is down and moved in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PanRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n\n    this.pX = null;\n    this.pY = null;\n}\n\ninherit(PanRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PanRecognizer\n     */\n    defaults: {\n        event: 'pan',\n        threshold: 10,\n        pointers: 1,\n        direction: DIRECTION_ALL\n    },\n\n    getTouchAction: function() {\n        var direction = this.options.direction;\n        var actions = [];\n        if (direction & DIRECTION_HORIZONTAL) {\n            actions.push(TOUCH_ACTION_PAN_Y);\n        }\n        if (direction & DIRECTION_VERTICAL) {\n            actions.push(TOUCH_ACTION_PAN_X);\n        }\n        return actions;\n    },\n\n    directionTest: function(input) {\n        var options = this.options;\n        var hasMoved = true;\n        var distance = input.distance;\n        var direction = input.direction;\n        var x = input.deltaX;\n        var y = input.deltaY;\n\n        // lock to axis?\n        if (!(direction & options.direction)) {\n            if (options.direction & DIRECTION_HORIZONTAL) {\n                direction = (x === 0) ? DIRECTION_NONE : (x < 0) ? DIRECTION_LEFT : DIRECTION_RIGHT;\n                hasMoved = x != this.pX;\n                distance = Math.abs(input.deltaX);\n            } else {\n                direction = (y === 0) ? DIRECTION_NONE : (y < 0) ? DIRECTION_UP : DIRECTION_DOWN;\n                hasMoved = y != this.pY;\n                distance = Math.abs(input.deltaY);\n            }\n        }\n        input.direction = direction;\n        return hasMoved && distance > options.threshold && direction & options.direction;\n    },\n\n    attrTest: function(input) {\n        return AttrRecognizer.prototype.attrTest.call(this, input) &&\n            (this.state & STATE_BEGAN || (!(this.state & STATE_BEGAN) && this.directionTest(input)));\n    },\n\n    emit: function(input) {\n\n        this.pX = input.deltaX;\n        this.pY = input.deltaY;\n\n        var direction = directionStr(input.direction);\n\n        if (direction) {\n            input.additionalEvent = this.options.event + direction;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Pinch\n * Recognized when two or more pointers are moving toward (zoom-in) or away from each other (zoom-out).\n * @constructor\n * @extends AttrRecognizer\n */\nfunction PinchRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(PinchRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'pinch',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.scale - 1) > this.options.threshold || this.state & STATE_BEGAN);\n    },\n\n    emit: function(input) {\n        if (input.scale !== 1) {\n            var inOut = input.scale < 1 ? 'in' : 'out';\n            input.additionalEvent = this.options.event + inOut;\n        }\n        this._super.emit.call(this, input);\n    }\n});\n\n/**\n * Press\n * Recognized when the pointer is down for x ms without any movement.\n * @constructor\n * @extends Recognizer\n */\nfunction PressRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    this._timer = null;\n    this._input = null;\n}\n\ninherit(PressRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PressRecognizer\n     */\n    defaults: {\n        event: 'press',\n        pointers: 1,\n        time: 251, // minimal time of the pointer to be pressed\n        threshold: 9 // a minimal movement is ok, but keep it low\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_AUTO];\n    },\n\n    process: function(input) {\n        var options = this.options;\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTime = input.deltaTime > options.time;\n\n        this._input = input;\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (!validMovement || !validPointers || (input.eventType & (INPUT_END | INPUT_CANCEL) && !validTime)) {\n            this.reset();\n        } else if (input.eventType & INPUT_START) {\n            this.reset();\n            this._timer = setTimeoutContext(function() {\n                this.state = STATE_RECOGNIZED;\n                this.tryEmit();\n            }, options.time, this);\n        } else if (input.eventType & INPUT_END) {\n            return STATE_RECOGNIZED;\n        }\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function(input) {\n        if (this.state !== STATE_RECOGNIZED) {\n            return;\n        }\n\n        if (input && (input.eventType & INPUT_END)) {\n            this.manager.emit(this.options.event + 'up', input);\n        } else {\n            this._input.timeStamp = now();\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Rotate\n * Recognized when two or more pointer are moving in a circular motion.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction RotateRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(RotateRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof RotateRecognizer\n     */\n    defaults: {\n        event: 'rotate',\n        threshold: 0,\n        pointers: 2\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_NONE];\n    },\n\n    attrTest: function(input) {\n        return this._super.attrTest.call(this, input) &&\n            (Math.abs(input.rotation) > this.options.threshold || this.state & STATE_BEGAN);\n    }\n});\n\n/**\n * Swipe\n * Recognized when the pointer is moving fast (velocity), with enough distance in the allowed direction.\n * @constructor\n * @extends AttrRecognizer\n */\nfunction SwipeRecognizer() {\n    AttrRecognizer.apply(this, arguments);\n}\n\ninherit(SwipeRecognizer, AttrRecognizer, {\n    /**\n     * @namespace\n     * @memberof SwipeRecognizer\n     */\n    defaults: {\n        event: 'swipe',\n        threshold: 10,\n        velocity: 0.3,\n        direction: DIRECTION_HORIZONTAL | DIRECTION_VERTICAL,\n        pointers: 1\n    },\n\n    getTouchAction: function() {\n        return PanRecognizer.prototype.getTouchAction.call(this);\n    },\n\n    attrTest: function(input) {\n        var direction = this.options.direction;\n        var velocity;\n\n        if (direction & (DIRECTION_HORIZONTAL | DIRECTION_VERTICAL)) {\n            velocity = input.overallVelocity;\n        } else if (direction & DIRECTION_HORIZONTAL) {\n            velocity = input.overallVelocityX;\n        } else if (direction & DIRECTION_VERTICAL) {\n            velocity = input.overallVelocityY;\n        }\n\n        return this._super.attrTest.call(this, input) &&\n            direction & input.offsetDirection &&\n            input.distance > this.options.threshold &&\n            input.maxPointers == this.options.pointers &&\n            abs(velocity) > this.options.velocity && input.eventType & INPUT_END;\n    },\n\n    emit: function(input) {\n        var direction = directionStr(input.offsetDirection);\n        if (direction) {\n            this.manager.emit(this.options.event + direction, input);\n        }\n\n        this.manager.emit(this.options.event, input);\n    }\n});\n\n/**\n * A tap is ecognized when the pointer is doing a small tap/click. Multiple taps are recognized if they occur\n * between the given interval and position. The delay option can be used to recognize multi-taps without firing\n * a single tap.\n *\n * The eventData from the emitted event contains the property `tapCount`, which contains the amount of\n * multi-taps being recognized.\n * @constructor\n * @extends Recognizer\n */\nfunction TapRecognizer() {\n    Recognizer.apply(this, arguments);\n\n    // previous time and center,\n    // used for tap counting\n    this.pTime = false;\n    this.pCenter = false;\n\n    this._timer = null;\n    this._input = null;\n    this.count = 0;\n}\n\ninherit(TapRecognizer, Recognizer, {\n    /**\n     * @namespace\n     * @memberof PinchRecognizer\n     */\n    defaults: {\n        event: 'tap',\n        pointers: 1,\n        taps: 1,\n        interval: 300, // max time between the multi-tap taps\n        time: 250, // max time of the pointer to be down (like finger on the screen)\n        threshold: 9, // a minimal movement is ok, but keep it low\n        posThreshold: 10 // a multi-tap can be a bit off the initial position\n    },\n\n    getTouchAction: function() {\n        return [TOUCH_ACTION_MANIPULATION];\n    },\n\n    process: function(input) {\n        var options = this.options;\n\n        var validPointers = input.pointers.length === options.pointers;\n        var validMovement = input.distance < options.threshold;\n        var validTouchTime = input.deltaTime < options.time;\n\n        this.reset();\n\n        if ((input.eventType & INPUT_START) && (this.count === 0)) {\n            return this.failTimeout();\n        }\n\n        // we only allow little movement\n        // and we've reached an end event, so a tap is possible\n        if (validMovement && validTouchTime && validPointers) {\n            if (input.eventType != INPUT_END) {\n                return this.failTimeout();\n            }\n\n            var validInterval = this.pTime ? (input.timeStamp - this.pTime < options.interval) : true;\n            var validMultiTap = !this.pCenter || getDistance(this.pCenter, input.center) < options.posThreshold;\n\n            this.pTime = input.timeStamp;\n            this.pCenter = input.center;\n\n            if (!validMultiTap || !validInterval) {\n                this.count = 1;\n            } else {\n                this.count += 1;\n            }\n\n            this._input = input;\n\n            // if tap count matches we have recognized it,\n            // else it has began recognizing...\n            var tapCount = this.count % options.taps;\n            if (tapCount === 0) {\n                // no failing requirements, immediately trigger the tap event\n                // or wait as long as the multitap interval to trigger\n                if (!this.hasRequireFailures()) {\n                    return STATE_RECOGNIZED;\n                } else {\n                    this._timer = setTimeoutContext(function() {\n                        this.state = STATE_RECOGNIZED;\n                        this.tryEmit();\n                    }, options.interval, this);\n                    return STATE_BEGAN;\n                }\n            }\n        }\n        return STATE_FAILED;\n    },\n\n    failTimeout: function() {\n        this._timer = setTimeoutContext(function() {\n            this.state = STATE_FAILED;\n        }, this.options.interval, this);\n        return STATE_FAILED;\n    },\n\n    reset: function() {\n        clearTimeout(this._timer);\n    },\n\n    emit: function() {\n        if (this.state == STATE_RECOGNIZED) {\n            this._input.tapCount = this.count;\n            this.manager.emit(this.options.event, this._input);\n        }\n    }\n});\n\n/**\n * Simple way to create a manager with a default set of recognizers.\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Hammer(element, options) {\n    options = options || {};\n    options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);\n    return new Manager(element, options);\n}\n\n/**\n * @const {string}\n */\nHammer.VERSION = '2.0.7';\n\n/**\n * default settings\n * @namespace\n */\nHammer.defaults = {\n    /**\n     * set if DOM events are being triggered.\n     * But this is slower and unused by simple implementations, so disabled by default.\n     * @type {Boolean}\n     * @default false\n     */\n    domEvents: false,\n\n    /**\n     * The value for the touchAction property/fallback.\n     * When set to `compute` it will magically set the correct value based on the added recognizers.\n     * @type {String}\n     * @default compute\n     */\n    touchAction: TOUCH_ACTION_COMPUTE,\n\n    /**\n     * @type {Boolean}\n     * @default true\n     */\n    enable: true,\n\n    /**\n     * EXPERIMENTAL FEATURE -- can be removed/changed\n     * Change the parent input target element.\n     * If Null, then it is being set the to main element.\n     * @type {Null|EventTarget}\n     * @default null\n     */\n    inputTarget: null,\n\n    /**\n     * force an input class\n     * @type {Null|Function}\n     * @default null\n     */\n    inputClass: null,\n\n    /**\n     * Default recognizer setup when calling `Hammer()`\n     * When creating a new Manager these will be skipped.\n     * @type {Array}\n     */\n    preset: [\n        // RecognizerClass, options, [recognizeWith, ...], [requireFailure, ...]\n        [RotateRecognizer, {enable: false}],\n        [PinchRecognizer, {enable: false}, ['rotate']],\n        [SwipeRecognizer, {direction: DIRECTION_HORIZONTAL}],\n        [PanRecognizer, {direction: DIRECTION_HORIZONTAL}, ['swipe']],\n        [TapRecognizer],\n        [TapRecognizer, {event: 'doubletap', taps: 2}, ['tap']],\n        [PressRecognizer]\n    ],\n\n    /**\n     * Some CSS properties can be used to improve the working of Hammer.\n     * Add them to this method and they will be set when creating a new Manager.\n     * @namespace\n     */\n    cssProps: {\n        /**\n         * Disables text selection to improve the dragging gesture. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userSelect: 'none',\n\n        /**\n         * Disable the Windows Phone grippers when pressing an element.\n         * @type {String}\n         * @default 'none'\n         */\n        touchSelect: 'none',\n\n        /**\n         * Disables the default callout shown when you touch and hold a touch target.\n         * On iOS, when you touch and hold a touch target such as a link, Safari displays\n         * a callout containing information about the link. This property allows you to disable that callout.\n         * @type {String}\n         * @default 'none'\n         */\n        touchCallout: 'none',\n\n        /**\n         * Specifies whether zooming is enabled. Used by IE10>\n         * @type {String}\n         * @default 'none'\n         */\n        contentZooming: 'none',\n\n        /**\n         * Specifies that an entire element should be draggable instead of its contents. Mainly for desktop browsers.\n         * @type {String}\n         * @default 'none'\n         */\n        userDrag: 'none',\n\n        /**\n         * Overrides the highlight color shown when the user taps a link or a JavaScript\n         * clickable element in iOS. This property obeys the alpha value, if specified.\n         * @type {String}\n         * @default 'rgba(0,0,0,0)'\n         */\n        tapHighlightColor: 'rgba(0,0,0,0)'\n    }\n};\n\nvar STOP = 1;\nvar FORCED_STOP = 2;\n\n/**\n * Manager\n * @param {HTMLElement} element\n * @param {Object} [options]\n * @constructor\n */\nfunction Manager(element, options) {\n    this.options = assign({}, Hammer.defaults, options || {});\n\n    this.options.inputTarget = this.options.inputTarget || element;\n\n    this.handlers = {};\n    this.session = {};\n    this.recognizers = [];\n    this.oldCssProps = {};\n\n    this.element = element;\n    this.input = createInputInstance(this);\n    this.touchAction = new TouchAction(this, this.options.touchAction);\n\n    toggleCssProps(this, true);\n\n    each(this.options.recognizers, function(item) {\n        var recognizer = this.add(new (item[0])(item[1]));\n        item[2] && recognizer.recognizeWith(item[2]);\n        item[3] && recognizer.requireFailure(item[3]);\n    }, this);\n}\n\nManager.prototype = {\n    /**\n     * set options\n     * @param {Object} options\n     * @returns {Manager}\n     */\n    set: function(options) {\n        assign(this.options, options);\n\n        // Options that need a little more setup\n        if (options.touchAction) {\n            this.touchAction.update();\n        }\n        if (options.inputTarget) {\n            // Clean up existing event listeners and reinitialize\n            this.input.destroy();\n            this.input.target = options.inputTarget;\n            this.input.init();\n        }\n        return this;\n    },\n\n    /**\n     * stop recognizing for this session.\n     * This session will be discarded, when a new [input]start event is fired.\n     * When forced, the recognizer cycle is stopped immediately.\n     * @param {Boolean} [force]\n     */\n    stop: function(force) {\n        this.session.stopped = force ? FORCED_STOP : STOP;\n    },\n\n    /**\n     * run the recognizers!\n     * called by the inputHandler function on every movement of the pointers (touches)\n     * it walks through all the recognizers and tries to detect the gesture that is being made\n     * @param {Object} inputData\n     */\n    recognize: function(inputData) {\n        var session = this.session;\n        if (session.stopped) {\n            return;\n        }\n\n        // run the touch-action polyfill\n        this.touchAction.preventDefaults(inputData);\n\n        var recognizer;\n        var recognizers = this.recognizers;\n\n        // this holds the recognizer that is being recognized.\n        // so the recognizer's state needs to be BEGAN, CHANGED, ENDED or RECOGNIZED\n        // if no recognizer is detecting a thing, it is set to `null`\n        var curRecognizer = session.curRecognizer;\n\n        // reset when the last recognizer is recognized\n        // or when we're in a new session\n        if (!curRecognizer || (curRecognizer && curRecognizer.state & STATE_RECOGNIZED)) {\n            curRecognizer = session.curRecognizer = null;\n        }\n\n        var i = 0;\n        while (i < recognizers.length) {\n            recognizer = recognizers[i];\n\n            // find out if we are allowed try to recognize the input for this one.\n            // 1.   allow if the session is NOT forced stopped (see the .stop() method)\n            // 2.   allow if we still haven't recognized a gesture in this session, or the this recognizer is the one\n            //      that is being recognized.\n            // 3.   allow if the recognizer is allowed to run simultaneous with the current recognized recognizer.\n            //      this can be setup with the `recognizeWith()` method on the recognizer.\n            if (session.stopped !== FORCED_STOP && ( // 1\n                    !curRecognizer || recognizer == curRecognizer || // 2\n                    recognizer.canRecognizeWith(curRecognizer))) { // 3\n                recognizer.recognize(inputData);\n            } else {\n                recognizer.reset();\n            }\n\n            // if the recognizer has been recognizing the input as a valid gesture, we want to store this one as the\n            // current active recognizer. but only if we don't already have an active recognizer\n            if (!curRecognizer && recognizer.state & (STATE_BEGAN | STATE_CHANGED | STATE_ENDED)) {\n                curRecognizer = session.curRecognizer = recognizer;\n            }\n            i++;\n        }\n    },\n\n    /**\n     * get a recognizer by its event name.\n     * @param {Recognizer|String} recognizer\n     * @returns {Recognizer|Null}\n     */\n    get: function(recognizer) {\n        if (recognizer instanceof Recognizer) {\n            return recognizer;\n        }\n\n        var recognizers = this.recognizers;\n        for (var i = 0; i < recognizers.length; i++) {\n            if (recognizers[i].options.event == recognizer) {\n                return recognizers[i];\n            }\n        }\n        return null;\n    },\n\n    /**\n     * add a recognizer to the manager\n     * existing recognizers with the same event name will be removed\n     * @param {Recognizer} recognizer\n     * @returns {Recognizer|Manager}\n     */\n    add: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'add', this)) {\n            return this;\n        }\n\n        // remove existing\n        var existing = this.get(recognizer.options.event);\n        if (existing) {\n            this.remove(existing);\n        }\n\n        this.recognizers.push(recognizer);\n        recognizer.manager = this;\n\n        this.touchAction.update();\n        return recognizer;\n    },\n\n    /**\n     * remove a recognizer by name or instance\n     * @param {Recognizer|String} recognizer\n     * @returns {Manager}\n     */\n    remove: function(recognizer) {\n        if (invokeArrayArg(recognizer, 'remove', this)) {\n            return this;\n        }\n\n        recognizer = this.get(recognizer);\n\n        // let's make sure this recognizer exists\n        if (recognizer) {\n            var recognizers = this.recognizers;\n            var index = inArray(recognizers, recognizer);\n\n            if (index !== -1) {\n                recognizers.splice(index, 1);\n                this.touchAction.update();\n            }\n        }\n\n        return this;\n    },\n\n    /**\n     * bind event\n     * @param {String} events\n     * @param {Function} handler\n     * @returns {EventEmitter} this\n     */\n    on: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n        if (handler === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            handlers[event] = handlers[event] || [];\n            handlers[event].push(handler);\n        });\n        return this;\n    },\n\n    /**\n     * unbind event, leave emit blank to remove all handlers\n     * @param {String} events\n     * @param {Function} [handler]\n     * @returns {EventEmitter} this\n     */\n    off: function(events, handler) {\n        if (events === undefined) {\n            return;\n        }\n\n        var handlers = this.handlers;\n        each(splitStr(events), function(event) {\n            if (!handler) {\n                delete handlers[event];\n            } else {\n                handlers[event] && handlers[event].splice(inArray(handlers[event], handler), 1);\n            }\n        });\n        return this;\n    },\n\n    /**\n     * emit event to the listeners\n     * @param {String} event\n     * @param {Object} data\n     */\n    emit: function(event, data) {\n        // we also want to trigger dom events\n        if (this.options.domEvents) {\n            triggerDomEvent(event, data);\n        }\n\n        // no handlers, so skip it all\n        var handlers = this.handlers[event] && this.handlers[event].slice();\n        if (!handlers || !handlers.length) {\n            return;\n        }\n\n        data.type = event;\n        data.preventDefault = function() {\n            data.srcEvent.preventDefault();\n        };\n\n        var i = 0;\n        while (i < handlers.length) {\n            handlers[i](data);\n            i++;\n        }\n    },\n\n    /**\n     * destroy the manager and unbinds all events\n     * it doesn't unbind dom events, that is the user own responsibility\n     */\n    destroy: function() {\n        this.element && toggleCssProps(this, false);\n\n        this.handlers = {};\n        this.session = {};\n        this.input.destroy();\n        this.element = null;\n    }\n};\n\n/**\n * add/remove the css properties as defined in manager.options.cssProps\n * @param {Manager} manager\n * @param {Boolean} add\n */\nfunction toggleCssProps(manager, add) {\n    var element = manager.element;\n    if (!element.style) {\n        return;\n    }\n    var prop;\n    each(manager.options.cssProps, function(value, name) {\n        prop = prefixed(element.style, name);\n        if (add) {\n            manager.oldCssProps[prop] = element.style[prop];\n            element.style[prop] = value;\n        } else {\n            element.style[prop] = manager.oldCssProps[prop] || '';\n        }\n    });\n    if (!add) {\n        manager.oldCssProps = {};\n    }\n}\n\n/**\n * trigger dom event\n * @param {String} event\n * @param {Object} data\n */\nfunction triggerDomEvent(event, data) {\n    var gestureEvent = document.createEvent('Event');\n    gestureEvent.initEvent(event, true, true);\n    gestureEvent.gesture = data;\n    data.target.dispatchEvent(gestureEvent);\n}\n\nassign(Hammer, {\n    INPUT_START: INPUT_START,\n    INPUT_MOVE: INPUT_MOVE,\n    INPUT_END: INPUT_END,\n    INPUT_CANCEL: INPUT_CANCEL,\n\n    STATE_POSSIBLE: STATE_POSSIBLE,\n    STATE_BEGAN: STATE_BEGAN,\n    STATE_CHANGED: STATE_CHANGED,\n    STATE_ENDED: STATE_ENDED,\n    STATE_RECOGNIZED: STATE_RECOGNIZED,\n    STATE_CANCELLED: STATE_CANCELLED,\n    STATE_FAILED: STATE_FAILED,\n\n    DIRECTION_NONE: DIRECTION_NONE,\n    DIRECTION_LEFT: DIRECTION_LEFT,\n    DIRECTION_RIGHT: DIRECTION_RIGHT,\n    DIRECTION_UP: DIRECTION_UP,\n    DIRECTION_DOWN: DIRECTION_DOWN,\n    DIRECTION_HORIZONTAL: DIRECTION_HORIZONTAL,\n    DIRECTION_VERTICAL: DIRECTION_VERTICAL,\n    DIRECTION_ALL: DIRECTION_ALL,\n\n    Manager: Manager,\n    Input: Input,\n    TouchAction: TouchAction,\n\n    TouchInput: TouchInput,\n    MouseInput: MouseInput,\n    PointerEventInput: PointerEventInput,\n    TouchMouseInput: TouchMouseInput,\n    SingleTouchInput: SingleTouchInput,\n\n    Recognizer: Recognizer,\n    AttrRecognizer: AttrRecognizer,\n    Tap: TapRecognizer,\n    Pan: PanRecognizer,\n    Swipe: SwipeRecognizer,\n    Pinch: PinchRecognizer,\n    Rotate: RotateRecognizer,\n    Press: PressRecognizer,\n\n    on: addEventListeners,\n    off: removeEventListeners,\n    each: each,\n    merge: merge,\n    extend: extend,\n    assign: assign,\n    inherit: inherit,\n    bindFn: bindFn,\n    prefixed: prefixed\n});\n\n// this prevents errors when Hammer is loaded in the presence of an AMD\n//  style loader but by script tag, not by the loader.\nvar freeGlobal = (typeof window !== 'undefined' ? window : (typeof self !== 'undefined' ? self : {})); // jshint ignore:line\nfreeGlobal.Hammer = Hammer;\n\nif (typeof define === 'function' && define.amd) {\n    define(function() {\n        return Hammer;\n    });\n} else if (typeof module != 'undefined' && module.exports) {\n    module.exports = Hammer;\n} else {\n    window[exportName] = Hammer;\n}\n\n})(window, document, 'Hammer');\n","/* flatpickr v4.6.3, @license MIT */\n(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n    typeof define === 'function' && define.amd ? define(factory) :\n    (global = global || self, global.flatpickr = factory());\n}(this, function () { 'use strict';\n\n    /*! *****************************************************************************\r\n    Copyright (c) Microsoft Corporation. All rights reserved.\r\n    Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n    this file except in compliance with the License. You may obtain a copy of the\r\n    License at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n    MERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n    See the Apache Version 2.0 License for specific language governing permissions\r\n    and limitations under the License.\r\n    ***************************************************************************** */\r\n\r\n    var __assign = function() {\r\n        __assign = Object.assign || function __assign(t) {\r\n            for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n                s = arguments[i];\r\n                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n            }\r\n            return t;\r\n        };\r\n        return __assign.apply(this, arguments);\r\n    };\n\n    var HOOKS = [\n        \"onChange\",\n        \"onClose\",\n        \"onDayCreate\",\n        \"onDestroy\",\n        \"onKeyDown\",\n        \"onMonthChange\",\n        \"onOpen\",\n        \"onParseConfig\",\n        \"onReady\",\n        \"onValueUpdate\",\n        \"onYearChange\",\n        \"onPreCalendarPosition\",\n    ];\n    var defaults = {\n        _disable: [],\n        _enable: [],\n        allowInput: false,\n        altFormat: \"F j, Y\",\n        altInput: false,\n        altInputClass: \"form-control input\",\n        animate: typeof window === \"object\" &&\n            window.navigator.userAgent.indexOf(\"MSIE\") === -1,\n        ariaDateFormat: \"F j, Y\",\n        clickOpens: true,\n        closeOnSelect: true,\n        conjunction: \", \",\n        dateFormat: \"Y-m-d\",\n        defaultHour: 12,\n        defaultMinute: 0,\n        defaultSeconds: 0,\n        disable: [],\n        disableMobile: false,\n        enable: [],\n        enableSeconds: false,\n        enableTime: false,\n        errorHandler: function (err) {\n            return typeof console !== \"undefined\" && console.warn(err);\n        },\n        getWeek: function (givenDate) {\n            var date = new Date(givenDate.getTime());\n            date.setHours(0, 0, 0, 0);\n            // Thursday in current week decides the year.\n            date.setDate(date.getDate() + 3 - ((date.getDay() + 6) % 7));\n            // January 4 is always in week 1.\n            var week1 = new Date(date.getFullYear(), 0, 4);\n            // Adjust to Thursday in week 1 and count number of weeks from date to week1.\n            return (1 +\n                Math.round(((date.getTime() - week1.getTime()) / 86400000 -\n                    3 +\n                    ((week1.getDay() + 6) % 7)) /\n                    7));\n        },\n        hourIncrement: 1,\n        ignoredFocusElements: [],\n        inline: false,\n        locale: \"default\",\n        minuteIncrement: 5,\n        mode: \"single\",\n        monthSelectorType: \"dropdown\",\n        nextArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M13.207 8.472l-7.854 7.854-0.707-0.707 7.146-7.146-7.146-7.148 0.707-0.707 7.854 7.854z' /></svg>\",\n        noCalendar: false,\n        now: new Date(),\n        onChange: [],\n        onClose: [],\n        onDayCreate: [],\n        onDestroy: [],\n        onKeyDown: [],\n        onMonthChange: [],\n        onOpen: [],\n        onParseConfig: [],\n        onReady: [],\n        onValueUpdate: [],\n        onYearChange: [],\n        onPreCalendarPosition: [],\n        plugins: [],\n        position: \"auto\",\n        positionElement: undefined,\n        prevArrow: \"<svg version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' viewBox='0 0 17 17'><g></g><path d='M5.207 8.471l7.146 7.147-0.707 0.707-7.853-7.854 7.854-7.853 0.707 0.707-7.147 7.146z' /></svg>\",\n        shorthandCurrentMonth: false,\n        showMonths: 1,\n        static: false,\n        time_24hr: false,\n        weekNumbers: false,\n        wrap: false\n    };\n\n    var english = {\n        weekdays: {\n            shorthand: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n            longhand: [\n                \"Sunday\",\n                \"Monday\",\n                \"Tuesday\",\n                \"Wednesday\",\n                \"Thursday\",\n                \"Friday\",\n                \"Saturday\",\n            ]\n        },\n        months: {\n            shorthand: [\n                \"Jan\",\n                \"Feb\",\n                \"Mar\",\n                \"Apr\",\n                \"May\",\n                \"Jun\",\n                \"Jul\",\n                \"Aug\",\n                \"Sep\",\n                \"Oct\",\n                \"Nov\",\n                \"Dec\",\n            ],\n            longhand: [\n                \"January\",\n                \"February\",\n                \"March\",\n                \"April\",\n                \"May\",\n                \"June\",\n                \"July\",\n                \"August\",\n                \"September\",\n                \"October\",\n                \"November\",\n                \"December\",\n            ]\n        },\n        daysInMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],\n        firstDayOfWeek: 0,\n        ordinal: function (nth) {\n            var s = nth % 100;\n            if (s > 3 && s < 21)\n                return \"th\";\n            switch (s % 10) {\n                case 1:\n                    return \"st\";\n                case 2:\n                    return \"nd\";\n                case 3:\n                    return \"rd\";\n                default:\n                    return \"th\";\n            }\n        },\n        rangeSeparator: \" to \",\n        weekAbbreviation: \"Wk\",\n        scrollTitle: \"Scroll to increment\",\n        toggleTitle: \"Click to toggle\",\n        amPM: [\"AM\", \"PM\"],\n        yearAriaLabel: \"Year\",\n        hourAriaLabel: \"Hour\",\n        minuteAriaLabel: \"Minute\",\n        time_24hr: false\n    };\n\n    var pad = function (number) { return (\"0\" + number).slice(-2); };\n    var int = function (bool) { return (bool === true ? 1 : 0); };\n    /* istanbul ignore next */\n    function debounce(func, wait, immediate) {\n        if (immediate === void 0) { immediate = false; }\n        var timeout;\n        return function () {\n            var context = this, args = arguments;\n            timeout !== null && clearTimeout(timeout);\n            timeout = window.setTimeout(function () {\n                timeout = null;\n                if (!immediate)\n                    func.apply(context, args);\n            }, wait);\n            if (immediate && !timeout)\n                func.apply(context, args);\n        };\n    }\n    var arrayify = function (obj) {\n        return obj instanceof Array ? obj : [obj];\n    };\n\n    function toggleClass(elem, className, bool) {\n        if (bool === true)\n            return elem.classList.add(className);\n        elem.classList.remove(className);\n    }\n    function createElement(tag, className, content) {\n        var e = window.document.createElement(tag);\n        className = className || \"\";\n        content = content || \"\";\n        e.className = className;\n        if (content !== undefined)\n            e.textContent = content;\n        return e;\n    }\n    function clearNode(node) {\n        while (node.firstChild)\n            node.removeChild(node.firstChild);\n    }\n    function findParent(node, condition) {\n        if (condition(node))\n            return node;\n        else if (node.parentNode)\n            return findParent(node.parentNode, condition);\n        return undefined; // nothing found\n    }\n    function createNumberInput(inputClassName, opts) {\n        var wrapper = createElement(\"div\", \"numInputWrapper\"), numInput = createElement(\"input\", \"numInput \" + inputClassName), arrowUp = createElement(\"span\", \"arrowUp\"), arrowDown = createElement(\"span\", \"arrowDown\");\n        if (navigator.userAgent.indexOf(\"MSIE 9.0\") === -1) {\n            numInput.type = \"number\";\n        }\n        else {\n            numInput.type = \"text\";\n            numInput.pattern = \"\\\\d*\";\n        }\n        if (opts !== undefined)\n            for (var key in opts)\n                numInput.setAttribute(key, opts[key]);\n        wrapper.appendChild(numInput);\n        wrapper.appendChild(arrowUp);\n        wrapper.appendChild(arrowDown);\n        return wrapper;\n    }\n    function getEventTarget(event) {\n        if (typeof event.composedPath === \"function\") {\n            var path = event.composedPath();\n            return path[0];\n        }\n        return event.target;\n    }\n\n    var doNothing = function () { return undefined; };\n    var monthToStr = function (monthNumber, shorthand, locale) { return locale.months[shorthand ? \"shorthand\" : \"longhand\"][monthNumber]; };\n    var revFormat = {\n        D: doNothing,\n        F: function (dateObj, monthName, locale) {\n            dateObj.setMonth(locale.months.longhand.indexOf(monthName));\n        },\n        G: function (dateObj, hour) {\n            dateObj.setHours(parseFloat(hour));\n        },\n        H: function (dateObj, hour) {\n            dateObj.setHours(parseFloat(hour));\n        },\n        J: function (dateObj, day) {\n            dateObj.setDate(parseFloat(day));\n        },\n        K: function (dateObj, amPM, locale) {\n            dateObj.setHours((dateObj.getHours() % 12) +\n                12 * int(new RegExp(locale.amPM[1], \"i\").test(amPM)));\n        },\n        M: function (dateObj, shortMonth, locale) {\n            dateObj.setMonth(locale.months.shorthand.indexOf(shortMonth));\n        },\n        S: function (dateObj, seconds) {\n            dateObj.setSeconds(parseFloat(seconds));\n        },\n        U: function (_, unixSeconds) { return new Date(parseFloat(unixSeconds) * 1000); },\n        W: function (dateObj, weekNum, locale) {\n            var weekNumber = parseInt(weekNum);\n            var date = new Date(dateObj.getFullYear(), 0, 2 + (weekNumber - 1) * 7, 0, 0, 0, 0);\n            date.setDate(date.getDate() - date.getDay() + locale.firstDayOfWeek);\n            return date;\n        },\n        Y: function (dateObj, year) {\n            dateObj.setFullYear(parseFloat(year));\n        },\n        Z: function (_, ISODate) { return new Date(ISODate); },\n        d: function (dateObj, day) {\n            dateObj.setDate(parseFloat(day));\n        },\n        h: function (dateObj, hour) {\n            dateObj.setHours(parseFloat(hour));\n        },\n        i: function (dateObj, minutes) {\n            dateObj.setMinutes(parseFloat(minutes));\n        },\n        j: function (dateObj, day) {\n            dateObj.setDate(parseFloat(day));\n        },\n        l: doNothing,\n        m: function (dateObj, month) {\n            dateObj.setMonth(parseFloat(month) - 1);\n        },\n        n: function (dateObj, month) {\n            dateObj.setMonth(parseFloat(month) - 1);\n        },\n        s: function (dateObj, seconds) {\n            dateObj.setSeconds(parseFloat(seconds));\n        },\n        u: function (_, unixMillSeconds) {\n            return new Date(parseFloat(unixMillSeconds));\n        },\n        w: doNothing,\n        y: function (dateObj, year) {\n            dateObj.setFullYear(2000 + parseFloat(year));\n        }\n    };\n    var tokenRegex = {\n        D: \"(\\\\w+)\",\n        F: \"(\\\\w+)\",\n        G: \"(\\\\d\\\\d|\\\\d)\",\n        H: \"(\\\\d\\\\d|\\\\d)\",\n        J: \"(\\\\d\\\\d|\\\\d)\\\\w+\",\n        K: \"\",\n        M: \"(\\\\w+)\",\n        S: \"(\\\\d\\\\d|\\\\d)\",\n        U: \"(.+)\",\n        W: \"(\\\\d\\\\d|\\\\d)\",\n        Y: \"(\\\\d{4})\",\n        Z: \"(.+)\",\n        d: \"(\\\\d\\\\d|\\\\d)\",\n        h: \"(\\\\d\\\\d|\\\\d)\",\n        i: \"(\\\\d\\\\d|\\\\d)\",\n        j: \"(\\\\d\\\\d|\\\\d)\",\n        l: \"(\\\\w+)\",\n        m: \"(\\\\d\\\\d|\\\\d)\",\n        n: \"(\\\\d\\\\d|\\\\d)\",\n        s: \"(\\\\d\\\\d|\\\\d)\",\n        u: \"(.+)\",\n        w: \"(\\\\d\\\\d|\\\\d)\",\n        y: \"(\\\\d{2})\"\n    };\n    var formats = {\n        // get the date in UTC\n        Z: function (date) { return date.toISOString(); },\n        // weekday name, short, e.g. Thu\n        D: function (date, locale, options) {\n            return locale.weekdays.shorthand[formats.w(date, locale, options)];\n        },\n        // full month name e.g. January\n        F: function (date, locale, options) {\n            return monthToStr(formats.n(date, locale, options) - 1, false, locale);\n        },\n        // padded hour 1-12\n        G: function (date, locale, options) {\n            return pad(formats.h(date, locale, options));\n        },\n        // hours with leading zero e.g. 03\n        H: function (date) { return pad(date.getHours()); },\n        // day (1-30) with ordinal suffix e.g. 1st, 2nd\n        J: function (date, locale) {\n            return locale.ordinal !== undefined\n                ? date.getDate() + locale.ordinal(date.getDate())\n                : date.getDate();\n        },\n        // AM/PM\n        K: function (date, locale) { return locale.amPM[int(date.getHours() > 11)]; },\n        // shorthand month e.g. Jan, Sep, Oct, etc\n        M: function (date, locale) {\n            return monthToStr(date.getMonth(), true, locale);\n        },\n        // seconds 00-59\n        S: function (date) { return pad(date.getSeconds()); },\n        // unix timestamp\n        U: function (date) { return date.getTime() / 1000; },\n        W: function (date, _, options) {\n            return options.getWeek(date);\n        },\n        // full year e.g. 2016\n        Y: function (date) { return date.getFullYear(); },\n        // day in month, padded (01-30)\n        d: function (date) { return pad(date.getDate()); },\n        // hour from 1-12 (am/pm)\n        h: function (date) { return (date.getHours() % 12 ? date.getHours() % 12 : 12); },\n        // minutes, padded with leading zero e.g. 09\n        i: function (date) { return pad(date.getMinutes()); },\n        // day in month (1-30)\n        j: function (date) { return date.getDate(); },\n        // weekday name, full, e.g. Thursday\n        l: function (date, locale) {\n            return locale.weekdays.longhand[date.getDay()];\n        },\n        // padded month number (01-12)\n        m: function (date) { return pad(date.getMonth() + 1); },\n        // the month number (1-12)\n        n: function (date) { return date.getMonth() + 1; },\n        // seconds 0-59\n        s: function (date) { return date.getSeconds(); },\n        // Unix Milliseconds\n        u: function (date) { return date.getTime(); },\n        // number of the day of the week\n        w: function (date) { return date.getDay(); },\n        // last two digits of year e.g. 16 for 2016\n        y: function (date) { return String(date.getFullYear()).substring(2); }\n    };\n\n    var createDateFormatter = function (_a) {\n        var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c;\n        return function (dateObj, frmt, overrideLocale) {\n            var locale = overrideLocale || l10n;\n            if (config.formatDate !== undefined) {\n                return config.formatDate(dateObj, frmt, locale);\n            }\n            return frmt\n                .split(\"\")\n                .map(function (c, i, arr) {\n                return formats[c] && arr[i - 1] !== \"\\\\\"\n                    ? formats[c](dateObj, locale, config)\n                    : c !== \"\\\\\"\n                        ? c\n                        : \"\";\n            })\n                .join(\"\");\n        };\n    };\n    var createDateParser = function (_a) {\n        var _b = _a.config, config = _b === void 0 ? defaults : _b, _c = _a.l10n, l10n = _c === void 0 ? english : _c;\n        return function (date, givenFormat, timeless, customLocale) {\n            if (date !== 0 && !date)\n                return undefined;\n            var locale = customLocale || l10n;\n            var parsedDate;\n            var dateOrig = date;\n            if (date instanceof Date)\n                parsedDate = new Date(date.getTime());\n            else if (typeof date !== \"string\" &&\n                date.toFixed !== undefined // timestamp\n            )\n                // create a copy\n                parsedDate = new Date(date);\n            else if (typeof date === \"string\") {\n                // date string\n                var format = givenFormat || (config || defaults).dateFormat;\n                var datestr = String(date).trim();\n                if (datestr === \"today\") {\n                    parsedDate = new Date();\n                    timeless = true;\n                }\n                else if (/Z$/.test(datestr) ||\n                    /GMT$/.test(datestr) // datestrings w/ timezone\n                )\n                    parsedDate = new Date(date);\n                else if (config && config.parseDate)\n                    parsedDate = config.parseDate(date, format);\n                else {\n                    parsedDate =\n                        !config || !config.noCalendar\n                            ? new Date(new Date().getFullYear(), 0, 1, 0, 0, 0, 0)\n                            : new Date(new Date().setHours(0, 0, 0, 0));\n                    var matched = void 0, ops = [];\n                    for (var i = 0, matchIndex = 0, regexStr = \"\"; i < format.length; i++) {\n                        var token_1 = format[i];\n                        var isBackSlash = token_1 === \"\\\\\";\n                        var escaped = format[i - 1] === \"\\\\\" || isBackSlash;\n                        if (tokenRegex[token_1] && !escaped) {\n                            regexStr += tokenRegex[token_1];\n                            var match = new RegExp(regexStr).exec(date);\n                            if (match && (matched = true)) {\n                                ops[token_1 !== \"Y\" ? \"push\" : \"unshift\"]({\n                                    fn: revFormat[token_1],\n                                    val: match[++matchIndex]\n                                });\n                            }\n                        }\n                        else if (!isBackSlash)\n                            regexStr += \".\"; // don't really care\n                        ops.forEach(function (_a) {\n                            var fn = _a.fn, val = _a.val;\n                            return (parsedDate = fn(parsedDate, val, locale) || parsedDate);\n                        });\n                    }\n                    parsedDate = matched ? parsedDate : undefined;\n                }\n            }\n            /* istanbul ignore next */\n            if (!(parsedDate instanceof Date && !isNaN(parsedDate.getTime()))) {\n                config.errorHandler(new Error(\"Invalid date provided: \" + dateOrig));\n                return undefined;\n            }\n            if (timeless === true)\n                parsedDate.setHours(0, 0, 0, 0);\n            return parsedDate;\n        };\n    };\n    /**\n     * Compute the difference in dates, measured in ms\n     */\n    function compareDates(date1, date2, timeless) {\n        if (timeless === void 0) { timeless = true; }\n        if (timeless !== false) {\n            return (new Date(date1.getTime()).setHours(0, 0, 0, 0) -\n                new Date(date2.getTime()).setHours(0, 0, 0, 0));\n        }\n        return date1.getTime() - date2.getTime();\n    }\n    var isBetween = function (ts, ts1, ts2) {\n        return ts > Math.min(ts1, ts2) && ts < Math.max(ts1, ts2);\n    };\n    var duration = {\n        DAY: 86400000\n    };\n\n    if (typeof Object.assign !== \"function\") {\n        Object.assign = function (target) {\n            var args = [];\n            for (var _i = 1; _i < arguments.length; _i++) {\n                args[_i - 1] = arguments[_i];\n            }\n            if (!target) {\n                throw TypeError(\"Cannot convert undefined or null to object\");\n            }\n            var _loop_1 = function (source) {\n                if (source) {\n                    Object.keys(source).forEach(function (key) { return (target[key] = source[key]); });\n                }\n            };\n            for (var _a = 0, args_1 = args; _a < args_1.length; _a++) {\n                var source = args_1[_a];\n                _loop_1(source);\n            }\n            return target;\n        };\n    }\n\n    var DEBOUNCED_CHANGE_MS = 300;\n    function FlatpickrInstance(element, instanceConfig) {\n        var self = {\n            config: __assign({}, defaults, flatpickr.defaultConfig),\n            l10n: english\n        };\n        self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n        self._handlers = [];\n        self.pluginElements = [];\n        self.loadedPlugins = [];\n        self._bind = bind;\n        self._setHoursFromDate = setHoursFromDate;\n        self._positionCalendar = positionCalendar;\n        self.changeMonth = changeMonth;\n        self.changeYear = changeYear;\n        self.clear = clear;\n        self.close = close;\n        self._createElement = createElement;\n        self.destroy = destroy;\n        self.isEnabled = isEnabled;\n        self.jumpToDate = jumpToDate;\n        self.open = open;\n        self.redraw = redraw;\n        self.set = set;\n        self.setDate = setDate;\n        self.toggle = toggle;\n        function setupHelperFunctions() {\n            self.utils = {\n                getDaysInMonth: function (month, yr) {\n                    if (month === void 0) { month = self.currentMonth; }\n                    if (yr === void 0) { yr = self.currentYear; }\n                    if (month === 1 && ((yr % 4 === 0 && yr % 100 !== 0) || yr % 400 === 0))\n                        return 29;\n                    return self.l10n.daysInMonth[month];\n                }\n            };\n        }\n        function init() {\n            self.element = self.input = element;\n            self.isOpen = false;\n            parseConfig();\n            setupLocale();\n            setupInputs();\n            setupDates();\n            setupHelperFunctions();\n            if (!self.isMobile)\n                build();\n            bindEvents();\n            if (self.selectedDates.length || self.config.noCalendar) {\n                if (self.config.enableTime) {\n                    setHoursFromDate(self.config.noCalendar\n                        ? self.latestSelectedDateObj || self.config.minDate\n                        : undefined);\n                }\n                updateValue(false);\n            }\n            setCalendarWidth();\n            self.showTimeInput =\n                self.selectedDates.length > 0 || self.config.noCalendar;\n            var isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n            /* TODO: investigate this further\n        \n              Currently, there is weird positioning behavior in safari causing pages\n              to scroll up. https://github.com/chmln/flatpickr/issues/563\n        \n              However, most browsers are not Safari and positioning is expensive when used\n              in scale. https://github.com/chmln/flatpickr/issues/1096\n            */\n            if (!self.isMobile && isSafari) {\n                positionCalendar();\n            }\n            triggerEvent(\"onReady\");\n        }\n        function bindToInstance(fn) {\n            return fn.bind(self);\n        }\n        function setCalendarWidth() {\n            var config = self.config;\n            if (config.weekNumbers === false && config.showMonths === 1)\n                return;\n            else if (config.noCalendar !== true) {\n                window.requestAnimationFrame(function () {\n                    if (self.calendarContainer !== undefined) {\n                        self.calendarContainer.style.visibility = \"hidden\";\n                        self.calendarContainer.style.display = \"block\";\n                    }\n                    if (self.daysContainer !== undefined) {\n                        var daysWidth = (self.days.offsetWidth + 1) * config.showMonths;\n                        self.daysContainer.style.width = daysWidth + \"px\";\n                        self.calendarContainer.style.width =\n                            daysWidth +\n                                (self.weekWrapper !== undefined\n                                    ? self.weekWrapper.offsetWidth\n                                    : 0) +\n                                \"px\";\n                        self.calendarContainer.style.removeProperty(\"visibility\");\n                        self.calendarContainer.style.removeProperty(\"display\");\n                    }\n                });\n            }\n        }\n        /**\n         * The handler for all events targeting the time inputs\n         */\n        function updateTime(e) {\n            if (self.selectedDates.length === 0) {\n                setDefaultTime();\n            }\n            if (e !== undefined && e.type !== \"blur\") {\n                timeWrapper(e);\n            }\n            var prevValue = self._input.value;\n            setHoursFromInputs();\n            updateValue();\n            if (self._input.value !== prevValue) {\n                self._debouncedChange();\n            }\n        }\n        function ampm2military(hour, amPM) {\n            return (hour % 12) + 12 * int(amPM === self.l10n.amPM[1]);\n        }\n        function military2ampm(hour) {\n            switch (hour % 24) {\n                case 0:\n                case 12:\n                    return 12;\n                default:\n                    return hour % 12;\n            }\n        }\n        /**\n         * Syncs the selected date object time with user's time input\n         */\n        function setHoursFromInputs() {\n            if (self.hourElement === undefined || self.minuteElement === undefined)\n                return;\n            var hours = (parseInt(self.hourElement.value.slice(-2), 10) || 0) % 24, minutes = (parseInt(self.minuteElement.value, 10) || 0) % 60, seconds = self.secondElement !== undefined\n                ? (parseInt(self.secondElement.value, 10) || 0) % 60\n                : 0;\n            if (self.amPM !== undefined) {\n                hours = ampm2military(hours, self.amPM.textContent);\n            }\n            var limitMinHours = self.config.minTime !== undefined ||\n                (self.config.minDate &&\n                    self.minDateHasTime &&\n                    self.latestSelectedDateObj &&\n                    compareDates(self.latestSelectedDateObj, self.config.minDate, true) ===\n                        0);\n            var limitMaxHours = self.config.maxTime !== undefined ||\n                (self.config.maxDate &&\n                    self.maxDateHasTime &&\n                    self.latestSelectedDateObj &&\n                    compareDates(self.latestSelectedDateObj, self.config.maxDate, true) ===\n                        0);\n            if (limitMaxHours) {\n                var maxTime = self.config.maxTime !== undefined\n                    ? self.config.maxTime\n                    : self.config.maxDate;\n                hours = Math.min(hours, maxTime.getHours());\n                if (hours === maxTime.getHours())\n                    minutes = Math.min(minutes, maxTime.getMinutes());\n                if (minutes === maxTime.getMinutes())\n                    seconds = Math.min(seconds, maxTime.getSeconds());\n            }\n            if (limitMinHours) {\n                var minTime = self.config.minTime !== undefined\n                    ? self.config.minTime\n                    : self.config.minDate;\n                hours = Math.max(hours, minTime.getHours());\n                if (hours === minTime.getHours())\n                    minutes = Math.max(minutes, minTime.getMinutes());\n                if (minutes === minTime.getMinutes())\n                    seconds = Math.max(seconds, minTime.getSeconds());\n            }\n            setHours(hours, minutes, seconds);\n        }\n        /**\n         * Syncs time input values with a date\n         */\n        function setHoursFromDate(dateObj) {\n            var date = dateObj || self.latestSelectedDateObj;\n            if (date)\n                setHours(date.getHours(), date.getMinutes(), date.getSeconds());\n        }\n        function setDefaultHours() {\n            var hours = self.config.defaultHour;\n            var minutes = self.config.defaultMinute;\n            var seconds = self.config.defaultSeconds;\n            if (self.config.minDate !== undefined) {\n                var minHr = self.config.minDate.getHours();\n                var minMinutes = self.config.minDate.getMinutes();\n                hours = Math.max(hours, minHr);\n                if (hours === minHr)\n                    minutes = Math.max(minMinutes, minutes);\n                if (hours === minHr && minutes === minMinutes)\n                    seconds = self.config.minDate.getSeconds();\n            }\n            if (self.config.maxDate !== undefined) {\n                var maxHr = self.config.maxDate.getHours();\n                var maxMinutes = self.config.maxDate.getMinutes();\n                hours = Math.min(hours, maxHr);\n                if (hours === maxHr)\n                    minutes = Math.min(maxMinutes, minutes);\n                if (hours === maxHr && minutes === maxMinutes)\n                    seconds = self.config.maxDate.getSeconds();\n            }\n            setHours(hours, minutes, seconds);\n        }\n        /**\n         * Sets the hours, minutes, and optionally seconds\n         * of the latest selected date object and the\n         * corresponding time inputs\n         * @param {Number} hours the hour. whether its military\n         *                 or am-pm gets inferred from config\n         * @param {Number} minutes the minutes\n         * @param {Number} seconds the seconds (optional)\n         */\n        function setHours(hours, minutes, seconds) {\n            if (self.latestSelectedDateObj !== undefined) {\n                self.latestSelectedDateObj.setHours(hours % 24, minutes, seconds || 0, 0);\n            }\n            if (!self.hourElement || !self.minuteElement || self.isMobile)\n                return;\n            self.hourElement.value = pad(!self.config.time_24hr\n                ? ((12 + hours) % 12) + 12 * int(hours % 12 === 0)\n                : hours);\n            self.minuteElement.value = pad(minutes);\n            if (self.amPM !== undefined)\n                self.amPM.textContent = self.l10n.amPM[int(hours >= 12)];\n            if (self.secondElement !== undefined)\n                self.secondElement.value = pad(seconds);\n        }\n        /**\n         * Handles the year input and incrementing events\n         * @param {Event} event the keyup or increment event\n         */\n        function onYearInput(event) {\n            var year = parseInt(event.target.value) + (event.delta || 0);\n            if (year / 1000 > 1 ||\n                (event.key === \"Enter\" && !/[^\\d]/.test(year.toString()))) {\n                changeYear(year);\n            }\n        }\n        /**\n         * Essentially addEventListener + tracking\n         * @param {Element} element the element to addEventListener to\n         * @param {String} event the event name\n         * @param {Function} handler the event handler\n         */\n        function bind(element, event, handler, options) {\n            if (event instanceof Array)\n                return event.forEach(function (ev) { return bind(element, ev, handler, options); });\n            if (element instanceof Array)\n                return element.forEach(function (el) { return bind(el, event, handler, options); });\n            element.addEventListener(event, handler, options);\n            self._handlers.push({\n                element: element,\n                event: event,\n                handler: handler,\n                options: options\n            });\n        }\n        /**\n         * A mousedown handler which mimics click.\n         * Minimizes latency, since we don't need to wait for mouseup in most cases.\n         * Also, avoids handling right clicks.\n         *\n         * @param {Function} handler the event handler\n         */\n        function onClick(handler) {\n            return function (evt) {\n                evt.which === 1 && handler(evt);\n            };\n        }\n        function triggerChange() {\n            triggerEvent(\"onChange\");\n        }\n        /**\n         * Adds all the necessary event listeners\n         */\n        function bindEvents() {\n            if (self.config.wrap) {\n                [\"open\", \"close\", \"toggle\", \"clear\"].forEach(function (evt) {\n                    Array.prototype.forEach.call(self.element.querySelectorAll(\"[data-\" + evt + \"]\"), function (el) {\n                        return bind(el, \"click\", self[evt]);\n                    });\n                });\n            }\n            if (self.isMobile) {\n                setupMobile();\n                return;\n            }\n            var debouncedResize = debounce(onResize, 50);\n            self._debouncedChange = debounce(triggerChange, DEBOUNCED_CHANGE_MS);\n            if (self.daysContainer && !/iPhone|iPad|iPod/i.test(navigator.userAgent))\n                bind(self.daysContainer, \"mouseover\", function (e) {\n                    if (self.config.mode === \"range\")\n                        onMouseOver(e.target);\n                });\n            bind(window.document.body, \"keydown\", onKeyDown);\n            if (!self.config.inline && !self.config.static)\n                bind(window, \"resize\", debouncedResize);\n            if (window.ontouchstart !== undefined)\n                bind(window.document, \"touchstart\", documentClick);\n            else\n                bind(window.document, \"mousedown\", onClick(documentClick));\n            bind(window.document, \"focus\", documentClick, { capture: true });\n            if (self.config.clickOpens === true) {\n                bind(self._input, \"focus\", self.open);\n                bind(self._input, \"mousedown\", onClick(self.open));\n            }\n            if (self.daysContainer !== undefined) {\n                bind(self.monthNav, \"mousedown\", onClick(onMonthNavClick));\n                bind(self.monthNav, [\"keyup\", \"increment\"], onYearInput);\n                bind(self.daysContainer, \"mousedown\", onClick(selectDate));\n            }\n            if (self.timeContainer !== undefined &&\n                self.minuteElement !== undefined &&\n                self.hourElement !== undefined) {\n                var selText = function (e) {\n                    return e.target.select();\n                };\n                bind(self.timeContainer, [\"increment\"], updateTime);\n                bind(self.timeContainer, \"blur\", updateTime, { capture: true });\n                bind(self.timeContainer, \"mousedown\", onClick(timeIncrement));\n                bind([self.hourElement, self.minuteElement], [\"focus\", \"click\"], selText);\n                if (self.secondElement !== undefined)\n                    bind(self.secondElement, \"focus\", function () { return self.secondElement && self.secondElement.select(); });\n                if (self.amPM !== undefined) {\n                    bind(self.amPM, \"mousedown\", onClick(function (e) {\n                        updateTime(e);\n                        triggerChange();\n                    }));\n                }\n            }\n        }\n        /**\n         * Set the calendar view to a particular date.\n         * @param {Date} jumpDate the date to set the view to\n         * @param {boolean} triggerChange if change events should be triggered\n         */\n        function jumpToDate(jumpDate, triggerChange) {\n            var jumpTo = jumpDate !== undefined\n                ? self.parseDate(jumpDate)\n                : self.latestSelectedDateObj ||\n                    (self.config.minDate && self.config.minDate > self.now\n                        ? self.config.minDate\n                        : self.config.maxDate && self.config.maxDate < self.now\n                            ? self.config.maxDate\n                            : self.now);\n            var oldYear = self.currentYear;\n            var oldMonth = self.currentMonth;\n            try {\n                if (jumpTo !== undefined) {\n                    self.currentYear = jumpTo.getFullYear();\n                    self.currentMonth = jumpTo.getMonth();\n                }\n            }\n            catch (e) {\n                /* istanbul ignore next */\n                e.message = \"Invalid date supplied: \" + jumpTo;\n                self.config.errorHandler(e);\n            }\n            if (triggerChange && self.currentYear !== oldYear) {\n                triggerEvent(\"onYearChange\");\n                buildMonthSwitch();\n            }\n            if (triggerChange &&\n                (self.currentYear !== oldYear || self.currentMonth !== oldMonth)) {\n                triggerEvent(\"onMonthChange\");\n            }\n            self.redraw();\n        }\n        /**\n         * The up/down arrow handler for time inputs\n         * @param {Event} e the click event\n         */\n        function timeIncrement(e) {\n            if (~e.target.className.indexOf(\"arrow\"))\n                incrementNumInput(e, e.target.classList.contains(\"arrowUp\") ? 1 : -1);\n        }\n        /**\n         * Increments/decrements the value of input associ-\n         * ated with the up/down arrow by dispatching an\n         * \"increment\" event on the input.\n         *\n         * @param {Event} e the click event\n         * @param {Number} delta the diff (usually 1 or -1)\n         * @param {Element} inputElem the input element\n         */\n        function incrementNumInput(e, delta, inputElem) {\n            var target = e && e.target;\n            var input = inputElem ||\n                (target && target.parentNode && target.parentNode.firstChild);\n            var event = createEvent(\"increment\");\n            event.delta = delta;\n            input && input.dispatchEvent(event);\n        }\n        function build() {\n            var fragment = window.document.createDocumentFragment();\n            self.calendarContainer = createElement(\"div\", \"flatpickr-calendar\");\n            self.calendarContainer.tabIndex = -1;\n            if (!self.config.noCalendar) {\n                fragment.appendChild(buildMonthNav());\n                self.innerContainer = createElement(\"div\", \"flatpickr-innerContainer\");\n                if (self.config.weekNumbers) {\n                    var _a = buildWeeks(), weekWrapper = _a.weekWrapper, weekNumbers = _a.weekNumbers;\n                    self.innerContainer.appendChild(weekWrapper);\n                    self.weekNumbers = weekNumbers;\n                    self.weekWrapper = weekWrapper;\n                }\n                self.rContainer = createElement(\"div\", \"flatpickr-rContainer\");\n                self.rContainer.appendChild(buildWeekdays());\n                if (!self.daysContainer) {\n                    self.daysContainer = createElement(\"div\", \"flatpickr-days\");\n                    self.daysContainer.tabIndex = -1;\n                }\n                buildDays();\n                self.rContainer.appendChild(self.daysContainer);\n                self.innerContainer.appendChild(self.rContainer);\n                fragment.appendChild(self.innerContainer);\n            }\n            if (self.config.enableTime) {\n                fragment.appendChild(buildTime());\n            }\n            toggleClass(self.calendarContainer, \"rangeMode\", self.config.mode === \"range\");\n            toggleClass(self.calendarContainer, \"animate\", self.config.animate === true);\n            toggleClass(self.calendarContainer, \"multiMonth\", self.config.showMonths > 1);\n            self.calendarContainer.appendChild(fragment);\n            var customAppend = self.config.appendTo !== undefined &&\n                self.config.appendTo.nodeType !== undefined;\n            if (self.config.inline || self.config.static) {\n                self.calendarContainer.classList.add(self.config.inline ? \"inline\" : \"static\");\n                if (self.config.inline) {\n                    if (!customAppend && self.element.parentNode)\n                        self.element.parentNode.insertBefore(self.calendarContainer, self._input.nextSibling);\n                    else if (self.config.appendTo !== undefined)\n                        self.config.appendTo.appendChild(self.calendarContainer);\n                }\n                if (self.config.static) {\n                    var wrapper = createElement(\"div\", \"flatpickr-wrapper\");\n                    if (self.element.parentNode)\n                        self.element.parentNode.insertBefore(wrapper, self.element);\n                    wrapper.appendChild(self.element);\n                    if (self.altInput)\n                        wrapper.appendChild(self.altInput);\n                    wrapper.appendChild(self.calendarContainer);\n                }\n            }\n            if (!self.config.static && !self.config.inline)\n                (self.config.appendTo !== undefined\n                    ? self.config.appendTo\n                    : window.document.body).appendChild(self.calendarContainer);\n        }\n        function createDay(className, date, dayNumber, i) {\n            var dateIsEnabled = isEnabled(date, true), dayElement = createElement(\"span\", \"flatpickr-day \" + className, date.getDate().toString());\n            dayElement.dateObj = date;\n            dayElement.$i = i;\n            dayElement.setAttribute(\"aria-label\", self.formatDate(date, self.config.ariaDateFormat));\n            if (className.indexOf(\"hidden\") === -1 &&\n                compareDates(date, self.now) === 0) {\n                self.todayDateElem = dayElement;\n                dayElement.classList.add(\"today\");\n                dayElement.setAttribute(\"aria-current\", \"date\");\n            }\n            if (dateIsEnabled) {\n                dayElement.tabIndex = -1;\n                if (isDateSelected(date)) {\n                    dayElement.classList.add(\"selected\");\n                    self.selectedDateElem = dayElement;\n                    if (self.config.mode === \"range\") {\n                        toggleClass(dayElement, \"startRange\", self.selectedDates[0] &&\n                            compareDates(date, self.selectedDates[0], true) === 0);\n                        toggleClass(dayElement, \"endRange\", self.selectedDates[1] &&\n                            compareDates(date, self.selectedDates[1], true) === 0);\n                        if (className === \"nextMonthDay\")\n                            dayElement.classList.add(\"inRange\");\n                    }\n                }\n            }\n            else {\n                dayElement.classList.add(\"flatpickr-disabled\");\n            }\n            if (self.config.mode === \"range\") {\n                if (isDateInRange(date) && !isDateSelected(date))\n                    dayElement.classList.add(\"inRange\");\n            }\n            if (self.weekNumbers &&\n                self.config.showMonths === 1 &&\n                className !== \"prevMonthDay\" &&\n                dayNumber % 7 === 1) {\n                self.weekNumbers.insertAdjacentHTML(\"beforeend\", \"<span class='flatpickr-day'>\" + self.config.getWeek(date) + \"</span>\");\n            }\n            triggerEvent(\"onDayCreate\", dayElement);\n            return dayElement;\n        }\n        function focusOnDayElem(targetNode) {\n            targetNode.focus();\n            if (self.config.mode === \"range\")\n                onMouseOver(targetNode);\n        }\n        function getFirstAvailableDay(delta) {\n            var startMonth = delta > 0 ? 0 : self.config.showMonths - 1;\n            var endMonth = delta > 0 ? self.config.showMonths : -1;\n            for (var m = startMonth; m != endMonth; m += delta) {\n                var month = self.daysContainer.children[m];\n                var startIndex = delta > 0 ? 0 : month.children.length - 1;\n                var endIndex = delta > 0 ? month.children.length : -1;\n                for (var i = startIndex; i != endIndex; i += delta) {\n                    var c = month.children[i];\n                    if (c.className.indexOf(\"hidden\") === -1 && isEnabled(c.dateObj))\n                        return c;\n                }\n            }\n            return undefined;\n        }\n        function getNextAvailableDay(current, delta) {\n            var givenMonth = current.className.indexOf(\"Month\") === -1\n                ? current.dateObj.getMonth()\n                : self.currentMonth;\n            var endMonth = delta > 0 ? self.config.showMonths : -1;\n            var loopDelta = delta > 0 ? 1 : -1;\n            for (var m = givenMonth - self.currentMonth; m != endMonth; m += loopDelta) {\n                var month = self.daysContainer.children[m];\n                var startIndex = givenMonth - self.currentMonth === m\n                    ? current.$i + delta\n                    : delta < 0\n                        ? month.children.length - 1\n                        : 0;\n                var numMonthDays = month.children.length;\n                for (var i = startIndex; i >= 0 && i < numMonthDays && i != (delta > 0 ? numMonthDays : -1); i += loopDelta) {\n                    var c = month.children[i];\n                    if (c.className.indexOf(\"hidden\") === -1 &&\n                        isEnabled(c.dateObj) &&\n                        Math.abs(current.$i - i) >= Math.abs(delta))\n                        return focusOnDayElem(c);\n                }\n            }\n            self.changeMonth(loopDelta);\n            focusOnDay(getFirstAvailableDay(loopDelta), 0);\n            return undefined;\n        }\n        function focusOnDay(current, offset) {\n            var dayFocused = isInView(document.activeElement || document.body);\n            var startElem = current !== undefined\n                ? current\n                : dayFocused\n                    ? document.activeElement\n                    : self.selectedDateElem !== undefined && isInView(self.selectedDateElem)\n                        ? self.selectedDateElem\n                        : self.todayDateElem !== undefined && isInView(self.todayDateElem)\n                            ? self.todayDateElem\n                            : getFirstAvailableDay(offset > 0 ? 1 : -1);\n            if (startElem === undefined)\n                return self._input.focus();\n            if (!dayFocused)\n                return focusOnDayElem(startElem);\n            getNextAvailableDay(startElem, offset);\n        }\n        function buildMonthDays(year, month) {\n            var firstOfMonth = (new Date(year, month, 1).getDay() - self.l10n.firstDayOfWeek + 7) % 7;\n            var prevMonthDays = self.utils.getDaysInMonth((month - 1 + 12) % 12);\n            var daysInMonth = self.utils.getDaysInMonth(month), days = window.document.createDocumentFragment(), isMultiMonth = self.config.showMonths > 1, prevMonthDayClass = isMultiMonth ? \"prevMonthDay hidden\" : \"prevMonthDay\", nextMonthDayClass = isMultiMonth ? \"nextMonthDay hidden\" : \"nextMonthDay\";\n            var dayNumber = prevMonthDays + 1 - firstOfMonth, dayIndex = 0;\n            // prepend days from the ending of previous month\n            for (; dayNumber <= prevMonthDays; dayNumber++, dayIndex++) {\n                days.appendChild(createDay(prevMonthDayClass, new Date(year, month - 1, dayNumber), dayNumber, dayIndex));\n            }\n            // Start at 1 since there is no 0th day\n            for (dayNumber = 1; dayNumber <= daysInMonth; dayNumber++, dayIndex++) {\n                days.appendChild(createDay(\"\", new Date(year, month, dayNumber), dayNumber, dayIndex));\n            }\n            // append days from the next month\n            for (var dayNum = daysInMonth + 1; dayNum <= 42 - firstOfMonth &&\n                (self.config.showMonths === 1 || dayIndex % 7 !== 0); dayNum++, dayIndex++) {\n                days.appendChild(createDay(nextMonthDayClass, new Date(year, month + 1, dayNum % daysInMonth), dayNum, dayIndex));\n            }\n            //updateNavigationCurrentMonth();\n            var dayContainer = createElement(\"div\", \"dayContainer\");\n            dayContainer.appendChild(days);\n            return dayContainer;\n        }\n        function buildDays() {\n            if (self.daysContainer === undefined) {\n                return;\n            }\n            clearNode(self.daysContainer);\n            // TODO: week numbers for each month\n            if (self.weekNumbers)\n                clearNode(self.weekNumbers);\n            var frag = document.createDocumentFragment();\n            for (var i = 0; i < self.config.showMonths; i++) {\n                var d = new Date(self.currentYear, self.currentMonth, 1);\n                d.setMonth(self.currentMonth + i);\n                frag.appendChild(buildMonthDays(d.getFullYear(), d.getMonth()));\n            }\n            self.daysContainer.appendChild(frag);\n            self.days = self.daysContainer.firstChild;\n            if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n                onMouseOver();\n            }\n        }\n        function buildMonthSwitch() {\n            if (self.config.showMonths > 1 ||\n                self.config.monthSelectorType !== \"dropdown\")\n                return;\n            var shouldBuildMonth = function (month) {\n                if (self.config.minDate !== undefined &&\n                    self.currentYear === self.config.minDate.getFullYear() &&\n                    month < self.config.minDate.getMonth()) {\n                    return false;\n                }\n                return !(self.config.maxDate !== undefined &&\n                    self.currentYear === self.config.maxDate.getFullYear() &&\n                    month > self.config.maxDate.getMonth());\n            };\n            self.monthsDropdownContainer.tabIndex = -1;\n            self.monthsDropdownContainer.innerHTML = \"\";\n            for (var i = 0; i < 12; i++) {\n                if (!shouldBuildMonth(i))\n                    continue;\n                var month = createElement(\"option\", \"flatpickr-monthDropdown-month\");\n                month.value = new Date(self.currentYear, i).getMonth().toString();\n                month.textContent = monthToStr(i, self.config.shorthandCurrentMonth, self.l10n);\n                month.tabIndex = -1;\n                if (self.currentMonth === i) {\n                    month.selected = true;\n                }\n                self.monthsDropdownContainer.appendChild(month);\n            }\n        }\n        function buildMonth() {\n            var container = createElement(\"div\", \"flatpickr-month\");\n            var monthNavFragment = window.document.createDocumentFragment();\n            var monthElement;\n            if (self.config.showMonths > 1 ||\n                self.config.monthSelectorType === \"static\") {\n                monthElement = createElement(\"span\", \"cur-month\");\n            }\n            else {\n                self.monthsDropdownContainer = createElement(\"select\", \"flatpickr-monthDropdown-months\");\n                bind(self.monthsDropdownContainer, \"change\", function (e) {\n                    var target = e.target;\n                    var selectedMonth = parseInt(target.value, 10);\n                    self.changeMonth(selectedMonth - self.currentMonth);\n                    triggerEvent(\"onMonthChange\");\n                });\n                buildMonthSwitch();\n                monthElement = self.monthsDropdownContainer;\n            }\n            var yearInput = createNumberInput(\"cur-year\", { tabindex: \"-1\" });\n            var yearElement = yearInput.getElementsByTagName(\"input\")[0];\n            yearElement.setAttribute(\"aria-label\", self.l10n.yearAriaLabel);\n            if (self.config.minDate) {\n                yearElement.setAttribute(\"min\", self.config.minDate.getFullYear().toString());\n            }\n            if (self.config.maxDate) {\n                yearElement.setAttribute(\"max\", self.config.maxDate.getFullYear().toString());\n                yearElement.disabled =\n                    !!self.config.minDate &&\n                        self.config.minDate.getFullYear() === self.config.maxDate.getFullYear();\n            }\n            var currentMonth = createElement(\"div\", \"flatpickr-current-month\");\n            currentMonth.appendChild(monthElement);\n            currentMonth.appendChild(yearInput);\n            monthNavFragment.appendChild(currentMonth);\n            container.appendChild(monthNavFragment);\n            return {\n                container: container,\n                yearElement: yearElement,\n                monthElement: monthElement\n            };\n        }\n        function buildMonths() {\n            clearNode(self.monthNav);\n            self.monthNav.appendChild(self.prevMonthNav);\n            if (self.config.showMonths) {\n                self.yearElements = [];\n                self.monthElements = [];\n            }\n            for (var m = self.config.showMonths; m--;) {\n                var month = buildMonth();\n                self.yearElements.push(month.yearElement);\n                self.monthElements.push(month.monthElement);\n                self.monthNav.appendChild(month.container);\n            }\n            self.monthNav.appendChild(self.nextMonthNav);\n        }\n        function buildMonthNav() {\n            self.monthNav = createElement(\"div\", \"flatpickr-months\");\n            self.yearElements = [];\n            self.monthElements = [];\n            self.prevMonthNav = createElement(\"span\", \"flatpickr-prev-month\");\n            self.prevMonthNav.innerHTML = self.config.prevArrow;\n            self.nextMonthNav = createElement(\"span\", \"flatpickr-next-month\");\n            self.nextMonthNav.innerHTML = self.config.nextArrow;\n            buildMonths();\n            Object.defineProperty(self, \"_hidePrevMonthArrow\", {\n                get: function () { return self.__hidePrevMonthArrow; },\n                set: function (bool) {\n                    if (self.__hidePrevMonthArrow !== bool) {\n                        toggleClass(self.prevMonthNav, \"flatpickr-disabled\", bool);\n                        self.__hidePrevMonthArrow = bool;\n                    }\n                }\n            });\n            Object.defineProperty(self, \"_hideNextMonthArrow\", {\n                get: function () { return self.__hideNextMonthArrow; },\n                set: function (bool) {\n                    if (self.__hideNextMonthArrow !== bool) {\n                        toggleClass(self.nextMonthNav, \"flatpickr-disabled\", bool);\n                        self.__hideNextMonthArrow = bool;\n                    }\n                }\n            });\n            self.currentYearElement = self.yearElements[0];\n            updateNavigationCurrentMonth();\n            return self.monthNav;\n        }\n        function buildTime() {\n            self.calendarContainer.classList.add(\"hasTime\");\n            if (self.config.noCalendar)\n                self.calendarContainer.classList.add(\"noCalendar\");\n            self.timeContainer = createElement(\"div\", \"flatpickr-time\");\n            self.timeContainer.tabIndex = -1;\n            var separator = createElement(\"span\", \"flatpickr-time-separator\", \":\");\n            var hourInput = createNumberInput(\"flatpickr-hour\", {\n                \"aria-label\": self.l10n.hourAriaLabel\n            });\n            self.hourElement = hourInput.getElementsByTagName(\"input\")[0];\n            var minuteInput = createNumberInput(\"flatpickr-minute\", {\n                \"aria-label\": self.l10n.minuteAriaLabel\n            });\n            self.minuteElement = minuteInput.getElementsByTagName(\"input\")[0];\n            self.hourElement.tabIndex = self.minuteElement.tabIndex = -1;\n            self.hourElement.value = pad(self.latestSelectedDateObj\n                ? self.latestSelectedDateObj.getHours()\n                : self.config.time_24hr\n                    ? self.config.defaultHour\n                    : military2ampm(self.config.defaultHour));\n            self.minuteElement.value = pad(self.latestSelectedDateObj\n                ? self.latestSelectedDateObj.getMinutes()\n                : self.config.defaultMinute);\n            self.hourElement.setAttribute(\"step\", self.config.hourIncrement.toString());\n            self.minuteElement.setAttribute(\"step\", self.config.minuteIncrement.toString());\n            self.hourElement.setAttribute(\"min\", self.config.time_24hr ? \"0\" : \"1\");\n            self.hourElement.setAttribute(\"max\", self.config.time_24hr ? \"23\" : \"12\");\n            self.minuteElement.setAttribute(\"min\", \"0\");\n            self.minuteElement.setAttribute(\"max\", \"59\");\n            self.timeContainer.appendChild(hourInput);\n            self.timeContainer.appendChild(separator);\n            self.timeContainer.appendChild(minuteInput);\n            if (self.config.time_24hr)\n                self.timeContainer.classList.add(\"time24hr\");\n            if (self.config.enableSeconds) {\n                self.timeContainer.classList.add(\"hasSeconds\");\n                var secondInput = createNumberInput(\"flatpickr-second\");\n                self.secondElement = secondInput.getElementsByTagName(\"input\")[0];\n                self.secondElement.value = pad(self.latestSelectedDateObj\n                    ? self.latestSelectedDateObj.getSeconds()\n                    : self.config.defaultSeconds);\n                self.secondElement.setAttribute(\"step\", self.minuteElement.getAttribute(\"step\"));\n                self.secondElement.setAttribute(\"min\", \"0\");\n                self.secondElement.setAttribute(\"max\", \"59\");\n                self.timeContainer.appendChild(createElement(\"span\", \"flatpickr-time-separator\", \":\"));\n                self.timeContainer.appendChild(secondInput);\n            }\n            if (!self.config.time_24hr) {\n                // add self.amPM if appropriate\n                self.amPM = createElement(\"span\", \"flatpickr-am-pm\", self.l10n.amPM[int((self.latestSelectedDateObj\n                    ? self.hourElement.value\n                    : self.config.defaultHour) > 11)]);\n                self.amPM.title = self.l10n.toggleTitle;\n                self.amPM.tabIndex = -1;\n                self.timeContainer.appendChild(self.amPM);\n            }\n            return self.timeContainer;\n        }\n        function buildWeekdays() {\n            if (!self.weekdayContainer)\n                self.weekdayContainer = createElement(\"div\", \"flatpickr-weekdays\");\n            else\n                clearNode(self.weekdayContainer);\n            for (var i = self.config.showMonths; i--;) {\n                var container = createElement(\"div\", \"flatpickr-weekdaycontainer\");\n                self.weekdayContainer.appendChild(container);\n            }\n            updateWeekdays();\n            return self.weekdayContainer;\n        }\n        function updateWeekdays() {\n            if (!self.weekdayContainer) {\n                return;\n            }\n            var firstDayOfWeek = self.l10n.firstDayOfWeek;\n            var weekdays = self.l10n.weekdays.shorthand.slice();\n            if (firstDayOfWeek > 0 && firstDayOfWeek < weekdays.length) {\n                weekdays = weekdays.splice(firstDayOfWeek, weekdays.length).concat(weekdays.splice(0, firstDayOfWeek));\n            }\n            for (var i = self.config.showMonths; i--;) {\n                self.weekdayContainer.children[i].innerHTML = \"\\n      <span class='flatpickr-weekday'>\\n        \" + weekdays.join(\"</span><span class='flatpickr-weekday'>\") + \"\\n      </span>\\n      \";\n            }\n        }\n        /* istanbul ignore next */\n        function buildWeeks() {\n            self.calendarContainer.classList.add(\"hasWeeks\");\n            var weekWrapper = createElement(\"div\", \"flatpickr-weekwrapper\");\n            weekWrapper.appendChild(createElement(\"span\", \"flatpickr-weekday\", self.l10n.weekAbbreviation));\n            var weekNumbers = createElement(\"div\", \"flatpickr-weeks\");\n            weekWrapper.appendChild(weekNumbers);\n            return {\n                weekWrapper: weekWrapper,\n                weekNumbers: weekNumbers\n            };\n        }\n        function changeMonth(value, isOffset) {\n            if (isOffset === void 0) { isOffset = true; }\n            var delta = isOffset ? value : value - self.currentMonth;\n            if ((delta < 0 && self._hidePrevMonthArrow === true) ||\n                (delta > 0 && self._hideNextMonthArrow === true))\n                return;\n            self.currentMonth += delta;\n            if (self.currentMonth < 0 || self.currentMonth > 11) {\n                self.currentYear += self.currentMonth > 11 ? 1 : -1;\n                self.currentMonth = (self.currentMonth + 12) % 12;\n                triggerEvent(\"onYearChange\");\n                buildMonthSwitch();\n            }\n            buildDays();\n            triggerEvent(\"onMonthChange\");\n            updateNavigationCurrentMonth();\n        }\n        function clear(triggerChangeEvent, toInitial) {\n            if (triggerChangeEvent === void 0) { triggerChangeEvent = true; }\n            if (toInitial === void 0) { toInitial = true; }\n            self.input.value = \"\";\n            if (self.altInput !== undefined)\n                self.altInput.value = \"\";\n            if (self.mobileInput !== undefined)\n                self.mobileInput.value = \"\";\n            self.selectedDates = [];\n            self.latestSelectedDateObj = undefined;\n            if (toInitial === true) {\n                self.currentYear = self._initialDate.getFullYear();\n                self.currentMonth = self._initialDate.getMonth();\n            }\n            self.showTimeInput = false;\n            if (self.config.enableTime === true) {\n                setDefaultHours();\n            }\n            self.redraw();\n            if (triggerChangeEvent)\n                // triggerChangeEvent is true (default) or an Event\n                triggerEvent(\"onChange\");\n        }\n        function close() {\n            self.isOpen = false;\n            if (!self.isMobile) {\n                if (self.calendarContainer !== undefined) {\n                    self.calendarContainer.classList.remove(\"open\");\n                }\n                if (self._input !== undefined) {\n                    self._input.classList.remove(\"active\");\n                }\n            }\n            triggerEvent(\"onClose\");\n        }\n        function destroy() {\n            if (self.config !== undefined)\n                triggerEvent(\"onDestroy\");\n            for (var i = self._handlers.length; i--;) {\n                var h = self._handlers[i];\n                h.element.removeEventListener(h.event, h.handler, h.options);\n            }\n            self._handlers = [];\n            if (self.mobileInput) {\n                if (self.mobileInput.parentNode)\n                    self.mobileInput.parentNode.removeChild(self.mobileInput);\n                self.mobileInput = undefined;\n            }\n            else if (self.calendarContainer && self.calendarContainer.parentNode) {\n                if (self.config.static && self.calendarContainer.parentNode) {\n                    var wrapper = self.calendarContainer.parentNode;\n                    wrapper.lastChild && wrapper.removeChild(wrapper.lastChild);\n                    if (wrapper.parentNode) {\n                        while (wrapper.firstChild)\n                            wrapper.parentNode.insertBefore(wrapper.firstChild, wrapper);\n                        wrapper.parentNode.removeChild(wrapper);\n                    }\n                }\n                else\n                    self.calendarContainer.parentNode.removeChild(self.calendarContainer);\n            }\n            if (self.altInput) {\n                self.input.type = \"text\";\n                if (self.altInput.parentNode)\n                    self.altInput.parentNode.removeChild(self.altInput);\n                delete self.altInput;\n            }\n            if (self.input) {\n                self.input.type = self.input._type;\n                self.input.classList.remove(\"flatpickr-input\");\n                self.input.removeAttribute(\"readonly\");\n                self.input.value = \"\";\n            }\n            [\n                \"_showTimeInput\",\n                \"latestSelectedDateObj\",\n                \"_hideNextMonthArrow\",\n                \"_hidePrevMonthArrow\",\n                \"__hideNextMonthArrow\",\n                \"__hidePrevMonthArrow\",\n                \"isMobile\",\n                \"isOpen\",\n                \"selectedDateElem\",\n                \"minDateHasTime\",\n                \"maxDateHasTime\",\n                \"days\",\n                \"daysContainer\",\n                \"_input\",\n                \"_positionElement\",\n                \"innerContainer\",\n                \"rContainer\",\n                \"monthNav\",\n                \"todayDateElem\",\n                \"calendarContainer\",\n                \"weekdayContainer\",\n                \"prevMonthNav\",\n                \"nextMonthNav\",\n                \"monthsDropdownContainer\",\n                \"currentMonthElement\",\n                \"currentYearElement\",\n                \"navigationCurrentMonth\",\n                \"selectedDateElem\",\n                \"config\",\n            ].forEach(function (k) {\n                try {\n                    delete self[k];\n                }\n                catch (_) { }\n            });\n        }\n        function isCalendarElem(elem) {\n            if (self.config.appendTo && self.config.appendTo.contains(elem))\n                return true;\n            return self.calendarContainer.contains(elem);\n        }\n        function documentClick(e) {\n            if (self.isOpen && !self.config.inline) {\n                var eventTarget_1 = getEventTarget(e);\n                var isCalendarElement = isCalendarElem(eventTarget_1);\n                var isInput = eventTarget_1 === self.input ||\n                    eventTarget_1 === self.altInput ||\n                    self.element.contains(eventTarget_1) ||\n                    // web components\n                    // e.path is not present in all browsers. circumventing typechecks\n                    (e.path &&\n                        e.path.indexOf &&\n                        (~e.path.indexOf(self.input) ||\n                            ~e.path.indexOf(self.altInput)));\n                var lostFocus = e.type === \"blur\"\n                    ? isInput &&\n                        e.relatedTarget &&\n                        !isCalendarElem(e.relatedTarget)\n                    : !isInput &&\n                        !isCalendarElement &&\n                        !isCalendarElem(e.relatedTarget);\n                var isIgnored = !self.config.ignoredFocusElements.some(function (elem) {\n                    return elem.contains(eventTarget_1);\n                });\n                if (lostFocus && isIgnored) {\n                    if (self.timeContainer !== undefined &&\n                        self.minuteElement !== undefined &&\n                        self.hourElement !== undefined) {\n                        updateTime();\n                    }\n                    self.close();\n                    if (self.config.mode === \"range\" && self.selectedDates.length === 1) {\n                        self.clear(false);\n                        self.redraw();\n                    }\n                }\n            }\n        }\n        function changeYear(newYear) {\n            if (!newYear ||\n                (self.config.minDate && newYear < self.config.minDate.getFullYear()) ||\n                (self.config.maxDate && newYear > self.config.maxDate.getFullYear()))\n                return;\n            var newYearNum = newYear, isNewYear = self.currentYear !== newYearNum;\n            self.currentYear = newYearNum || self.currentYear;\n            if (self.config.maxDate &&\n                self.currentYear === self.config.maxDate.getFullYear()) {\n                self.currentMonth = Math.min(self.config.maxDate.getMonth(), self.currentMonth);\n            }\n            else if (self.config.minDate &&\n                self.currentYear === self.config.minDate.getFullYear()) {\n                self.currentMonth = Math.max(self.config.minDate.getMonth(), self.currentMonth);\n            }\n            if (isNewYear) {\n                self.redraw();\n                triggerEvent(\"onYearChange\");\n                buildMonthSwitch();\n            }\n        }\n        function isEnabled(date, timeless) {\n            if (timeless === void 0) { timeless = true; }\n            var dateToCheck = self.parseDate(date, undefined, timeless); // timeless\n            if ((self.config.minDate &&\n                dateToCheck &&\n                compareDates(dateToCheck, self.config.minDate, timeless !== undefined ? timeless : !self.minDateHasTime) < 0) ||\n                (self.config.maxDate &&\n                    dateToCheck &&\n                    compareDates(dateToCheck, self.config.maxDate, timeless !== undefined ? timeless : !self.maxDateHasTime) > 0))\n                return false;\n            if (self.config.enable.length === 0 && self.config.disable.length === 0)\n                return true;\n            if (dateToCheck === undefined)\n                return false;\n            var bool = self.config.enable.length > 0, array = bool ? self.config.enable : self.config.disable;\n            for (var i = 0, d = void 0; i < array.length; i++) {\n                d = array[i];\n                if (typeof d === \"function\" &&\n                    d(dateToCheck) // disabled by function\n                )\n                    return bool;\n                else if (d instanceof Date &&\n                    dateToCheck !== undefined &&\n                    d.getTime() === dateToCheck.getTime())\n                    // disabled by date\n                    return bool;\n                else if (typeof d === \"string\" && dateToCheck !== undefined) {\n                    // disabled by date string\n                    var parsed = self.parseDate(d, undefined, true);\n                    return parsed && parsed.getTime() === dateToCheck.getTime()\n                        ? bool\n                        : !bool;\n                }\n                else if (\n                // disabled by range\n                typeof d === \"object\" &&\n                    dateToCheck !== undefined &&\n                    d.from &&\n                    d.to &&\n                    dateToCheck.getTime() >= d.from.getTime() &&\n                    dateToCheck.getTime() <= d.to.getTime())\n                    return bool;\n            }\n            return !bool;\n        }\n        function isInView(elem) {\n            if (self.daysContainer !== undefined)\n                return (elem.className.indexOf(\"hidden\") === -1 &&\n                    self.daysContainer.contains(elem));\n            return false;\n        }\n        function onKeyDown(e) {\n            // e.key                      e.keyCode\n            // \"Backspace\"                        8\n            // \"Tab\"                              9\n            // \"Enter\"                           13\n            // \"Escape\"     (IE \"Esc\")           27\n            // \"ArrowLeft\"  (IE \"Left\")          37\n            // \"ArrowUp\"    (IE \"Up\")            38\n            // \"ArrowRight\" (IE \"Right\")         39\n            // \"ArrowDown\"  (IE \"Down\")          40\n            // \"Delete\"     (IE \"Del\")           46\n            var isInput = e.target === self._input;\n            var allowInput = self.config.allowInput;\n            var allowKeydown = self.isOpen && (!allowInput || !isInput);\n            var allowInlineKeydown = self.config.inline && isInput && !allowInput;\n            if (e.keyCode === 13 && isInput) {\n                if (allowInput) {\n                    self.setDate(self._input.value, true, e.target === self.altInput\n                        ? self.config.altFormat\n                        : self.config.dateFormat);\n                    return e.target.blur();\n                }\n                else {\n                    self.open();\n                }\n            }\n            else if (isCalendarElem(e.target) ||\n                allowKeydown ||\n                allowInlineKeydown) {\n                var isTimeObj = !!self.timeContainer &&\n                    self.timeContainer.contains(e.target);\n                switch (e.keyCode) {\n                    case 13:\n                        if (isTimeObj) {\n                            e.preventDefault();\n                            updateTime();\n                            focusAndClose();\n                        }\n                        else\n                            selectDate(e);\n                        break;\n                    case 27: // escape\n                        e.preventDefault();\n                        focusAndClose();\n                        break;\n                    case 8:\n                    case 46:\n                        if (isInput && !self.config.allowInput) {\n                            e.preventDefault();\n                            self.clear();\n                        }\n                        break;\n                    case 37:\n                    case 39:\n                        if (!isTimeObj && !isInput) {\n                            e.preventDefault();\n                            if (self.daysContainer !== undefined &&\n                                (allowInput === false ||\n                                    (document.activeElement && isInView(document.activeElement)))) {\n                                var delta_1 = e.keyCode === 39 ? 1 : -1;\n                                if (!e.ctrlKey)\n                                    focusOnDay(undefined, delta_1);\n                                else {\n                                    e.stopPropagation();\n                                    changeMonth(delta_1);\n                                    focusOnDay(getFirstAvailableDay(1), 0);\n                                }\n                            }\n                        }\n                        else if (self.hourElement)\n                            self.hourElement.focus();\n                        break;\n                    case 38:\n                    case 40:\n                        e.preventDefault();\n                        var delta = e.keyCode === 40 ? 1 : -1;\n                        if ((self.daysContainer && e.target.$i !== undefined) ||\n                            e.target === self.input ||\n                            e.target === self.altInput) {\n                            if (e.ctrlKey) {\n                                e.stopPropagation();\n                                changeYear(self.currentYear - delta);\n                                focusOnDay(getFirstAvailableDay(1), 0);\n                            }\n                            else if (!isTimeObj)\n                                focusOnDay(undefined, delta * 7);\n                        }\n                        else if (e.target === self.currentYearElement) {\n                            changeYear(self.currentYear - delta);\n                        }\n                        else if (self.config.enableTime) {\n                            if (!isTimeObj && self.hourElement)\n                                self.hourElement.focus();\n                            updateTime(e);\n                            self._debouncedChange();\n                        }\n                        break;\n                    case 9:\n                        if (isTimeObj) {\n                            var elems = [\n                                self.hourElement,\n                                self.minuteElement,\n                                self.secondElement,\n                                self.amPM,\n                            ]\n                                .concat(self.pluginElements)\n                                .filter(function (x) { return x; });\n                            var i = elems.indexOf(e.target);\n                            if (i !== -1) {\n                                var target = elems[i + (e.shiftKey ? -1 : 1)];\n                                e.preventDefault();\n                                (target || self._input).focus();\n                            }\n                        }\n                        else if (!self.config.noCalendar &&\n                            self.daysContainer &&\n                            self.daysContainer.contains(e.target) &&\n                            e.shiftKey) {\n                            e.preventDefault();\n                            self._input.focus();\n                        }\n                        break;\n                    default:\n                        break;\n                }\n            }\n            if (self.amPM !== undefined && e.target === self.amPM) {\n                switch (e.key) {\n                    case self.l10n.amPM[0].charAt(0):\n                    case self.l10n.amPM[0].charAt(0).toLowerCase():\n                        self.amPM.textContent = self.l10n.amPM[0];\n                        setHoursFromInputs();\n                        updateValue();\n                        break;\n                    case self.l10n.amPM[1].charAt(0):\n                    case self.l10n.amPM[1].charAt(0).toLowerCase():\n                        self.amPM.textContent = self.l10n.amPM[1];\n                        setHoursFromInputs();\n                        updateValue();\n                        break;\n                }\n            }\n            if (isInput || isCalendarElem(e.target)) {\n                triggerEvent(\"onKeyDown\", e);\n            }\n        }\n        function onMouseOver(elem) {\n            if (self.selectedDates.length !== 1 ||\n                (elem &&\n                    (!elem.classList.contains(\"flatpickr-day\") ||\n                        elem.classList.contains(\"flatpickr-disabled\"))))\n                return;\n            var hoverDate = elem\n                ? elem.dateObj.getTime()\n                : self.days.firstElementChild.dateObj.getTime(), initialDate = self.parseDate(self.selectedDates[0], undefined, true).getTime(), rangeStartDate = Math.min(hoverDate, self.selectedDates[0].getTime()), rangeEndDate = Math.max(hoverDate, self.selectedDates[0].getTime());\n            var containsDisabled = false;\n            var minRange = 0, maxRange = 0;\n            for (var t = rangeStartDate; t < rangeEndDate; t += duration.DAY) {\n                if (!isEnabled(new Date(t), true)) {\n                    containsDisabled =\n                        containsDisabled || (t > rangeStartDate && t < rangeEndDate);\n                    if (t < initialDate && (!minRange || t > minRange))\n                        minRange = t;\n                    else if (t > initialDate && (!maxRange || t < maxRange))\n                        maxRange = t;\n                }\n            }\n            for (var m = 0; m < self.config.showMonths; m++) {\n                var month = self.daysContainer.children[m];\n                var _loop_1 = function (i, l) {\n                    var dayElem = month.children[i], date = dayElem.dateObj;\n                    var timestamp = date.getTime();\n                    var outOfRange = (minRange > 0 && timestamp < minRange) ||\n                        (maxRange > 0 && timestamp > maxRange);\n                    if (outOfRange) {\n                        dayElem.classList.add(\"notAllowed\");\n                        [\"inRange\", \"startRange\", \"endRange\"].forEach(function (c) {\n                            dayElem.classList.remove(c);\n                        });\n                        return \"continue\";\n                    }\n                    else if (containsDisabled && !outOfRange)\n                        return \"continue\";\n                    [\"startRange\", \"inRange\", \"endRange\", \"notAllowed\"].forEach(function (c) {\n                        dayElem.classList.remove(c);\n                    });\n                    if (elem !== undefined) {\n                        elem.classList.add(hoverDate <= self.selectedDates[0].getTime()\n                            ? \"startRange\"\n                            : \"endRange\");\n                        if (initialDate < hoverDate && timestamp === initialDate)\n                            dayElem.classList.add(\"startRange\");\n                        else if (initialDate > hoverDate && timestamp === initialDate)\n                            dayElem.classList.add(\"endRange\");\n                        if (timestamp >= minRange &&\n                            (maxRange === 0 || timestamp <= maxRange) &&\n                            isBetween(timestamp, initialDate, hoverDate))\n                            dayElem.classList.add(\"inRange\");\n                    }\n                };\n                for (var i = 0, l = month.children.length; i < l; i++) {\n                    _loop_1(i, l);\n                }\n            }\n        }\n        function onResize() {\n            if (self.isOpen && !self.config.static && !self.config.inline)\n                positionCalendar();\n        }\n        function setDefaultTime() {\n            self.setDate(self.config.minDate !== undefined\n                ? new Date(self.config.minDate.getTime())\n                : new Date(), true);\n            setDefaultHours();\n            updateValue();\n        }\n        function open(e, positionElement) {\n            if (positionElement === void 0) { positionElement = self._positionElement; }\n            if (self.isMobile === true) {\n                if (e) {\n                    e.preventDefault();\n                    e.target && e.target.blur();\n                }\n                if (self.mobileInput !== undefined) {\n                    self.mobileInput.focus();\n                    self.mobileInput.click();\n                }\n                triggerEvent(\"onOpen\");\n                return;\n            }\n            if (self._input.disabled || self.config.inline)\n                return;\n            var wasOpen = self.isOpen;\n            self.isOpen = true;\n            if (!wasOpen) {\n                self.calendarContainer.classList.add(\"open\");\n                self._input.classList.add(\"active\");\n                triggerEvent(\"onOpen\");\n                positionCalendar(positionElement);\n            }\n            if (self.config.enableTime === true && self.config.noCalendar === true) {\n                if (self.selectedDates.length === 0) {\n                    setDefaultTime();\n                }\n                if (self.config.allowInput === false &&\n                    (e === undefined ||\n                        !self.timeContainer.contains(e.relatedTarget))) {\n                    setTimeout(function () { return self.hourElement.select(); }, 50);\n                }\n            }\n        }\n        function minMaxDateSetter(type) {\n            return function (date) {\n                var dateObj = (self.config[\"_\" + type + \"Date\"] = self.parseDate(date, self.config.dateFormat));\n                var inverseDateObj = self.config[\"_\" + (type === \"min\" ? \"max\" : \"min\") + \"Date\"];\n                if (dateObj !== undefined) {\n                    self[type === \"min\" ? \"minDateHasTime\" : \"maxDateHasTime\"] =\n                        dateObj.getHours() > 0 ||\n                            dateObj.getMinutes() > 0 ||\n                            dateObj.getSeconds() > 0;\n                }\n                if (self.selectedDates) {\n                    self.selectedDates = self.selectedDates.filter(function (d) { return isEnabled(d); });\n                    if (!self.selectedDates.length && type === \"min\")\n                        setHoursFromDate(dateObj);\n                    updateValue();\n                }\n                if (self.daysContainer) {\n                    redraw();\n                    if (dateObj !== undefined)\n                        self.currentYearElement[type] = dateObj.getFullYear().toString();\n                    else\n                        self.currentYearElement.removeAttribute(type);\n                    self.currentYearElement.disabled =\n                        !!inverseDateObj &&\n                            dateObj !== undefined &&\n                            inverseDateObj.getFullYear() === dateObj.getFullYear();\n                }\n            };\n        }\n        function parseConfig() {\n            var boolOpts = [\n                \"wrap\",\n                \"weekNumbers\",\n                \"allowInput\",\n                \"clickOpens\",\n                \"time_24hr\",\n                \"enableTime\",\n                \"noCalendar\",\n                \"altInput\",\n                \"shorthandCurrentMonth\",\n                \"inline\",\n                \"static\",\n                \"enableSeconds\",\n                \"disableMobile\",\n            ];\n            var userConfig = __assign({}, instanceConfig, JSON.parse(JSON.stringify(element.dataset || {})));\n            var formats = {};\n            self.config.parseDate = userConfig.parseDate;\n            self.config.formatDate = userConfig.formatDate;\n            Object.defineProperty(self.config, \"enable\", {\n                get: function () { return self.config._enable; },\n                set: function (dates) {\n                    self.config._enable = parseDateRules(dates);\n                }\n            });\n            Object.defineProperty(self.config, \"disable\", {\n                get: function () { return self.config._disable; },\n                set: function (dates) {\n                    self.config._disable = parseDateRules(dates);\n                }\n            });\n            var timeMode = userConfig.mode === \"time\";\n            if (!userConfig.dateFormat && (userConfig.enableTime || timeMode)) {\n                var defaultDateFormat = flatpickr.defaultConfig.dateFormat || defaults.dateFormat;\n                formats.dateFormat =\n                    userConfig.noCalendar || timeMode\n                        ? \"H:i\" + (userConfig.enableSeconds ? \":S\" : \"\")\n                        : defaultDateFormat + \" H:i\" + (userConfig.enableSeconds ? \":S\" : \"\");\n            }\n            if (userConfig.altInput &&\n                (userConfig.enableTime || timeMode) &&\n                !userConfig.altFormat) {\n                var defaultAltFormat = flatpickr.defaultConfig.altFormat || defaults.altFormat;\n                formats.altFormat =\n                    userConfig.noCalendar || timeMode\n                        ? \"h:i\" + (userConfig.enableSeconds ? \":S K\" : \" K\")\n                        : defaultAltFormat + (\" h:i\" + (userConfig.enableSeconds ? \":S\" : \"\") + \" K\");\n            }\n            if (!userConfig.altInputClass) {\n                self.config.altInputClass =\n                    self.input.className + \" \" + self.config.altInputClass;\n            }\n            Object.defineProperty(self.config, \"minDate\", {\n                get: function () { return self.config._minDate; },\n                set: minMaxDateSetter(\"min\")\n            });\n            Object.defineProperty(self.config, \"maxDate\", {\n                get: function () { return self.config._maxDate; },\n                set: minMaxDateSetter(\"max\")\n            });\n            var minMaxTimeSetter = function (type) { return function (val) {\n                self.config[type === \"min\" ? \"_minTime\" : \"_maxTime\"] = self.parseDate(val, \"H:i:S\");\n            }; };\n            Object.defineProperty(self.config, \"minTime\", {\n                get: function () { return self.config._minTime; },\n                set: minMaxTimeSetter(\"min\")\n            });\n            Object.defineProperty(self.config, \"maxTime\", {\n                get: function () { return self.config._maxTime; },\n                set: minMaxTimeSetter(\"max\")\n            });\n            if (userConfig.mode === \"time\") {\n                self.config.noCalendar = true;\n                self.config.enableTime = true;\n            }\n            Object.assign(self.config, formats, userConfig);\n            for (var i = 0; i < boolOpts.length; i++)\n                self.config[boolOpts[i]] =\n                    self.config[boolOpts[i]] === true ||\n                        self.config[boolOpts[i]] === \"true\";\n            HOOKS.filter(function (hook) { return self.config[hook] !== undefined; }).forEach(function (hook) {\n                self.config[hook] = arrayify(self.config[hook] || []).map(bindToInstance);\n            });\n            self.isMobile =\n                !self.config.disableMobile &&\n                    !self.config.inline &&\n                    self.config.mode === \"single\" &&\n                    !self.config.disable.length &&\n                    !self.config.enable.length &&\n                    !self.config.weekNumbers &&\n                    /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\n            for (var i = 0; i < self.config.plugins.length; i++) {\n                var pluginConf = self.config.plugins[i](self) || {};\n                for (var key in pluginConf) {\n                    if (HOOKS.indexOf(key) > -1) {\n                        self.config[key] = arrayify(pluginConf[key])\n                            .map(bindToInstance)\n                            .concat(self.config[key]);\n                    }\n                    else if (typeof userConfig[key] === \"undefined\")\n                        self.config[key] = pluginConf[key];\n                }\n            }\n            triggerEvent(\"onParseConfig\");\n        }\n        function setupLocale() {\n            if (typeof self.config.locale !== \"object\" &&\n                typeof flatpickr.l10ns[self.config.locale] === \"undefined\")\n                self.config.errorHandler(new Error(\"flatpickr: invalid locale \" + self.config.locale));\n            self.l10n = __assign({}, flatpickr.l10ns[\"default\"], (typeof self.config.locale === \"object\"\n                ? self.config.locale\n                : self.config.locale !== \"default\"\n                    ? flatpickr.l10ns[self.config.locale]\n                    : undefined));\n            tokenRegex.K = \"(\" + self.l10n.amPM[0] + \"|\" + self.l10n.amPM[1] + \"|\" + self.l10n.amPM[0].toLowerCase() + \"|\" + self.l10n.amPM[1].toLowerCase() + \")\";\n            var userConfig = __assign({}, instanceConfig, JSON.parse(JSON.stringify(element.dataset || {})));\n            if (userConfig.time_24hr === undefined &&\n                flatpickr.defaultConfig.time_24hr === undefined) {\n                self.config.time_24hr = self.l10n.time_24hr;\n            }\n            self.formatDate = createDateFormatter(self);\n            self.parseDate = createDateParser({ config: self.config, l10n: self.l10n });\n        }\n        function positionCalendar(customPositionElement) {\n            if (self.calendarContainer === undefined)\n                return;\n            triggerEvent(\"onPreCalendarPosition\");\n            var positionElement = customPositionElement || self._positionElement;\n            var calendarHeight = Array.prototype.reduce.call(self.calendarContainer.children, (function (acc, child) { return acc + child.offsetHeight; }), 0), calendarWidth = self.calendarContainer.offsetWidth, configPos = self.config.position.split(\" \"), configPosVertical = configPos[0], configPosHorizontal = configPos.length > 1 ? configPos[1] : null, inputBounds = positionElement.getBoundingClientRect(), distanceFromBottom = window.innerHeight - inputBounds.bottom, showOnTop = configPosVertical === \"above\" ||\n                (configPosVertical !== \"below\" &&\n                    distanceFromBottom < calendarHeight &&\n                    inputBounds.top > calendarHeight);\n            var top = window.pageYOffset +\n                inputBounds.top +\n                (!showOnTop ? positionElement.offsetHeight + 2 : -calendarHeight - 2);\n            toggleClass(self.calendarContainer, \"arrowTop\", !showOnTop);\n            toggleClass(self.calendarContainer, \"arrowBottom\", showOnTop);\n            if (self.config.inline)\n                return;\n            var left = window.pageXOffset +\n                inputBounds.left -\n                (configPosHorizontal != null && configPosHorizontal === \"center\"\n                    ? (calendarWidth - inputBounds.width) / 2\n                    : 0);\n            var right = window.document.body.offsetWidth - (window.pageXOffset + inputBounds.right);\n            var rightMost = left + calendarWidth > window.document.body.offsetWidth;\n            var centerMost = right + calendarWidth > window.document.body.offsetWidth;\n            toggleClass(self.calendarContainer, \"rightMost\", rightMost);\n            if (self.config.static)\n                return;\n            self.calendarContainer.style.top = top + \"px\";\n            if (!rightMost) {\n                self.calendarContainer.style.left = left + \"px\";\n                self.calendarContainer.style.right = \"auto\";\n            }\n            else if (!centerMost) {\n                self.calendarContainer.style.left = \"auto\";\n                self.calendarContainer.style.right = right + \"px\";\n            }\n            else {\n                var doc = document.styleSheets[0];\n                // some testing environments don't have css support\n                if (doc === undefined)\n                    return;\n                var bodyWidth = window.document.body.offsetWidth;\n                var centerLeft = Math.max(0, bodyWidth / 2 - calendarWidth / 2);\n                var centerBefore = \".flatpickr-calendar.centerMost:before\";\n                var centerAfter = \".flatpickr-calendar.centerMost:after\";\n                var centerIndex = doc.cssRules.length;\n                var centerStyle = \"{left:\" + inputBounds.left + \"px;right:auto;}\";\n                toggleClass(self.calendarContainer, \"rightMost\", false);\n                toggleClass(self.calendarContainer, \"centerMost\", true);\n                doc.insertRule(centerBefore + \",\" + centerAfter + centerStyle, centerIndex);\n                self.calendarContainer.style.left = centerLeft + \"px\";\n                self.calendarContainer.style.right = \"auto\";\n            }\n        }\n        function redraw() {\n            if (self.config.noCalendar || self.isMobile)\n                return;\n            updateNavigationCurrentMonth();\n            buildDays();\n        }\n        function focusAndClose() {\n            self._input.focus();\n            if (window.navigator.userAgent.indexOf(\"MSIE\") !== -1 ||\n                navigator.msMaxTouchPoints !== undefined) {\n                // hack - bugs in the way IE handles focus keeps the calendar open\n                setTimeout(self.close, 0);\n            }\n            else {\n                self.close();\n            }\n        }\n        function selectDate(e) {\n            e.preventDefault();\n            e.stopPropagation();\n            var isSelectable = function (day) {\n                return day.classList &&\n                    day.classList.contains(\"flatpickr-day\") &&\n                    !day.classList.contains(\"flatpickr-disabled\") &&\n                    !day.classList.contains(\"notAllowed\");\n            };\n            var t = findParent(e.target, isSelectable);\n            if (t === undefined)\n                return;\n            var target = t;\n            var selectedDate = (self.latestSelectedDateObj = new Date(target.dateObj.getTime()));\n            var shouldChangeMonth = (selectedDate.getMonth() < self.currentMonth ||\n                selectedDate.getMonth() >\n                    self.currentMonth + self.config.showMonths - 1) &&\n                self.config.mode !== \"range\";\n            self.selectedDateElem = target;\n            if (self.config.mode === \"single\")\n                self.selectedDates = [selectedDate];\n            else if (self.config.mode === \"multiple\") {\n                var selectedIndex = isDateSelected(selectedDate);\n                if (selectedIndex)\n                    self.selectedDates.splice(parseInt(selectedIndex), 1);\n                else\n                    self.selectedDates.push(selectedDate);\n            }\n            else if (self.config.mode === \"range\") {\n                if (self.selectedDates.length === 2) {\n                    self.clear(false, false);\n                }\n                self.latestSelectedDateObj = selectedDate;\n                self.selectedDates.push(selectedDate);\n                // unless selecting same date twice, sort ascendingly\n                if (compareDates(selectedDate, self.selectedDates[0], true) !== 0)\n                    self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n            }\n            setHoursFromInputs();\n            if (shouldChangeMonth) {\n                var isNewYear = self.currentYear !== selectedDate.getFullYear();\n                self.currentYear = selectedDate.getFullYear();\n                self.currentMonth = selectedDate.getMonth();\n                if (isNewYear) {\n                    triggerEvent(\"onYearChange\");\n                    buildMonthSwitch();\n                }\n                triggerEvent(\"onMonthChange\");\n            }\n            updateNavigationCurrentMonth();\n            buildDays();\n            updateValue();\n            if (self.config.enableTime)\n                setTimeout(function () { return (self.showTimeInput = true); }, 50);\n            // maintain focus\n            if (!shouldChangeMonth &&\n                self.config.mode !== \"range\" &&\n                self.config.showMonths === 1)\n                focusOnDayElem(target);\n            else if (self.selectedDateElem !== undefined &&\n                self.hourElement === undefined) {\n                self.selectedDateElem && self.selectedDateElem.focus();\n            }\n            if (self.hourElement !== undefined)\n                self.hourElement !== undefined && self.hourElement.focus();\n            if (self.config.closeOnSelect) {\n                var single = self.config.mode === \"single\" && !self.config.enableTime;\n                var range = self.config.mode === \"range\" &&\n                    self.selectedDates.length === 2 &&\n                    !self.config.enableTime;\n                if (single || range) {\n                    focusAndClose();\n                }\n            }\n            triggerChange();\n        }\n        var CALLBACKS = {\n            locale: [setupLocale, updateWeekdays],\n            showMonths: [buildMonths, setCalendarWidth, buildWeekdays],\n            minDate: [jumpToDate],\n            maxDate: [jumpToDate]\n        };\n        function set(option, value) {\n            if (option !== null && typeof option === \"object\") {\n                Object.assign(self.config, option);\n                for (var key in option) {\n                    if (CALLBACKS[key] !== undefined)\n                        CALLBACKS[key].forEach(function (x) { return x(); });\n                }\n            }\n            else {\n                self.config[option] = value;\n                if (CALLBACKS[option] !== undefined)\n                    CALLBACKS[option].forEach(function (x) { return x(); });\n                else if (HOOKS.indexOf(option) > -1)\n                    self.config[option] = arrayify(value);\n            }\n            self.redraw();\n            updateValue(false);\n        }\n        function setSelectedDate(inputDate, format) {\n            var dates = [];\n            if (inputDate instanceof Array)\n                dates = inputDate.map(function (d) { return self.parseDate(d, format); });\n            else if (inputDate instanceof Date || typeof inputDate === \"number\")\n                dates = [self.parseDate(inputDate, format)];\n            else if (typeof inputDate === \"string\") {\n                switch (self.config.mode) {\n                    case \"single\":\n                    case \"time\":\n                        dates = [self.parseDate(inputDate, format)];\n                        break;\n                    case \"multiple\":\n                        dates = inputDate\n                            .split(self.config.conjunction)\n                            .map(function (date) { return self.parseDate(date, format); });\n                        break;\n                    case \"range\":\n                        dates = inputDate\n                            .split(self.l10n.rangeSeparator)\n                            .map(function (date) { return self.parseDate(date, format); });\n                        break;\n                    default:\n                        break;\n                }\n            }\n            else\n                self.config.errorHandler(new Error(\"Invalid date supplied: \" + JSON.stringify(inputDate)));\n            self.selectedDates = dates.filter(function (d) { return d instanceof Date && isEnabled(d, false); });\n            if (self.config.mode === \"range\")\n                self.selectedDates.sort(function (a, b) { return a.getTime() - b.getTime(); });\n        }\n        function setDate(date, triggerChange, format) {\n            if (triggerChange === void 0) { triggerChange = false; }\n            if (format === void 0) { format = self.config.dateFormat; }\n            if ((date !== 0 && !date) || (date instanceof Array && date.length === 0))\n                return self.clear(triggerChange);\n            setSelectedDate(date, format);\n            self.showTimeInput = self.selectedDates.length > 0;\n            self.latestSelectedDateObj =\n                self.selectedDates[self.selectedDates.length - 1];\n            self.redraw();\n            jumpToDate();\n            setHoursFromDate();\n            if (self.selectedDates.length === 0) {\n                self.clear(false);\n            }\n            updateValue(triggerChange);\n            if (triggerChange)\n                triggerEvent(\"onChange\");\n        }\n        function parseDateRules(arr) {\n            return arr\n                .slice()\n                .map(function (rule) {\n                if (typeof rule === \"string\" ||\n                    typeof rule === \"number\" ||\n                    rule instanceof Date) {\n                    return self.parseDate(rule, undefined, true);\n                }\n                else if (rule &&\n                    typeof rule === \"object\" &&\n                    rule.from &&\n                    rule.to)\n                    return {\n                        from: self.parseDate(rule.from, undefined),\n                        to: self.parseDate(rule.to, undefined)\n                    };\n                return rule;\n            })\n                .filter(function (x) { return x; }); // remove falsy values\n        }\n        function setupDates() {\n            self.selectedDates = [];\n            self.now = self.parseDate(self.config.now) || new Date();\n            // Workaround IE11 setting placeholder as the input's value\n            var preloadedDate = self.config.defaultDate ||\n                ((self.input.nodeName === \"INPUT\" ||\n                    self.input.nodeName === \"TEXTAREA\") &&\n                    self.input.placeholder &&\n                    self.input.value === self.input.placeholder\n                    ? null\n                    : self.input.value);\n            if (preloadedDate)\n                setSelectedDate(preloadedDate, self.config.dateFormat);\n            self._initialDate =\n                self.selectedDates.length > 0\n                    ? self.selectedDates[0]\n                    : self.config.minDate &&\n                        self.config.minDate.getTime() > self.now.getTime()\n                        ? self.config.minDate\n                        : self.config.maxDate &&\n                            self.config.maxDate.getTime() < self.now.getTime()\n                            ? self.config.maxDate\n                            : self.now;\n            self.currentYear = self._initialDate.getFullYear();\n            self.currentMonth = self._initialDate.getMonth();\n            if (self.selectedDates.length > 0)\n                self.latestSelectedDateObj = self.selectedDates[0];\n            if (self.config.minTime !== undefined)\n                self.config.minTime = self.parseDate(self.config.minTime, \"H:i\");\n            if (self.config.maxTime !== undefined)\n                self.config.maxTime = self.parseDate(self.config.maxTime, \"H:i\");\n            self.minDateHasTime =\n                !!self.config.minDate &&\n                    (self.config.minDate.getHours() > 0 ||\n                        self.config.minDate.getMinutes() > 0 ||\n                        self.config.minDate.getSeconds() > 0);\n            self.maxDateHasTime =\n                !!self.config.maxDate &&\n                    (self.config.maxDate.getHours() > 0 ||\n                        self.config.maxDate.getMinutes() > 0 ||\n                        self.config.maxDate.getSeconds() > 0);\n            Object.defineProperty(self, \"showTimeInput\", {\n                get: function () { return self._showTimeInput; },\n                set: function (bool) {\n                    self._showTimeInput = bool;\n                    if (self.calendarContainer)\n                        toggleClass(self.calendarContainer, \"showTimeInput\", bool);\n                    self.isOpen && positionCalendar();\n                }\n            });\n        }\n        function setupInputs() {\n            self.input = self.config.wrap\n                ? element.querySelector(\"[data-input]\")\n                : element;\n            /* istanbul ignore next */\n            if (!self.input) {\n                self.config.errorHandler(new Error(\"Invalid input element specified\"));\n                return;\n            }\n            // hack: store previous type to restore it after destroy()\n            self.input._type = self.input.type;\n            self.input.type = \"text\";\n            self.input.classList.add(\"flatpickr-input\");\n            self._input = self.input;\n            if (self.config.altInput) {\n                // replicate self.element\n                self.altInput = createElement(self.input.nodeName, self.config.altInputClass);\n                self._input = self.altInput;\n                self.altInput.placeholder = self.input.placeholder;\n                self.altInput.disabled = self.input.disabled;\n                self.altInput.required = self.input.required;\n                self.altInput.tabIndex = self.input.tabIndex;\n                self.altInput.type = \"text\";\n                self.input.setAttribute(\"type\", \"hidden\");\n                if (!self.config.static && self.input.parentNode)\n                    self.input.parentNode.insertBefore(self.altInput, self.input.nextSibling);\n            }\n            if (!self.config.allowInput)\n                self._input.setAttribute(\"readonly\", \"readonly\");\n            self._positionElement = self.config.positionElement || self._input;\n        }\n        function setupMobile() {\n            var inputType = self.config.enableTime\n                ? self.config.noCalendar\n                    ? \"time\"\n                    : \"datetime-local\"\n                : \"date\";\n            self.mobileInput = createElement(\"input\", self.input.className + \" flatpickr-mobile\");\n            self.mobileInput.step = self.input.getAttribute(\"step\") || \"any\";\n            self.mobileInput.tabIndex = 1;\n            self.mobileInput.type = inputType;\n            self.mobileInput.disabled = self.input.disabled;\n            self.mobileInput.required = self.input.required;\n            self.mobileInput.placeholder = self.input.placeholder;\n            self.mobileFormatStr =\n                inputType === \"datetime-local\"\n                    ? \"Y-m-d\\\\TH:i:S\"\n                    : inputType === \"date\"\n                        ? \"Y-m-d\"\n                        : \"H:i:S\";\n            if (self.selectedDates.length > 0) {\n                self.mobileInput.defaultValue = self.mobileInput.value = self.formatDate(self.selectedDates[0], self.mobileFormatStr);\n            }\n            if (self.config.minDate)\n                self.mobileInput.min = self.formatDate(self.config.minDate, \"Y-m-d\");\n            if (self.config.maxDate)\n                self.mobileInput.max = self.formatDate(self.config.maxDate, \"Y-m-d\");\n            self.input.type = \"hidden\";\n            if (self.altInput !== undefined)\n                self.altInput.type = \"hidden\";\n            try {\n                if (self.input.parentNode)\n                    self.input.parentNode.insertBefore(self.mobileInput, self.input.nextSibling);\n            }\n            catch (_a) { }\n            bind(self.mobileInput, \"change\", function (e) {\n                self.setDate(e.target.value, false, self.mobileFormatStr);\n                triggerEvent(\"onChange\");\n                triggerEvent(\"onClose\");\n            });\n        }\n        function toggle(e) {\n            if (self.isOpen === true)\n                return self.close();\n            self.open(e);\n        }\n        function triggerEvent(event, data) {\n            // If the instance has been destroyed already, all hooks have been removed\n            if (self.config === undefined)\n                return;\n            var hooks = self.config[event];\n            if (hooks !== undefined && hooks.length > 0) {\n                for (var i = 0; hooks[i] && i < hooks.length; i++)\n                    hooks[i](self.selectedDates, self.input.value, self, data);\n            }\n            if (event === \"onChange\") {\n                self.input.dispatchEvent(createEvent(\"change\"));\n                // many front-end frameworks bind to the input event\n                self.input.dispatchEvent(createEvent(\"input\"));\n            }\n        }\n        function createEvent(name) {\n            var e = document.createEvent(\"Event\");\n            e.initEvent(name, true, true);\n            return e;\n        }\n        function isDateSelected(date) {\n            for (var i = 0; i < self.selectedDates.length; i++) {\n                if (compareDates(self.selectedDates[i], date) === 0)\n                    return \"\" + i;\n            }\n            return false;\n        }\n        function isDateInRange(date) {\n            if (self.config.mode !== \"range\" || self.selectedDates.length < 2)\n                return false;\n            return (compareDates(date, self.selectedDates[0]) >= 0 &&\n                compareDates(date, self.selectedDates[1]) <= 0);\n        }\n        function updateNavigationCurrentMonth() {\n            if (self.config.noCalendar || self.isMobile || !self.monthNav)\n                return;\n            self.yearElements.forEach(function (yearElement, i) {\n                var d = new Date(self.currentYear, self.currentMonth, 1);\n                d.setMonth(self.currentMonth + i);\n                if (self.config.showMonths > 1 ||\n                    self.config.monthSelectorType === \"static\") {\n                    self.monthElements[i].textContent =\n                        monthToStr(d.getMonth(), self.config.shorthandCurrentMonth, self.l10n) + \" \";\n                }\n                else {\n                    self.monthsDropdownContainer.value = d.getMonth().toString();\n                }\n                yearElement.value = d.getFullYear().toString();\n            });\n            self._hidePrevMonthArrow =\n                self.config.minDate !== undefined &&\n                    (self.currentYear === self.config.minDate.getFullYear()\n                        ? self.currentMonth <= self.config.minDate.getMonth()\n                        : self.currentYear < self.config.minDate.getFullYear());\n            self._hideNextMonthArrow =\n                self.config.maxDate !== undefined &&\n                    (self.currentYear === self.config.maxDate.getFullYear()\n                        ? self.currentMonth + 1 > self.config.maxDate.getMonth()\n                        : self.currentYear > self.config.maxDate.getFullYear());\n        }\n        function getDateStr(format) {\n            return self.selectedDates\n                .map(function (dObj) { return self.formatDate(dObj, format); })\n                .filter(function (d, i, arr) {\n                return self.config.mode !== \"range\" ||\n                    self.config.enableTime ||\n                    arr.indexOf(d) === i;\n            })\n                .join(self.config.mode !== \"range\"\n                ? self.config.conjunction\n                : self.l10n.rangeSeparator);\n        }\n        /**\n         * Updates the values of inputs associated with the calendar\n         */\n        function updateValue(triggerChange) {\n            if (triggerChange === void 0) { triggerChange = true; }\n            if (self.mobileInput !== undefined && self.mobileFormatStr) {\n                self.mobileInput.value =\n                    self.latestSelectedDateObj !== undefined\n                        ? self.formatDate(self.latestSelectedDateObj, self.mobileFormatStr)\n                        : \"\";\n            }\n            self.input.value = getDateStr(self.config.dateFormat);\n            if (self.altInput !== undefined) {\n                self.altInput.value = getDateStr(self.config.altFormat);\n            }\n            if (triggerChange !== false)\n                triggerEvent(\"onValueUpdate\");\n        }\n        function onMonthNavClick(e) {\n            var isPrevMonth = self.prevMonthNav.contains(e.target);\n            var isNextMonth = self.nextMonthNav.contains(e.target);\n            if (isPrevMonth || isNextMonth) {\n                changeMonth(isPrevMonth ? -1 : 1);\n            }\n            else if (self.yearElements.indexOf(e.target) >= 0) {\n                e.target.select();\n            }\n            else if (e.target.classList.contains(\"arrowUp\")) {\n                self.changeYear(self.currentYear + 1);\n            }\n            else if (e.target.classList.contains(\"arrowDown\")) {\n                self.changeYear(self.currentYear - 1);\n            }\n        }\n        function timeWrapper(e) {\n            e.preventDefault();\n            var isKeyDown = e.type === \"keydown\", input = e.target;\n            if (self.amPM !== undefined && e.target === self.amPM) {\n                self.amPM.textContent =\n                    self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n            }\n            var min = parseFloat(input.getAttribute(\"min\")), max = parseFloat(input.getAttribute(\"max\")), step = parseFloat(input.getAttribute(\"step\")), curValue = parseInt(input.value, 10), delta = e.delta ||\n                (isKeyDown ? (e.which === 38 ? 1 : -1) : 0);\n            var newValue = curValue + step * delta;\n            if (typeof input.value !== \"undefined\" && input.value.length === 2) {\n                var isHourElem = input === self.hourElement, isMinuteElem = input === self.minuteElement;\n                if (newValue < min) {\n                    newValue =\n                        max +\n                            newValue +\n                            int(!isHourElem) +\n                            (int(isHourElem) && int(!self.amPM));\n                    if (isMinuteElem)\n                        incrementNumInput(undefined, -1, self.hourElement);\n                }\n                else if (newValue > max) {\n                    newValue =\n                        input === self.hourElement ? newValue - max - int(!self.amPM) : min;\n                    if (isMinuteElem)\n                        incrementNumInput(undefined, 1, self.hourElement);\n                }\n                if (self.amPM &&\n                    isHourElem &&\n                    (step === 1\n                        ? newValue + curValue === 23\n                        : Math.abs(newValue - curValue) > step)) {\n                    self.amPM.textContent =\n                        self.l10n.amPM[int(self.amPM.textContent === self.l10n.amPM[0])];\n                }\n                input.value = pad(newValue);\n            }\n        }\n        init();\n        return self;\n    }\n    /* istanbul ignore next */\n    function _flatpickr(nodeList, config) {\n        // static list\n        var nodes = Array.prototype.slice\n            .call(nodeList)\n            .filter(function (x) { return x instanceof HTMLElement; });\n        var instances = [];\n        for (var i = 0; i < nodes.length; i++) {\n            var node = nodes[i];\n            try {\n                if (node.getAttribute(\"data-fp-omit\") !== null)\n                    continue;\n                if (node._flatpickr !== undefined) {\n                    node._flatpickr.destroy();\n                    node._flatpickr = undefined;\n                }\n                node._flatpickr = FlatpickrInstance(node, config || {});\n                instances.push(node._flatpickr);\n            }\n            catch (e) {\n                console.error(e);\n            }\n        }\n        return instances.length === 1 ? instances[0] : instances;\n    }\n    /* istanbul ignore next */\n    if (typeof HTMLElement !== \"undefined\" &&\n        typeof HTMLCollection !== \"undefined\" &&\n        typeof NodeList !== \"undefined\") {\n        // browser env\n        HTMLCollection.prototype.flatpickr = NodeList.prototype.flatpickr = function (config) {\n            return _flatpickr(this, config);\n        };\n        HTMLElement.prototype.flatpickr = function (config) {\n            return _flatpickr([this], config);\n        };\n    }\n    /* istanbul ignore next */\n    var flatpickr = function (selector, config) {\n        if (typeof selector === \"string\") {\n            return _flatpickr(window.document.querySelectorAll(selector), config);\n        }\n        else if (selector instanceof Node) {\n            return _flatpickr([selector], config);\n        }\n        else {\n            return _flatpickr(selector, config);\n        }\n    };\n    /* istanbul ignore next */\n    flatpickr.defaultConfig = {};\n    flatpickr.l10ns = {\n        en: __assign({}, english),\n        \"default\": __assign({}, english)\n    };\n    flatpickr.localize = function (l10n) {\n        flatpickr.l10ns[\"default\"] = __assign({}, flatpickr.l10ns[\"default\"], l10n);\n    };\n    flatpickr.setDefaults = function (config) {\n        flatpickr.defaultConfig = __assign({}, flatpickr.defaultConfig, config);\n    };\n    flatpickr.parseDate = createDateParser({});\n    flatpickr.formatDate = createDateFormatter({});\n    flatpickr.compareDates = compareDates;\n    /* istanbul ignore next */\n    if (typeof jQuery !== \"undefined\" && typeof jQuery.fn !== \"undefined\") {\n        jQuery.fn.flatpickr = function (config) {\n            return _flatpickr(this, config);\n        };\n    }\n    // eslint-disable-next-line @typescript-eslint/camelcase\n    Date.prototype.fp_incr = function (days) {\n        return new Date(this.getFullYear(), this.getMonth(), this.getDate() + (typeof days === \"string\" ? parseInt(days, 10) : days));\n    };\n    if (typeof window !== \"undefined\") {\n        window.flatpickr = flatpickr;\n    }\n\n    return flatpickr;\n\n}));\n"],"sourceRoot":""}