{"version":3,"sources":["scripts.head.all.min.js"],"names":["scriptGlobalObject","window","document","undefined","tests","ModernizrProto","_version","_config","classPrefix","enableClasses","enableJSClass","usePrefixes","_q","on","test","cb","self","this","setTimeout","addTest","name","fn","options","push","addAsyncTest","Modernizr","prototype","classes","is","obj","type","hasOwnProp","_hasOwnProperty","docElement","documentElement","isSVG","nodeName","toLowerCase","setClasses","className","baseVal","reJS","RegExp","replace","length","join","feature","key","featureNameSplit","split","last","Boolean","_trigger","createElement","arguments","createElementNS","call","apply","injectElementWithStyles","rule","callback","nodes","testnames","style","ret","node","docOverflow","mod","div","body","fake","getBody","parseInt","id","appendChild","styleSheet","cssText","createTextNode","background","overflow","parentNode","removeChild","offsetHeight","hasOwnProperty","object","property","constructor","_l","res","cbs","i","createSVGRect","testStyles","diff","el","innerHTML","open","inputElem","inputattrs","attrs","input","props","len","list","HTMLDataListElement","prefixes","_prefixes","matchMedia","mq","msMatchMedia","mql","matches","bool","elem","pseudo","prop","result","getComputedStyle","console","getPropertyValue","error","currentStyle","computedStyle","TouchEvent","DocumentTouch","query","featureNames","aliasIdx","nameIdx","featureIdx","aliases","testRunner","ui","conditionalLoader","conditionsAllArray","add","conditionsArray","concat","getScriptsToLoadFrom","testMap","scriptsToLoad","jQuery","each","index","testObject","scripts","getStylesToLoadFrom","stylesToLoad","styles","merge","loadScripts","completedScripts","checkIfComplete","scriptObject","requests","j","scriptUrl","ajax","url","configuration","data","staticResourcesBase","dataType","cache","when","done","scriptsDone","fail","xhr","text","errorMsg","scriptsFail","log","errorCallback","loadStyles","styleUrl","rel","href","appendTo","loadMainJS","jqxhr","settings","status","exec","allowPredefinedData","tempData","set","value","tempKeys","get"],"mappings":"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","file":"scripts.head.all.min.js","sourcesContent":["/*!\n * modernizr v3.11.3\n * Build https://modernizr.com/download?-details-input-svg-touchevents-addtest-setclasses-dontmin\n *\n * Copyright (c)\n * Faruk Ates\n * Paul Irish\n * Alex Sexton\n * Ryan Seddon\n * Patrick Kettner\n * Stu Cox\n * Richard Herrera\n * Veeck\n\n * MIT License\n */\n\n/*\n * Modernizr tests which native CSS3 and HTML5 features are available in the\n * current UA and makes the results available to you in two ways: as properties on\n * a global `Modernizr` object, and as classes on the `` element. This\n * information allows you to progressively enhance your pages with a granular level\n * of control over the experience.\n*/\n\n;(function(scriptGlobalObject, window, document, undefined){\n\n var tests = [];\n \n\n /**\n * ModernizrProto is the constructor for Modernizr\n *\n * @class\n * @access public\n */\n var ModernizrProto = {\n _version: '3.11.3',\n\n // Any settings that don't work as separate modules\n // can go in here as configuration.\n _config: {\n 'classPrefix': '',\n 'enableClasses': true,\n 'enableJSClass': true,\n 'usePrefixes': true\n },\n\n // Queue of tests\n _q: [],\n\n // Stub these for people who are listening\n on: function(test, cb) {\n // I don't really think people should do this, but we can\n // safe guard it a bit.\n // -- NOTE:: this gets WAY overridden in src/addTest for actual async tests.\n // This is in case people listen to synchronous tests. I would leave it out,\n // but the code to *disallow* sync tests in the real version of this\n // function is actually larger than this.\n var self = this;\n setTimeout(function() {\n cb(self[test]);\n }, 0);\n },\n\n addTest: function(name, fn, options) {\n tests.push({name: name, fn: fn, options: options});\n },\n\n addAsyncTest: function(fn) {\n tests.push({name: null, fn: fn});\n }\n };\n\n \n\n // Fake some of Object.create so we can force non test results to be non \"own\" properties.\n var Modernizr = function() {};\n Modernizr.prototype = ModernizrProto;\n\n // Leak modernizr globally when you `require` it rather than force it here.\n // Overwrite name so constructor name is nicer :D\n Modernizr = new Modernizr();\n\n \n\n var classes = [];\n \n\n /**\n * is returns a boolean if the typeof an obj is exactly type.\n *\n * @access private\n * @function is\n * @param {*} obj - A thing we want to check the type of\n * @param {string} type - A string to compare the typeof against\n * @returns {boolean} true if the typeof the first parameter is exactly the specified type, false otherwise\n */\n function is(obj, type) {\n return typeof obj === type;\n }\n\n ;\n\n /**\n * Run through all tests and detect their support in the current UA.\n *\n * @access private\n * @returns {void}\n */\n function testRunner() {\n var featureNames;\n var feature;\n var aliasIdx;\n var result;\n var nameIdx;\n var featureName;\n var featureNameSplit;\n\n for (var featureIdx in tests) {\n if (tests.hasOwnProperty(featureIdx)) {\n featureNames = [];\n feature = tests[featureIdx];\n // run the test, throw the return value into the Modernizr,\n // then based on that boolean, define an appropriate className\n // and push it into an array of classes we'll join later.\n //\n // If there is no name, it's an 'async' test that is run,\n // but not directly added to the object. That should\n // be done with a post-run addTest call.\n if (feature.name) {\n featureNames.push(feature.name.toLowerCase());\n\n if (feature.options && feature.options.aliases && feature.options.aliases.length) {\n // Add all the aliases into the names list\n for (aliasIdx = 0; aliasIdx < feature.options.aliases.length; aliasIdx++) {\n featureNames.push(feature.options.aliases[aliasIdx].toLowerCase());\n }\n }\n }\n\n // Run the test, or use the raw value if it's not a function\n result = is(feature.fn, 'function') ? feature.fn() : feature.fn;\n\n // Set each of the names on the Modernizr object\n for (nameIdx = 0; nameIdx < featureNames.length; nameIdx++) {\n featureName = featureNames[nameIdx];\n // Support dot properties as sub tests. We don't do checking to make sure\n // that the implied parent tests have been added. You must call them in\n // order (either in the test, or make the parent test a dependency).\n //\n // Cap it to TWO to make the logic simple and because who needs that kind of subtesting\n // hashtag famous last words\n featureNameSplit = featureName.split('.');\n\n if (featureNameSplit.length === 1) {\n Modernizr[featureNameSplit[0]] = result;\n } else {\n // cast to a Boolean, if not one already or if it doesnt exist yet (like inputtypes)\n if (!Modernizr[featureNameSplit[0]] || Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) {\n Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]);\n }\n\n Modernizr[featureNameSplit[0]][featureNameSplit[1]] = result;\n }\n\n classes.push((result ? '' : 'no-') + featureNameSplit.join('-'));\n }\n }\n }\n }\n ;\n\n /**\n * docElement is a convenience wrapper to grab the root element of the document\n *\n * @access private\n * @returns {HTMLElement|SVGElement} The root element of the document\n */\n var docElement = document.documentElement;\n \n\n /**\n * A convenience helper to check if the document we are running in is an SVG document\n *\n * @access private\n * @returns {boolean}\n */\n var isSVG = docElement.nodeName.toLowerCase() === 'svg';\n\n \n\n /**\n * setClasses takes an array of class names and adds them to the root element\n *\n * @access private\n * @function setClasses\n * @param {string[]} classes - Array of class names\n */\n // Pass in an and array of class names, e.g.:\n // ['no-webp', 'borderradius', ...]\n function setClasses(classes) {\n var className = docElement.className;\n var classPrefix = Modernizr._config.classPrefix || '';\n\n if (isSVG) {\n className = className.baseVal;\n }\n\n // Change `no-js` to `js` (independently of the `enableClasses` option)\n // Handle classPrefix on this too\n if (Modernizr._config.enableJSClass) {\n var reJS = new RegExp('(^|\\\\s)' + classPrefix + 'no-js(\\\\s|$)');\n className = className.replace(reJS, '$1' + classPrefix + 'js$2');\n }\n\n if (Modernizr._config.enableClasses) {\n // Add the new classes\n if (classes.length > 0) {\n className += ' ' + classPrefix + classes.join(' ' + classPrefix);\n }\n if (isSVG) {\n docElement.className.baseVal = className;\n } else {\n docElement.className = className;\n }\n }\n }\n\n ;\n\n /**\n * hasOwnProp is a shim for hasOwnProperty that is needed for Safari 2.0 support\n *\n * @author kangax\n * @access private\n * @function hasOwnProp\n * @param {object} object - The object to check for a property\n * @param {string} property - The property to check for\n * @returns {boolean}\n */\n\n // hasOwnProperty shim by kangax needed for Safari 2.0 support\n var hasOwnProp;\n\n (function() {\n var _hasOwnProperty = ({}).hasOwnProperty;\n /* istanbul ignore else */\n /* we have no way of testing IE 5.5 or safari 2,\n * so just assume the else gets hit */\n if (!is(_hasOwnProperty, 'undefined') && !is(_hasOwnProperty.call, 'undefined')) {\n hasOwnProp = function(object, property) {\n return _hasOwnProperty.call(object, property);\n };\n }\n else {\n hasOwnProp = function(object, property) { /* yes, this can give false positives/negatives, but most of the time we don't care about those */\n return ((property in object) && is(object.constructor.prototype[property], 'undefined'));\n };\n }\n })();\n\n \n\n\n // _l tracks listeners for async tests, as well as tests that execute after the initial run\n ModernizrProto._l = {};\n\n /**\n * Modernizr.on is a way to listen for the completion of async tests. Being\n * asynchronous, they may not finish before your scripts run. As a result you\n * will get a possibly false negative `undefined` value.\n *\n * @memberOf Modernizr\n * @name Modernizr.on\n * @access public\n * @function on\n * @param {string} feature - String name of the feature detect\n * @param {Function} cb - Callback function returning a Boolean - true if feature is supported, false if not\n * @returns {void}\n * @example\n *\n * ```js\n * Modernizr.on('flash', function( result ) {\n * if (result) {\n * // the browser has flash\n * } else {\n * // the browser does not have flash\n * }\n * });\n * ```\n */\n ModernizrProto.on = function(feature, cb) {\n // Create the list of listeners if it doesn't exist\n if (!this._l[feature]) {\n this._l[feature] = [];\n }\n\n // Push this test on to the listener list\n this._l[feature].push(cb);\n\n // If it's already been resolved, trigger it on next tick\n if (Modernizr.hasOwnProperty(feature)) {\n // Next Tick\n setTimeout(function() {\n Modernizr._trigger(feature, Modernizr[feature]);\n }, 0);\n }\n };\n\n /**\n * _trigger is the private function used to signal test completion and run any\n * callbacks registered through [Modernizr.on](#modernizr-on)\n *\n * @memberOf Modernizr\n * @name Modernizr._trigger\n * @access private\n * @function _trigger\n * @param {string} feature - string name of the feature detect\n * @param {Function|boolean} [res] - A feature detection function, or the boolean =\n * result of a feature detection function\n * @returns {void}\n */\n ModernizrProto._trigger = function(feature, res) {\n if (!this._l[feature]) {\n return;\n }\n\n var cbs = this._l[feature];\n\n // Force async\n setTimeout(function() {\n var i, cb;\n for (i = 0; i < cbs.length; i++) {\n cb = cbs[i];\n cb(res);\n }\n }, 0);\n\n // Don't trigger these again\n delete this._l[feature];\n };\n\n /**\n * addTest allows you to define your own feature detects that are not currently\n * included in Modernizr (under the covers it's the exact same code Modernizr\n * uses for its own [feature detections](https://github.com/Modernizr/Modernizr/tree/master/feature-detects)).\n * Just like the official detects, the result\n * will be added onto the Modernizr object, as well as an appropriate className set on\n * the html element when configured to do so\n *\n * @memberOf Modernizr\n * @name Modernizr.addTest\n * @optionName Modernizr.addTest()\n * @optionProp addTest\n * @access public\n * @function addTest\n * @param {string|object} feature - The string name of the feature detect, or an\n * object of feature detect names and test\n * @param {Function|boolean} test - Function returning true if feature is supported,\n * false if not. Otherwise a boolean representing the results of a feature detection\n * @returns {object} the Modernizr object to allow chaining\n * @example\n *\n * The most common way of creating your own feature detects is by calling\n * `Modernizr.addTest` with a string (preferably just lowercase, without any\n * punctuation), and a function you want executed that will return a boolean result\n *\n * ```js\n * Modernizr.addTest('itsTuesday', function() {\n * var d = new Date();\n * return d.getDay() === 2;\n * });\n * ```\n *\n * When the above is run, it will set Modernizr.itstuesday to `true` when it is tuesday,\n * and to `false` every other day of the week. One thing to notice is that the names of\n * feature detect functions are always lowercased when added to the Modernizr object. That\n * means that `Modernizr.itsTuesday` will not exist, but `Modernizr.itstuesday` will.\n *\n *\n * Since we only look at the returned value from any feature detection function,\n * you do not need to actually use a function. For simple detections, just passing\n * in a statement that will return a boolean value works just fine.\n *\n * ```js\n * Modernizr.addTest('hasjquery', 'jQuery' in window);\n * ```\n *\n * Just like before, when the above runs `Modernizr.hasjquery` will be true if\n * jQuery has been included on the page. Not using a function saves a small amount\n * of overhead for the browser, as well as making your code much more readable.\n *\n * Finally, you also have the ability to pass in an object of feature names and\n * their tests. This is handy if you want to add multiple detections in one go.\n * The keys should always be a string, and the value can be either a boolean or\n * function that returns a boolean.\n *\n * ```js\n * var detects = {\n * 'hasjquery': 'jQuery' in window,\n * 'itstuesday': function() {\n * var d = new Date();\n * return d.getDay() === 2;\n * }\n * }\n *\n * Modernizr.addTest(detects);\n * ```\n *\n * There is really no difference between the first methods and this one, it is\n * just a convenience to let you write more readable code.\n */\n function addTest(feature, test) {\n\n if (typeof feature === 'object') {\n for (var key in feature) {\n if (hasOwnProp(feature, key)) {\n addTest(key, feature[ key ]);\n }\n }\n } else {\n\n feature = feature.toLowerCase();\n var featureNameSplit = feature.split('.');\n var last = Modernizr[featureNameSplit[0]];\n\n // Again, we don't check for parent test existence. Get that right, though.\n if (featureNameSplit.length === 2) {\n last = last[featureNameSplit[1]];\n }\n\n if (typeof last !== 'undefined') {\n // we're going to quit if you're trying to overwrite an existing test\n // if we were to allow it, we'd do this:\n // var re = new RegExp(\"\\\\b(no-)?\" + feature + \"\\\\b\");\n // docElement.className = docElement.className.replace( re, '' );\n // but, no rly, stuff 'em.\n return Modernizr;\n }\n\n test = typeof test === 'function' ? test() : test;\n\n // Set the value (this is the magic, right here).\n if (featureNameSplit.length === 1) {\n Modernizr[featureNameSplit[0]] = test;\n } else {\n // cast to a Boolean, if not one already\n if (Modernizr[featureNameSplit[0]] && !(Modernizr[featureNameSplit[0]] instanceof Boolean)) {\n Modernizr[featureNameSplit[0]] = new Boolean(Modernizr[featureNameSplit[0]]);\n }\n\n Modernizr[featureNameSplit[0]][featureNameSplit[1]] = test;\n }\n\n // Set a single class (either `feature` or `no-feature`)\n setClasses([(!!test && test !== false ? '' : 'no-') + featureNameSplit.join('-')]);\n\n // Trigger the event\n Modernizr._trigger(feature, test);\n }\n\n return Modernizr; // allow chaining.\n }\n\n // After all the tests are run, add self to the Modernizr prototype\n Modernizr._q.push(function() {\n ModernizrProto.addTest = addTest;\n });\n\n \n\n/*!\n{\n \"name\": \"SVG\",\n \"property\": \"svg\",\n \"caniuse\": \"svg\",\n \"tags\": [\"svg\"],\n \"authors\": [\"Erik Dahlstrom\"],\n \"polyfills\": [\n \"svgweb\",\n \"raphael\",\n \"amplesdk\",\n \"canvg\",\n \"svg-boilerplate\",\n \"sie\",\n \"dojogfx\",\n \"fabricjs\"\n ]\n}\n!*/\n/* DOC\nDetects support for SVG in `` or `` elements.\n*/\n\n Modernizr.addTest('svg', !!document.createElementNS && !!document.createElementNS('http://www.w3.org/2000/svg', 'svg').createSVGRect);\n\n\n /**\n * createElement is a convenience wrapper around document.createElement. Since we\n * use createElement all over the place, this allows for (slightly) smaller code\n * as well as abstracting away issues with creating elements in contexts other than\n * HTML documents (e.g. SVG documents).\n *\n * @access private\n * @function createElement\n * @returns {HTMLElement|SVGElement} An HTML or SVG element\n */\n function createElement() {\n if (typeof document.createElement !== 'function') {\n // This is the case in IE7, where the type of createElement is \"object\".\n // For this reason, we cannot call apply() as Object is not a Function.\n return document.createElement(arguments[0]);\n } else if (isSVG) {\n return document.createElementNS.call(document, 'http://www.w3.org/2000/svg', arguments[0]);\n } else {\n return document.createElement.apply(document, arguments);\n }\n }\n\n ;\n\n /**\n * getBody returns the body of a document, or an element that can stand in for\n * the body if a real body does not exist\n *\n * @access private\n * @function getBody\n * @returns {HTMLElement|SVGElement} Returns the real body of a document, or an\n * artificially created element that stands in for the body\n */\n function getBody() {\n // After page load injecting a fake body doesn't work so check if body exists\n var body = document.body;\n\n if (!body) {\n // Can't use the real body create a fake one.\n body = createElement(isSVG ? 'svg' : 'body');\n body.fake = true;\n }\n\n return body;\n }\n\n ;\n\n /**\n * injectElementWithStyles injects an element with style element and some CSS rules\n *\n * @access private\n * @function injectElementWithStyles\n * @param {string} rule - String representing a css rule\n * @param {Function} callback - A function that is used to test the injected element\n * @param {number} [nodes] - An integer representing the number of additional nodes you want injected\n * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes\n * @returns {boolean} the result of the specified callback test\n */\n function injectElementWithStyles(rule, callback, nodes, testnames) {\n var mod = 'modernizr';\n var style;\n var ret;\n var node;\n var docOverflow;\n var div = createElement('div');\n var body = getBody();\n\n if (parseInt(nodes, 10)) {\n // In order not to give false positives we create a node for each test\n // This also allows the method to scale for unspecified uses\n while (nodes--) {\n node = createElement('div');\n node.id = testnames ? testnames[nodes] : mod + (nodes + 1);\n div.appendChild(node);\n }\n }\n\n style = createElement('style');\n style.type = 'text/css';\n style.id = 's' + mod;\n\n // IE6 will false positive on some tests due to the style element inside the test div somehow interfering offsetHeight, so insert it into body or fakebody.\n // Opera will act all quirky when injecting elements in documentElement when page is served as xml, needs fakebody too. #270\n (!body.fake ? div : body).appendChild(style);\n body.appendChild(div);\n\n if (style.styleSheet) {\n style.styleSheet.cssText = rule;\n } else {\n style.appendChild(document.createTextNode(rule));\n }\n div.id = mod;\n\n if (body.fake) {\n //avoid crashing IE8, if background image is used\n body.style.background = '';\n //Safari 5.13/5.1.4 OSX stops loading if ::-webkit-scrollbar is used and scrollbars are visible\n body.style.overflow = 'hidden';\n docOverflow = docElement.style.overflow;\n docElement.style.overflow = 'hidden';\n docElement.appendChild(body);\n }\n\n ret = callback(div, rule);\n // If this is done after page load we don't want to remove the body so check if body exists\n if (body.fake) {\n body.parentNode.removeChild(body);\n docElement.style.overflow = docOverflow;\n // Trigger layout so kinetic scrolling isn't disabled in iOS6+\n // eslint-disable-next-line\n docElement.offsetHeight;\n } else {\n div.parentNode.removeChild(div);\n }\n\n return !!ret;\n }\n\n ;\n\n /**\n * testStyles injects an element with style element and some CSS rules\n *\n * @memberOf Modernizr\n * @name Modernizr.testStyles\n * @optionName Modernizr.testStyles()\n * @optionProp testStyles\n * @access public\n * @function testStyles\n * @param {string} rule - String representing a css rule\n * @param {Function} callback - A function that is used to test the injected element\n * @param {number} [nodes] - An integer representing the number of additional nodes you want injected\n * @param {string[]} [testnames] - An array of strings that are used as ids for the additional nodes\n * @returns {boolean}\n * @example\n *\n * `Modernizr.testStyles` takes a CSS rule and injects it onto the current page\n * along with (possibly multiple) DOM elements. This lets you check for features\n * that can not be detected by simply checking the [IDL](https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Interface_development_guide/IDL_interface_rules).\n *\n * ```js\n * Modernizr.testStyles('#modernizr { width: 9px; color: papayawhip; }', function(elem, rule) {\n * // elem is the first DOM node in the page (by default #modernizr)\n * // rule is the first argument you supplied - the CSS rule in string form\n *\n * addTest('widthworks', elem.style.width === '9px')\n * });\n * ```\n *\n * If your test requires multiple nodes, you can include a third argument\n * indicating how many additional div elements to include on the page. The\n * additional nodes are injected as children of the `elem` that is returned as\n * the first argument to the callback.\n *\n * ```js\n * Modernizr.testStyles('#modernizr {width: 1px}; #modernizr2 {width: 2px}', function(elem) {\n * document.getElementById('modernizr').style.width === '1px'; // true\n * document.getElementById('modernizr2').style.width === '2px'; // true\n * elem.firstChild === document.getElementById('modernizr2'); // true\n * }, 1);\n * ```\n *\n * By default, all of the additional elements have an ID of `modernizr[n]`, where\n * `n` is its index (e.g. the first additional, second overall is `#modernizr2`,\n * the second additional is `#modernizr3`, etc.).\n * If you want to have more meaningful IDs for your function, you can provide\n * them as the fourth argument, as an array of strings\n *\n * ```js\n * Modernizr.testStyles('#foo {width: 10px}; #bar {height: 20px}', function(elem) {\n * elem.firstChild === document.getElementById('foo'); // true\n * elem.lastChild === document.getElementById('bar'); // true\n * }, 2, ['foo', 'bar']);\n * ```\n */\n var testStyles = ModernizrProto.testStyles = injectElementWithStyles;\n \n/*!\n{\n \"name\": \"details Element\",\n \"caniuse\": \"details\",\n \"property\": \"details\",\n \"tags\": [\"elem\"],\n \"builderAliases\": [\"elem_details\"],\n \"authors\": [\"@mathias\"],\n \"notes\": [{\n \"name\": \"Mathias' Original\",\n \"href\": \"https://mathiasbynens.be/notes/html5-details-jquery#comment-35\"\n }]\n}\n!*/\n\n Modernizr.addTest('details', function() {\n var el = createElement('details');\n var diff;\n\n // return early if possible; thanks @aFarkas!\n if (!('open' in el)) {\n return false;\n }\n\n testStyles('#modernizr details{display:block}', function(node) {\n node.appendChild(el);\n el.innerHTML = 'ab';\n diff = el.offsetHeight;\n el.open = true;\n diff = diff !== el.offsetHeight;\n });\n\n return diff;\n });\n\n\n /**\n * since we have a fairly large number of input tests that don't mutate the input\n * we create a single element that can be shared with all of those tests for a\n * minor perf boost\n *\n * @access private\n * @returns {HTMLInputElement}\n */\n var inputElem = createElement('input');\n \n/*!\n{\n \"name\": \"Input attributes\",\n \"property\": \"input\",\n \"tags\": [\"forms\"],\n \"authors\": [\"Mike Taylor\"],\n \"notes\": [{\n \"name\": \"WHATWG Spec\",\n \"href\": \"https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary\"\n }],\n \"knownBugs\": [\"Some blackberry devices report false positive for input.multiple\"]\n}\n!*/\n/* DOC\nDetects support for HTML5 `` element attributes and exposes Boolean subproperties with the results:\n\n```javascript\nModernizr.input.autocomplete\nModernizr.input.autofocus\nModernizr.input.list\nModernizr.input.max\nModernizr.input.min\nModernizr.input.multiple\nModernizr.input.pattern\nModernizr.input.placeholder\nModernizr.input.required\nModernizr.input.step\n```\n*/\n\n // Run through HTML5's new input attributes to see if the UA understands any.\n // Mike Taylr has created a comprehensive resource for testing these attributes\n // when applied to all input types:\n // miketaylr.com/code/input-type-attr.html\n\n // Only input placeholder is tested while textarea's placeholder is not.\n // Currently Safari 4 and Opera 11 have support only for the input placeholder\n // Both tests are available in feature-detects/forms-placeholder.js\n\n var inputattrs = 'autocomplete autofocus list placeholder max min multiple pattern required step'.split(' ');\n var attrs = {};\n\n Modernizr.input = (function(props) {\n for (var i = 0, len = props.length; i < len; i++) {\n attrs[ props[i] ] = !!(props[i] in inputElem);\n }\n if (attrs.list) {\n // safari false positive's on datalist: webk.it/74252\n // see also github.com/Modernizr/Modernizr/issues/146\n attrs.list = !!(createElement('datalist') && window.HTMLDataListElement);\n }\n return attrs;\n })(inputattrs);\n\n\n /**\n * List of property values to set for css tests. See ticket #21\n * https://github.com/modernizr/modernizr/issues/21\n *\n * @memberOf Modernizr\n * @name Modernizr._prefixes\n * @optionName Modernizr._prefixes\n * @optionProp prefixes\n * @access public\n * @example\n *\n * Modernizr._prefixes is the internal list of prefixes that we test against\n * inside of things like [prefixed](#modernizr-prefixed) and [prefixedCSS](#-code-modernizr-prefixedcss). It is simply\n * an array of kebab-case vendor prefixes you can use within your code.\n *\n * Some common use cases include\n *\n * Generating all possible prefixed version of a CSS property\n * ```js\n * var rule = Modernizr._prefixes.join('transform: rotate(20deg); ');\n *\n * rule === 'transform: rotate(20deg); webkit-transform: rotate(20deg); moz-transform: rotate(20deg); o-transform: rotate(20deg); ms-transform: rotate(20deg);'\n * ```\n *\n * Generating all possible prefixed version of a CSS value\n * ```js\n * rule = 'display:' + Modernizr._prefixes.join('flex; display:') + 'flex';\n *\n * rule === 'display:flex; display:-webkit-flex; display:-moz-flex; display:-o-flex; display:-ms-flex; display:flex'\n * ```\n */\n // we use ['',''] rather than an empty array in order to allow a pattern of .`join()`ing prefixes to test\n // values in feature detects to continue to work\n var prefixes = (ModernizrProto._config.usePrefixes ? ' -webkit- -moz- -o- -ms- '.split(' ') : ['','']);\n\n // expose these for the plugin API. Look in the source for how to join() them against your input\n ModernizrProto._prefixes = prefixes;\n\n \n\n\n /**\n * wrapper around getComputedStyle, to fix issues with Firefox returning null when\n * called inside of a hidden iframe\n *\n * @access private\n * @function computedStyle\n * @param {HTMLElement|SVGElement} elem - The element we want to find the computed styles of\n * @param {string|null} [pseudo] - An optional pseudo element selector (e.g. :before), of null if none\n * @param {string} prop - A CSS property\n * @returns {CSSStyleDeclaration} the value of the specified CSS property\n */\n function computedStyle(elem, pseudo, prop) {\n var result;\n\n if ('getComputedStyle' in window) {\n result = getComputedStyle.call(window, elem, pseudo);\n var console = window.console;\n\n if (result !== null) {\n if (prop) {\n result = result.getPropertyValue(prop);\n }\n } else {\n if (console) {\n var method = console.error ? 'error' : 'log';\n console[method].call(console, 'getComputedStyle returning null, its possible modernizr test results are inaccurate');\n }\n }\n } else {\n result = !pseudo && elem.currentStyle && elem.currentStyle[prop];\n }\n\n return result;\n }\n\n ;\n\n /**\n * Modernizr.mq tests a given media query, live against the current state of the window\n * adapted from matchMedia polyfill by Scott Jehl and Paul Irish\n * gist.github.com/786768\n *\n * @memberOf Modernizr\n * @name Modernizr.mq\n * @optionName Modernizr.mq()\n * @optionProp mq\n * @access public\n * @function mq\n * @param {string} mq - String of the media query we want to test\n * @returns {boolean}\n * @example\n * Modernizr.mq allows for you to programmatically check if the current browser\n * window state matches a media query.\n *\n * ```js\n * var query = Modernizr.mq('(min-width: 900px)');\n *\n * if (query) {\n * // the browser window is larger than 900px\n * }\n * ```\n *\n * Only valid media queries are supported, therefore you must always include values\n * with your media query\n *\n * ```js\n * // good\n * Modernizr.mq('(min-width: 900px)');\n *\n * // bad\n * Modernizr.mq('min-width');\n * ```\n *\n * If you would just like to test that media queries are supported in general, use\n *\n * ```js\n * Modernizr.mq('only all'); // true if MQ are supported, false if not\n * ```\n *\n * Note that if the browser does not support media queries (e.g. old IE) mq will\n * always return false.\n */\n var mq = (function() {\n var matchMedia = window.matchMedia || window.msMatchMedia;\n if (matchMedia) {\n return function(mq) {\n var mql = matchMedia(mq);\n return mql && mql.matches || false;\n };\n }\n\n return function(mq) {\n var bool = false;\n\n injectElementWithStyles('@media ' + mq + ' { #modernizr { position: absolute; } }', function(node) {\n bool = computedStyle(node, null, 'position') === 'absolute';\n });\n\n return bool;\n };\n })();\n\n ModernizrProto.mq = mq;\n\n \n/*!\n{\n \"name\": \"Touch Events\",\n \"property\": \"touchevents\",\n \"caniuse\": \"touch\",\n \"tags\": [\"media\", \"attribute\"],\n \"notes\": [{\n \"name\": \"Touch Events spec\",\n \"href\": \"https://www.w3.org/TR/2013/WD-touch-events-20130124/\"\n }],\n \"warnings\": [\n \"** DEPRECATED see https://github.com/Modernizr/Modernizr/pull/2432 **\",\n \"Indicates if the browser supports the Touch Events spec, and does not necessarily reflect a touchscreen device\"\n ],\n \"knownBugs\": [\n \"False-positive on some configurations of Nokia N900\",\n \"False-positive on some BlackBerry 6.0 builds – https://github.com/Modernizr/Modernizr/issues/372#issuecomment-3112695\"\n ]\n}\n!*/\n/* DOC\nIndicates if the browser supports the W3C Touch Events API.\n\nThis *does not* necessarily reflect a touchscreen device:\n\n* Older touchscreen devices only emulate mouse events\n* Modern IE touch devices implement the Pointer Events API instead: use `Modernizr.pointerevents` to detect support for that\n* Some browsers & OS setups may enable touch APIs when no touchscreen is connected\n* Future browsers may implement other event models for touch interactions\n\nSee this article: [You Can't Detect A Touchscreen](http://www.stucox.com/blog/you-cant-detect-a-touchscreen/).\n\nIt's recommended to bind both mouse and touch/pointer events simultaneously – see [this HTML5 Rocks tutorial](https://www.html5rocks.com/en/mobile/touchandmouse/).\n\nThis test will also return `true` for Firefox 4 Multitouch support.\n*/\n\n // Chrome (desktop) used to lie about its support on this, but that has since been rectified: https://bugs.chromium.org/p/chromium/issues/detail?id=36415\n // Chrome also changed its behaviour since v70 and recommends the TouchEvent object for detection: https://www.chromestatus.com/feature/4764225348042752\n Modernizr.addTest('touchevents', function() {\n if (('ontouchstart' in window) || window.TouchEvent || window.DocumentTouch && document instanceof DocumentTouch) {\n return true;\n }\n\n // include the 'heartz' as a way to have a non matching MQ to help terminate the join\n // https://github.com/Modernizr/Modernizr/issues/1814\n var query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join('');\n return mq(query);\n });\n\n\n // Run each test\n testRunner();\n\n // Remove the \"no-js\" class if it exists\n setClasses(classes);\n\n delete ModernizrProto.addTest;\n delete ModernizrProto.addAsyncTest;\n\n // Run the things that are supposed to run after the tests\n for (var i = 0; i < Modernizr._q.length; i++) {\n Modernizr._q[i]();\n }\n\n // Leak Modernizr namespace\n scriptGlobalObject.Modernizr = Modernizr;\n\n\n;\n\n})(window, window, document);\n\n/**\n * Conditionally loading of some Libraries which are only needed in some rare cases and are else to big to concat with\n * all the other files. Given the testMap, this function checks the property \"test\" of each object and, if it\n * resolves to \"true\", adds the scripts of the array to a loading-que. Then it asynchronously loads all those scripts\n * BEFORE loading the main.js-File.\n *\n * NOTE: If a Script fails to load, execution is not stopped and main file will load anyways.\n *\n * User: david.losert\n * Date: 30.12.2014\n * Time: 10:45\n */\n\n;(function () {\n\t'use strict';\n\t/*global ui:true */\n\tui = typeof(ui) === 'undefined' ? {} : ui;\n\n\tui.conditionalLoader = {\n\t\tconditionsAllArray: [],\n\t\tadd: function (conditionsArray) {\n\t\t\tthis.conditionsAllArray = this.conditionsAllArray.concat(conditionsArray);\n\t\t},\n\t\tgetScriptsToLoadFrom: function (testMap) {\n\t\t\tvar scriptsToLoad = [];\n\t\t\tjQuery.each(testMap, function (index, testObject) {\n\t\t\t\tif ((typeof(testObject.test) === 'function' ? testObject.test() : testObject.test) && testObject.scripts) {\n\t\t\t\t\tscriptsToLoad.push(testObject);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn scriptsToLoad;\n\t\t},\n\t\tgetStylesToLoadFrom: function (testMap) {\n\t\t\tvar stylesToLoad = [];\n\t\t\t// var isIE8 = jQuery('.lt-ie9').length > 0 ? true : false;\n\n\t\t\tjQuery.each(testMap, function (index, testObject) {\n\t\t\t\t//var ie8styles = [];\n\n\t\t\t\tif ((typeof(testObject.test) === 'function' ? testObject.test() : testObject.test) && testObject.styles) {\n\t\t\t\t\tjQuery.merge(stylesToLoad, testObject.styles);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn stylesToLoad;\n\t\t},\n\t\tloadScripts: function (scripts, callback) {\n\t\t\tvar completedScripts = 0;\n\n\t\t\tif (scripts.length === 0) {\n\t\t\t\tcallback();\n\t\t\t}\n\n\t\t\tjQuery.each(scripts, function (i, scriptObject) {\n\t\t\t\tvar requests = [];\n\t\t\t\tjQuery.each(scriptObject.scripts, function (j, scriptUrl) {\n\t\t\t\t\trequests.push(jQuery.ajax({\n\t\t\t\t\t\turl: ui.configuration.data.staticResourcesBase + scriptUrl,\n\t\t\t\t\t\tdataType: 'script',\n\t\t\t\t\t\tcache: true\n\t\t\t\t\t}));\n\t\t\t\t});\n\n\t\t\t\tjQuery.when.apply(jQuery, requests)\n\t\t\t\t\t.done(function () {\n\t\t\t\t\t\tif (typeof(scriptObject.scriptsDone) === 'function') {\n\t\t\t\t\t\t\tscriptObject.scriptsDone();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsuccessCallback();\n\t\t\t\t\t})\n\t\t\t\t\t.fail(function (xhr, text, errorMsg) {\n\t\t\t\t\t\tif (typeof(scriptObject.scriptsFail) === 'function') {\n\t\t\t\t\t\t\tscriptObject.scriptsFail();\n\t\t\t\t\t\t}\n\t\t\t\t\t\terrorCallback(scriptObject);\n\t\t\t\t\t});\n\t\t\t});\n\n\t\t\tfunction successCallback() {\n\t\t\t\tcompletedScripts++;\n\t\t\t\tcheckIfComplete();\n\t\t\t}\n\n\t\t\tfunction errorCallback(scriptObject) {\n\t\t\t\tcompletedScripts++;\n\t\t\t\tif (window.console) {\n\t\t\t\t\tconsole.log('Error while loading: ' + scriptObject.scripts.join());\n\t\t\t\t}\n\t\t\t\tcheckIfComplete();\n\t\t\t}\n\n\t\t\tfunction checkIfComplete() {\n\t\t\t\tif (completedScripts === scripts.length) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tloadStyles: function (styles) {\n\t\t\tif (styles.length > 0) {\n\t\t\t\tjQuery.each(styles, function (index, styleUrl) {\n\t\t\t\t\tjQuery('', {\n\t\t\t\t\t\trel: 'stylesheet',\n\t\t\t\t\t\ttype: 'text/css',\n\t\t\t\t\t\thref: ui.configuration.data.staticResourcesBase + styleUrl\n\t\t\t\t\t}).appendTo('head');\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tloadMainJS: function () {\n\t\t\tjQuery.ajax({\n\t\t\t\turl: ui.configuration.data.staticResourcesBase + 'js/main.js',\n\t\t\t\tdataType: 'script',\n\t\t\t\tcache: true\n\t\t\t})\n\t\t\t.fail(function (jqxhr, settings, error) {\n\t\t\t\tif (window.console) {\n\t\t\t\t\tconsole.log('[' + jqxhr.status + '] - Error while loading main File: ', error);\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t\texec: function () {\n\t\t\tvar stylesToLoad = this.getStylesToLoadFrom(this.conditionsAllArray);\n\t\t\tvar scriptsToLoad = this.getScriptsToLoadFrom(this.conditionsAllArray);\n\t\t\tthis.loadStyles(stylesToLoad);\n\t\t\tthis.loadScripts(scriptsToLoad, this.loadMainJS);\n\t\t}\n\t};\n})();\n\n/* initialization of configuration getter and setter methods, use this methods to get and set configuration values */\n(function (allowPredefinedData) {\n\t'use strict';\n\n\t/*global ui:true */\n\tui = typeof ui === 'undefined' ? {} : ui;\n\n\tif (typeof ui.configuration.data === 'undefined') {\n\t\tui.configuration.data = {};\n\t} else {\n\t\tif (allowPredefinedData === true) {\n\t\t\t// reset everything but data\n\t\t\tvar tempData = ui.configuration.data;\n\t\t\tui.configuration = {data: tempData};\n\t\t} else {\n\t\t\tui.configuration.data = {};\n\t\t}\n\t}\n\n\t// configuration functions\n\tui.configuration.set = function (key, value) {\n\t\tvar tempKeys = key.split('.');\n\t\tif (tempKeys.length === 2) {\n\t\t\tif (typeof ui.configuration.data[tempKeys[0]] === 'undefined') {\n\t\t\t\tui.configuration.data[tempKeys[0]] = {};\n\t\t\t}\n\t\t\tui.configuration.data[tempKeys[0]][tempKeys[1]] = value;\n\t\t\treturn true;\n\t\t}\n\t\tui.configuration.data[tempKeys[0]] = value;\n\t\treturn true;\n\t};\n\n\tui.configuration.get = function (key) {\n\t\tvar tempKeys = key.split('.');\n\t\tif (tempKeys.length === 2) {\n\t\t\tif (typeof ui.configuration.data[tempKeys[0]] === 'undefined' || typeof ui.configuration.data[tempKeys[0]][tempKeys[1]] === 'undefined') {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\treturn ui.configuration.data[tempKeys[0]][tempKeys[1]];\n\t\t}\n\t\tif (typeof ui.configuration.data[tempKeys[0]] === 'undefined') {\n\t\t\treturn null;\n\t\t}\n\t\treturn ui.configuration.data[tempKeys[0]];\n\t};\n\n})(true);\n"]}